From 1aa99ac17e3582991588565cb5a78cd1343fcab4 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 4 Aug 2017 22:39:15 +0200 Subject: [PATCH] include the dist directory in the project --- .gitignore | 1 - dist/image-editor.js | 2321 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2321 insertions(+), 1 deletion(-) create mode 100644 dist/image-editor.js diff --git a/.gitignore b/.gitignore index d9d7e40..48745e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules -dist *.sublime-project *.sublime-workspace diff --git a/dist/image-editor.js b/dist/image-editor.js new file mode 100644 index 0000000..00344c1 --- /dev/null +++ b/dist/image-editor.js @@ -0,0 +1,2321 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o max) { + return max; + } + return value; +} + +module.exports = assertBetween; + +},{}],27:[function(require,module,exports){ +'use strict'; + +function assertKeyValuePair(key, value) { + if (typeof key === 'object') { + return key; + } + + var returnValue = {}; + returnValue[key] = value; + + return returnValue; +} + +module.exports = assertKeyValuePair; + +},{}],28:[function(require,module,exports){ +'use strict'; + +/** + * @param {fabric.Image} obj + * @param {int} width + * @param {int} height + * @param {string} units + * @return {Object} + * axis: STRING, + * dim: OBJECT( width: NUMBER, height: NUMBER), + * width: NUMBER, + * height: NUMBER, + * ppmm: NUMBER + */ +function calcCrop(obj, width, height, units) { + var cropRatio = width / height; + var objRatio = obj.width / obj.height; + + var returnValue = { + image: obj, + axis: objRatio > cropRatio ? 'x' : 'y', + dim: { + width: Number(width), + height: Number(height), + units: units + }, + width: obj.width * obj.scaleX, + height: obj.height * obj.scaleY, + objectRatio: objRatio, + cropRatio: cropRatio + }; + + if (objRatio > cropRatio) { + returnValue.width *= cropRatio / objRatio; + } else { + returnValue.height /= cropRatio / objRatio; + } + + // Pixels per millimeter + returnValue.ppmm = returnValue.width / ((returnValue.dim.width * obj.scaleX) * 10); + + return returnValue; +} + +module.exports = calcCrop; + +},{}],29:[function(require,module,exports){ +'use strict'; + +function isAspectChanged(x1, y1, x2, y2) { + return (Math.abs(x1 / y1 - x2 / y2) > 0.01); +} + +module.exports = isAspectChanged; + +},{}],30:[function(require,module,exports){ +'use strict'; + +function isFullscreen() { + return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement; +} + +module.exports = isFullscreen; + +},{}],31:[function(require,module,exports){ +'use strict'; + +function isMobile() { + return $(window).width() < 768; +} + +module.exports = isMobile; + +},{}],32:[function(require,module,exports){ +'use strict'; + +var MouseMetrics = { + previousMouseData: { + x: null, + y: null + }, + + deletePreviousMouseData: function() { + MouseMetrics.previousMouseData = { + x: null, + y: null + }; + }, + + setPreviousMouseData: function(values) { + MouseMetrics.previousMouseData = { + x: values.x || null, + y: values.y || null, + }; + }, +}; + +module.exports = MouseMetrics; + +},{}],33:[function(require,module,exports){ +'use strict'; + +/** + * @param {fabric.Object} obj + * @param {Object} bounds + * @return {fabric.Object} + */ +function setPositionInside(obj, bounds) { + ['left', 'top'].forEach(function (v) { + if (obj[v] < bounds[v].min) { + obj.set(v, bounds[v].min).setCoords(); + } + + if (obj[v] > bounds[v].max) { + obj.set(v, bounds[v].max).setCoords(); + } + }); + return obj; +} + +module.exports = setPositionInside; + +},{}],34:[function(require,module,exports){ +'use strict'; + +/** + * @param {Object} obj + * @param {Object} properties + */ +function setProperties(obj, properties) { + for (var o in properties) { + if (properties.hasOwnProperty(o)) { + Object.defineProperty(obj, o, properties[o]); + } + } +} + +module.exports = setProperties; + +},{}],35:[function(require,module,exports){ +'use strict'; + +function supportsFullscreen() { + + return document.documentElement.requestFullscreen || document.documentElement.webkitRequestFullScreen || document.documentElement.mozRequestFullScreen || document.documentElement.msRequestFullscreen; + +} + +module.exports = supportsFullscreen; + +},{}],36:[function(require,module,exports){ +'use strict'; + +var isFullscreen = require('./is-fullscreen'); +/** + * Toggles the full screen state for passed DOM object + * @param {HTMLElement} elm + */ +function toggleFullscreen(elem) { + if (isFullscreen()) { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } + return; + } + + if (elem.requestFullscreen) { + elem.requestFullscreen(); + } else if (elem.webkitRequestFullScreen) { + elem.webkitRequestFullScreen(); + } else if (elem.mozRequestFullScreen) { + elem.mozRequestFullScreen(); + } else if (elem.msRequestFullscreen) { + elem.msRequestFullscreen(); + } +} + +module.exports = toggleFullscreen; + +},{"./is-fullscreen":30}]},{},[24]); + +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJub3QtdXNlZC1idXQtbmVlZGVkLXN0cmluZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogSGFuZGxlcyAzZCBpbWFnZSBvZiBjYW52YXMgcHJvZHVjdHMuXG4gKiBAcGFyYW0ge2NhbnZhc31cbiAqL1xuZnVuY3Rpb24gVGhyZWVESGFuZGxlcihjYW52YXMpIHtcbiAgICB2YXIgX292ZXJsYXkgPSBuZXcgZmFicmljLkdyb3VwKCk7XG4gICAgdmFyIF9pbWFnZTtcblxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIF9vdmVybGF5XG4gICAgICAgICAgICAuc2V0KHtcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZFdpdGhVcGRhdGUobmV3IGZhYnJpYy5SZWN0KHtcbiAgICAgICAgICAgICAgICAvLyBXaWR0aCBpcyBtYWRlIGJpZ2dlciBhcyB0aGlzIHdvcmtzIGJldHRlciB3aXRoIHJlc2l6aW5nIHRoZSBlZGl0b3JcbiAgICAgICAgICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoICogMixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNhbnZhcy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgZmlsbDogY2FudmFzLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICBjYW52YXMuYWRkKF9vdmVybGF5KTtcbiAgICB9XG5cbiAgICBpbml0KCk7XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgM2QgaW1hZ2UgYnkgcmVtb3ZpbmcgdmlzaWJpbGl0eVxuICAgICAqIEByZXR1cm4ge1RocmVlREhhbmRsZXJ9XG4gICAgICovXG4gICAgdGhpcy5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfb3ZlcmxheS5zZXRWaXNpYmxlKGZhbHNlKS5jYW52YXMucmVzaXplKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSAzZCBpbWFnZSBieSBzZXR0aW5nIHRoZSB3aWR0aCBhbmQgdmlzaWJpbGl0eSBvZiB0aGUgb3ZlcmxheSBhbmQgbW92aW5nIGVsZW1lbnRzIHdoaWNoXG4gICAgICogbmVlZHMgdG8gYmUgdmlzaWJsZSB0byB0aGUgZnJvbnQuXG4gICAgICogQHJldHVybiB7VGhyZWVESGFuZGxlcn1cbiAgICAgKi9cbiAgICB0aGlzLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX292ZXJsYXlcbiAgICAgICAgICAgIC5zZXQoe1xuICAgICAgICAgICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSkuYnJpbmdUb0Zyb250KCk7XG5cbiAgICAgICAgY2FudmFzLmdldEJ1dHRvbk1lbnUoKS5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgY2FudmFzLnJlbmRlckFsbCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIDNkIG1vZGUgaXMgZW5hYmxlZC92aXNpYmxlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuaXNFbmFibGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX292ZXJsYXkudmlzaWJsZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVmcmVzaGVzIHRoZSBpbWFnZS4gVGhpcyBpcyBtb3N0bHkgZG9uZSB1cG9uIHJlc2l6ZSBvZiB0aGUgd2luZG93XG4gICAgICovXG4gICAgdGhpcy5yZWZyZXNoSW1hZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgX292ZXJsYXkuc2V0KHtcbiAgICAgICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYXBwbHlJbWFnZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAoUmUpYWRkcyB0aGUgbmV3L2V4aXN0aW5nIGltYWdlIHdpdGggbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIG92ZXJsYXkuXG4gICAgICogQHBhcmFtIHtpbWd9XG4gICAgICovXG4gICAgdGhpcy5hcHBseUltYWdlID0gZnVuY3Rpb24oaW1nKSB7XG4gICAgICAgIGltZyA9IGltZyB8fCBfaW1hZ2U7XG5cbiAgICAgICAgX292ZXJsYXlcbiAgICAgICAgICAgIC5yZW1vdmUoX2ltYWdlKVxuICAgICAgICAgICAgLmFkZChfaW1hZ2UgPSBjYW52YXMuZ2V0UmVzaXplZEltYWdlKGltZykpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbWFnZSBhbmQgZW5hYmxlcyAzZCBtb2RlLlxuICAgICAqIEBwYXJhbSB7aW1nfVxuICAgICAqIEByZXR1cm4ge1RocmVlREhhbmRsZXJ9XG4gICAgICovXG4gICAgdGhpcy5zZXRJbWFnZSA9IGZ1bmN0aW9uIChpbWcpIHtcbiAgICAgICAgaW1nLnNldCh7XG4gICAgICAgICAgICAvLyBJbWFnZSBzaG91bGQgYmUgYWJvdXQgMjBweCBsb3dlciB0aGFuIHRoZSBjZW50ZXIgKGJlY2F1c2Ugb2YgdGhlIGJ1dHRvbnMpXG4gICAgICAgICAgICB0b3A6IDIwLFxuICAgICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hcHBseUltYWdlKGltZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZSgpO1xuICAgIH07XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUaHJlZURIYW5kbGVyO1xuXG59LHtcIi4vdXRpbFwiOjI1fV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQXBlcnR1cmVIYW5kbGVyIHRha2VzIGNhcmUgb2YgdGhlIGJhcnMgYXJvdW5kIHRoZSBpbWFnZSB0byBzaG93IHdoYXQgYXJlYSBoYXMgYmVlbi93aWxsIGJlIGNyb3BwZWQuXG4gKiBAcGFyYW0ge2NhbnZhc31cbiAqL1xuZnVuY3Rpb24gQXBlcnR1cmVIYW5kbGVyKGNhbnZhcykge1xuICAgIHZhciBfaXRlbXMgPSB7eDogW10sIHk6IFtdfTtcblxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciBib3VuZHMgPSBjYW52YXM7XG4gICAgICAgIHZhciB4UmVjdCA9IG5ldyBmYWJyaWMuUmVjdCh7XG4gICAgICAgICAgICB3aWR0aDogYm91bmRzLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBib3VuZHMuaGVpZ2h0IC8gMixcbiAgICAgICAgICAgIGZpbGw6IGNhbnZhcy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciB5UmVjdCA9IHhSZWN0LmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgIHdpZHRoOiBib3VuZHMud2lkdGggLyAyLFxuICAgICAgICAgICAgaGVpZ2h0OiBib3VuZHMuaGVpZ2h0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF9pdGVtcy54ID0gW10uY29uY2F0KFt4UmVjdCwgeFJlY3QuY2xvbmUoKV0pO1xuICAgICAgICBfaXRlbXMueT0gW10uY29uY2F0KFt5UmVjdCwgeVJlY3QuY2xvbmUoKV0pO1xuXG4gICAgICAgIFtdLmNvbmNhdChfaXRlbXMueCwgX2l0ZW1zLnkpLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIGNhbnZhcy5hZGQobyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XG4gICAgfVxuICAgIGluaXQoKTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgY29uZmlndXJhdGlvbiB0byB0aGUgYXBlcnR1cmVzIGFwZXJ0dXJlcyBvbiB0aGUgdmlld3BvcnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXhpc1xuICAgICAqIEBwYXJhbSB7dmlld3BvcnR9XG4gICAgICovXG4gICAgdGhpcy5hcHBseSA9IGZ1bmN0aW9uIChheGlzLCB2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLmdldEFwZXJ0dXJlcyhheGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICBvLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuZ2V0QXBlcnR1cmVzKGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jyk7XG5cbiAgICAgICAgYWN0aXZlLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIG8udmlzaWJsZSA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFjdGl2ZVswXS53aWR0aD0gYWN0aXZlWzFdLndpZHRoID0gY2FudmFzLndpZHRoO1xuICAgICAgICBhY3RpdmVbMF0uaGVpZ2h0ID0gYWN0aXZlWzFdLmhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG5cbiAgICAgICAgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgICAgICAgYWN0aXZlWzBdLnRvcCA9IHZpZXdwb3J0LnRvcCAtIGFjdGl2ZVswXS5oZWlnaHQgKyAwLjU7XG4gICAgICAgICAgICBhY3RpdmVbMV0udG9wID0gdmlld3BvcnQudG9wICsgdmlld3BvcnQuaGVpZ2h0IC0gMC41O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0aXZlWzBdLmxlZnQgPSB2aWV3cG9ydC5sZWZ0IC0gYWN0aXZlWzBdLndpZHRoICsgMC41O1xuICAgICAgICAgICAgYWN0aXZlWzFdLmxlZnQgPSB2aWV3cG9ydC5sZWZ0ICsgdmlld3BvcnQud2lkdGggLSAwLjU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldEFwZXJ0dXJlcygpLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIG8uc2V0Q29vcmRzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBlcnR1cmVzIG9uIHNwZWNpZmllZCBheGlzLiBJZiBubyBheGlzIGlzIHByb3ZpZGVkLCBib3RoIHggYW5kIHkgYXJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBheGlzXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHRoaXMuZ2V0QXBlcnR1cmVzID0gZnVuY3Rpb24gKGF4aXMpIHtcbiAgICAgICAgcmV0dXJuIGF4aXMgPyBfaXRlbXNbYXhpc10gOiBbXS5jb25jYXQoX2l0ZW1zLngsIF9pdGVtcy55KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0cmFuc3BhcmVuY3kgb2YgdGhlIGFwZXJ0dXJlcyBkZXBlbmRpbmcgb24gdGhlIGNyb3Agc3RhdHVzXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcHBseVxuICAgICAqIEByZXR1cm5zIHtBcGVydHVyZUhhbmRsZXJ9XG4gICAgICovXG4gICAgdGhpcy5zZXRUcmFuc3BhcmVudCA9IGZ1bmN0aW9uIChhcHBseSkge1xuICAgICAgICB0aGlzLmdldEFwZXJ0dXJlcygpLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIG8ub3BhY2l0eSA9IGFwcGx5ID8gMC43IDogMTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FudmFzLnJlbmRlckFsbCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEFwZXJ0dXJlSGFuZGxlcjtcblxufSx7fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBUZXh0QnV0dG9uID0gcmVxdWlyZSgnLi9UZXh0QnV0dG9uJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgbWVudSB3aXRoIHRleHQtYnV0dG9ucyBzZXR0aW5ncyBwcm92aWRlZC4gU2V0dGluZ3Mgd2lsbCBvdmVycmlkZVxuICogdGhlIGRlZmF1bHRzIGZyb20gdGhlIGNvbmZpZyBmaWxlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjYW52YXNcbiAqIEBwYXJhbSB7T2JqZWN0PX0gc2V0dGluZ3NcbiAqL1xuZnVuY3Rpb24gQnV0dG9uTWVudShjYW52YXMsIHNldHRpbmdzKSB7XG4gICAgdmFyIF90ZXh0QnV0dG9ucyA9IFtdO1xuICAgIHZhciBfd2lkdGggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggb2YgYWxsIGNvbnRhaW5lZCBpdGVtc1xuICAgICAqIEByZXR1cm4ge051bWJlcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRXaWR0aCgpIHtcbiAgICAgICAgdmFyIHN0YXJ0V2lkdGggPSAwO1xuICAgICAgICBfdGV4dEJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbih0ZXh0QnV0dG9uKSB7XG4gICAgICAgICAgICBzdGFydFdpZHRoICs9IHRleHRCdXR0b24ud2lkdGg7XG4gICAgICAgIH0pO1xuICAgICAgICBfd2lkdGggPSBzdGFydFdpZHRoICs9IHNldHRpbmdzLm1hcmdpbiAqIChfdGV4dEJ1dHRvbnMubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBpdGVtcyB0byB0aGUgYnV0dG9uLW1lbnUuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSB0ZXh0XG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgICogQHJldHVybiB7QnV0dG9uTWVudX1cbiAgICAgKi9cbiAgICB0aGlzLmFkZEl0ZW0gPSBmdW5jdGlvbihpZCwgdGV4dCwgY2FsbGJhY2ssIGlzQWN0aXZlKSB7XG4gICAgICAgIF90ZXh0QnV0dG9ucy5wdXNoKFxuICAgICAgICAgICAgbmV3IFRleHRCdXR0b24oaWQsIHRleHQsIHNldHRpbmdzLCBpc0FjdGl2ZSlcbiAgICAgICAgICAgICAgICAub25DbGljayhjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAuc2V0KHtfX2dyb3VwOiB0aGlzfSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJpbmdzIHRoZSBidXR0b25zIHRvIHRoZSBmcm9udCBpbnNpZGUgdGhlIGNhbnZhc1xuICAgICAqIEByZXR1cm4ge0J1dHRvbk1lbnV9XG4gICAgICovXG4gICAgdGhpcy5icmluZ1RvRnJvbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgX3RleHRCdXR0b25zLmZvckVhY2goZnVuY3Rpb24odGV4dEJ1dHRvbikge1xuICAgICAgICAgICAgdGV4dEJ1dHRvbi5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBidXR0b25zIGluc2lkZSB0aGUgbWVudS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLmdldEl0ZW1zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfdGV4dEJ1dHRvbnM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIGJ1dHRvbk1lbnUuXG4gICAgICogQHJldHVybiB7TnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuZ2V0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF93aWR0aDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYnV0dG9uIHdpdGggaWQ9YnV0dG9uSWQgdG8gYWN0aXZlL25vdCBhY3RpdmUgbW9kZVxuICAgICAqL1xuICAgIHRoaXMuc2V0QnV0dG9uQWN0aXZlID0gZnVuY3Rpb24oYnV0dG9uSWQsIGlzQWN0aXZlKSB7XG4gICAgICAgIF90ZXh0QnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgICAgICAgIGlmIChidXR0b24uZ2V0SWQoKSA9PT0gYnV0dG9uSWQpIHtcbiAgICAgICAgICAgICAgICBidXR0b24uc2V0QWN0aXZlKGlzQWN0aXZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJ1dHRvbiB3aXRoIGlkPWJ1dHRvbklkIHRvIGRpc2FibGVkL2VuYWJsZWQgbW9kZVxuICAgICAqL1xuICAgIHRoaXMuc2V0QnV0dG9uRGlzYWJsZWQgPSBmdW5jdGlvbihidXR0b25JZCwgaXNEaXNhYmxlZCkge1xuICAgICAgICBfdGV4dEJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoYnV0dG9uKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLmdldElkKCkgPT09IGJ1dHRvbklkKSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uLnNldERpc2FibGVkKGlzRGlzYWJsZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIGJ1dHRvbnNcbiAgICAgKi9cbiAgICB0aGlzLmhpZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgX3RleHRCdXR0b25zLmZvckVhY2goZnVuY3Rpb24odGV4dEJ1dHRvbikge1xuICAgICAgICAgICAgdGV4dEJ1dHRvbi5zZXQoe1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhbGwgdGhlIGJ1dHRvbnNcbiAgICAgKi9cbiAgICB0aGlzLnNob3cgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgX3RleHRCdXR0b25zLmZvckVhY2goZnVuY3Rpb24odGV4dEJ1dHRvbikge1xuICAgICAgICAgICAgdGV4dEJ1dHRvbi5zZXQoe1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGUgYm91bmRhcmllcyBhbmQgYWRkIGFsbCBpdGVtcyB0byBjYW52YXMgaWYgcmVxdWlyZWRcbiAgICAgKiBAcmV0dXJuIHtCdXR0b25NZW51fVxuICAgICAqL1xuICAgIHRoaXMucmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldFdpZHRoKCk7XG5cbiAgICAgICAgdmFyIHN0YXJ0ID0gY2FudmFzLndpZHRoIC8gMiAtIHRoaXMuZ2V0V2lkdGgoKSAvIDI7XG4gICAgICAgIHZhciBjdXJyUG9zID0gTWF0aC5yb3VuZChzdGFydCk7XG5cbiAgICAgICAgX3RleHRCdXR0b25zLmZvckVhY2goZnVuY3Rpb24odGV4dEJ1dHRvbikge1xuICAgICAgICAgICAgdGV4dEJ1dHRvblxuICAgICAgICAgICAgICAgIC5zZXQoe1xuICAgICAgICAgICAgICAgICAgICB0b3A6IDEwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBjdXJyUG9zXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc2V0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgIGlmICghdGV4dEJ1dHRvbi5jYW52YXMpIHtcbiAgICAgICAgICAgICAgICB0ZXh0QnV0dG9uLmFkZFRvKGNhbnZhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyUG9zICs9IE1hdGgucm91bmQodGV4dEJ1dHRvbi53aWR0aCArIHNldHRpbmdzLm1hcmdpbik7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgbW92aW5nIG9mIHRleHQtYnV0dG9uc1xuICAgICAgICAgICAgdGV4dEJ1dHRvbi5sb2NrTW92ZW1lbnRYID0gdGV4dEJ1dHRvbi5sb2NrTW92ZW1lbnRZID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FudmFzLnJlbmRlckFsbCgpO1xuXG4gICAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnV0dG9uTWVudTtcblxufSx7XCIuL1RleHRCdXR0b25cIjoxNCxcIi4vY29uZmlnXCI6MTYsXCIuL3V0aWxcIjoyNX1dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG52YXIgQXBlcnR1cmVIYW5kbGVyID0gcmVxdWlyZSgnLi9BcGVydHVyZUhhbmRsZXInKTtcbnZhciBCdXR0b25NZW51ID0gcmVxdWlyZSgnLi9CdXR0b25NZW51Jyk7XG52YXIgRHJhZ2JhckhhbmRsZXIgPSByZXF1aXJlKCcuL0RyYWdiYXJIYW5kbGVyJyk7XG52YXIgVmlld3BvcnQgPSByZXF1aXJlKCcuL1ZpZXdwb3J0Jyk7XG52YXIgVGhyZWVESGFuZGxlciA9IHJlcXVpcmUoJy4vM2RIYW5kbGVyJyk7XG52YXIgTWlycm9ySGFuZGxlciA9IHJlcXVpcmUoJy4vTWlycm9ySGFuZGxlcicpO1xudmFyIEltYWdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL0ltYWdlRGF0YUhhbmRsZXInKTtcblxudmFyICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuXG4vKipcbiAqIENhbnZhcyBpcyB1c2luZyBmYWJyaWMgdG8gY3JlYXRlIHRoZSBjYW52YXMgYW5kIGluaXRpYXRlIGl0IHdpdGggaXRzIGluaXRpYWwgc2V0dGluZ3MuXG4gKiBJdCBpcyBhbHNvIGhlcmUgbW9zdCBvZiB0aGUgaW50ZXJhY3Rpb24gaXMgdGFraW5nIHBsYWNlLiBBbmQgbW9zdCBmaWxlcyBhcmUgY29ubmVjdGVkIHRvIHRoaXMgZmlsZS5cbiAqIEZlLiBnZXREcmFnYmFycyBtZXRob2QgY2FuIGJlIGNhbGxlZCBmcm9tIG1vc3QgcGxhY2VzIGFzIHRoZSBDYW52YXMgY2xhc3MgaXMgYXZhaWxhYmxlIGluIG1vc3QgcGxhY2VzLlxuICovXG52YXIgQ2FudmFzID0gZmFicmljLnV0aWwuY3JlYXRlQ2xhc3MoZmFicmljLkNhbnZhcywge1xuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uIChpZCwgZGltZW5zaW9ucykge1xuICAgICAgICB0aGlzLmNhbGxTdXBlcignaW5pdGlhbGl6ZScsIGlkLCB7XG4gICAgICAgICAgICBlbmFibGVSZXRpbmFTY2FsaW5nOiB0cnVlLFxuICAgICAgICAgICAgcmVuZGVyT25BZGRSZW1vdmU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gQWxsb3cgdG91Y2ggc2Nyb2xsaW5nIG9uIHRvdWNoLWRldmljZXMgbGFyZ2VyIHRoYW4gbW9iaWxlIHNjcmVlbiBzaXplcy5cbiAgICAgICAgICAgIGFsbG93VG91Y2hTY3JvbGxpbmc6ICF1dGlsLmlzTW9iaWxlKCksXG4gICAgICAgICAgICBzdGF0ZWZ1bDogZmFsc2UsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZDJkMmQyJyxcbiAgICAgICAgICAgIHByZXNlcnZlT2JqZWN0U3RhY2tpbmc6IHRydWUsXG4gICAgICAgICAgICBzZWxlY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IGRpbWVuc2lvbnMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGRpbWVuc2lvbnMuaGVpZ2h0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV2ZW50aGFuZGxlciBmb3IgbW91c2V1cCBldmVudHMgb24gdGhlIHdob2xlIGNhbnZhcy5cbiAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmV3cml0dGVuIGEgYml0IHRvIG5vdCBoYXZlIHRoYXQgbWFueSBldmVudHMgYWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuIGNyb3BwZWQuXG4gICAgICAgIHRoaXMub24oJ21vdXNlOnVwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SW1hZ2UoKS5fX2RyYWdnZWQgJiYgIXRoaXMuZ2V0M2RIYW5kbGVyKCkuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFwZXJ0dXJlcygpLnNldFRyYW5zcGFyZW50KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0SW1hZ2VEYXRhKCkuc2V0Q3JvcERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGV2ZW50IHRvIHRlbGwgdGhlIGltYWdlIGhhcyBiZWVuIGRyYWdnZWQuXG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnRyaWdnZXIoJ1BJRTpkcmFnZ2VkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlckFsbCgpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzaXplOiBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICBhcmdzID0gYXJncyB8fCB7IGhlaWdodDogdGhpcy5oZWlnaHQsIHdpZHRoOiB0aGlzLndpZHRofTtcblxuICAgICAgICB0aGlzLnNldEhlaWdodChhcmdzLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2V0V2lkdGgoYXJncy53aWR0aCk7XG4gICAgICAgIHRoaXMuZ2V0QnV0dG9uTWVudSgpLnJlbmRlcigpO1xuICAgICAgICBpZiAodGhpcy5nZXQzZEhhbmRsZXIoKS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5nZXQzZEhhbmRsZXIoKS5yZWZyZXNoSW1hZ2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEltYWdlKHRoaXMuZ2V0UmVzaXplZEltYWdlKHRoaXMuZ2V0SW1hZ2UoKSkpXG4gICAgICAgICAgICB0aGlzLmdldFZpZXdwb3J0KCkucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRUb0JhY2sodGhpcy5nZXRJbWFnZSgpKTtcbiAgICAgICAgdGhpcy5nZXREcmFnYmFycygpLnJlc2V0UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5yZW5kZXJBbGwoKTtcbiAgICB9LFxuXG4gICAgZGlzYWJsZVNjcm9sbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGFsbG93VG91Y2hTY3JvbGxpbmc6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgZW5hYmxlU2Nyb2xsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXQoe1xuICAgICAgICAgICAgYWxsb3dUb3VjaFNjcm9sbGluZzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGdldDNkSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX18zZEhhbmRsZXIgfHxcbiAgICAgICAgICAodGhpcy5fXzNkSGFuZGxlciA9IG5ldyBUaHJlZURIYW5kbGVyKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldDNkVXJsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbWFnZURhdGEgPSB0aGlzLmdldEltYWdlRGF0YSgpLmdldERhdGEoKTtcbiAgICAgICAgdmFyIHBhcmFtcyA9IFtcbiAgICAgICAgICAgICdoPTQwMCcsXG4gICAgICAgICAgICAnY2FudmFzW2VkZ2VdPScgKyBpbWFnZURhdGEuZWRnZSxcbiAgICAgICAgICAgICdjcm9wW3ddPScgKyBpbWFnZURhdGEud2lkdGgsXG4gICAgICAgICAgICAnY3JvcFtoXT0nICsgaW1hZ2VEYXRhLmhlaWdodCxcbiAgICAgICAgICAgICdjcm9wW3hdPScgKyBpbWFnZURhdGEueCxcbiAgICAgICAgICAgICdjcm9wW3ldPScgKyBpbWFnZURhdGEueSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoaW1hZ2VEYXRhLm1pcnJvcmVkKSB7XG4gICAgICAgICAgICBwYXJhbXMucHVzaCgnbWlycm9yPTEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEltYWdlKCkuX191cmwucmVwbGFjZSgvXFw/aD1cXGQrJC8sICc/JykgKyBwYXJhbXMuam9pbignJicpO1xuICAgIH0sXG5cbiAgICBnZXRBcGVydHVyZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19hcGVydHVyZWhhbmRsZXIgfHxcbiAgICAgICAgICAgICh0aGlzLl9fYXBlcnR1cmVoYW5kbGVyID0gbmV3IEFwZXJ0dXJlSGFuZGxlcih0aGlzKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMge0RyYWdiYXJIYW5kbGVyfVxuICAgICAqL1xuICAgIGdldERyYWdiYXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZHJhZ2JhcnMgfHxcbiAgICAgICAgICAgICh0aGlzLl9fZHJhZ2JhcnMgPSBuZXcgRHJhZ2JhckhhbmRsZXIodGhpcykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtmYWJyaWMuSW1hZ2V9XG4gICAgICovXG4gICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19pbWFnZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7TWlycm9ySGFuZGxlcn1cbiAgICAgKi9cbiAgICBnZXRNaXJyb3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19taXJyb3IgfHxcbiAgICAgICAgICAgICh0aGlzLl9fbWlycm9yID0gbmV3IE1pcnJvckhhbmRsZXIodGhpcy5nZXRJbWFnZSgpKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge01pcnJvckhhbmRsZXJ9XG4gICAgICovXG4gICAgZ2V0SW1hZ2VEYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9faW1hZ2VEYXRhIHx8XG4gICAgICAgICAgICAodGhpcy5fX2ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGFIYW5kbGVyKHRoaXMuZ2V0SW1hZ2UoKSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWaWV3cG9ydH1cbiAgICAgKi9cbiAgICBnZXRWaWV3cG9ydDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3ZpZXdwb3J0IHx8XG4gICAgICAgICAgICAodGhpcy5fX3ZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KHRoaXMpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWVudSBmb3IgdGhpcyBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCdXR0b25NZW51fVxuICAgICAqL1xuICAgIGdldEJ1dHRvbk1lbnU6IGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAgICAgICBpZiAoIXRoaXMuX19idXR0b25NZW51KSB7XG4gICAgICAgICAgICB2YXIgZGVmYXVsdHMgPSBjb25maWcuYnV0dG9uTWVudVt0aGlzLl9fdHlwZV07XG4gICAgICAgICAgICB0aGlzLl9fYnV0dG9uTWVudSA9IG5ldyBCdXR0b25NZW51KHRoaXMsICQuZXh0ZW5kKHt9LCBkZWZhdWx0cywgc2V0dGluZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fX2J1dHRvbk1lbnU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbG9hZHMgdGhlIDNEIHZpZXcsIGlmIGl0IGlzIHByZXNlbnRcbiAgICAgKiBAcmV0dXJuIHtDYW52YXN9XG4gICAgICovXG4gICAgcmVmcmVzaDNkVmlldzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5nZXQzZEhhbmRsZXIoKS5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGUzRCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Q2FudmFzfVxuICAgICAqL1xuICAgIHJlbW92ZUltYWdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fX2ltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9faW1hZ2VEYXRhID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlKHRoaXMuX19pbWFnZSk7XG4gICAgfSxcblxuICAgIHJlZnJlc2hJbWFnZTogZnVuY3Rpb24oaW1nKSB7XG4gICAgICAgIHRoaXMuX19pbWFnZSA9IGltZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2ZhYnJpYy5JbWFnZX0gaW1nXG4gICAgICogQHJldHVybiB7Q2FudmFzfVxuICAgICAqL1xuICAgIHNldEltYWdlOiBmdW5jdGlvbiAoaW1nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlSW1hZ2UoKTtcbiAgICAgICAgdGhpcy5fX2ltYWdlID0gaW1nO1xuICAgICAgICB0aGlzLl9faW1hZ2UuX19kcmFnZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX19pbWFnZS5fX2Nyb3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fX2ltYWdlLmFkZFRvKHRoaXMpLmNlbnRlcigpLm9uKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpbWcuY2FudmFzLmdldEFwZXJ0dXJlcygpLnNldFRyYW5zcGFyZW50KHRydWUpO1xuICAgICAgICB9KS5zZXRDb29yZHMoKTtcbiAgICAgICAgdGhpcy5nZXRWaWV3cG9ydCgpLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBnZXRSZXNpemVkSW1hZ2U6IGZ1bmN0aW9uKGltZykge1xuICAgICAgICAvLyBDYWxjdWxhdGUgbWF4SGVpZ2h0IGFuZCBtYXhXaWR0aCBvZiB0aGUgM2QgaW1hZ2VcbiAgICAgICAgLy8gYW5kIHNjYWxlIHRoZSBpbWFnZSBhY2NvcmluZyB0byB0aG9zZSB2YWx1ZXNcbiAgICAgICAgdmFyIG1heEhlaWdodCA9IHRoaXMuZ2V0SGVpZ2h0KCkgLSAxMDA7XG4gICAgICAgIHZhciBtYXhXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKSAtIDEwMDtcblxuICAgICAgICBpbWcuc2NhbGVUb0hlaWdodChtYXhIZWlnaHQgPCBpbWcuaGVpZ2h0ID8gbWF4SGVpZ2h0IDogaW1nLmhlaWdodCk7XG4gICAgICAgIGltZy5zY2FsZVRvV2lkdGgobWF4V2lkdGggPCAoaW1nLndpZHRoICogaW1nLnNjYWxlWCkgPyBtYXhXaWR0aCA6IGltZy53aWR0aCAqIGltZy5zY2FsZVgpO1xuXG4gICAgICAgIHJldHVybiBpbWc7XG4gICAgfSxcblxuICAgIHRvZ2dsZTNEOiBmdW5jdGlvbiAoc2hvd0FzM2QpIHtcblxuICAgICAgICB0aGlzLmdldEJ1dHRvbk1lbnUoKS5zZXRCdXR0b25BY3RpdmUoJ3RvZ2dsZTNkJywgc2hvd0FzM2QpO1xuXG4gICAgICAgIGlmICghc2hvd0FzM2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDNkSGFuZGxlcigpLmRpc2FibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRkb2N1bWVudC50cmlnZ2VyKCdQSUU6aW1hZ2Utc3RhcnQtbG9hZCcpO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHRoaXMuZ2V0M2RVcmwoKSxcbiAgICAgICAgICAgIGNyb3NzRG9tYWluOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogXCJIRUFEXCIsXG4gICAgICAgICAgICBjYWNoZTogdHJ1ZSxcbiAgICAgICAgfSkuZG9uZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZhYnJpYy5JbWFnZS5mcm9tVVJMKGVuY29kZVVSSSh0aGlzLmdldDNkVXJsKCkpLCBmdW5jdGlvbiAoaW1nKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbWcuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50LnRyaWdnZXIoJ1BJRTppbWFnZS1lcnJvci1sb2FkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmdldDNkSGFuZGxlcigpLnNldEltYWdlKGltZyk7XG4gICAgICAgICAgICAgICAgJGRvY3VtZW50LnRyaWdnZXIoJ1BJRTppbWFnZS1lbmQtbG9hZCcpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzO1xuXG59LHtcIi4vM2RIYW5kbGVyXCI6MSxcIi4vQXBlcnR1cmVIYW5kbGVyXCI6MixcIi4vQnV0dG9uTWVudVwiOjMsXCIuL0RyYWdiYXJIYW5kbGVyXCI6NixcIi4vSW1hZ2VEYXRhSGFuZGxlclwiOjEwLFwiLi9NaXJyb3JIYW5kbGVyXCI6MTIsXCIuL1ZpZXdwb3J0XCI6MTUsXCIuL2NvbmZpZ1wiOjE2LFwiLi91dGlsXCI6MjV9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgRHJhZ0hhbmRsZSA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgdmFyIF9jdXJyZW50QXhpcztcbiAgICB2YXIgX2RyYWdIYW5kbGU7XG4gICAgdmFyIF9tb3ZlZEhhbmRsZTtcblxuICAgIC8vIEV2ZW50IGRlY2xhcmF0aW9uc1xuICAgIHZhciBldmVudHMgPSB7XG4gICAgICAgIG1vdXNlRG93bjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX2RyYWdIYW5kbGUgPSB0cnVlO1xuXG4gICAgICAgICAgICBfY3VycmVudEF4aXMgPSB0aGlzLmF4aXM7XG4gICAgICAgICAgICBoYW5kbGVyLmNhbnZhcy5nZXRJbWFnZSgpLnRyaWdnZXIoJ21vdXNlZG93bicpO1xuICAgICAgICB9LFxuICAgICAgICBtb3VzZVVwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIV9kcmFnSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIV9tb3ZlZEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ1BJRTpkcmFnYmFyLWNsaWNrJywgeyBheGlzOiBfY3VycmVudEF4aXMgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9kcmFnSGFuZGxlID0gZmFsc2U7XG4gICAgICAgICAgICBfbW92ZWRIYW5kbGUgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jdXJyZW50QXhpcyA9IG51bGw7XG4gICAgICAgICAgICB1dGlsLk1vdXNlTWV0cmljcy5kZWxldGVQcmV2aW91c01vdXNlRGF0YSgpO1xuICAgICAgICAgICAgaGFuZGxlci5jYW52YXMuZ2V0SW1hZ2UoKS50cmlnZ2VyKCdtb3VzZXVwJyk7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlTW92ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICghX2RyYWdIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlJ3JlIHVzaW5nIGEgcG9seWZpbGwgdG8gY2FsY3VsYXRlIG1vdWRlL3RvdWNoIG1vdmVtZW50IGlmIHRoZSBicm93c2VyL2RldmljZVxuICAgICAgICAgICAgLy8gZG9lcyBub3Qgc3VwcG9ydCBtb3ZlbWVudFgvbW92ZW1lbnRZLlxuICAgICAgICAgICAgdmFyIHByZXZpb3VzTW91c2VEYXRhID0gdXRpbC5Nb3VzZU1ldHJpY3MucHJldmlvdXNNb3VzZURhdGE7XG4gICAgICAgICAgICB2YXIgbW92ZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgeDogJ21vdmVtZW50WCcgaW4gZS5lID8gZS5lLm1vdmVtZW50WCA6IChwcmV2aW91c01vdXNlRGF0YS54ID8gZS5lLnBhZ2VYIC0gcHJldmlvdXNNb3VzZURhdGEueCA6IDApLFxuICAgICAgICAgICAgICAgIHk6ICdtb3ZlbWVudFknIGluIGUuZSA/IGUuZS5tb3ZlbWVudFkgOiAocHJldmlvdXNNb3VzZURhdGEueSA/IGUuZS5wYWdlWSAtIHByZXZpb3VzTW91c2VEYXRhLnkgOiAwKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHV0aWwuTW91c2VNZXRyaWNzLnNldFByZXZpb3VzTW91c2VEYXRhKHt4OiBlLmUucGFnZVgsIHk6IGUuZS5wYWdlWX0pO1xuICAgICAgICAgICAgX21vdmVkSGFuZGxlID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKF9jdXJyZW50QXhpcyA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5jYW52YXMuZ2V0SW1hZ2UoKS5sZWZ0IC09IG1vdmVtZW50Lng7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FudmFzLmdldEltYWdlKCkudG9wIC09IG1vdmVtZW50Lnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIG1vdmluZyBmb3IgaW1hZ2UsIHRvIHN0YXkgd2l0aGluIGJvdW5kc1xuICAgICAgICAgICAgaGFuZGxlci5jYW52YXMuZ2V0SW1hZ2UoKS5zZXRDb29yZHMoKS50cmlnZ2VyKCdtb3ZpbmcnKTtcbiAgICAgICAgICAgIGhhbmRsZXIuY2FudmFzLnJlbmRlckFsbCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldFJlY3QodGV4dCwgd2lkdGgpIHtcbiAgICAgICAgdmFyIHR4dCA9IG5ldyBmYWJyaWMuVGV4dCh0ZXh0LCBjb25maWcuZHJhZ0hhbmRsZS50ZXh0KTtcbiAgICAgICAgdmFyIHJlY3QgPSBuZXcgZmFicmljLlJlY3QoJC5leHRlbmQoe30sIGNvbmZpZy5kcmFnSGFuZGxlLnJlY3QsIHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBuZXcgZmFicmljLkdyb3VwKFtyZWN0LCB0eHRdKS5zZXQoe1xuICAgICAgICAgICAgZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0Q2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlci5jYW52YXM7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0SGFuZGxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9faGFuZGxlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdCh0aGlzLl9faGFuZGxlcy54LCB0aGlzLl9faGFuZGxlcy55KTtcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRIYW5kbGVQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9faGFuZGxlcy55LnNldCh7bGVmdDogaGFuZGxlci5nZXRUcmFja3MoKS55LmxlZnR9KS5zZXRDb29yZHMoKTtcbiAgICAgICAgdGhpcy5fX2hhbmRsZXMueC5zZXQoe3RvcDogaGFuZGxlci5nZXRUcmFja3MoKS54LnRvcH0pLnNldENvb3JkcygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmlld3BvcnREYXRhID0gdGhpcy5nZXRDYW52YXMoKS5nZXRWaWV3cG9ydCgpLmdldERhdGEoKTtcbiAgICAgICAgdmFyIHRyYWNrcyA9IGhhbmRsZXIuZ2V0VHJhY2tzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX19oYW5kbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmdldENhbnZhcygpLnJlbW92ZSh0aGlzLl9faGFuZGxlcy54KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FudmFzKCkucmVtb3ZlKHRoaXMuX19oYW5kbGVzLnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX2hhbmRsZXMgPSB7XG4gICAgICAgICAgICB4OiBnZXRSZWN0KHZpZXdwb3J0RGF0YS5kaW0ud2lkdGggKyAnICcgKyB2aWV3cG9ydERhdGEuZGltLnVuaXRzLCB2aWV3cG9ydERhdGEud2lkdGgpLFxuICAgICAgICAgICAgeTogZ2V0UmVjdCh2aWV3cG9ydERhdGEuZGltLmhlaWdodCArICcgJyArIHZpZXdwb3J0RGF0YS5kaW0udW5pdHMsIHZpZXdwb3J0RGF0YS5oZWlnaHQpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2hhbmRsZXMueC5hZGRUbyh0aGlzLmdldENhbnZhcygpKS5jZW50ZXJIKCkuc2V0KHsgdG9wOiB0cmFja3MueC50b3AgfSkuc2V0Q29vcmRzKCk7XG4gICAgICAgIHRoaXMuX19oYW5kbGVzLnkuYWRkVG8odGhpcy5nZXRDYW52YXMoKSlcbiAgICAgICAgICAgIC5zZXRBbmdsZSgtOTApXG4gICAgICAgICAgICAuY2VudGVyVigpLnNldCh7IGxlZnQ6IHRyYWNrcy55LmxlZnQgfSlcbiAgICAgICAgICAgIC5zZXRDb29yZHMoKTtcblxuICAgICAgICB0aGlzLmdldENhbnZhcygpXG4gICAgICAgICAgICAub24oJ21vdXNlOm1vdmUnLCBldmVudHMubW91c2VNb3ZlKVxuICAgICAgICAgICAgLm9uKCdtb3VzZTp1cCcsIGV2ZW50cy5tb3VzZVVwKTtcblxuICAgICAgICB0cmFja3MueC5vbignbW91c2Vkb3duJywgZXZlbnRzLm1vdXNlRG93bi5iaW5kKHRyYWNrcy54KSk7XG4gICAgICAgIHRyYWNrcy55Lm9uKCdtb3VzZWRvd24nLCBldmVudHMubW91c2VEb3duLmJpbmQodHJhY2tzLnkpKTtcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnSGFuZGxlO1xuXG59LHtcIi4vY29uZmlnXCI6MTYsXCIuL3V0aWxcIjoyNX1dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRHJhZ0hhbmRsZSA9IHJlcXVpcmUoJy4vRHJhZ0hhbmRsZScpO1xudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG5cbmZ1bmN0aW9uIERyYWdiYXJIYW5kbGVyKGNhbnZhcykge1xuICAgIHZhciBfZHJhZ2JhcnMgPSB7XG4gICAgICAgIHg6IG51bGwsXG4gICAgICAgIHk6IG51bGxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7RHJhZ2JhckhhbmRsZXJ9XG4gICAgICovXG4gICAgdGhpcy5hcHBseSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFjYW52YXMuX19oYXNEcmFnYmFycykge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICBjYW52YXMuX19oYXNEcmFnYmFycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9faGFuZGxlcykge1xuICAgICAgICAgICAgdGhpcy5fX2hhbmRsZXMgPSBuZXcgRHJhZ0hhbmRsZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19oYW5kbGVzLmluaXQoKTtcblxuICAgICAgICB0aGlzLmJyaW5nVG9Gcm9udCgpO1xuXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuXG4gICAgdGhpcy5icmluZ1RvRnJvbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgW10uY29uY2F0KF9kcmFnYmFycy54LCBfZHJhZ2JhcnMueSkuZm9yRWFjaChmdW5jdGlvbiAoZHJhZ2Jhcikge1xuICAgICAgICAgICAgZHJhZ2Jhci5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fX2hhbmRsZXMuZ2V0SGFuZGxlcygpLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICAgICAgaGFuZGxlLmJyaW5nVG9Gcm9udCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBkcmFnYmFycyBmcm9tIGNhbnZhc1xuICAgICAqL1xuICAgIHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbnZhc1xuICAgICAgICAgICAgLnJlbW92ZShfZHJhZ2JhcnMueClcbiAgICAgICAgICAgIC5yZW1vdmUoX2RyYWdiYXJzLnkpXG4gICAgICAgICAgICAucmVuZGVyQWxsKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFRyYWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9kcmFnYmFycztcbiAgICB9O1xuXG4gICAgdGhpcy5yZXNldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghX2RyYWdiYXJzLnkgfHwgIV9kcmFnYmFycy54KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIF9kcmFnYmFycy55LnNldCh7XG4gICAgICAgICAgICBsZWZ0OiBjYW52YXMud2lkdGggLSAzMCxcbiAgICAgICAgICAgIGhlaWdodDogY2FudmFzLmdldEltYWdlKCkuaGVpZ2h0ICogY2FudmFzLmdldEltYWdlKCkuc2NhbGVZLFxuICAgICAgICB9KS5zZXRDb29yZHMoKTtcblxuICAgICAgICBfZHJhZ2JhcnMueC5zZXQoe1xuICAgICAgICAgICAgdG9wOiBjYW52YXMuaGVpZ2h0IC0gMzAsXG4gICAgICAgICAgICB3aWR0aDogY2FudmFzLmdldEltYWdlKCkud2lkdGggKiBjYW52YXMuZ2V0SW1hZ2UoKS5zY2FsZVksXG4gICAgICAgIH0pLnNldENvb3JkcygpO1xuXG4gICAgICAgIHRoaXMuX19oYW5kbGVzLnNldEhhbmRsZVBvc2l0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RyYWdiYXJIYW5kbGVyfVxuICAgICAqL1xuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgIF9kcmFnYmFycy54ID0gbmV3IGZhYnJpYy5SZWN0KCQuZXh0ZW5kKHt9LCBjb25maWcuZHJhZ0Jhciwge1xuICAgICAgICAgICAgYXhpczogJ3gnLFxuICAgICAgICAgICAgd2lkdGg6IGNhbnZhcy5nZXRJbWFnZSgpLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuZHJhZ0Jhci5zaXplLFxuICAgICAgICAgICAgbG9ja01vdmVtZW50WTogdHJ1ZSxcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgICAgICBob3ZlckN1cnNvcjogJ2V3LXJlc2l6ZScsXG4gICAgICAgICAgICBtb3ZlQ3Vyc29yOiAnZXctcmVzaXplJyxcbiAgICAgICAgfSkpXG4gICAgICAgICAgICAuYWRkVG8oY2FudmFzKVxuICAgICAgICAgICAgLmNlbnRlckgoKS5zZXQoeyB0b3A6IGNhbnZhcy5oZWlnaHQgLSAzMCB9KS5zZXRDb29yZHMoKTtcblxuICAgICAgICBfZHJhZ2JhcnMueSA9IG5ldyBmYWJyaWMuUmVjdCgkLmV4dGVuZCh7fSwgY29uZmlnLmRyYWdCYXIsIHtcbiAgICAgICAgICAgIGF4aXM6ICd5JyxcbiAgICAgICAgICAgIHdpZHRoOiBjb25maWcuZHJhZ0Jhci5zaXplLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXMuZ2V0SW1hZ2UoKS5oZWlnaHQsXG4gICAgICAgICAgICBsb2NrTW92ZW1lbnRYOiB0cnVlLFxuICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhvdmVyQ3Vyc29yOiAnbnMtcmVzaXplJyxcbiAgICAgICAgICAgIG1vdmVDdXJzb3I6ICducy1yZXNpemUnLFxuICAgICAgICB9KSlcbiAgICAgICAgICAgIC5hZGRUbyhjYW52YXMpXG4gICAgICAgICAgICAuc2V0KHsgbGVmdDogY2FudmFzLndpZHRoIC0gMzAgfSkuc2V0Q29vcmRzKCk7XG5cbiAgICAgICAgY2FudmFzLmdldEltYWdlKCkub24oJ21vdmluZycsIHRoaXMuc3luYyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0RyYWdiYXJIYW5kbGVyfVxuICAgICAqL1xuICAgIHRoaXMuc3luYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX2RyYWdiYXJzLnguc2V0KHtsZWZ0OiBjYW52YXMuZ2V0SW1hZ2UoKS5sZWZ0fSkuc2V0Q29vcmRzKCk7XG4gICAgICAgIF9kcmFnYmFycy55LnNldCh7dG9wOiBjYW52YXMuZ2V0SW1hZ2UoKS50b3B9KS5zZXRDb29yZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnYmFySGFuZGxlcjtcblxufSx7XCIuL0RyYWdIYW5kbGVcIjo1LFwiLi9jb25maWdcIjoxNn1dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7ZmFicmljLkltYWdlfSBpbWdcbiAqIEBwYXJhbSB7ZmFicmljLlJlY3R9IGJvdW5kaW5nUmVjdFxuICovXG5mdW5jdGlvbiBEcmFnZ2FibGUoaW1nLCBib3VuZGluZ1JlY3QpIHtcbiAgICB2YXIgX2JvdW5kcyA9IGJvdW5kaW5nUmVjdDtcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIHdoZW4gb2JqZWN0IGlzIG1vdmVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3ZlKCkge1xuICAgICAgICB0aGlzLl9fZHJhZ2dlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jYW52YXMuZGlzYWJsZVNjcm9sbCgpO1xuXG4gICAgICAgIHV0aWwuc2V0UG9zaXRpb25JbnNpZGUodGhpcywgX2JvdW5kcyk7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIG9uTW92ZSBldmVudCB0byBpbWFnZVxuICAgIGltZy5vbignbW92aW5nJywgb25Nb3ZlKTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge2ZhYnJpYy5SZWN0fSBsb2NhbEJvdW5kaW5nUmVjdFxuICAgICAqIEByZXR1cm4ge0RyYWdnYWJsZX1cbiAgICAgKi9cbiAgICB0aGlzLmVuYWJsZSA9IGZ1bmN0aW9uIChsb2NhbEJvdW5kaW5nUmVjdCkge1xuICAgICAgICBpZiAobG9jYWxCb3VuZGluZ1JlY3QpIHtcbiAgICAgICAgICAgIF9ib3VuZHMgPSBsb2NhbEJvdW5kaW5nUmVjdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEBUT0RPIFJlZmFjdG9yIHRoaXMsIHNlZSBWaWV3cG9ydC5jYWxjTWluTWF4Qm91bmRzRm9yUmVjdFxuICAgICAgICBpZiAoaW1nLmNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldERhdGEoKS5heGlzID09PSAneCcpIHtcbiAgICAgICAgICAgIF9ib3VuZHMudG9wLm1pbiA9IF9ib3VuZHMudG9wLm1heCA9IGltZy50b3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfYm91bmRzLmxlZnQubWluID0gX2JvdW5kcy5sZWZ0Lm1heCA9IGltZy5sZWZ0O1xuICAgICAgICB9XG5cbiAgICAgICAgaW1nLmxvY2tNb3ZlbWVudFggPSBpbWcubG9ja01vdmVtZW50WSA9IGZhbHNlO1xuICAgICAgICBpbWcuc2VsZWN0YWJsZSA9IHRydWU7XG4gICAgICAgIGltZy5ob3ZlckN1cnNvciA9ICdtb3ZlJztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnZ2FibGU7XG5cbn0se1wiLi91dGlsXCI6MjV9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG5cbmZ1bmN0aW9uIEZyYW1lSGFuZGxlcih2aWV3cG9ydCkge1xuICAgIHZhciBfZnJhbWVzO1xuICAgIHZhciBfZnJhbWVUeXBlID0gJ2ltYWdlJztcblxuICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIGluaXRGcmFtZXMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGcmFtZXNBc0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgX2ZyYW1lcy50b3AsIF9mcmFtZXMucmlnaHQsIF9mcmFtZXMuYm90dG9tLCBfZnJhbWVzLmxlZnRcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSA0IHJlY3RhbmdsZXMgd2hpY2ggYXJlIHVzZWQgd2hlbiBjdXJyZW50IGNhbnZhcyBzaG91bGQgYmUgZnJhbWVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdEZyYW1lcygpIHtcbiAgICAgICAgdmFyIGZyYW1lID0gbmV3IGZhYnJpYy5SZWN0KGNvbmZpZy5mcmFtZXMuZGVmYXVsdCk7XG5cbiAgICAgICAgX2ZyYW1lcyA9IHtcbiAgICAgICAgICAgIHRvcDogZnJhbWUuY2xvbmUoKSxcbiAgICAgICAgICAgIHJpZ2h0OiBmcmFtZS5jbG9uZSgpLFxuICAgICAgICAgICAgYm90dG9tOiBmcmFtZS5jbG9uZSgpLFxuICAgICAgICAgICAgbGVmdDogZnJhbWUuY2xvbmUoKVxuICAgICAgICB9O1xuXG4gICAgICAgIGdldEZyYW1lc0FzQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICB2aWV3cG9ydC5jYW52YXMuYWRkKG8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbml0KCk7XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5nZXRGcmFtZVR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfZnJhbWVUeXBlO1xuICAgIH07XG5cbiAgICB0aGlzLnNldFZpc2libGUgPSBmdW5jdGlvbiAoaXNWaXNpYmxlKSB7XG4gICAgICAgIGlzVmlzaWJsZSA9IHR5cGVvZiBpc1Zpc2libGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6ICEhaXNWaXNpYmxlO1xuXG4gICAgICAgIGdldEZyYW1lc0FzQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChmcmFtZSkge1xuICAgICAgICAgICAgZnJhbWUuc2V0KHsgdmlzaWJsZTogaXNWaXNpYmxlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB2aWV3cG9ydC5jYW52YXMucmVuZGVyQWxsKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwYXNzZWQgZnJhbWV0eXBlIHRvIHBhc3NlZCB2aWV3d3BvcnRcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGZyYW1lVHlwZSBub25lfGltYWdlfGJsYWNrfHdoaXRlXG4gICAgICogQHJldHVybiB7RnJhbWVIYW5kbGVyfVxuICAgICAqL1xuICAgIHRoaXMuc2V0RnJhbWVzID0gZnVuY3Rpb24gKGZyYW1lVHlwZSkge1xuICAgICAgICB2YXIgYm91bmRzID0gdmlld3BvcnQuZ2V0Qm91bmRzKCk7XG5cbiAgICAgICAgZnJhbWVUeXBlID0gZnJhbWVUeXBlIHx8IF9mcmFtZVR5cGUgfHwgJ2ltYWdlJztcbiAgICAgICAgX2ZyYW1lVHlwZSA9IGZyYW1lVHlwZTtcblxuICAgICAgICBpZiAoIWZyYW1lVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYW1lVHlwZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTtcblxuICAgICAgICBnZXRGcmFtZXNBc0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgby5zZXQoY29uZmlnLmZyYW1lc1tmcmFtZVR5cGVdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIHZwRGF0YSA9IHZpZXdwb3J0LmdldERhdGEoKTtcbiAgICAgICAgdmFyIGZyYW1lU2l6ZSA9IDI5O1xuICAgICAgICBpZiAodnBEYXRhLmRpbS51bml0cyA9PT0gJ2luY2gnKSB7XG4gICAgICAgICAgICBmcmFtZVNpemUgLz0gMi41NDtcbiAgICAgICAgfVxuXG4gICAgICAgIF9mcmFtZXMudG9wLmhlaWdodCA9XG4gICAgICAgICAgICBfZnJhbWVzLmJvdHRvbS5oZWlnaHQgPVxuICAgICAgICAgICAgICAgIF9mcmFtZXMucmlnaHQud2lkdGggPVxuICAgICAgICAgICAgICAgICAgICBfZnJhbWVzLmxlZnQud2lkdGggPSB2cERhdGEucHBtbSAqIGZyYW1lU2l6ZSAqIHZpZXdwb3J0LmNhbnZhcy5nZXRJbWFnZSgpLnNjYWxlWDtcblxuICAgICAgICBfZnJhbWVzLnRvcC53aWR0aCA9IF9mcmFtZXMuYm90dG9tLndpZHRoID0gdnBEYXRhLndpZHRoO1xuICAgICAgICBfZnJhbWVzLnJpZ2h0LmhlaWdodCA9IF9mcmFtZXMubGVmdC5oZWlnaHQgPSB2cERhdGEuaGVpZ2h0O1xuXG4gICAgICAgIGlmIChmcmFtZVR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgIF9mcmFtZXMudG9wLndpZHRoIC09ICh2cERhdGEucHBtbSAqIGZyYW1lU2l6ZSAqIHZpZXdwb3J0LmNhbnZhcy5nZXRJbWFnZSgpLnNjYWxlWCkgKiAyO1xuICAgICAgICAgICAgX2ZyYW1lcy5ib3R0b20ud2lkdGggPSBfZnJhbWVzLnRvcC53aWR0aDtcbiAgICAgICAgICAgIF9mcmFtZXMucmlnaHQuaGVpZ2h0IC09ICh2cERhdGEucHBtbSAqIGZyYW1lU2l6ZSAqIHZpZXdwb3J0LmNhbnZhcy5nZXRJbWFnZSgpLnNjYWxlWCkgKiAyO1xuICAgICAgICAgICAgX2ZyYW1lcy5sZWZ0LmhlaWdodCA9IF9mcmFtZXMucmlnaHQuaGVpZ2h0O1xuXG4gICAgICAgICAgICBfZnJhbWVzLnRvcC5zZXQoe1xuICAgICAgICAgICAgICAgIHRvcDogYm91bmRzLnRvcCxcbiAgICAgICAgICAgIH0pLmNlbnRlckgoKS5zZXRDb29yZHMoKTtcblxuICAgICAgICAgICAgX2ZyYW1lcy5ib3R0b20uc2V0KHtcbiAgICAgICAgICAgICAgICB0b3A6IChib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIF9mcmFtZXMuYm90dG9tLmhlaWdodCkgLSAxXG4gICAgICAgICAgICB9KS5jZW50ZXJIKCkuc2V0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgIF9mcmFtZXMucmlnaHQuc2V0KHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBfZnJhbWVzLnJpZ2h0LndpZHRoKSAtIDFcbiAgICAgICAgICAgIH0pLmNlbnRlclYoKS5zZXRDb29yZHMoKTtcblxuICAgICAgICAgICAgX2ZyYW1lcy5sZWZ0LnNldCh7XG4gICAgICAgICAgICAgICAgbGVmdDogYm91bmRzLmxlZnRcbiAgICAgICAgICAgIH0pLmNlbnRlclYoKS5zZXRDb29yZHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9mcmFtZXMudG9wLnNldCh7XG4gICAgICAgICAgICAgICAgdG9wOiAoYm91bmRzLnRvcCAtIF9mcmFtZXMudG9wLmhlaWdodCkgKyAxLFxuICAgICAgICAgICAgfSkuY2VudGVySCgpLnNldENvb3JkcygpO1xuXG4gICAgICAgICAgICBfZnJhbWVzLmJvdHRvbS5zZXQoe1xuICAgICAgICAgICAgICAgIHRvcDogKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0KSAtIDEsXG4gICAgICAgICAgICB9KS5jZW50ZXJIKCkuc2V0Q29vcmRzKCk7XG5cbiAgICAgICAgICAgIF9mcmFtZXMucmlnaHQuc2V0KHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpIC0gMVxuICAgICAgICAgICAgfSkuY2VudGVyVigpLnNldENvb3JkcygpO1xuXG4gICAgICAgICAgICBfZnJhbWVzLmxlZnQuc2V0KHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAoYm91bmRzLmxlZnQgLSBfZnJhbWVzLmxlZnQud2lkdGgpICsgMVxuICAgICAgICAgICAgfSkuY2VudGVyVigpLnNldENvb3JkcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmlld3BvcnQuY2FudmFzLnJlbmRlckFsbCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRnJhbWVIYW5kbGVyO1xuXG59LHtcIi4vY29uZmlnXCI6MTZ9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gR29yZUhhbmRsZXIodmlld3BvcnQpIHtcbiAgICB2YXIgX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB2YXIgX2xpbmVzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtmYWJyaWMuTGluZX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRMaW5lKGxlZnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBmYWJyaWMuTGluZShbMCwgMCwgMCwgdmlld3BvcnQuZ2V0RGF0YSgpLmhlaWdodF0sIHtcbiAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICBzdHJva2U6ICcjMDAwJyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICAgIHRvcDogdmlld3BvcnQuZ2V0Qm91bmRzKCkudG9wXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0dvcmVIYW5kbGVyfVxuICAgICAqL1xuICAgIHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9saW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICB2aWV3cG9ydC5jYW52YXMucmVtb3ZlKGxpbmUpO1xuICAgICAgICB9KTtcbiAgICAgICAgX2xpbmVzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBlbmFibGVkXG4gICAgICogQHJldHVybiB7R29yZUhhbmRsZXJ9XG4gICAgICovXG4gICAgdGhpcy5lbmFibGUgPSBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgICAgICBfZW5hYmxlZCA9IGVuYWJsZWQ7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcblxuICAgICAgICBpZiAoIV9lbmFibGVkKSB7XG4gICAgICAgICAgICB2aWV3cG9ydC5jYW52YXMucmVuZGVyQWxsKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYm91bmRzID0gdmlld3BvcnQuZ2V0Qm91bmRzKCk7XG4gICAgICAgIHZhciBzdGVwICAgPSB2aWV3cG9ydC5nZXREYXRhKCkucHBtbSAqIDQ1MDtcbiAgICAgICAgdmFyIGNvdW50ICA9IE1hdGguY2VpbChib3VuZHMud2lkdGggLyBzdGVwKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIF9saW5lcy5wdXNoKGdldExpbmUoYm91bmRzLmxlZnQgKyBzdGVwICogaSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2xpbmVzLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZpZXdwb3J0LmNhbnZhcy5hZGQobyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZpZXdwb3J0LmNhbnZhcy5yZW5kZXJBbGwoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7R29yZUhhbmRsZXJ9XG4gICAgICovXG4gICAgdGhpcy5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlKF9lbmFibGVkKTtcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdvcmVIYW5kbGVyO1xuXG59LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIEltYWdlRGF0YUhhbmRsZXIoaW1nKSB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgY3JvcHBlZCBpbWFnZSBpcyBkcmFnZ2VkXG4gICAgICogQHJldHVybiB7T2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuZ2V0Q3JvcERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Nyb3BEYXRhJykpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldENyb3BEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2aWV3cG9ydEJvdW5kcyA9IGltZy5jYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRCb3VuZHMoKTtcbiAgICAgICAgdmFyIGRyYWdBeGlzID0gaW1nLmNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldERhdGEoKS5heGlzO1xuXG4gICAgICAgIHZhciBjcm9wRGF0YSA9IHtcbiAgICAgICAgICAgIHg6IGRyYWdBeGlzID09PSAneCcgPyAodmlld3BvcnRCb3VuZHMubGVmdCAtIGltZy5sZWZ0KSAvIChpbWcud2lkdGggKiBpbWcuc2NhbGVYKSA6IDAsXG4gICAgICAgICAgICB5OiBkcmFnQXhpcyA9PT0gJ3knID8gKHZpZXdwb3J0Qm91bmRzLnRvcCAtIGltZy50b3ApIC8gKGltZy5oZWlnaHQgKiBpbWcuc2NhbGVZKSA6IDAsXG4gICAgICAgIH1cblxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdjcm9wRGF0YScsIEpTT04uc3RyaW5naWZ5KGNyb3BEYXRhKSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVDcm9wRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdjcm9wRGF0YScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYXBwbGllZCB0cmFuc2Zvcm1hdGlvbnMgZm9yIHRoZSBJbWFnZSBhbmQgYWxzb1xuICAgICAqIGhvdyBpdCBpcyBjcm9wcGVkIGFuZCBkcmFnZ2VkLlxuICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2aWV3cG9ydERhdGEgPSBpbWcuY2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0RGF0YSgpO1xuXG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9ICQuZXh0ZW5kKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWlycm9yZWQ6IGltZy5jYW52YXMuZ2V0TWlycm9yKCkuZ2V0U3RhdHVzKCksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHZpZXdwb3J0RGF0YS5kaW0ud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB2aWV3cG9ydERhdGEuZGltLmhlaWdodCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmdldENyb3BEYXRhKClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaW1nLmNhbnZhcy5fX3R5cGUgPT09ICdjYW52YXMnKSB7XG4gICAgICAgICAgICB2YXIgZnJhbWVIYW5kbGVyID0gaW1nLmNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEZyYW1lSGFuZGxlcigpO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUuZWRnZSA9IGZyYW1lSGFuZGxlci5nZXRGcmFtZVR5cGUoKTtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLmZyYW1lZCA9IHJldHVyblZhbHVlLmVkZ2UgIT09ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEltYWdlRGF0YUhhbmRsZXI7XG5cbn0se31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIENhbnZhcyA9IHJlcXVpcmUoJy4vQ2FudmFzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5mdW5jdGlvbiBJbWFnZUVkaXRvcihjYW52YXNJZCwgYXJncykge1xuICAgIHZhciBfY2FudmFzO1xuXG4gICAgdmFyIF9zZXR0aW5ncyA9ICQuZXh0ZW5kKHtcbiAgICAgICAgLy8gVHlwZSBkZWZhdWx0cyB0byB3YWxscGFwZXJcbiAgICAgICAgdHlwZTogJ3dhbGxwYXBlcicsXG4gICAgICAgIC8vIERlZmF1bHQgdGV4dHMgb24gdGhlIGJ1dHRvbnNcbiAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgICAgc2hvd1RocmVlRDogJzNkJyxcbiAgICAgICAgICAgIGhpZGVUaHJlZUQ6ICdGbGF0JyxcbiAgICAgICAgICAgIHNob3dNdXJhbHM6ICdTaG93IE11cmFscyBQYW5lbCcsXG4gICAgICAgICAgICBoaWRlTXVyYWxzOiAnSGlkZSBNdXJhbHMgUGFuZWwnLFxuICAgICAgICAgICAgc2hvd1J1bGVyczogJ1Nob3cgUnVsZXInLFxuICAgICAgICAgICAgaGlkZVJ1bGVyczogJ0hpZGUgUnVsZXInLFxuICAgICAgICAgICAgc2hvd0Z1bGxzY3JlZW46ICdGdWxsc2NyZWVuJyxcbiAgICAgICAgICAgIGV4aXRGdWxsc2NyZWVuOiAnRXhpdCBGdWxsc2NyZWVuJyxcbiAgICAgICAgfVxuICAgIH0sIGFyZ3MpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjYW52YXNcbiAgICBfY2FudmFzID0gbmV3IENhbnZhcyhjYW52YXNJZCwgYXJncy5kaW1lbnNpb25zKTtcblxuICAgIC8vIExldCBDYW52YXMga25vdyB3aGljaCB0eXBlIGl0IGlzLCBjYW52YXMgb3Igd2FsbHBhcGVyIHNpbmNlIGl0IGlzXG4gICAgLy8gYWNjZXNzaWJsZSBmb3IgYWxsIG9iamVjdHMgY29udGFpbmVkIHdpdGhpbi5cbiAgICBfY2FudmFzLnNldCh7XG4gICAgICAgIF9fdHlwZTogX3NldHRpbmdzLnR5cGVcbiAgICB9KTtcblxuICAgIC8vIEFkZGluZyBidXR0b25zIHRvIHRoZSBjYW52YXMgZGVwZW5kaW5nIG9uIHdoaWNoIHR5cGUgaXMgYWN0aXZlLlxuICAgIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0aGF0IHRoaXMgcmVzaWRlcyBzb21ld2hlcmUgZWxzZSwgZWl0aGVyIGluIENhbnZhcyBvclxuICAgIC8vIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGltYWdlIGVkaXRvci5cbiAgICBpZiAoX2NhbnZhcy5fX3R5cGUgPT09ICdjYW52YXMnKSB7XG4gICAgICAgIF9jYW52YXMuZ2V0QnV0dG9uTWVudSgpXG4gICAgICAgICAgICAuYWRkSXRlbSgndG9nZ2xlM2QnLCBbX3NldHRpbmdzLmJ1dHRvbnMuc2hvd1RocmVlRCwgX3NldHRpbmdzLmJ1dHRvbnMuaGlkZVRocmVlRF0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfY2FudmFzLnRvZ2dsZTNEKHRoaXMuaXNBY3RpdmUoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfY2FudmFzLmdldEJ1dHRvbk1lbnUoKVxuICAgICAgICAgICAgLmFkZEl0ZW0oJ3RvZ2dsZU11cmFscycsIFtfc2V0dGluZ3MuYnV0dG9ucy5zaG93TXVyYWxzLCBfc2V0dGluZ3MuYnV0dG9ucy5oaWRlTXVyYWxzXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF9jYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRHb3JlcygpLmVuYWJsZSh0aGlzLmlzQWN0aXZlKCkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGRJdGVtKCd0b2dnbGVSdWxlcnMnLCBbX3NldHRpbmdzLmJ1dHRvbnMuc2hvd1J1bGVycywgX3NldHRpbmdzLmJ1dHRvbnMuaGlkZVJ1bGVyc10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfY2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0UnVsZXJzKCkuZW5hYmxlKHRoaXMuaXNBY3RpdmUoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodXRpbC5zdXBwb3J0c0Z1bGxzY3JlZW4oKSkge1xuICAgICAgICBfY2FudmFzLmdldEJ1dHRvbk1lbnUoKVxuICAgICAgICAgICAgLmFkZEl0ZW0oJ3RvZ2dsZUZ1bGxzY3JlZW4nLCBbX3NldHRpbmdzLmJ1dHRvbnMuc2hvd0Z1bGxzY3JlZW4sIF9zZXR0aW5ncy5idXR0b25zLmV4aXRGdWxsc2NyZWVuXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlRnVsbHNjcmVlbihfY2FudmFzLmdldFNlbGVjdGlvbkVsZW1lbnQoKS5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jYW52YXMuZ2V0QnV0dG9uTWVudSgpLnJlbmRlcigpO1xuXG4gICAgLy8gQmluZGluZyBmdWxsc2NyZWVuIGNoYW5nZSBldmVudCB0byB0aGUgaW1hZ2UtZWRpdG9yIHdyYXBwZXIuIFRoaXMgd2F5IHdlIGNhbiBzZXQgdGhlIGNvcnJlY3QgYnV0dG9uIGFjdGl2ZS5cbiAgICAkKF9jYW52YXMuZ2V0U2VsZWN0aW9uRWxlbWVudCgpLnBhcmVudE5vZGUpLmJpbmQoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UgbW96ZnVsbHNjcmVlbmNoYW5nZSBmdWxsc2NyZWVuY2hhbmdlJywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgaXNGdWxsc2NyZWVuID0gZG9jdW1lbnQuZnVsbFNjcmVlbiB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuIHx8IGRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbjtcblxuICAgICAgICBpZiAoaXNGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfY2FudmFzLmdldEJ1dHRvbk1lbnUoKS5nZXRJdGVtcygpLmZvckVhY2goZnVuY3Rpb24oYnV0dG9uKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLmdldElkKCkgPT09ICd0b2dnbGVGdWxsc2NyZWVuJykge1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRBY3RpdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyb3BzIGltYWdlIHRvIGRlc2lyZWQgZGltZW5zaW9uc1xuICAgICAqIEBwYXJhbSAge2ludH0gd2lkdGggIFtkZXNjcmlwdGlvbl1cbiAgICAgKiBAcGFyYW0gIHtpbnR9IGhlaWdodCBbZGVzY3JpcHRpb25dXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB1bml0cyBjbXxpbmNoXG4gICAgICogQHJldHVybiB7SW1hZ2VFZGl0b3J9XG4gICAgICovXG4gICAgdGhpcy5jcm9wID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIHVuaXRzKSB7XG5cbiAgICAgICAgX2NhbnZhcy5nZXRJbWFnZURhdGEoKS5yZW1vdmVDcm9wRGF0YSgpO1xuXG4gICAgICAgIF9jYW52YXMuZ2V0Vmlld3BvcnQoKS5zZXQod2lkdGgsIGhlaWdodCwgdW5pdHMpO1xuXG4gICAgICAgIHZhciBzaG91bGRCZUNyb3BwZWQgPSB1dGlsLmlzQXNwZWN0Q2hhbmdlZChfY2FudmFzLmdldEltYWdlKCkud2lkdGgsIF9jYW52YXMuZ2V0SW1hZ2UoKS5oZWlnaHQsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIGlmIChzaG91bGRCZUNyb3BwZWQpIHtcbiAgICAgICAgICAgIF9jYW52YXMuZ2V0SW1hZ2UoKS5fX2RyYWdnZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIF9jYW52YXMuZ2V0SW1hZ2UoKS5fX2Nyb3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgX2NhbnZhcy5nZXRJbWFnZURhdGEoKS5zZXRDcm9wRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX2NhbnZhcy5nZXRJbWFnZSgpLl9fY3JvcHBlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ3xvYmplY3R9IGtleVxuICAgICAqIEBwYXJhbSAge29iamVjdH0gZGVmYXVsdFZhbHVlXG4gICAgICogQHJldHVybiB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IF9zZXR0aW5nc1trZXldO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW1hZ2UgaW50byB0aGUgY2FudmFzLlxuICAgICAqIEBwYXJhbSAge051bWJlcnxTdHJpbmd9IHVybFxuICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEByZXR1cm4ge0ltYWdlRWRpdG9yfVxuICAgICAqL1xuICAgIHRoaXMubG9hZEltYWdlID0gZnVuY3Rpb24gKHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBjYWxsYmFjayA6IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBmYWJyaWMuSW1hZ2UuZnJvbVVSTCh0aGlzLl91cmwgPSB1cmwsIGZ1bmN0aW9uIChpbWcpIHtcbiAgICAgICAgICAgIF9jYW52YXMuc2V0SW1hZ2UoaW1nKTtcbiAgICAgICAgICAgIGltZy5fX3VybCA9IHVybDtcbiAgICAgICAgICAgIGltZy5zZW5kVG9CYWNrKCk7XG4gICAgICAgICAgICBjYWxsYmFjayhpbWcpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ3xvYmplY3R9IGtleVxuICAgICAqIEBwYXJhbSAge29iamVjdH0gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtJbWFnZUVkaXRvcn1cbiAgICAgKi9cbiAgICB0aGlzLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICQuZXh0ZW5kKF9zZXR0aW5ncywgdXRpbC5hc3NlcnRLZXlWYWx1ZVBhaXIoa2V5LCB2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgdXRpbC5zZXRQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgY2FudmFzOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NhbnZhcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEltYWdlRWRpdG9yO1xuXG59LHtcIi4vQ2FudmFzXCI6NCxcIi4vdXRpbFwiOjI1fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBNaXJyb3JIYW5kbGVyKGltZykge1xuXG4gICAgdmFyIF9taXJyb3JlZCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBjaGVja2VkXG4gICAgICogQHJldHVybiB7TWlycm9ySGFuZGxlcn1cbiAgICAgKi9cbiAgICB0aGlzLnNldCA9IGZ1bmN0aW9uKGNoZWNrZWQpIHtcbiAgICAgICAgX21pcnJvcmVkID0gKGltZy5mbGlwWCA9IGNoZWNrZWQpID8gMSA6IDA7XG4gICAgICAgIGltZy5zZXRDb29yZHMoKS5jYW52YXMucmVuZGVyQWxsKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5nZXRTdGF0dXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9taXJyb3JlZDtcbiAgICB9XG5cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1pcnJvckhhbmRsZXI7XG5cbn0se31dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBUZXh0QnV0dG9uID0gcmVxdWlyZSgnLi9UZXh0QnV0dG9uJyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxuZnVuY3Rpb24gUnVsZXJIYW5kbGVyKHZpZXdwb3J0KSB7XG4gICAgdmFyIF9lbmFibGVkID0gZmFsc2U7XG4gICAgdmFyIF9saW5lcyA9IHsgeDogbnVsbCwgeTogbnVsbCB9O1xuICAgIHZhciBfcmVjdCA9IHsgeDogbnVsbCwgeTogbnVsbCB9O1xuXG4gICAgdmFyIEV2ZW50ID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVHJpZ2dlcnMgd2hlbiBoYW5kbGViYXIgaXMgbW92ZWRcbiAgICAgICAgICovXG4gICAgICAgIG9uTW92ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdXBkYXRlUnVsZXJUZXh0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVJ1bGVyVGV4dChydWxlcikge1xuICAgICAgICB2YXIgYXhpcyA9IHJ1bGVyLmF4aXM7XG4gICAgICAgIHZhciBib3VuZHMgPSB2aWV3cG9ydC5nZXRCb3VuZHMoKTtcbiAgICAgICAgdmFyIHBvcyA9IHV0aWwuYXNzZXJ0QmV0d2VlbihydWxlcltheGlzXSwgYm91bmRzLm1pbltheGlzXSwgYm91bmRzLm1heFtheGlzXSk7XG4gICAgICAgIHJ1bGVyLm1hcmtlcltheGlzXSA9IHJ1bGVyW2F4aXNdID0gcG9zO1xuICAgICAgICB2YXIgZGltID0gKHJ1bGVyW2F4aXNdIC0gYm91bmRzW2F4aXNdKSAvICh2aWV3cG9ydC5nZXREYXRhKCkucHBtbSAqIDEwICogdmlld3BvcnQuY2FudmFzLmdldEltYWdlKCkuc2NhbGVYKTtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIGRpbSA9IHZpZXdwb3J0LmdldERhdGEoKS5kaW0uaGVpZ2h0IC0gZGltO1xuICAgICAgICB9XG5cbiAgICAgICAgcnVsZXIuc2V0VGV4dChNYXRoLnJvdW5kKGRpbSAqIDEwMCkgLyAxMDAgKyAnICcgKyB2aWV3cG9ydC5nZXREYXRhKCkuZGltLnVuaXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtmYWJyaWMuTGluZX1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRMaW5lKGF4aXMpIHtcbiAgICAgICAgdmFyIGJvdW5kcyA9IHZpZXdwb3J0LmdldEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gbmV3IGZhYnJpYy5MaW5lKFtcbiAgICAgICAgICAgICAgICAwLCAwLFxuICAgICAgICAgICAgICAgIGF4aXMgPT09ICd4JyA/IGJvdW5kcy53aWR0aCA6IDAsXG4gICAgICAgICAgICAgICAgYXhpcyA9PT0gJ3knID8gYm91bmRzLmhlaWdodCA6IDBcbiAgICAgICAgICAgIF0sIHtcbiAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICBzdHJva2U6ICcjMDAwJyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgdG9wOiBheGlzID09PSAneCcgPyBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAvIDIgOiBib3VuZHMudG9wLFxuICAgICAgICAgICAgbGVmdDogYXhpcyA9PT0gJ3knID8gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyIDogYm91bmRzLmxlZnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7UnVsZXJIYW5kbGVyfVxuICAgICAqL1xuICAgIHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFtdLmNvbmNhdChfcmVjdC54LCBfcmVjdC55LCBfbGluZXMueCwgX2xpbmVzLnkpLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHZpZXdwb3J0LmNhbnZhcy5yZW1vdmUobyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEByZXR1cm4ge1J1bGVySGFuZGxlcn1cbiAgICAgKi9cbiAgICB0aGlzLmVuYWJsZSA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgICAgIHZhciBib3VuZHMgPSB2aWV3cG9ydC5nZXRCb3VuZHMoKTtcblxuICAgICAgICB2YXIga2VlcFBvc2l0aW9uID0gKFxuICAgICAgICAgICAgZW5hYmxlZCAmJiAoX2VuYWJsZWQgPT09IGVuYWJsZWQpICYmXG4gICAgICAgICAgICBfbGluZXMueCAmJiAoTWF0aC5hYnMoX2xpbmVzLngud2lkdGggLSBib3VuZHMud2lkdGgpIDwgMSkgJiZcbiAgICAgICAgICAgIF9saW5lcy55ICYmIChNYXRoLmFicyhfbGluZXMueS5oZWlnaHQgLSBib3VuZHMuaGVpZ2h0KSA8IDEpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGtlZXBQb3NpdGlvbikge1xuICAgICAgICAgICAgdXBkYXRlUnVsZXJUZXh0KF9yZWN0LngpO1xuICAgICAgICAgICAgdXBkYXRlUnVsZXJUZXh0KF9yZWN0LnkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBfZW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgIGlmICghX2VuYWJsZWQpIHtcbiAgICAgICAgICAgIHZpZXdwb3J0LmNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgX2xpbmVzID0geyB4OiBnZXRMaW5lKCd4JyksIHk6IGdldExpbmUoJ3knKSB9O1xuXG4gICAgICAgIHZpZXdwb3J0LmNhbnZhcy5hZGQoX2xpbmVzLngpO1xuICAgICAgICB2aWV3cG9ydC5jYW52YXMuYWRkKF9saW5lcy55KTtcblxuICAgICAgICBfcmVjdC54ID0gbmV3IFRleHRCdXR0b24oJ2hvcml6b250YWxSdWxlcicsICdIJywgY29uZmlnLnJ1bGVySGFuZGxlLCB0cnVlKVxuICAgICAgICAgICAgLnNldChjb25maWcucnVsZXJIYW5kbGUueChfbGluZXMsIGJvdW5kcykpXG4gICAgICAgICAgICAuYWRkVG8odmlld3BvcnQuY2FudmFzKVxuICAgICAgICAgICAgLm9uKCdtb3ZpbmcnLCBFdmVudC5vbk1vdmUpXG4gICAgICAgICAgICAudHJpZ2dlcignbW92aW5nJyk7XG5cbiAgICAgICAgX3JlY3QueSA9IG5ldyBUZXh0QnV0dG9uKCd2ZXJ0aWNhbFJ1bGVyJywgJ1YnLCBjb25maWcucnVsZXJIYW5kbGUsIHRydWUpXG4gICAgICAgICAgICAuc2V0KGNvbmZpZy5ydWxlckhhbmRsZS55KF9saW5lcywgYm91bmRzKSlcbiAgICAgICAgICAgIC5hZGRUbyh2aWV3cG9ydC5jYW52YXMpXG4gICAgICAgICAgICAub24oJ21vdmluZycsIEV2ZW50Lm9uTW92ZSlcbiAgICAgICAgICAgIC50cmlnZ2VyKCdtb3ZpbmcnKTtcblxuICAgICAgICB2aWV3cG9ydC5jYW52YXMucmVuZGVyQWxsKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge1J1bGVySGFuZGxlcn1cbiAgICAgKi9cbiAgICB0aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGUoX2VuYWJsZWQpO1xuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUnVsZXJIYW5kbGVyO1xuXG59LHtcIi4vVGV4dEJ1dHRvblwiOjE0LFwiLi9jb25maWdcIjoxNixcIi4vdXRpbFwiOjI1fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgdGV4dC1idXR0b24gd2l0aCB0ZXh0L3NldHRpbmdzIHByb3ZpZGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSB0ZXh0IHRvIGJlIHNob3duIGluc2lkZSB0aGUgYnV0dG9uXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0dGluZ3NcbiAqL1xuZnVuY3Rpb24gVGV4dEJ1dHRvbihpZCwgdGV4dCwgc2V0dGluZ3MsIGlzQWN0aXZlKSB7XG4gICAgZmFicmljLkdyb3VwLmNhbGwodGhpcyk7XG5cbiAgICB2YXIgX19hY3RpdmUgPSBpc0FjdGl2ZSB8fCBmYWxzZTtcbiAgICB2YXIgX2NhbGxiYWNrID0gbnVsbDtcbiAgICB2YXIgX3JlY3QgPSBudWxsO1xuICAgIHZhciBfdGV4dCA9IG51bGw7XG4gICAgdmFyIF9pZCA9IGlkO1xuICAgIHZhciB3aWR0aCA9IHNldHRpbmdzLnJlY3QgPyBzZXR0aW5ncy5yZWN0LndpZHRoIDogMDtcbiAgICB2YXIgaGVpZ2h0ID0gc2V0dGluZ3MucmVjdCA/IHNldHRpbmdzLnJlY3QuaGVpZ2h0IDogMDtcblxuICAgIHZhciBfcmVjdFNldHRpbmdzID0gJC5leHRlbmQoe30sIGNvbmZpZy50ZXh0QnV0dG9uLnJlY3Qod2lkdGgsIGhlaWdodCksIHNldHRpbmdzLnJlY3QpO1xuICAgIHZhciBfdGV4dFNldHRpbmdzID0gJC5leHRlbmQoe30sIGNvbmZpZy50ZXh0QnV0dG9uLnRleHQsIHNldHRpbmdzLnRleHQsIHtcbiAgICAgICAgdGV4dDogQXJyYXkuaXNBcnJheSh0ZXh0KSA/IHRleHRbMF0gOiB0ZXh0LFxuICAgICAgICB0ZXh0QWN0aXZlOiBBcnJheS5pc0FycmF5KHRleHQpID8gdGV4dFsxXSA6IHRleHQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlbGVjdGFibGUgPSB0cnVlO1xuXG4gICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGludGVyYWN0aXZlXG4gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuaG92ZXJDdXJzb3IgPSBjb25maWcudGV4dEJ1dHRvbi5jdXJzb3I7XG5cbiAgICAvLyBJbml0aWFsaXplIHRleHQgYW5kIHJlY3RhbmdsZVxuICAgIF90ZXh0ID0gbmV3IGZhYnJpYy5UZXh0KCcnLCBfdGV4dFNldHRpbmdzKTtcbiAgICBfcmVjdCA9IG5ldyBmYWJyaWMuUmVjdChfcmVjdFNldHRpbmdzKTtcblxuICAgIHRoaXMuYWRkV2l0aFVwZGF0ZShfcmVjdCkuYWRkV2l0aFVwZGF0ZShfdGV4dCk7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IHRleHRcbiAgICAgKiBAcmV0dXJuIHtUZXh0QnV0dG9ufVxuICAgICAqL1xuICAgIHRoaXMuc2V0VGV4dCA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgX3RleHQuc2V0VGV4dCgodGV4dCB8fCAnJykudG9TdHJpbmcoKSkuc2V0Q29vcmRzKCk7XG5cbiAgICAgICAgaWYgKF9yZWN0U2V0dGluZ3MuZHluYW1pY1cpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBfcmVjdC53aWR0aCA9IF90ZXh0LndpZHRoICsgY29uZmlnLnRleHRCdXR0b24ucGFkZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfcmVjdFNldHRpbmdzLmR5bmFtaWNIKSB7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IF9yZWN0LmhlaWdodCA9IF90ZXh0LmhlaWdodCArIGNvbmZpZy50ZXh0QnV0dG9uLnBhZGRpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZXRDb29yZHMoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRJZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2lkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2FjdGl2ZTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGUpIHtcbiAgICAgICAgdG9nZ2xlQWN0aXZlU3R5bGUuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NhbGxiYWNrLmNhbGwodGhpcywgZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX19ncm91cCkge1xuICAgICAgICAgICAgdGhpcy5fX2dyb3VwLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9nZ2xlQWN0aXZlU3R5bGUoKSB7XG4gICAgICAgIF9yZWN0LnNldEZpbGwoX3JlY3RTZXR0aW5nc1t0aGlzLmlzQWN0aXZlKCkgPyAnYWN0aXZlRmlsbCcgOiAnZmlsbCddKTtcbiAgICAgICAgX3RleHQuc2V0RmlsbChfdGV4dFNldHRpbmdzW3RoaXMuaXNBY3RpdmUoKSA/ICdhY3RpdmVGaWxsJyA6ICdmaWxsJ10pO1xuICAgICAgICB0aGlzLnNldFRleHQoX3RleHRTZXR0aW5nc1t0aGlzLmlzQWN0aXZlKCkgPyAndGV4dEFjdGl2ZScgOiAndGV4dCddKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2xpY2sgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICBfY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuICAgICAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgLy8gQXMgaW5hY3RpdmUgYnV0dG9ucyBhcmUgc3RpbGwgY2xpY2thYmxlLCB3ZSBmaXJzdCBjaGVjayBpZiB0aGUgYnV0dG9uIGlzIGRpc2FibGVkLlxuICAgICAgICAgICAgLy8gT25seSB0aGVuIHdlIHNob3VsZCBkbyBzdHVmZi5cbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19hY3RpdmUgPSAhdGhpcy5fX2FjdGl2ZTtcbiAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZURvd24uY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0QWN0aXZlID0gZnVuY3Rpb24gKGlzQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX19hY3RpdmUgPSB0eXBlb2YgaXNBY3RpdmUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6ICEhaXNBY3RpdmU7XG4gICAgICAgIHRvZ2dsZUFjdGl2ZVN0eWxlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0RGlzYWJsZWQgPSBmdW5jdGlvbiAoaXNEaXNhYmxlZClcbiAgICB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuXG4gICAgICAgIF9yZWN0LnNldEZpbGwoX3JlY3RTZXR0aW5nc1t0aGlzLmRpc2FibGVkID8gJ2Rpc2FibGVkRmlsbCcgOiAnZmlsbCddKTtcbiAgICAgICAgX3RleHQuc2V0RmlsbChfdGV4dFNldHRpbmdzW3RoaXMuZGlzYWJsZWQgPyAnZGlzYWJsZWRGaWxsJyA6ICdmaWxsJ10pO1xuICAgIH07XG5cbiAgICBpZiAoX3RleHRTZXR0aW5ncy50ZXh0KSB7XG4gICAgICAgIHRoaXMuc2V0VGV4dChfdGV4dFNldHRpbmdzLnRleHQpO1xuICAgIH1cbn1cblxuVGV4dEJ1dHRvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZhYnJpYy5Hcm91cC5wcm90b3R5cGUpO1xuVGV4dEJ1dHRvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnV0dG9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRleHRCdXR0b247XG5cbn0se1wiLi9jb25maWdcIjoxNn1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIEZyYW1lSGFuZGxlciA9IHJlcXVpcmUoJy4vRnJhbWVIYW5kbGVyJyk7XG52YXIgR29yZUhhbmRsZXIgPSByZXF1aXJlKCcuL0dvcmVIYW5kbGVyJyk7XG52YXIgUnVsZXJIYW5kbGVyID0gcmVxdWlyZSgnLi9SdWxlckhhbmRsZXInKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmZ1bmN0aW9uIFZpZXdwb3J0KGNhbnZhcykge1xuICAgIHZhciBfYmVhbXMgPSBbXTtcbiAgICB2YXIgX2JvcmRlcldpZHRoID0gMjtcbiAgICB2YXIgX2RhdGEgPSBudWxsO1xuICAgIHZhciBfcmVjdDtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHZpZXdwb3J0IHRvIHBhZ2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcHBseSgpIHtcbiAgICAgICAgdmFyIGNyb3BEYXRhID0gY2FudmFzLmdldEltYWdlRGF0YSgpLmdldENyb3BEYXRhKCk7XG4gICAgICAgIGNhbnZhcy5yZW1vdmUoX3JlY3QpO1xuXG4gICAgICAgIF9yZWN0ID0gbmV3IGZhYnJpYy5SZWN0KHtcbiAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgIHdpZHRoOiBfZGF0YS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogX2RhdGEuaGVpZ2h0LFxuICAgICAgICAgICAgc3Ryb2tlOiAnI2ZmZicsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogY2FudmFzLl9fdHlwZSA9PT0gJ2NhbnZhcycgPyAwIDogX2JvcmRlcldpZHRoXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF9yZWN0LndpZHRoICs9IF9ib3JkZXJXaWR0aDtcbiAgICAgICAgX3JlY3QuaGVpZ2h0ICs9IF9ib3JkZXJXaWR0aDtcbiAgICAgICAgX3JlY3QuYWRkVG8oY2FudmFzKS5jZW50ZXIoKS5zZXRDb29yZHMoKTtcblxuICAgICAgICBpZiAoY3JvcERhdGEpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHBvc2l0aW9uIGFmdGVyIHNjcmVlbnJlc2l6ZSBhbmQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGltYWdlIGFscmVhZHkgaGFzIGJlZW4gY3JvcHBlZCB0byBhIGNlcnRhaW4gcG9zaXRpb24uXG4gICAgICAgICAgICB2YXIgbGVmdCA9IF9yZWN0LmxlZnQgKyBfcmVjdC5zdHJva2VXaWR0aCAtIChjYW52YXMuZ2V0SW1hZ2UoKS53aWR0aCAqIGNhbnZhcy5nZXRJbWFnZSgpLnNjYWxlWCAqIGNyb3BEYXRhLngpO1xuICAgICAgICAgICAgdmFyIHRvcCA9IF9yZWN0LnRvcCArIF9yZWN0LnN0cm9rZVdpZHRoIC0gKGNhbnZhcy5nZXRJbWFnZSgpLmhlaWdodCAqIGNhbnZhcy5nZXRJbWFnZSgpLnNjYWxlWSAqIGNyb3BEYXRhLnkpO1xuXG4gICAgICAgICAgICBjYW52YXMuZ2V0SW1hZ2UoKS5zZXQoeyBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCB9KS5zZXRDb29yZHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbnZhcy5nZXRJbWFnZSgpLmNlbnRlcigpLnNldENvb3JkcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FudmFzLmdldEltYWdlKCkuZHJhZy5lbmFibGUoY2FsY01pbk1heEJvdW5kc0ZvclJlY3QoX3JlY3QuZ2V0SW5zaWRlQm91bmRpbmdSZWN0KCksIGNhbnZhcy5nZXRJbWFnZSgpKSlcbiAgICAgICAgY2FudmFzLmdldEFwZXJ0dXJlcygpLmFwcGx5KF9kYXRhLmF4aXMsIF9yZWN0LmdldEJvdW5kaW5nUmVjdCgpKTtcblxuICAgICAgICBpZiAoY2FudmFzLl9fdHlwZSAhPT0gJ2NhbnZhcycpIHtcbiAgICAgICAgICAgIGRyYXdCZWFtcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5zZXRGcmFtZShzZWxmLmdldEZyYW1lSGFuZGxlcigpLmdldEZyYW1lVHlwZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy5nZXREcmFnYmFycygpLmFwcGx5KCk7XG4gICAgICAgIC8vIEFwZXJ0dXJlcyBzb21ldGltZXMgb3ZlcmxhcHMgdGhlIHZpZXdwb3J0cyBib3VuZGluZyByZWN0LlxuICAgICAgICAvLyBTb2x2ZSB0aGlzIGJ5IGJyaW5naW5nIGl0IHRvIHRoZSBmcm9udCBhZnRlciBhcGVydHVyZXMgYXJlIGFwcGxpZWQuXG4gICAgICAgIF9yZWN0LmJyaW5nVG9Gcm9udCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmRlciB0aGUgZGlhZ29uYWwgbGluZXMgZnJvbSB2aWV3cG9ydCB0byBlZGdlIG9mIHRoZSBjYW52YXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcmF3QmVhbXMoKSB7XG4gICAgICAgIF9iZWFtcy5mb3JFYWNoKGZ1bmN0aW9uIChiZWFtKSB7XG4gICAgICAgICAgICBjYW52YXMucmVtb3ZlKGJlYW0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBfYmVhbXMgPSBbXTtcblxuICAgICAgICAvLyBUT1AgTEVGVFxuICAgICAgICBfYmVhbXMucHVzaChuZXcgZmFicmljLkxpbmUoXG4gICAgICAgICAgICBbX3JlY3QubGVmdCwgX3JlY3QudG9wLCBfcmVjdC5sZWZ0IC0gX3JlY3QudG9wLCAtMV0sIHtcbiAgICAgICAgICAgICAgICBzdHJva2U6ICcjZmZmJyxcbiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSk7XG5cbiAgICAgICAgLy8gVE9QIFJJR0hUXG4gICAgICAgIF9iZWFtcy5wdXNoKF9iZWFtc1swXS5jbG9uZSgpLnNldCh7IGZsaXBYOiB0cnVlLCBsZWZ0OiBfcmVjdC5sZWZ0ICsgX3JlY3Qud2lkdGggfSkpO1xuICAgICAgICAvLyBCT1RUT00gUklHSFRcbiAgICAgICAgX2JlYW1zLnB1c2goX2JlYW1zWzFdLmNsb25lKCkuc2V0KHsgZmxpcFk6IHRydWUsIHRvcDogX3JlY3QudG9wICsgX3JlY3QuaGVpZ2h0IH0pKTtcbiAgICAgICAgLy8gQk9UVE9NIExFRlRcbiAgICAgICAgX2JlYW1zLnB1c2goX2JlYW1zWzBdLmNsb25lKCkuc2V0KHsgZmxpcFk6IHRydWUsIHRvcDogX3JlY3QudG9wICsgX3JlY3QuaGVpZ2h0IH0pKTtcblxuICAgICAgICBfYmVhbXMuZm9yRWFjaChmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgY2FudmFzLmFkZChvKTtcbiAgICAgICAgICAgIG8uYnJpbmdUb0Zyb250KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gb2JqZWN0IHdpdGggbWluIC8gbWF4IHZhbHVlcyBmb3IgZWFjaCBheGlzLCBiYXNlZCBvbiB0aGUgYm91bmRzXG4gICAgICogb2YgcGFzc2VkIGZhYnJpYy5SZWN0XG4gICAgICogQHBhcmFtICB7ZmFicmljLlJlY3R9IHJlY3RcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FsY01pbk1heEJvdW5kc0ZvclJlY3QocmVjdCwgaW1nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgICAgICAgbWluOiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC0gKGltZy53aWR0aCAqIGltZy5zY2FsZVgpLFxuICAgICAgICAgICAgICAgIG1heDogcmVjdC5sZWZ0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG9wOiB7XG4gICAgICAgICAgICAgICAgbWluOiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC0gKGltZy5oZWlnaHQgKiBpbWcuc2NhbGVZKSxcbiAgICAgICAgICAgICAgICBtYXg6IHJlY3QudG9wXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG5cbiAgICB0aGlzLmdldEJvdW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWN0LmdldEluc2lkZUJvdW5kaW5nUmVjdCgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtWaWV3cG9ydH1cbiAgICAgKi9cbiAgICB0aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldChfZGF0YS5kaW0ud2lkdGgsIF9kYXRhLmRpbS5oZWlnaHQsIF9kYXRhLmRpbS51bml0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gd2lkdGhcbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGhlaWdodFxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdW5pdHNcbiAgICAgKiBAcmV0dXJuIHtWaWV3cG9ydH1cbiAgICAgKi9cbiAgICB0aGlzLnNldCA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0LCB1bml0cykge1xuICAgICAgICB2YXIgb2xkRGF0YSA9IF9kYXRhO1xuXG4gICAgICAgIF9kYXRhID0gdXRpbC5jYWxjQ3JvcChjYW52YXMuZ2V0SW1hZ2UoKSwgd2lkdGgsIGhlaWdodCwgdW5pdHMpO1xuXG4gICAgICAgIHZhciBrZWVwQ3JvcHBpbmcgPSAob2xkRGF0YSAmJiAhdXRpbC5pc0FzcGVjdENoYW5nZWQob2xkRGF0YS5kaW0ud2lkdGgsIG9sZERhdGEuZGltLmhlaWdodCwgd2lkdGgsIGhlaWdodCkpO1xuICAgICAgICBpZiAoa2VlcENyb3BwaW5nKSB7XG4gICAgICAgICAgICBjYW52YXMuZ2V0SW1hZ2VEYXRhKCkuc2V0Q3JvcERhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGx5KCk7XG4gICAgICAgIHRoaXMuZ2V0R29yZXMoKS5yZXNldCgpO1xuICAgICAgICB0aGlzLmdldFJ1bGVycygpLnJlc2V0KCk7XG5cbiAgICAgICAgaWYgKGNhbnZhcy5nZXRJbWFnZSgpLl9fY3JvcHBlZCAmJiAha2VlcENyb3BwaW5nKSB7XG4gICAgICAgICAgICBjYW52YXMuZ2V0QXBlcnR1cmVzKCkuc2V0VHJhbnNwYXJlbnQodHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIFRyaWdnZXIgZXZlbnQgdG8gdGVsbCB0aGUgaW1hZ2UgbmVlZHMgdG8gYmUgZHJhZ2dlZC5cbiAgICAgICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ1BJRTpuZWVkcy1kcmFnZ2luZycsIHsgYXhpczogX2RhdGEuYXhpcyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy5nZXRCdXR0b25NZW51KCkuYnJpbmdUb0Zyb250KCk7XG5cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBmcmFtZVR5cGUgd2hpdGV8YmxhY2t8aW1hZ2V8bm9uZVxuICAgICAqIEByZXR1cm4ge1ZpZXdwb3J0fVxuICAgICAqL1xuICAgIHRoaXMuc2V0RnJhbWUgPSBmdW5jdGlvbiAoZnJhbWVUeXBlKSB7XG4gICAgICAgIHRoaXMuZ2V0RnJhbWVIYW5kbGVyKCkuc2V0RnJhbWVzKGZyYW1lVHlwZSk7XG5cbiAgICAgICAgdmFyIGJ1dHRvbnMgPSBjYW52YXMuZ2V0QnV0dG9uTWVudSgpLmdldEl0ZW1zKCk7XG4gICAgICAgIGlmIChmcmFtZVR5cGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgYnV0dG9uc1swXS5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1dHRvbnNbMF0uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy5nZXRCdXR0b25NZW51KCkuYnJpbmdUb0Zyb250KCk7XG5cbiAgICAgICAgY2FudmFzLnJlZnJlc2gzZFZpZXcoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX2RhdGE7XG4gICAgfTtcblxuICAgIHZhciBfZnJhbWVIYW5kbGVyID0gbnVsbDtcblxuICAgIHRoaXMuZ2V0RnJhbWVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX2ZyYW1lSGFuZGxlciB8fCAoX2ZyYW1lSGFuZGxlciA9IG5ldyBGcmFtZUhhbmRsZXIodGhpcykpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEdvcmVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2dvcmVIYW5kbGVyIHx8ICh0aGlzLl9fZ29yZUhhbmRsZXIgPSBuZXcgR29yZUhhbmRsZXIodGhpcykpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFJ1bGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19ydWxlckhhbmRsZXIgfHwgKHRoaXMuX19ydWxlckhhbmRsZXIgPSBuZXcgUnVsZXJIYW5kbGVyKHRoaXMpKTtcbiAgICB9O1xuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gVmlld3BvcnQ7XG5cbn0se1wiLi9GcmFtZUhhbmRsZXJcIjo4LFwiLi9Hb3JlSGFuZGxlclwiOjksXCIuL1J1bGVySGFuZGxlclwiOjEzLFwiLi91dGlsXCI6MjV9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZyYW1lczogcmVxdWlyZSgnLi9jb25maWcvZnJhbWVzJyksXG4gICAgdGV4dEJ1dHRvbjogcmVxdWlyZSgnLi9jb25maWcvdGV4dC1idXR0b24nKSxcbiAgICBidXR0b25NZW51OiByZXF1aXJlKCcuL2NvbmZpZy9idXR0b24tbWVudScpLFxuICAgIHJ1bGVySGFuZGxlOiByZXF1aXJlKCcuL2NvbmZpZy9ydWxlci1oYW5kbGUnKSxcbiAgICBkcmFnSGFuZGxlOiByZXF1aXJlKCcuL2NvbmZpZy9kcmFnLWhhbmRsZScpLFxuICAgIGRyYWdCYXI6IHJlcXVpcmUoJy4vY29uZmlnL2RyYWctYmFyJylcbn07XG5cbn0se1wiLi9jb25maWcvYnV0dG9uLW1lbnVcIjoxNyxcIi4vY29uZmlnL2RyYWctYmFyXCI6MTgsXCIuL2NvbmZpZy9kcmFnLWhhbmRsZVwiOjE5LFwiLi9jb25maWcvZnJhbWVzXCI6MjAsXCIuL2NvbmZpZy9ydWxlci1oYW5kbGVcIjoyMSxcIi4vY29uZmlnL3RleHQtYnV0dG9uXCI6MjJ9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgY2FudmFzOiB7XG4gICAgICAgIG1hcmdpbjogNSxcbiAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgZmlsbDogJyNmZmZmZmYnLFxuICAgICAgICAgICAgYWN0aXZlRmlsbDogJyNmZmZmZmYnLFxuICAgICAgICAgICAgZGlzYWJsZWRGaWxsOiAnI2ZmZmZmZidcbiAgICAgICAgfSxcbiAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgZmlsbDogJyMzNDM0MzQnLFxuICAgICAgICAgICAgYWN0aXZlRmlsbDogJyM0OTQ5NDknLFxuICAgICAgICAgICAgZGlzYWJsZWRGaWxsOiAnIzk5OTk5OSdcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgJ3Bob3RvLXdhbGxwYXBlcic6IHtcbiAgICAgICAgbWFyZ2luOiA1LFxuICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICBmaWxsOiAnI2ZmZmZmZicsXG4gICAgICAgICAgICBhY3RpdmVGaWxsOiAnI2ZmZmZmZicsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgIGZpbGw6ICcjMDAwMDAwJyxcbiAgICAgICAgICAgIGFjdGl2ZUZpbGw6ICcjNDQ0NDQ0JyxcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgd2FsbHBhcGVyOiB7XG4gICAgICAgIG1hcmdpbjogNSxcbiAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgZmlsbDogJyNmZmZmZmYnLFxuICAgICAgICAgICAgYWN0aXZlRmlsbDogJyNmZmZmZmYnLFxuICAgICAgICAgICAgZGlzYWJsZWRGaWxsOiAnI2ZmZmZmZidcbiAgICAgICAgfSxcbiAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgZmlsbDogJyMzNDM0MzQnLFxuICAgICAgICAgICAgYWN0aXZlRmlsbDogJyM0OTQ5NDknLFxuICAgICAgICAgICAgZGlzYWJsZWRGaWxsOiAnIzk5OTk5OSdcbiAgICAgICAgfSxcbiAgICB9XG5cbn07XG5cbn0se31dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmlsbDogJyNiYmJiYmInLFxuICAgIHNpemU6IDIwLFxufTtcblxufSx7fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICB0ZXh0OiB7XG4gICAgICAgIGZvbnRGYW1pbHk6ICdicmV1ZXInLFxuICAgICAgICBmb250U2l6ZTogMTIsXG4gICAgICAgIGZpbGw6ICcjZmZmZmZmJyxcbiAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICAgIHRvcDogMixcbiAgICB9LFxuICAgIHJlY3Q6IHtcbiAgICAgICAgZmlsbDogJyM2NjY2NjYnLFxuICAgICAgICBoZWlnaHQ6IDIwLFxuICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICB9LFxufTtcblxufSx7fV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgZmlsbDogJyMwMDAwMDAnLFxuICAgICAgICBzdHJva2U6ICcjZjMxZmIzJyxcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMSxcbiAgICB9LFxuXG4gICAgaW1hZ2U6IHtcbiAgICAgICAgZmlsbDogJ3JnYmEoMCwwLDAsMC4yKScsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgIH0sXG5cbiAgICBibGFjazoge1xuICAgICAgICBmaWxsOiAnIzAwMDAwMCcsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLFxuICAgIH0sXG5cbiAgICB3aGl0ZToge1xuICAgICAgICBmaWxsOiAnI2ZmZmZmZicsXG4gICAgICAgIHN0cm9rZVdpZHRoOiAwLFxuICAgIH0sXG5cbn07XG5cbn0se31dLDIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgICBsaW5lOiBmdW5jdGlvbihheGlzLCBib3VuZHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV2ZW50ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICBzdHJva2U6ICcjMDAwJyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgdG9wOiBheGlzID09PSAneCcgPyBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAvIDIgOiBib3VuZHMudG9wLFxuICAgICAgICAgICAgbGVmdDogYXhpcyA9PT0gJ3knID8gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLyAyIDogYm91bmRzLmxlZnRcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB0ZXh0OiB7XG4gICAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgICAgd2lkdGg6IDc1LFxuICAgICAgICBoZWlnaHQ6IDIwLFxuICAgICAgICBmaWxsOiAnIzMzZmYzMycsXG4gICAgfSxcblxuICAgIHg6IGZ1bmN0aW9uKGxpbmVzLCBib3VuZHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGF4aXM6ICdsZWZ0JyxcbiAgICAgICAgICAgIG1hcmtlcjogbGluZXMueSxcbiAgICAgICAgICAgIHRvcDogTWF0aC5jZWlsKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ICsgNSksXG4gICAgICAgICAgICBsZWZ0OiBsaW5lcy55LmxlZnQsXG4gICAgICAgICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGxvY2tNb3ZlbWVudFk6IHRydWUsXG4gICAgICAgICAgICBtb3ZlQ3Vyc29yOiAnZXctcmVzaXplJyxcbiAgICAgICAgICAgIGhvdmVyQ3Vyc29yOiAnZXctcmVzaXplJyxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgeTogZnVuY3Rpb24obGluZXMsIGJvdW5kcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXhpczogJ3RvcCcsXG4gICAgICAgICAgICBtYXJrZXI6IGxpbmVzLngsXG4gICAgICAgICAgICB0b3A6IGxpbmVzLngudG9wLFxuICAgICAgICAgICAgbGVmdDogTWF0aC5jZWlsKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoICsgNSksXG4gICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGxvY2tNb3ZlbWVudFg6IHRydWUsXG4gICAgICAgICAgICBtb3ZlQ3Vyc29yOiAnbnMtcmVzaXplJyxcbiAgICAgICAgICAgIGhvdmVyQ3Vyc29yOiAnbnMtcmVzaXplJyxcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbn0se31dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgICByZWN0OiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxsOiAnIzM0MzQzNCcsXG4gICAgICAgICAgICBhY3RpdmVGaWxsOiAnIzQ5NDk0OScsXG4gICAgICAgICAgICBkaXNhYmxlZEZpbGw6ICcjOTk5OTk5JyxcbiAgICAgICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgICAgICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggfHwgMSxcbiAgICAgICAgICAgIGR5bmFtaWNXOiAhd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCB8fCAxLFxuICAgICAgICAgICAgZHluYW1pY0g6ICFoZWlnaHQsXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdGV4dDoge1xuICAgICAgICBmaWxsOiAnI2ZmZmZmZicsXG4gICAgICAgIGZvbnRGYW1pbHk6ICdicmV1ZXInLFxuICAgICAgICBmb250U2l6ZTogMTQsXG4gICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICB9LFxuXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgcGFkZGluZzogMjAsXG59O1xuXG59LHt9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBEcmFnZ2FibGUgPSByZXF1aXJlKCcuL0RyYWdnYWJsZScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuZnVuY3Rpb24gRXh0ZW5kRmFicmljRnVuY3Rpb25hbGl0eSgpIHtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGZhYnJpYyBjYW52YXNcbiAgICAkLmV4dGVuZChmYWJyaWMuT2JqZWN0LnByb3RvdHlwZSwge1xuICAgICAgICBjb3JuZXJTaXplOiAwLFxuICAgICAgICBoYXNCb3JkZXJzOiBmYWxzZSxcbiAgICAgICAgaGFzQ29udHJvbHM6IGZhbHNlLFxuICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDAsXG4gICAgICAgIGFkZFRvOiBmdW5jdGlvbihjYW52YXMpIHtcbiAgICAgICAgICAgIGNhbnZhcy5hZGQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuXG4gICAgdXRpbC5zZXRQcm9wZXJ0aWVzKGZhYnJpYy5JbWFnZS5wcm90b3R5cGUsIHtcbiAgICAgICAgZHJhZzoge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fX2RyYWdnYWJsZSB8fCAodGhpcy5fX2RyYWdnYWJsZSA9IG5ldyBEcmFnZ2FibGUodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAkLmV4dGVuZChmYWJyaWMuUmVjdC5wcm90b3R5cGUsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGlubmVyIGJvdW5kcyBvZiB0aGlzIGZhYnJpYy5SZWN0XG4gICAgICAgICAqIEByZXR1cm4ge09iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIGdldEluc2lkZUJvdW5kaW5nUmVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5nZXRCb3VuZGluZ1JlY3QoKTtcbiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiBib3VuZHMubGVmdCArIHRoaXMuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAgICAgdG9wOiBib3VuZHMudG9wICsgdGhpcy5zdHJva2VXaWR0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogYm91bmRzLndpZHRoIC0gdGhpcy5zdHJva2VXaWR0aCAqIDIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBib3VuZHMuaGVpZ2h0IC0gdGhpcy5zdHJva2VXaWR0aCAqIDJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVyblZhbHVlLnJpZ2h0ID0gcmV0dXJuVmFsdWUubGVmdCArIHJldHVyblZhbHVlLndpZHRoO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUuYm90dG9tID0gcmV0dXJuVmFsdWUudG9wICsgcmV0dXJuVmFsdWUuaGVpZ2h0O1xuXG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5taW4gPSB7XG4gICAgICAgICAgICAgICAgbGVmdDogcmV0dXJuVmFsdWUubGVmdCxcbiAgICAgICAgICAgICAgICB0b3A6IHJldHVyblZhbHVlLnRvcFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuVmFsdWUubWF4ID0ge1xuICAgICAgICAgICAgICAgIGxlZnQ6IHJldHVyblZhbHVlLmxlZnQgKyByZXR1cm5WYWx1ZS53aWR0aCxcbiAgICAgICAgICAgICAgICB0b3A6IHJldHVyblZhbHVlLnRvcCArIHJldHVyblZhbHVlLmhlaWdodFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRXh0ZW5kRmFicmljRnVuY3Rpb25hbGl0eTtcblxufSx7XCIuL0RyYWdnYWJsZVwiOjcsXCIuL3V0aWxcIjoyNX1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uKCkge1xuXG4gICAgLyoqXG4gICAgICogRmFicmljIGZ1bmN0aW9uYWxpdHkgaXMgZXh0ZW5kZWQgd2l0aCBzb21lIGN1c3RvbSBmdW5jdGlvbmFsaXR5LiBUaGlzIGlzIGRvbmUgYmVmb3JlXG4gICAgICogd2UgZG8gYW55dGhpbmcgZWxzZS5cbiAgICAgKi9cbiAgICByZXF1aXJlKCcuL2V4dGVuZC1mYWJyaWMtZnVuY3Rpb25hbGl0eScpKCk7XG5cbiAgICAvKipcbiAgICAgKiBJbWFnZUVkaXRvciBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgYWxsIGZpbGVzLiBIZXJlIHRoZSBpbWFnZSBlZGl0b3IgaXMgY3JlYXRlZCBhbmRcbiAgICAgKiBpdCByZWNlaXZlcyBhdHRyaWJ1dGVzIGZyb20gdGhlIGluaXRpYWxpc2F0aW9uLiBBcyB0aGlzIGlzIGRvbmUgZnJvbSBvdXRzaWRlIG9mIHRoaXMgZmlsZSxcbiAgICAgKiB0aGUgSW1hZ2VFZGl0b3Igc2hvdWxkIGJlIGF2YWlsYWJsZSBvbiBnbG9iYWxseS5cbiAgICAgKi9cbiAgICB3aW5kb3cuSW1hZ2VFZGl0b3IgPSByZXF1aXJlKCcuL0ltYWdlRWRpdG9yJyk7XG5cbn0oKSk7XG59LHtcIi4vSW1hZ2VFZGl0b3JcIjoxMSxcIi4vZXh0ZW5kLWZhYnJpYy1mdW5jdGlvbmFsaXR5XCI6MjN9XSwyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgYXNzZXJ0S2V5VmFsdWVQYWlyOiByZXF1aXJlKCcuL3V0aWxzL2Fzc2VydC1rZXktdmFsdWUtcGFpcicpLFxuICAgIGFzc2VydEJldHdlZW46IHJlcXVpcmUoJy4vdXRpbHMvYXNzZXJ0LWJldHdlZW4nKSxcbiAgICBjYWxjQ3JvcDogcmVxdWlyZSgnLi91dGlscy9jYWxjLWNyb3AnKSxcbiAgICBzZXRQb3NpdGlvbkluc2lkZTogcmVxdWlyZSgnLi91dGlscy9zZXQtcG9zaXRpb24taW5zaWRlJyksXG4gICAgc2V0UHJvcGVydGllczogcmVxdWlyZSgnLi91dGlscy9zZXQtcHJvcGVydGllcycpLFxuICAgIHRvZ2dsZUZ1bGxzY3JlZW46IHJlcXVpcmUoJy4vdXRpbHMvdG9nZ2xlLWZ1bGxzY3JlZW4nKSxcbiAgICBpc01vYmlsZTogcmVxdWlyZSgnLi91dGlscy9pcy1tb2JpbGUnKSxcbiAgICBNb3VzZU1ldHJpY3M6IHJlcXVpcmUoJy4vdXRpbHMvbW91c2UtbWV0cmljcycpLFxuICAgIHN1cHBvcnRzRnVsbHNjcmVlbjogcmVxdWlyZSgnLi91dGlscy9zdXBwb3J0cy1mdWxsc2NyZWVuJyksXG4gICAgaXNGdWxsc2NyZWVuOiByZXF1aXJlKCcuL3V0aWxzL2lzLWZ1bGxzY3JlZW4nKSxcbiAgICBpc0FzcGVjdENoYW5nZWQ6IHJlcXVpcmUoJy4vdXRpbHMvaXMtYXNwZWN0LWNoYW5nZWQnKSxcbn07XG5cbn0se1wiLi91dGlscy9hc3NlcnQtYmV0d2VlblwiOjI2LFwiLi91dGlscy9hc3NlcnQta2V5LXZhbHVlLXBhaXJcIjoyNyxcIi4vdXRpbHMvY2FsYy1jcm9wXCI6MjgsXCIuL3V0aWxzL2lzLWFzcGVjdC1jaGFuZ2VkXCI6MjksXCIuL3V0aWxzL2lzLWZ1bGxzY3JlZW5cIjozMCxcIi4vdXRpbHMvaXMtbW9iaWxlXCI6MzEsXCIuL3V0aWxzL21vdXNlLW1ldHJpY3NcIjozMixcIi4vdXRpbHMvc2V0LXBvc2l0aW9uLWluc2lkZVwiOjMzLFwiLi91dGlscy9zZXQtcHJvcGVydGllc1wiOjM0LFwiLi91dGlscy9zdXBwb3J0cy1mdWxsc2NyZWVuXCI6MzUsXCIuL3V0aWxzL3RvZ2dsZS1mdWxsc2NyZWVuXCI6MzZ9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2VydEJldHdlZW4odmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgaWYgKHZhbHVlIDwgbWluKSB7XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGlmICh2YWx1ZSA+IG1heCkge1xuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzZXJ0QmV0d2VlbjtcblxufSx7fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBhc3NlcnRLZXlWYWx1ZVBhaXIoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIHZhciByZXR1cm5WYWx1ZSA9IHt9O1xuICAgIHJldHVyblZhbHVlW2tleV0gPSB2YWx1ZTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NlcnRLZXlWYWx1ZVBhaXI7XG5cbn0se31dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0gIHtmYWJyaWMuSW1hZ2V9IG9ialxuICogQHBhcmFtICB7aW50fSB3aWR0aFxuICogQHBhcmFtICB7aW50fSBoZWlnaHRcbiAqIEBwYXJhbSAge3N0cmluZ30gdW5pdHNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgICAgICAgIGF4aXM6IFNUUklORyxcbiAqICAgICAgICAgIGRpbTogT0JKRUNUKCB3aWR0aDogTlVNQkVSLCBoZWlnaHQ6IE5VTUJFUiksXG4gKiAgICAgICAgICB3aWR0aDogTlVNQkVSLFxuICogICAgICAgICAgaGVpZ2h0OiBOVU1CRVIsXG4gKiAgICAgICAgICBwcG1tOiBOVU1CRVJcbiAqL1xuZnVuY3Rpb24gY2FsY0Nyb3Aob2JqLCB3aWR0aCwgaGVpZ2h0LCB1bml0cykge1xuICAgIHZhciBjcm9wUmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcbiAgICB2YXIgb2JqUmF0aW8gPSBvYmoud2lkdGggLyBvYmouaGVpZ2h0O1xuXG4gICAgdmFyIHJldHVyblZhbHVlID0ge1xuICAgICAgICBpbWFnZTogb2JqLFxuICAgICAgICBheGlzOiBvYmpSYXRpbyA+IGNyb3BSYXRpbyA/ICd4JyA6ICd5JyxcbiAgICAgICAgZGltOiB7XG4gICAgICAgICAgICB3aWR0aDogTnVtYmVyKHdpZHRoKSxcbiAgICAgICAgICAgIGhlaWdodDogTnVtYmVyKGhlaWdodCksXG4gICAgICAgICAgICB1bml0czogdW5pdHNcbiAgICAgICAgfSxcbiAgICAgICAgd2lkdGg6IG9iai53aWR0aCAqIG9iai5zY2FsZVgsXG4gICAgICAgIGhlaWdodDogb2JqLmhlaWdodCAqIG9iai5zY2FsZVksXG4gICAgICAgIG9iamVjdFJhdGlvOiBvYmpSYXRpbyxcbiAgICAgICAgY3JvcFJhdGlvOiBjcm9wUmF0aW9cbiAgICB9O1xuXG4gICAgaWYgKG9ialJhdGlvID4gY3JvcFJhdGlvKSB7XG4gICAgICAgIHJldHVyblZhbHVlLndpZHRoICo9IGNyb3BSYXRpbyAvIG9ialJhdGlvO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblZhbHVlLmhlaWdodCAvPSBjcm9wUmF0aW8gLyBvYmpSYXRpbztcbiAgICB9XG5cbiAgICAvLyBQaXhlbHMgcGVyIG1pbGxpbWV0ZXJcbiAgICByZXR1cm5WYWx1ZS5wcG1tID0gcmV0dXJuVmFsdWUud2lkdGggLyAoKHJldHVyblZhbHVlLmRpbS53aWR0aCAqIG9iai5zY2FsZVgpICogMTApO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbGNDcm9wO1xuXG59LHt9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGlzQXNwZWN0Q2hhbmdlZCh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiAoTWF0aC5hYnMoeDEgLyB5MSAtIHgyIC8geTIpID4gMC4wMSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBc3BlY3RDaGFuZ2VkO1xuXG59LHt9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGlzRnVsbHNjcmVlbigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bGxzY3JlZW47XG5cbn0se31dLDMxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gaXNNb2JpbGUoKSB7XG4gICAgcmV0dXJuICQod2luZG93KS53aWR0aCgpIDwgNzY4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTW9iaWxlO1xuXG59LHt9XSwzMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBNb3VzZU1ldHJpY3MgPSB7XG4gICAgcHJldmlvdXNNb3VzZURhdGE6IHtcbiAgICAgICAgeDogbnVsbCxcbiAgICAgICAgeTogbnVsbFxuICAgIH0sXG5cbiAgICBkZWxldGVQcmV2aW91c01vdXNlRGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIE1vdXNlTWV0cmljcy5wcmV2aW91c01vdXNlRGF0YSA9IHtcbiAgICAgICAgICAgIHg6IG51bGwsXG4gICAgICAgICAgICB5OiBudWxsXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIHNldFByZXZpb3VzTW91c2VEYXRhOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgICAgTW91c2VNZXRyaWNzLnByZXZpb3VzTW91c2VEYXRhID0ge1xuICAgICAgICAgICAgeDogdmFsdWVzLnggfHwgbnVsbCxcbiAgICAgICAgICAgIHk6IHZhbHVlcy55IHx8IG51bGwsXG4gICAgICAgIH07XG4gICAgfSxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTW91c2VNZXRyaWNzO1xuXG59LHt9XSwzMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHBhcmFtICB7ZmFicmljLk9iamVjdH0gb2JqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGJvdW5kc1xuICogQHJldHVybiB7ZmFicmljLk9iamVjdH1cbiAqL1xuZnVuY3Rpb24gc2V0UG9zaXRpb25JbnNpZGUob2JqLCBib3VuZHMpIHtcbiAgICBbJ2xlZnQnLCAndG9wJ10uZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgICBpZiAob2JqW3ZdIDwgYm91bmRzW3ZdLm1pbikge1xuICAgICAgICAgICAgb2JqLnNldCh2LCBib3VuZHNbdl0ubWluKS5zZXRDb29yZHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvYmpbdl0gPiBib3VuZHNbdl0ubWF4KSB7XG4gICAgICAgICAgICBvYmouc2V0KHYsIGJvdW5kc1t2XS5tYXgpLnNldENvb3JkcygpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRQb3NpdGlvbkluc2lkZTtcblxufSx7fV0sMzQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gc2V0UHJvcGVydGllcyhvYmosIHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBvIGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobykpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG8sIHByb3BlcnRpZXNbb10pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFByb3BlcnRpZXM7XG5cbn0se31dLDM1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gc3VwcG9ydHNGdWxsc2NyZWVuKCkge1xuXG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuO1xuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3VwcG9ydHNGdWxsc2NyZWVuO1xuXG59LHt9XSwzNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0Z1bGxzY3JlZW4gPSByZXF1aXJlKCcuL2lzLWZ1bGxzY3JlZW4nKTtcbi8qKlxuICogVG9nZ2xlcyB0aGUgZnVsbCBzY3JlZW4gc3RhdGUgZm9yIHBhc3NlZCBET00gb2JqZWN0XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbG1cbiAqL1xuZnVuY3Rpb24gdG9nZ2xlRnVsbHNjcmVlbihlbGVtKSB7XG4gICAgaWYgKGlzRnVsbHNjcmVlbigpKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbikge1xuICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9nZ2xlRnVsbHNjcmVlbjtcblxufSx7XCIuL2lzLWZ1bGxzY3JlZW5cIjozMH1dfSx7fSxbMjRdKTtcbiJdLCJmaWxlIjoibm90LXVzZWQtYnV0LW5lZWRlZC1zdHJpbmcuanMifQ==