(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["Quagga"] = factory(); else root["Quagga"] = factory(); })(window, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 90); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var toPropertyKey = __webpack_require__(68); function _defineProperty(e, r, t) { return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 1 */ /***/ (function(module, exports) { function _getPrototypeOf(t) { return module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, module.exports.__esModule = true, module.exports["default"] = module.exports, _getPrototypeOf(t); } module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 2 */ /***/ (function(module, exports) { function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { var toPropertyKey = __webpack_require__(68); function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = __webpack_require__(8)["default"]; var assertThisInitialized = __webpack_require__(150); function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return assertThisInitialized(t); } module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { var setPrototypeOf = __webpack_require__(38); function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && setPrototypeOf(t, e); } module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { // TODO(Babel 8): Remove this file. var runtime = __webpack_require__(146)(); module.exports = runtime; // Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736= try { regeneratorRuntime = runtime; } catch (accidentalStrictMode) { if (typeof globalThis === "object") { globalThis.regeneratorRuntime = runtime; } else { Function("r", "regeneratorRuntime = r")(runtime); } } /***/ }), /* 7 */ /***/ (function(module, exports) { function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 8 */ /***/ (function(module, exports) { function _typeof(o) { "@babel/helpers - typeof"; return module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, module.exports.__esModule = true, module.exports["default"] = module.exports, _typeof(o); } module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { var freeGlobal = __webpack_require__(46); /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; /***/ }), /* 10 */ /***/ (function(module, exports) { /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return value != null && (type == 'object' || type == 'function'); } module.exports = isObject; /***/ }), /* 11 */ /***/ (function(module, exports) { /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } module.exports = isObjectLike; /***/ }), /* 12 */ /***/ (function(module, exports) { /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { var superPropBase = __webpack_require__(151); function _get() { return module.exports = _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, module.exports.__esModule = true, module.exports["default"] = module.exports, _get.apply(null, arguments); } module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { var baseIsNative = __webpack_require__(102), getValue = __webpack_require__(108); /** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */ function getNative(object, key) { var value = getValue(object, key); return baseIsNative(value) ? value : undefined; } module.exports = getNative; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { var baseMerge = __webpack_require__(91), createAssigner = __webpack_require__(134); /** * This method is like `_.assign` except that it recursively merges own and * inherited enumerable string keyed properties of source objects into the * destination object. Source properties that resolve to `undefined` are * skipped if a destination value exists. Array and plain object properties * are merged recursively. Other objects and value types are overridden by * assignment. Source objects are applied from left to right. Subsequent * sources overwrite property assignments of previous sources. * * **Note:** This method mutates `object`. * * @static * @memberOf _ * @since 0.5.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @example * * var object = { * 'a': [{ 'b': 2 }, { 'd': 4 }] * }; * * var other = { * 'a': [{ 'c': 3 }, { 'e': 5 }] * }; * * _.merge(object, other); * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } */ var merge = createAssigner(function(object, source, srcIndex) { baseMerge(object, source, srcIndex); }); module.exports = merge; /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { var arrayWithoutHoles = __webpack_require__(152); var iterableToArray = __webpack_require__(153); var unsupportedIterableToArray = __webpack_require__(66); var nonIterableSpread = __webpack_require__(154); function _toConsumableArray(r) { return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread(); } module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19), getRawTag = __webpack_require__(104), objectToString = __webpack_require__(105); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } module.exports = baseGetTag; /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { var assignValue = __webpack_require__(60), baseAssignValue = __webpack_require__(29); /** * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. * @param {Array} props The property identifiers to copy. * @param {Object} [object={}] The object to copy properties to. * @param {Function} [customizer] The function to customize copied values. * @returns {Object} Returns `object`. */ function copyObject(source, props, object, customizer) { var isNew = !object; object || (object = {}); var index = -1, length = props.length; while (++index < length) { var key = props[index]; var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined; if (newValue === undefined) { newValue = source[key]; } if (isNew) { baseAssignValue(object, key, newValue); } else { assignValue(object, key, newValue); } } return object; } module.exports = copyObject; /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(9); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeKeys = __webpack_require__(61), baseKeysIn = __webpack_require__(132), isArrayLike = __webpack_require__(26); /** * Creates an array of the own and inherited enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. * * @static * @memberOf _ * @since 3.0.0 * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keysIn(new Foo); * // => ['a', 'b', 'c'] (iteration order is not guaranteed) */ function keysIn(object) { return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); } module.exports = keysIn; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { var listCacheClear = __webpack_require__(92), listCacheDelete = __webpack_require__(93), listCacheGet = __webpack_require__(94), listCacheHas = __webpack_require__(95), listCacheSet = __webpack_require__(96); /** * Creates an list cache object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function ListCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `ListCache`. ListCache.prototype.clear = listCacheClear; ListCache.prototype['delete'] = listCacheDelete; ListCache.prototype.get = listCacheGet; ListCache.prototype.has = listCacheHas; ListCache.prototype.set = listCacheSet; module.exports = ListCache; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { var eq = __webpack_require__(23); /** * Gets the index at which the `key` is found in `array` of key-value pairs. * * @private * @param {Array} array The array to inspect. * @param {*} key The key to search for. * @returns {number} Returns the index of the matched value, else `-1`. */ function assocIndexOf(array, key) { var length = array.length; while (length--) { if (eq(array[length][0], key)) { return length; } } return -1; } module.exports = assocIndexOf; /***/ }), /* 23 */ /***/ (function(module, exports) { /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */ function eq(value, other) { return value === other || (value !== value && other !== other); } module.exports = eq; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14); /* Built-in method references that are verified to be native. */ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { var isKeyable = __webpack_require__(117); /** * Gets the data for `map`. * * @private * @param {Object} map The map to query. * @param {string} key The reference key. * @returns {*} Returns the map data. */ function getMapData(map, key) { var data = map.__data__; return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map; } module.exports = getMapData; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(28), isLength = __webpack_require__(56); /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } module.exports = isArrayLike; /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14), root = __webpack_require__(9); /* Built-in method references that are verified to be native. */ var Map = getNative(root, 'Map'); module.exports = Map; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(17), isObject = __webpack_require__(10); /** `Object#toString` result references. */ var asyncTag = '[object AsyncFunction]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', proxyTag = '[object Proxy]'; /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { if (!isObject(value)) { return false; } // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 9 which returns 'object' for typed arrays and other constructors. var tag = baseGetTag(value); return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; } module.exports = isFunction; /***/ }), /* 29 */ /***/ (function(module, exports, __webpack_require__) { var defineProperty = __webpack_require__(50); /** * The base implementation of `assignValue` and `assignMergeValue` without * value checks. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function baseAssignValue(object, key, value) { if (key == '__proto__' && defineProperty) { defineProperty(object, key, { 'configurable': true, 'enumerable': true, 'value': value, 'writable': true }); } else { object[key] = value; } } module.exports = baseAssignValue; /***/ }), /* 30 */ /***/ (function(module, exports) { module.exports = function(module) { if (!module.webpackPolyfill) { module.deprecate = function() {}; module.paths = []; // module.parent = undefined by default if (!module.children) module.children = []; Object.defineProperty(module, "loaded", { enumerable: true, get: function() { return module.l; } }); Object.defineProperty(module, "id", { enumerable: true, get: function() { return module.i; } }); module.webpackPolyfill = 1; } return module; }; /***/ }), /* 31 */ /***/ (function(module, exports, __webpack_require__) { var Uint8Array = __webpack_require__(124); /** * Creates a clone of `arrayBuffer`. * * @private * @param {ArrayBuffer} arrayBuffer The array buffer to clone. * @returns {ArrayBuffer} Returns the cloned array buffer. */ function cloneArrayBuffer(arrayBuffer) { var result = new arrayBuffer.constructor(arrayBuffer.byteLength); new Uint8Array(result).set(new Uint8Array(arrayBuffer)); return result; } module.exports = cloneArrayBuffer; /***/ }), /* 32 */ /***/ (function(module, exports, __webpack_require__) { var overArg = __webpack_require__(55); /** Built-in value references. */ var getPrototype = overArg(Object.getPrototypeOf, Object); module.exports = getPrototype; /***/ }), /* 33 */ /***/ (function(module, exports) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */ function isPrototype(value) { var Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; return value === proto; } module.exports = isPrototype; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { var baseIsArguments = __webpack_require__(126), isObjectLike = __webpack_require__(11); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); }; module.exports = isArguments; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(9), stubFalse = __webpack_require__(128); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Built-in value references. */ var Buffer = moduleExports ? root.Buffer : undefined; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; /** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */ var isBuffer = nativeIsBuffer || stubFalse; module.exports = isBuffer; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30)(module))) /***/ }), /* 36 */ /***/ (function(module, exports) { /** * The base implementation of `_.unary` without support for storing metadata. * * @private * @param {Function} func The function to cap arguments for. * @returns {Function} Returns the new capped function. */ function baseUnary(func) { return function(value) { return func(value); }; } module.exports = baseUnary; /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(46); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Detect free variable `process` from Node.js. */ var freeProcess = moduleExports && freeGlobal.process; /** Used to access faster Node.js helpers. */ var nodeUtil = (function() { try { // Use `util.types` for Node.js 10+. var types = freeModule && freeModule.require && freeModule.require('util').types; if (types) { return types; } // Legacy `process.binding('util')` for Node.js < 10. return freeProcess && freeProcess.binding && freeProcess.binding('util'); } catch (e) {} }()); module.exports = nodeUtil; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30)(module))) /***/ }), /* 38 */ /***/ (function(module, exports) { function _setPrototypeOf(t, e) { return module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, module.exports.__esModule = true, module.exports["default"] = module.exports, _setPrototypeOf(t, e); } module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeKeys = __webpack_require__(61), baseKeys = __webpack_require__(159), isArrayLike = __webpack_require__(26); /** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { * this.a = 1; * this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */ function keys(object) { return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); } module.exports = keys; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { var arrayFilter = __webpack_require__(163), stubArray = __webpack_require__(75); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Built-in value references. */ var propertyIsEnumerable = objectProto.propertyIsEnumerable; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { if (object == null) { return []; } object = Object(object); return arrayFilter(nativeGetSymbols(object), function(symbol) { return propertyIsEnumerable.call(object, symbol); }); }; module.exports = getSymbols; /***/ }), /* 41 */ /***/ (function(module, exports) { /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } module.exports = arrayPush; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { var DataView = __webpack_require__(166), Map = __webpack_require__(27), Promise = __webpack_require__(167), Set = __webpack_require__(168), WeakMap = __webpack_require__(169), baseGetTag = __webpack_require__(17), toSource = __webpack_require__(47); /** `Object#toString` result references. */ var mapTag = '[object Map]', objectTag = '[object Object]', promiseTag = '[object Promise]', setTag = '[object Set]', weakMapTag = '[object WeakMap]'; var dataViewTag = '[object DataView]'; /** Used to detect maps, sets, and weakmaps. */ var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap); /** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || (Map && getTag(new Map) != mapTag) || (Promise && getTag(Promise.resolve()) != promiseTag) || (Set && getTag(new Set) != setTag) || (WeakMap && getTag(new WeakMap) != weakMapTag)) { getTag = function(value) { var result = baseGetTag(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : ''; if (ctorString) { switch (ctorString) { case dataViewCtorString: return dataViewTag; case mapCtorString: return mapTag; case promiseCtorString: return promiseTag; case setCtorString: return setTag; case weakMapCtorString: return weakMapTag; } } return result; }; } module.exports = getTag; /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { var isArray = __webpack_require__(12), isKey = __webpack_require__(180), stringToPath = __webpack_require__(181), toString = __webpack_require__(184); /** * Casts `value` to a path array if it's not one. * * @private * @param {*} value The value to inspect. * @param {Object} [object] The object to query keys on. * @returns {Array} Returns the cast property path array. */ function castPath(value, object) { if (isArray(value)) { return value; } return isKey(value, object) ? [value] : stringToPath(toString(value)); } module.exports = castPath; /***/ }), /* 44 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(17), isObjectLike = __webpack_require__(11); /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(21), stackClear = __webpack_require__(97), stackDelete = __webpack_require__(98), stackGet = __webpack_require__(99), stackHas = __webpack_require__(100), stackSet = __webpack_require__(101); /** * Creates a stack cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Stack(entries) { var data = this.__data__ = new ListCache(entries); this.size = data.size; } // Add methods to `Stack`. Stack.prototype.clear = stackClear; Stack.prototype['delete'] = stackDelete; Stack.prototype.get = stackGet; Stack.prototype.has = stackHas; Stack.prototype.set = stackSet; module.exports = Stack; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; module.exports = freeGlobal; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(103))) /***/ }), /* 47 */ /***/ (function(module, exports) { /** Used for built-in method references. */ var funcProto = Function.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** * Converts `func` to its source code. * * @private * @param {Function} func The function to convert. * @returns {string} Returns the source code. */ function toSource(func) { if (func != null) { try { return funcToString.call(func); } catch (e) {} try { return (func + ''); } catch (e) {} } return ''; } module.exports = toSource; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { var mapCacheClear = __webpack_require__(109), mapCacheDelete = __webpack_require__(116), mapCacheGet = __webpack_require__(118), mapCacheHas = __webpack_require__(119), mapCacheSet = __webpack_require__(120); /** * Creates a map cache object to store key-value pairs. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function MapCache(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `MapCache`. MapCache.prototype.clear = mapCacheClear; MapCache.prototype['delete'] = mapCacheDelete; MapCache.prototype.get = mapCacheGet; MapCache.prototype.has = mapCacheHas; MapCache.prototype.set = mapCacheSet; module.exports = MapCache; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { var baseAssignValue = __webpack_require__(29), eq = __webpack_require__(23); /** * This function is like `assignValue` except that it doesn't assign * `undefined` values. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignMergeValue(object, key, value) { if ((value !== undefined && !eq(object[key], value)) || (value === undefined && !(key in object))) { baseAssignValue(object, key, value); } } module.exports = assignMergeValue; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14); var defineProperty = (function() { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); module.exports = defineProperty; /***/ }), /* 51 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(9); /** Detect free variable `exports`. */ var freeExports = true && exports && !exports.nodeType && exports; /** Detect free variable `module`. */ var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; /** Detect the popular CommonJS extension `module.exports`. */ var moduleExports = freeModule && freeModule.exports === freeExports; /** Built-in value references. */ var Buffer = moduleExports ? root.Buffer : undefined, allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; /** * Creates a clone of `buffer`. * * @private * @param {Buffer} buffer The buffer to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Buffer} Returns the cloned buffer. */ function cloneBuffer(buffer, isDeep) { if (isDeep) { return buffer.slice(); } var length = buffer.length, result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); buffer.copy(result); return result; } module.exports = cloneBuffer; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30)(module))) /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(31); /** * Creates a clone of `typedArray`. * * @private * @param {Object} typedArray The typed array to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the cloned typed array. */ function cloneTypedArray(typedArray, isDeep) { var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); } module.exports = cloneTypedArray; /***/ }), /* 53 */ /***/ (function(module, exports) { /** * Copies the values of `source` to `array`. * * @private * @param {Array} source The array to copy values from. * @param {Array} [array=[]] The array to copy values to. * @returns {Array} Returns `array`. */ function copyArray(source, array) { var index = -1, length = source.length; array || (array = Array(length)); while (++index < length) { array[index] = source[index]; } return array; } module.exports = copyArray; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { var baseCreate = __webpack_require__(125), getPrototype = __webpack_require__(32), isPrototype = __webpack_require__(33); /** * Initializes an object clone. * * @private * @param {Object} object The object to clone. * @returns {Object} Returns the initialized clone. */ function initCloneObject(object) { return (typeof object.constructor == 'function' && !isPrototype(object)) ? baseCreate(getPrototype(object)) : {}; } module.exports = initCloneObject; /***/ }), /* 55 */ /***/ (function(module, exports) { /** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */ function overArg(func, transform) { return function(arg) { return func(transform(arg)); }; } module.exports = overArg; /***/ }), /* 56 */ /***/ (function(module, exports) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } module.exports = isLength; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(17), getPrototype = __webpack_require__(32), isObjectLike = __webpack_require__(11); /** `Object#toString` result references. */ var objectTag = '[object Object]'; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to infer the `Object` constructor. */ var objectCtorString = funcToString.call(Object); /** * Checks if `value` is a plain object, that is, an object created by the * `Object` constructor or one with a `[[Prototype]]` of `null`. * * @static * @memberOf _ * @since 0.8.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. * @example * * function Foo() { * this.a = 1; * } * * _.isPlainObject(new Foo); * // => false * * _.isPlainObject([1, 2, 3]); * // => false * * _.isPlainObject({ 'x': 0, 'y': 0 }); * // => true * * _.isPlainObject(Object.create(null)); * // => true */ function isPlainObject(value) { if (!isObjectLike(value) || baseGetTag(value) != objectTag) { return false; } var proto = getPrototype(value); if (proto === null) { return true; } var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; return typeof Ctor == 'function' && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; } module.exports = isPlainObject; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { var baseIsTypedArray = __webpack_require__(129), baseUnary = __webpack_require__(36), nodeUtil = __webpack_require__(37); /* Node.js helper references. */ var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); * // => true * * _.isTypedArray([]); * // => false */ var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; /***/ }), /* 59 */ /***/ (function(module, exports) { /** * Gets the value at `key`, unless `key` is "__proto__" or "constructor". * * @private * @param {Object} object The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function safeGet(object, key) { if (key === 'constructor' && typeof object[key] === 'function') { return; } if (key == '__proto__') { return; } return object[key]; } module.exports = safeGet; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { var baseAssignValue = __webpack_require__(29), eq = __webpack_require__(23); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */ function assignValue(object, key, value) { var objValue = object[key]; if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || (value === undefined && !(key in object))) { baseAssignValue(object, key, value); } } module.exports = assignValue; /***/ }), /* 61 */ /***/ (function(module, exports, __webpack_require__) { var baseTimes = __webpack_require__(131), isArguments = __webpack_require__(34), isArray = __webpack_require__(12), isBuffer = __webpack_require__(35), isIndex = __webpack_require__(62), isTypedArray = __webpack_require__(58); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */ function arrayLikeKeys(value, inherited) { var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; for (var key in value) { if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode. key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers. (isBuff && (key == 'offset' || key == 'parent')) || // PhantomJS 2 has enumerable non-index properties on typed arrays. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || // Skip index properties. isIndex(key, length) ))) { result.push(key); } } return result; } module.exports = arrayLikeKeys; /***/ }), /* 62 */ /***/ (function(module, exports) { /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; /** Used to detect unsigned integer values. */ var reIsUint = /^(?:0|[1-9]\d*)$/; /** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { var type = typeof value; length = length == null ? MAX_SAFE_INTEGER : length; return !!length && (type == 'number' || (type != 'symbol' && reIsUint.test(value))) && (value > -1 && value % 1 == 0 && value < length); } module.exports = isIndex; /***/ }), /* 63 */ /***/ (function(module, exports) { /** * This method returns the first argument it receives. * * @static * @since 0.1.0 * @memberOf _ * @category Util * @param {*} value Any value. * @returns {*} Returns `value`. * @example * * var object = { 'a': 1 }; * * console.log(_.identity(object) === object); * // => true */ function identity(value) { return value; } module.exports = identity; /***/ }), /* 64 */ /***/ (function(module, exports, __webpack_require__) { var apply = __webpack_require__(136); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeMax = Math.max; /** * A specialized version of `baseRest` which transforms the rest array. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @param {Function} transform The rest array transform. * @returns {Function} Returns the new function. */ function overRest(func, start, transform) { start = nativeMax(start === undefined ? (func.length - 1) : start, 0); return function() { var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array(length); while (++index < length) { array[index] = args[start + index]; } index = -1; var otherArgs = Array(start + 1); while (++index < start) { otherArgs[index] = args[index]; } otherArgs[start] = transform(array); return apply(func, this, otherArgs); }; } module.exports = overRest; /***/ }), /* 65 */ /***/ (function(module, exports, __webpack_require__) { var baseSetToString = __webpack_require__(137), shortOut = __webpack_require__(139); /** * Sets the `toString` method of `func` to return `string`. * * @private * @param {Function} func The function to modify. * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ var setToString = shortOut(baseSetToString); module.exports = setToString; /***/ }), /* 66 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeToArray = __webpack_require__(67); function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0; } } module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 67 */ /***/ (function(module, exports) { function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = __webpack_require__(8)["default"]; var toPrimitive = __webpack_require__(145); function toPropertyKey(t) { var i = toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } module.exports = toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 69 */ /***/ (function(module, exports) { function _OverloadYield(e, d) { this.v = e, this.k = d; } module.exports = _OverloadYield, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 70 */ /***/ (function(module, exports, __webpack_require__) { var regeneratorDefine = __webpack_require__(71); function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return regeneratorDefine(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (regeneratorDefine(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, regeneratorDefine(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, regeneratorDefine(u, "constructor", GeneratorFunctionPrototype), regeneratorDefine(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", regeneratorDefine(GeneratorFunctionPrototype, o, "GeneratorFunction"), regeneratorDefine(u), regeneratorDefine(u, o, "Generator"), regeneratorDefine(u, n, function () { return this; }), regeneratorDefine(u, "toString", function () { return "[object Generator]"; }), (module.exports = _regenerator = function _regenerator() { return { w: i, m: f }; }, module.exports.__esModule = true, module.exports["default"] = module.exports)(); } module.exports = _regenerator, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 71 */ /***/ (function(module, exports) { function _regeneratorDefine(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } module.exports = _regeneratorDefine = function regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, module.exports.__esModule = true, module.exports["default"] = module.exports, _regeneratorDefine(e, r, n, t); } module.exports = _regeneratorDefine, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { var regenerator = __webpack_require__(70); var regeneratorAsyncIterator = __webpack_require__(73); function _regeneratorAsyncGen(r, e, t, o, n) { return new regeneratorAsyncIterator(regenerator().w(r, e, t, o), n || Promise); } module.exports = _regeneratorAsyncGen, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { var OverloadYield = __webpack_require__(69); var regeneratorDefine = __webpack_require__(71); function AsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (regeneratorDefine(AsyncIterator.prototype), regeneratorDefine(AsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), regeneratorDefine(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); } module.exports = AsyncIterator, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 74 */ /***/ (function(module, exports) { /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; /***/ }), /* 75 */ /***/ (function(module, exports) { /** * This method returns a new empty array. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {Array} Returns the new empty array. * @example * * var arrays = _.times(2, _.stubArray); * * console.log(arrays); * // => [[], []] * * console.log(arrays[0] === arrays[1]); * // => false */ function stubArray() { return []; } module.exports = stubArray; /***/ }), /* 76 */ /***/ (function(module, exports, __webpack_require__) { var arrayPush = __webpack_require__(41), getPrototype = __webpack_require__(32), getSymbols = __webpack_require__(40), stubArray = __webpack_require__(75); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetSymbols = Object.getOwnPropertySymbols; /** * Creates an array of the own and inherited enumerable symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of symbols. */ var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { var result = []; while (object) { arrayPush(result, getSymbols(object)); object = getPrototype(object); } return result; }; module.exports = getSymbolsIn; /***/ }), /* 77 */ /***/ (function(module, exports, __webpack_require__) { var arrayPush = __webpack_require__(41), isArray = __webpack_require__(12); /** * The base implementation of `getAllKeys` and `getAllKeysIn` which uses * `keysFunc` and `symbolsFunc` to get the enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @param {Function} keysFunc The function to get the keys of `object`. * @param {Function} symbolsFunc The function to get the symbols of `object`. * @returns {Array} Returns the array of property names and symbols. */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); } module.exports = baseGetAllKeys; /***/ }), /* 78 */ /***/ (function(module, exports, __webpack_require__) { var baseGetAllKeys = __webpack_require__(77), getSymbolsIn = __webpack_require__(76), keysIn = __webpack_require__(20); /** * Creates an array of own and inherited enumerable property names and * symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeysIn(object) { return baseGetAllKeys(object, keysIn, getSymbolsIn); } module.exports = getAllKeysIn; /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { var isSymbol = __webpack_require__(44); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** * Converts `value` to a string key if it's not a string or symbol. * * @private * @param {*} value The value to inspect. * @returns {string|symbol} Returns the key. */ function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = toKey; /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { var arrayWithHoles = __webpack_require__(142); var iterableToArrayLimit = __webpack_require__(143); var unsupportedIterableToArray = __webpack_require__(66); var nonIterableRest = __webpack_require__(144); function _slicedToArray(r, e) { return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest(); } module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 81 */ /***/ (function(module, exports, __webpack_require__) { var objectWithoutPropertiesLoose = __webpack_require__(155); function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } module.exports = _objectWithoutProperties, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 82 */ /***/ (function(module, exports, __webpack_require__) { var arrayMap = __webpack_require__(74), baseClone = __webpack_require__(156), baseUnset = __webpack_require__(179), castPath = __webpack_require__(43), copyObject = __webpack_require__(18), customOmitClone = __webpack_require__(190), flatRest = __webpack_require__(191), getAllKeysIn = __webpack_require__(78); /** Used to compose bitmasks for cloning. */ var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable property paths of `object` that are not omitted. * * **Note:** This method is considerably slower than `_.pick`. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. * @param {...(string|string[])} [paths] The property paths to omit. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.omit(object, ['a', 'c']); * // => { 'b': '2' } */ var omit = flatRest(function(object, paths) { var result = {}; if (object == null) { return result; } var isDeep = false; paths = arrayMap(paths, function(path) { path = castPath(path, object); isDeep || (isDeep = path.length > 1); return path; }); copyObject(object, getAllKeysIn(object), result); if (isDeep) { result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); } var length = paths.length; while (length--) { baseUnset(result, paths[length]); } return result; }); module.exports = omit; /***/ }), /* 83 */ /***/ (function(module, exports, __webpack_require__) { var getPrototypeOf = __webpack_require__(1); var setPrototypeOf = __webpack_require__(38); var isNativeFunction = __webpack_require__(195); var construct = __webpack_require__(196); function _wrapNativeSuper(t) { var r = "function" == typeof Map ? new Map() : void 0; return module.exports = _wrapNativeSuper = function _wrapNativeSuper(t) { if (null === t || !isNativeFunction(t)) return t; if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function"); if (void 0 !== r) { if (r.has(t)) return r.get(t); r.set(t, Wrapper); } function Wrapper() { return construct(t, arguments, getPrototypeOf(this).constructor); } return Wrapper.prototype = Object.create(t.prototype, { constructor: { value: Wrapper, enumerable: !1, writable: !0, configurable: !0 } }), setPrototypeOf(Wrapper, t); }, module.exports.__esModule = true, module.exports["default"] = module.exports, _wrapNativeSuper(t); } module.exports = _wrapNativeSuper, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 84 */, /* 85 */, /* 86 */, /* 87 */, /* 88 */, /* 89 */, /* 90 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(198); /***/ }), /* 91 */ /***/ (function(module, exports, __webpack_require__) { var Stack = __webpack_require__(45), assignMergeValue = __webpack_require__(49), baseFor = __webpack_require__(121), baseMergeDeep = __webpack_require__(123), isObject = __webpack_require__(10), keysIn = __webpack_require__(20), safeGet = __webpack_require__(59); /** * The base implementation of `_.merge` without support for multiple sources. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @param {number} srcIndex The index of `source`. * @param {Function} [customizer] The function to customize merged values. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. */ function baseMerge(object, source, srcIndex, customizer, stack) { if (object === source) { return; } baseFor(source, function(srcValue, key) { stack || (stack = new Stack); if (isObject(srcValue)) { baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); } else { var newValue = customizer ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) : undefined; if (newValue === undefined) { newValue = srcValue; } assignMergeValue(object, key, newValue); } }, keysIn); } module.exports = baseMerge; /***/ }), /* 92 */ /***/ (function(module, exports) { /** * Removes all key-value entries from the list cache. * * @private * @name clear * @memberOf ListCache */ function listCacheClear() { this.__data__ = []; this.size = 0; } module.exports = listCacheClear; /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(22); /** Used for built-in method references. */ var arrayProto = Array.prototype; /** Built-in value references. */ var splice = arrayProto.splice; /** * Removes `key` and its value from the list cache. * * @private * @name delete * @memberOf ListCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function listCacheDelete(key) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { return false; } var lastIndex = data.length - 1; if (index == lastIndex) { data.pop(); } else { splice.call(data, index, 1); } --this.size; return true; } module.exports = listCacheDelete; /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(22); /** * Gets the list cache value for `key`. * * @private * @name get * @memberOf ListCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function listCacheGet(key) { var data = this.__data__, index = assocIndexOf(data, key); return index < 0 ? undefined : data[index][1]; } module.exports = listCacheGet; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(22); /** * Checks if a list cache value for `key` exists. * * @private * @name has * @memberOf ListCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function listCacheHas(key) { return assocIndexOf(this.__data__, key) > -1; } module.exports = listCacheHas; /***/ }), /* 96 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(22); /** * Sets the list cache `key` to `value`. * * @private * @name set * @memberOf ListCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the list cache instance. */ function listCacheSet(key, value) { var data = this.__data__, index = assocIndexOf(data, key); if (index < 0) { ++this.size; data.push([key, value]); } else { data[index][1] = value; } return this; } module.exports = listCacheSet; /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(21); /** * Removes all key-value entries from the stack. * * @private * @name clear * @memberOf Stack */ function stackClear() { this.__data__ = new ListCache; this.size = 0; } module.exports = stackClear; /***/ }), /* 98 */ /***/ (function(module, exports) { /** * Removes `key` and its value from the stack. * * @private * @name delete * @memberOf Stack * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { var data = this.__data__, result = data['delete'](key); this.size = data.size; return result; } module.exports = stackDelete; /***/ }), /* 99 */ /***/ (function(module, exports) { /** * Gets the stack value for `key`. * * @private * @name get * @memberOf Stack * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function stackGet(key) { return this.__data__.get(key); } module.exports = stackGet; /***/ }), /* 100 */ /***/ (function(module, exports) { /** * Checks if a stack value for `key` exists. * * @private * @name has * @memberOf Stack * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { return this.__data__.has(key); } module.exports = stackHas; /***/ }), /* 101 */ /***/ (function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(21), Map = __webpack_require__(27), MapCache = __webpack_require__(48); /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; /** * Sets the stack `key` to `value`. * * @private * @name set * @memberOf Stack * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { var data = this.__data__; if (data instanceof ListCache) { var pairs = data.__data__; if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { pairs.push([key, value]); this.size = ++data.size; return this; } data = this.__data__ = new MapCache(pairs); } data.set(key, value); this.size = data.size; return this; } module.exports = stackSet; /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(28), isMasked = __webpack_require__(106), isObject = __webpack_require__(10), toSource = __webpack_require__(47); /** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; /** Used to detect host constructors (Safari). */ var reIsHostCtor = /^\[object .+?Constructor\]$/; /** Used for built-in method references. */ var funcProto = Function.prototype, objectProto = Object.prototype; /** Used to resolve the decompiled source of functions. */ var funcToString = funcProto.toString; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** Used to detect if a method is native. */ var reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, * else `false`. */ function baseIsNative(value) { if (!isObject(value) || isMasked(value)) { return false; } var pattern = isFunction(value) ? reIsNative : reIsHostCtor; return pattern.test(toSource(value)); } module.exports = baseIsNative; /***/ }), /* 103 */ /***/ (function(module, exports) { var g; // This works in non-strict mode g = (function() { return this; })(); try { // This works if eval is allowed (see CSP) g = g || new Function("return this")(); } catch (e) { // This works if the window reference is available if (typeof window === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /* 104 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } module.exports = getRawTag; /***/ }), /* 105 */ /***/ (function(module, exports) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } module.exports = objectToString; /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { var coreJsData = __webpack_require__(107); /** Used to detect methods masquerading as native. */ var maskSrcKey = (function() { var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); return uid ? ('Symbol(src)_1.' + uid) : ''; }()); /** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */ function isMasked(func) { return !!maskSrcKey && (maskSrcKey in func); } module.exports = isMasked; /***/ }), /* 107 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(9); /** Used to detect overreaching core-js shims. */ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; /***/ }), /* 108 */ /***/ (function(module, exports) { /** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */ function getValue(object, key) { return object == null ? undefined : object[key]; } module.exports = getValue; /***/ }), /* 109 */ /***/ (function(module, exports, __webpack_require__) { var Hash = __webpack_require__(110), ListCache = __webpack_require__(21), Map = __webpack_require__(27); /** * Removes all key-value entries from the map. * * @private * @name clear * @memberOf MapCache */ function mapCacheClear() { this.size = 0; this.__data__ = { 'hash': new Hash, 'map': new (Map || ListCache), 'string': new Hash }; } module.exports = mapCacheClear; /***/ }), /* 110 */ /***/ (function(module, exports, __webpack_require__) { var hashClear = __webpack_require__(111), hashDelete = __webpack_require__(112), hashGet = __webpack_require__(113), hashHas = __webpack_require__(114), hashSet = __webpack_require__(115); /** * Creates a hash object. * * @private * @constructor * @param {Array} [entries] The key-value pairs to cache. */ function Hash(entries) { var index = -1, length = entries == null ? 0 : entries.length; this.clear(); while (++index < length) { var entry = entries[index]; this.set(entry[0], entry[1]); } } // Add methods to `Hash`. Hash.prototype.clear = hashClear; Hash.prototype['delete'] = hashDelete; Hash.prototype.get = hashGet; Hash.prototype.has = hashHas; Hash.prototype.set = hashSet; module.exports = Hash; /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(24); /** * Removes all key-value entries from the hash. * * @private * @name clear * @memberOf Hash */ function hashClear() { this.__data__ = nativeCreate ? nativeCreate(null) : {}; this.size = 0; } module.exports = hashClear; /***/ }), /* 112 */ /***/ (function(module, exports) { /** * Removes `key` and its value from the hash. * * @private * @name delete * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function hashDelete(key) { var result = this.has(key) && delete this.__data__[key]; this.size -= result ? 1 : 0; return result; } module.exports = hashDelete; /***/ }), /* 113 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(24); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Gets the hash value for `key`. * * @private * @name get * @memberOf Hash * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function hashGet(key) { var data = this.__data__; if (nativeCreate) { var result = data[key]; return result === HASH_UNDEFINED ? undefined : result; } return hasOwnProperty.call(data, key) ? data[key] : undefined; } module.exports = hashGet; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(24); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Checks if a hash value for `key` exists. * * @private * @name has * @memberOf Hash * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function hashHas(key) { var data = this.__data__; return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); } module.exports = hashHas; /***/ }), /* 115 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(24); /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; /** * Sets the hash `key` to `value`. * * @private * @name set * @memberOf Hash * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the hash instance. */ function hashSet(key, value) { var data = this.__data__; this.size += this.has(key) ? 0 : 1; data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; return this; } module.exports = hashSet; /***/ }), /* 116 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(25); /** * Removes `key` and its value from the map. * * @private * @name delete * @memberOf MapCache * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function mapCacheDelete(key) { var result = getMapData(this, key)['delete'](key); this.size -= result ? 1 : 0; return result; } module.exports = mapCacheDelete; /***/ }), /* 117 */ /***/ (function(module, exports) { /** * Checks if `value` is suitable for use as unique object key. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is suitable, else `false`. */ function isKeyable(value) { var type = typeof value; return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') ? (value !== '__proto__') : (value === null); } module.exports = isKeyable; /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(25); /** * Gets the map value for `key`. * * @private * @name get * @memberOf MapCache * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ function mapCacheGet(key) { return getMapData(this, key).get(key); } module.exports = mapCacheGet; /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(25); /** * Checks if a map value for `key` exists. * * @private * @name has * @memberOf MapCache * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function mapCacheHas(key) { return getMapData(this, key).has(key); } module.exports = mapCacheHas; /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(25); /** * Sets the map `key` to `value`. * * @private * @name set * @memberOf MapCache * @param {string} key The key of the value to set. * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ function mapCacheSet(key, value) { var data = getMapData(this, key), size = data.size; data.set(key, value); this.size += data.size == size ? 0 : 1; return this; } module.exports = mapCacheSet; /***/ }), /* 121 */ /***/ (function(module, exports, __webpack_require__) { var createBaseFor = __webpack_require__(122); /** * The base implementation of `baseForOwn` which iterates over `object` * properties returned by `keysFunc` and invokes `iteratee` for each property. * Iteratee functions may exit iteration early by explicitly returning `false`. * * @private * @param {Object} object The object to iterate over. * @param {Function} iteratee The function invoked per iteration. * @param {Function} keysFunc The function to get the keys of `object`. * @returns {Object} Returns `object`. */ var baseFor = createBaseFor(); module.exports = baseFor; /***/ }), /* 122 */ /***/ (function(module, exports) { /** * Creates a base function for methods like `_.forIn` and `_.forOwn`. * * @private * @param {boolean} [fromRight] Specify iterating from right to left. * @returns {Function} Returns the new base function. */ function createBaseFor(fromRight) { return function(object, iteratee, keysFunc) { var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; while (length--) { var key = props[fromRight ? length : ++index]; if (iteratee(iterable[key], key, iterable) === false) { break; } } return object; }; } module.exports = createBaseFor; /***/ }), /* 123 */ /***/ (function(module, exports, __webpack_require__) { var assignMergeValue = __webpack_require__(49), cloneBuffer = __webpack_require__(51), cloneTypedArray = __webpack_require__(52), copyArray = __webpack_require__(53), initCloneObject = __webpack_require__(54), isArguments = __webpack_require__(34), isArray = __webpack_require__(12), isArrayLikeObject = __webpack_require__(127), isBuffer = __webpack_require__(35), isFunction = __webpack_require__(28), isObject = __webpack_require__(10), isPlainObject = __webpack_require__(57), isTypedArray = __webpack_require__(58), safeGet = __webpack_require__(59), toPlainObject = __webpack_require__(130); /** * A specialized version of `baseMerge` for arrays and objects which performs * deep merges and tracks traversed objects enabling objects with circular * references to be merged. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @param {string} key The key of the value to merge. * @param {number} srcIndex The index of `source`. * @param {Function} mergeFunc The function to merge values. * @param {Function} [customizer] The function to customize assigned values. * @param {Object} [stack] Tracks traversed source values and their merged * counterparts. */ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { var objValue = safeGet(object, key), srcValue = safeGet(source, key), stacked = stack.get(srcValue); if (stacked) { assignMergeValue(object, key, stacked); return; } var newValue = customizer ? customizer(objValue, srcValue, (key + ''), object, source, stack) : undefined; var isCommon = newValue === undefined; if (isCommon) { var isArr = isArray(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue); newValue = srcValue; if (isArr || isBuff || isTyped) { if (isArray(objValue)) { newValue = objValue; } else if (isArrayLikeObject(objValue)) { newValue = copyArray(objValue); } else if (isBuff) { isCommon = false; newValue = cloneBuffer(srcValue, true); } else if (isTyped) { isCommon = false; newValue = cloneTypedArray(srcValue, true); } else { newValue = []; } } else if (isPlainObject(srcValue) || isArguments(srcValue)) { newValue = objValue; if (isArguments(objValue)) { newValue = toPlainObject(objValue); } else if (!isObject(objValue) || isFunction(objValue)) { newValue = initCloneObject(srcValue); } } else { isCommon = false; } } if (isCommon) { // Recursively merge objects and arrays (susceptible to call stack limits). stack.set(srcValue, newValue); mergeFunc(newValue, srcValue, srcIndex, customizer, stack); stack['delete'](srcValue); } assignMergeValue(object, key, newValue); } module.exports = baseMergeDeep; /***/ }), /* 124 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(9); /** Built-in value references. */ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; /***/ }), /* 125 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(10); /** Built-in value references. */ var objectCreate = Object.create; /** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} proto The object to inherit from. * @returns {Object} Returns the new object. */ var baseCreate = (function() { function object() {} return function(proto) { if (!isObject(proto)) { return {}; } if (objectCreate) { return objectCreate(proto); } object.prototype = proto; var result = new object; object.prototype = undefined; return result; }; }()); module.exports = baseCreate; /***/ }), /* 126 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(17), isObjectLike = __webpack_require__(11); /** `Object#toString` result references. */ var argsTag = '[object Arguments]'; /** * The base implementation of `_.isArguments`. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, */ function baseIsArguments(value) { return isObjectLike(value) && baseGetTag(value) == argsTag; } module.exports = baseIsArguments; /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { var isArrayLike = __webpack_require__(26), isObjectLike = __webpack_require__(11); /** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, * else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */ function isArrayLikeObject(value) { return isObjectLike(value) && isArrayLike(value); } module.exports = isArrayLikeObject; /***/ }), /* 128 */ /***/ (function(module, exports) { /** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */ function stubFalse() { return false; } module.exports = stubFalse; /***/ }), /* 129 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(17), isLength = __webpack_require__(56), isObjectLike = __webpack_require__(11); /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', weakMapTag = '[object WeakMap]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to identify `toStringTag` values of typed arrays. */ var typedArrayTags = {}; typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; /** * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. */ function baseIsTypedArray(value) { return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; } module.exports = baseIsTypedArray; /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { var copyObject = __webpack_require__(18), keysIn = __webpack_require__(20); /** * Converts `value` to a plain object flattening inherited enumerable string * keyed properties of `value` to own properties of the plain object. * * @static * @memberOf _ * @since 3.0.0 * @category Lang * @param {*} value The value to convert. * @returns {Object} Returns the converted plain object. * @example * * function Foo() { * this.b = 2; * } * * Foo.prototype.c = 3; * * _.assign({ 'a': 1 }, new Foo); * // => { 'a': 1, 'b': 2 } * * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); * // => { 'a': 1, 'b': 2, 'c': 3 } */ function toPlainObject(value) { return copyObject(value, keysIn(value)); } module.exports = toPlainObject; /***/ }), /* 131 */ /***/ (function(module, exports) { /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */ function baseTimes(n, iteratee) { var index = -1, result = Array(n); while (++index < n) { result[index] = iteratee(index); } return result; } module.exports = baseTimes; /***/ }), /* 132 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(10), isPrototype = __webpack_require__(33), nativeKeysIn = __webpack_require__(133); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeysIn(object) { if (!isObject(object)) { return nativeKeysIn(object); } var isProto = isPrototype(object), result = []; for (var key in object) { if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { result.push(key); } } return result; } module.exports = baseKeysIn; /***/ }), /* 133 */ /***/ (function(module, exports) { /** * This function is like * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * except that it includes inherited enumerable properties. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function nativeKeysIn(object) { var result = []; if (object != null) { for (var key in Object(object)) { result.push(key); } } return result; } module.exports = nativeKeysIn; /***/ }), /* 134 */ /***/ (function(module, exports, __webpack_require__) { var baseRest = __webpack_require__(135), isIterateeCall = __webpack_require__(140); /** * Creates a function like `_.assign`. * * @private * @param {Function} assigner The function to assign values. * @returns {Function} Returns the new assigner function. */ function createAssigner(assigner) { return baseRest(function(object, sources) { var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined, guard = length > 2 ? sources[2] : undefined; customizer = (assigner.length > 3 && typeof customizer == 'function') ? (length--, customizer) : undefined; if (guard && isIterateeCall(sources[0], sources[1], guard)) { customizer = length < 3 ? undefined : customizer; length = 1; } object = Object(object); while (++index < length) { var source = sources[index]; if (source) { assigner(object, source, index, customizer); } } return object; }); } module.exports = createAssigner; /***/ }), /* 135 */ /***/ (function(module, exports, __webpack_require__) { var identity = __webpack_require__(63), overRest = __webpack_require__(64), setToString = __webpack_require__(65); /** * The base implementation of `_.rest` which doesn't validate or coerce arguments. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @returns {Function} Returns the new function. */ function baseRest(func, start) { return setToString(overRest(func, start, identity), func + ''); } module.exports = baseRest; /***/ }), /* 136 */ /***/ (function(module, exports) { /** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {Array} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */ function apply(func, thisArg, args) { switch (args.length) { case 0: return func.call(thisArg); case 1: return func.call(thisArg, args[0]); case 2: return func.call(thisArg, args[0], args[1]); case 3: return func.call(thisArg, args[0], args[1], args[2]); } return func.apply(thisArg, args); } module.exports = apply; /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { var constant = __webpack_require__(138), defineProperty = __webpack_require__(50), identity = __webpack_require__(63); /** * The base implementation of `setToString` without support for hot loop shorting. * * @private * @param {Function} func The function to modify. * @param {Function} string The `toString` result. * @returns {Function} Returns `func`. */ var baseSetToString = !defineProperty ? identity : function(func, string) { return defineProperty(func, 'toString', { 'configurable': true, 'enumerable': false, 'value': constant(string), 'writable': true }); }; module.exports = baseSetToString; /***/ }), /* 138 */ /***/ (function(module, exports) { /** * Creates a function that returns `value`. * * @static * @memberOf _ * @since 2.4.0 * @category Util * @param {*} value The value to return from the new function. * @returns {Function} Returns the new constant function. * @example * * var objects = _.times(2, _.constant({ 'a': 1 })); * * console.log(objects); * // => [{ 'a': 1 }, { 'a': 1 }] * * console.log(objects[0] === objects[1]); * // => true */ function constant(value) { return function() { return value; }; } module.exports = constant; /***/ }), /* 139 */ /***/ (function(module, exports) { /** Used to detect hot functions by number of calls within a span of milliseconds. */ var HOT_COUNT = 800, HOT_SPAN = 16; /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeNow = Date.now; /** * Creates a function that'll short out and invoke `identity` instead * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` * milliseconds. * * @private * @param {Function} func The function to restrict. * @returns {Function} Returns the new shortable function. */ function shortOut(func) { var count = 0, lastCalled = 0; return function() { var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); lastCalled = stamp; if (remaining > 0) { if (++count >= HOT_COUNT) { return arguments[0]; } } else { count = 0; } return func.apply(undefined, arguments); }; } module.exports = shortOut; /***/ }), /* 140 */ /***/ (function(module, exports, __webpack_require__) { var eq = __webpack_require__(23), isArrayLike = __webpack_require__(26), isIndex = __webpack_require__(62), isObject = __webpack_require__(10); /** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, * else `false`. */ function isIterateeCall(value, index, object) { if (!isObject(object)) { return false; } var type = typeof index; if (type == 'number' ? (isArrayLike(object) && isIndex(index, object.length)) : (type == 'string' && index in object) ) { return eq(object[index], value); } return false; } module.exports = isIterateeCall; /***/ }), /* 141 */ /***/ (function(module, exports) { /* * typedefs.js * Normalizes browser-specific prefixes and provide some basic polyfills */ if (typeof window !== 'undefined') { if (!window.requestAnimationFrame) { window.requestAnimationFrame = function () { return window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (/* function FrameRequestCallback */callback) { window.setTimeout(callback, 1000 / 60); }; }(); } } if (typeof Math.imul !== 'function') { /* eslint-disable no-bitwise */ Math.imul = function (a, b) { var ah = a >>> 16 & 0xffff; var al = a & 0xffff; var bh = b >>> 16 & 0xffff; var bl = b & 0xffff; // the shift by 0 fixes the sign on the high part // the final |0 converts the unsigned value into a signed value return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0; }; /* eslint-enable no-bitwise */ } if (typeof Object.assign !== 'function') { Object.assign = function (target) { // .length of function is 2 'use strict'; if (target === null) { // TypeError if undefined or null throw new TypeError('Cannot convert undefined or null to object'); } var to = Object(target); for (var index = 1; index < arguments.length; index++) { // eslint-disable-next-line prefer-rest-params var nextSource = arguments[index]; if (nextSource !== null) { // Skip over if undefined or null // eslint-disable-next-line no-restricted-syntax for (var nextKey in nextSource) { // Avoid bugs when hasOwnProperty is shadowed if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { to[nextKey] = nextSource[nextKey]; } } } } return to; }; } /***/ }), /* 142 */ /***/ (function(module, exports) { function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 143 */ /***/ (function(module, exports) { function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 144 */ /***/ (function(module, exports) { function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 145 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = __webpack_require__(8)["default"]; function toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } module.exports = toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 146 */ /***/ (function(module, exports, __webpack_require__) { var OverloadYield = __webpack_require__(69); var regenerator = __webpack_require__(70); var regeneratorAsync = __webpack_require__(147); var regeneratorAsyncGen = __webpack_require__(72); var regeneratorAsyncIterator = __webpack_require__(73); var regeneratorKeys = __webpack_require__(148); var regeneratorValues = __webpack_require__(149); function _regeneratorRuntime() { "use strict"; var r = regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (module.exports = _regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new OverloadYield(r, e); }, AsyncIterator: regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? regeneratorAsyncGen : regeneratorAsync)(a(r), e, t, o, u); }, keys: regeneratorKeys, values: regeneratorValues }; }, module.exports.__esModule = true, module.exports["default"] = module.exports)(); } module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 147 */ /***/ (function(module, exports, __webpack_require__) { var regeneratorAsyncGen = __webpack_require__(72); function _regeneratorAsync(n, e, r, t, o) { var a = regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); } module.exports = _regeneratorAsync, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 148 */ /***/ (function(module, exports) { function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; } module.exports = _regeneratorKeys, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 149 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = __webpack_require__(8)["default"]; function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); } module.exports = _regeneratorValues, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 150 */ /***/ (function(module, exports) { function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 151 */ /***/ (function(module, exports, __webpack_require__) { var getPrototypeOf = __webpack_require__(1); function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = getPrototypeOf(t));); return t; } module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 152 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeToArray = __webpack_require__(67); function _arrayWithoutHoles(r) { if (Array.isArray(r)) return arrayLikeToArray(r); } module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 153 */ /***/ (function(module, exports) { function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 154 */ /***/ (function(module, exports) { function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 155 */ /***/ (function(module, exports) { function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } module.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 156 */ /***/ (function(module, exports, __webpack_require__) { var Stack = __webpack_require__(45), arrayEach = __webpack_require__(157), assignValue = __webpack_require__(60), baseAssign = __webpack_require__(158), baseAssignIn = __webpack_require__(161), cloneBuffer = __webpack_require__(51), copyArray = __webpack_require__(53), copySymbols = __webpack_require__(162), copySymbolsIn = __webpack_require__(164), getAllKeys = __webpack_require__(165), getAllKeysIn = __webpack_require__(78), getTag = __webpack_require__(42), initCloneArray = __webpack_require__(170), initCloneByTag = __webpack_require__(171), initCloneObject = __webpack_require__(54), isArray = __webpack_require__(12), isBuffer = __webpack_require__(35), isMap = __webpack_require__(175), isObject = __webpack_require__(10), isSet = __webpack_require__(177), keys = __webpack_require__(39), keysIn = __webpack_require__(20); /** Used to compose bitmasks for cloning. */ var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]', weakMapTag = '[object WeakMap]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** Used to identify `toStringTag` values supported by `_.clone`. */ var cloneableTags = {}; cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false; /** * The base implementation of `_.clone` and `_.cloneDeep` which tracks * traversed objects. * * @private * @param {*} value The value to clone. * @param {boolean} bitmask The bitmask flags. * 1 - Deep clone * 2 - Flatten inherited properties * 4 - Clone symbols * @param {Function} [customizer] The function to customize cloning. * @param {string} [key] The key of `value`. * @param {Object} [object] The parent object of `value`. * @param {Object} [stack] Tracks traversed objects and their clone counterparts. * @returns {*} Returns the cloned value. */ function baseClone(value, bitmask, customizer, key, object, stack) { var result, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG; if (customizer) { result = object ? customizer(value, key, object, stack) : customizer(value); } if (result !== undefined) { return result; } if (!isObject(value)) { return value; } var isArr = isArray(value); if (isArr) { result = initCloneArray(value); if (!isDeep) { return copyArray(value, result); } } else { var tag = getTag(value), isFunc = tag == funcTag || tag == genTag; if (isBuffer(value)) { return cloneBuffer(value, isDeep); } if (tag == objectTag || tag == argsTag || (isFunc && !object)) { result = (isFlat || isFunc) ? {} : initCloneObject(value); if (!isDeep) { return isFlat ? copySymbolsIn(value, baseAssignIn(result, value)) : copySymbols(value, baseAssign(result, value)); } } else { if (!cloneableTags[tag]) { return object ? value : {}; } result = initCloneByTag(value, tag, isDeep); } } // Check for circular references and return its corresponding clone. stack || (stack = new Stack); var stacked = stack.get(value); if (stacked) { return stacked; } stack.set(value, result); if (isSet(value)) { value.forEach(function(subValue) { result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); }); } else if (isMap(value)) { value.forEach(function(subValue, key) { result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); }); } var keysFunc = isFull ? (isFlat ? getAllKeysIn : getAllKeys) : (isFlat ? keysIn : keys); var props = isArr ? undefined : keysFunc(value); arrayEach(props || value, function(subValue, key) { if (props) { key = subValue; subValue = value[key]; } // Recursively populate clone (susceptible to call stack limits). assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); }); return result; } module.exports = baseClone; /***/ }), /* 157 */ /***/ (function(module, exports) { /** * A specialized version of `_.forEach` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns `array`. */ function arrayEach(array, iteratee) { var index = -1, length = array == null ? 0 : array.length; while (++index < length) { if (iteratee(array[index], index, array) === false) { break; } } return array; } module.exports = arrayEach; /***/ }), /* 158 */ /***/ (function(module, exports, __webpack_require__) { var copyObject = __webpack_require__(18), keys = __webpack_require__(39); /** * The base implementation of `_.assign` without support for multiple sources * or `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssign(object, source) { return object && copyObject(source, keys(source), object); } module.exports = baseAssign; /***/ }), /* 159 */ /***/ (function(module, exports, __webpack_require__) { var isPrototype = __webpack_require__(33), nativeKeys = __webpack_require__(160); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function baseKeys(object) { if (!isPrototype(object)) { return nativeKeys(object); } var result = []; for (var key in Object(object)) { if (hasOwnProperty.call(object, key) && key != 'constructor') { result.push(key); } } return result; } module.exports = baseKeys; /***/ }), /* 160 */ /***/ (function(module, exports, __webpack_require__) { var overArg = __webpack_require__(55); /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeKeys = overArg(Object.keys, Object); module.exports = nativeKeys; /***/ }), /* 161 */ /***/ (function(module, exports, __webpack_require__) { var copyObject = __webpack_require__(18), keysIn = __webpack_require__(20); /** * The base implementation of `_.assignIn` without support for multiple sources * or `customizer` functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. * @returns {Object} Returns `object`. */ function baseAssignIn(object, source) { return object && copyObject(source, keysIn(source), object); } module.exports = baseAssignIn; /***/ }), /* 162 */ /***/ (function(module, exports, __webpack_require__) { var copyObject = __webpack_require__(18), getSymbols = __webpack_require__(40); /** * Copies own symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. * @param {Object} [object={}] The object to copy symbols to. * @returns {Object} Returns `object`. */ function copySymbols(source, object) { return copyObject(source, getSymbols(source), object); } module.exports = copySymbols; /***/ }), /* 163 */ /***/ (function(module, exports) { /** * A specialized version of `_.filter` for arrays without support for * iteratee shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} predicate The function invoked per iteration. * @returns {Array} Returns the new filtered array. */ function arrayFilter(array, predicate) { var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = []; while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result[resIndex++] = value; } } return result; } module.exports = arrayFilter; /***/ }), /* 164 */ /***/ (function(module, exports, __webpack_require__) { var copyObject = __webpack_require__(18), getSymbolsIn = __webpack_require__(76); /** * Copies own and inherited symbols of `source` to `object`. * * @private * @param {Object} source The object to copy symbols from. * @param {Object} [object={}] The object to copy symbols to. * @returns {Object} Returns `object`. */ function copySymbolsIn(source, object) { return copyObject(source, getSymbolsIn(source), object); } module.exports = copySymbolsIn; /***/ }), /* 165 */ /***/ (function(module, exports, __webpack_require__) { var baseGetAllKeys = __webpack_require__(77), getSymbols = __webpack_require__(40), keys = __webpack_require__(39); /** * Creates an array of own enumerable property names and symbols of `object`. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names and symbols. */ function getAllKeys(object) { return baseGetAllKeys(object, keys, getSymbols); } module.exports = getAllKeys; /***/ }), /* 166 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14), root = __webpack_require__(9); /* Built-in method references that are verified to be native. */ var DataView = getNative(root, 'DataView'); module.exports = DataView; /***/ }), /* 167 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14), root = __webpack_require__(9); /* Built-in method references that are verified to be native. */ var Promise = getNative(root, 'Promise'); module.exports = Promise; /***/ }), /* 168 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14), root = __webpack_require__(9); /* Built-in method references that are verified to be native. */ var Set = getNative(root, 'Set'); module.exports = Set; /***/ }), /* 169 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(14), root = __webpack_require__(9); /* Built-in method references that are verified to be native. */ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; /***/ }), /* 170 */ /***/ (function(module, exports) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Initializes an array clone. * * @private * @param {Array} array The array to clone. * @returns {Array} Returns the initialized clone. */ function initCloneArray(array) { var length = array.length, result = new array.constructor(length); // Add properties assigned by `RegExp#exec`. if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { result.index = array.index; result.input = array.input; } return result; } module.exports = initCloneArray; /***/ }), /* 171 */ /***/ (function(module, exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(31), cloneDataView = __webpack_require__(172), cloneRegExp = __webpack_require__(173), cloneSymbol = __webpack_require__(174), cloneTypedArray = __webpack_require__(52); /** `Object#toString` result references. */ var boolTag = '[object Boolean]', dateTag = '[object Date]', mapTag = '[object Map]', numberTag = '[object Number]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]'; var arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]'; /** * Initializes an object clone based on its `toStringTag`. * * **Note:** This function only supports cloning values with tags of * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. * * @private * @param {Object} object The object to clone. * @param {string} tag The `toStringTag` of the object to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the initialized clone. */ function initCloneByTag(object, tag, isDeep) { var Ctor = object.constructor; switch (tag) { case arrayBufferTag: return cloneArrayBuffer(object); case boolTag: case dateTag: return new Ctor(+object); case dataViewTag: return cloneDataView(object, isDeep); case float32Tag: case float64Tag: case int8Tag: case int16Tag: case int32Tag: case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: return cloneTypedArray(object, isDeep); case mapTag: return new Ctor; case numberTag: case stringTag: return new Ctor(object); case regexpTag: return cloneRegExp(object); case setTag: return new Ctor; case symbolTag: return cloneSymbol(object); } } module.exports = initCloneByTag; /***/ }), /* 172 */ /***/ (function(module, exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(31); /** * Creates a clone of `dataView`. * * @private * @param {Object} dataView The data view to clone. * @param {boolean} [isDeep] Specify a deep clone. * @returns {Object} Returns the cloned data view. */ function cloneDataView(dataView, isDeep) { var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); } module.exports = cloneDataView; /***/ }), /* 173 */ /***/ (function(module, exports) { /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; /** * Creates a clone of `regexp`. * * @private * @param {Object} regexp The regexp to clone. * @returns {Object} Returns the cloned regexp. */ function cloneRegExp(regexp) { var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); result.lastIndex = regexp.lastIndex; return result; } module.exports = cloneRegExp; /***/ }), /* 174 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19); /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; /** * Creates a clone of the `symbol` object. * * @private * @param {Object} symbol The symbol object to clone. * @returns {Object} Returns the cloned symbol object. */ function cloneSymbol(symbol) { return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; } module.exports = cloneSymbol; /***/ }), /* 175 */ /***/ (function(module, exports, __webpack_require__) { var baseIsMap = __webpack_require__(176), baseUnary = __webpack_require__(36), nodeUtil = __webpack_require__(37); /* Node.js helper references. */ var nodeIsMap = nodeUtil && nodeUtil.isMap; /** * Checks if `value` is classified as a `Map` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a map, else `false`. * @example * * _.isMap(new Map); * // => true * * _.isMap(new WeakMap); * // => false */ var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; module.exports = isMap; /***/ }), /* 176 */ /***/ (function(module, exports, __webpack_require__) { var getTag = __webpack_require__(42), isObjectLike = __webpack_require__(11); /** `Object#toString` result references. */ var mapTag = '[object Map]'; /** * The base implementation of `_.isMap` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a map, else `false`. */ function baseIsMap(value) { return isObjectLike(value) && getTag(value) == mapTag; } module.exports = baseIsMap; /***/ }), /* 177 */ /***/ (function(module, exports, __webpack_require__) { var baseIsSet = __webpack_require__(178), baseUnary = __webpack_require__(36), nodeUtil = __webpack_require__(37); /* Node.js helper references. */ var nodeIsSet = nodeUtil && nodeUtil.isSet; /** * Checks if `value` is classified as a `Set` object. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a set, else `false`. * @example * * _.isSet(new Set); * // => true * * _.isSet(new WeakSet); * // => false */ var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; module.exports = isSet; /***/ }), /* 178 */ /***/ (function(module, exports, __webpack_require__) { var getTag = __webpack_require__(42), isObjectLike = __webpack_require__(11); /** `Object#toString` result references. */ var setTag = '[object Set]'; /** * The base implementation of `_.isSet` without Node.js optimizations. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a set, else `false`. */ function baseIsSet(value) { return isObjectLike(value) && getTag(value) == setTag; } module.exports = baseIsSet; /***/ }), /* 179 */ /***/ (function(module, exports, __webpack_require__) { var castPath = __webpack_require__(43), last = __webpack_require__(186), parent = __webpack_require__(187), toKey = __webpack_require__(79); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * The base implementation of `_.unset`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The property path to unset. * @returns {boolean} Returns `true` if the property is deleted, else `false`. */ function baseUnset(object, path) { path = castPath(path, object); // Prevent prototype pollution: // https://github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg // https://github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh var index = -1, length = path.length; if (!length) { return true; } while (++index < length) { var key = toKey(path[index]); // Always block "__proto__" anywhere in the path if it's not expected if (key === '__proto__' && !hasOwnProperty.call(object, '__proto__')) { return false; } // Block constructor/prototype as non-terminal traversal keys to prevent // escaping the object graph into built-in constructors and prototypes. if ((key === 'constructor' || key === 'prototype') && index < length - 1) { return false; } } var obj = parent(object, path); return obj == null || delete obj[toKey(last(path))]; } module.exports = baseUnset; /***/ }), /* 180 */ /***/ (function(module, exports, __webpack_require__) { var isArray = __webpack_require__(12), isSymbol = __webpack_require__(44); /** Used to match property names within property paths. */ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/; /** * Checks if `value` is a property name and not a property path. * * @private * @param {*} value The value to check. * @param {Object} [object] The object to query keys on. * @returns {boolean} Returns `true` if `value` is a property name, else `false`. */ function isKey(value, object) { if (isArray(value)) { return false; } var type = typeof value; if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) { return true; } return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object)); } module.exports = isKey; /***/ }), /* 181 */ /***/ (function(module, exports, __webpack_require__) { var memoizeCapped = __webpack_require__(182); /** Used to match property names within property paths. */ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; /** Used to match backslashes in property paths. */ var reEscapeChar = /\\(\\)?/g; /** * Converts `string` to a property path array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the property path array. */ var stringToPath = memoizeCapped(function(string) { var result = []; if (string.charCodeAt(0) === 46 /* . */) { result.push(''); } string.replace(rePropName, function(match, number, quote, subString) { result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); }); return result; }); module.exports = stringToPath; /***/ }), /* 182 */ /***/ (function(module, exports, __webpack_require__) { var memoize = __webpack_require__(183); /** Used as the maximum memoize cache size. */ var MAX_MEMOIZE_SIZE = 500; /** * A specialized version of `_.memoize` which clears the memoized function's * cache when it exceeds `MAX_MEMOIZE_SIZE`. * * @private * @param {Function} func The function to have its output memoized. * @returns {Function} Returns the new memoized function. */ function memoizeCapped(func) { var result = memoize(func, function(key) { if (cache.size === MAX_MEMOIZE_SIZE) { cache.clear(); } return key; }); var cache = result.cache; return result; } module.exports = memoizeCapped; /***/ }), /* 183 */ /***/ (function(module, exports, __webpack_require__) { var MapCache = __webpack_require__(48); /** Error message constants. */ var FUNC_ERROR_TEXT = 'Expected a function'; /** * Creates a function that memoizes the result of `func`. If `resolver` is * provided, it determines the cache key for storing the result based on the * arguments provided to the memoized function. By default, the first argument * provided to the memoized function is used as the map cache key. The `func` * is invoked with the `this` binding of the memoized function. * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` * constructor with one whose instances implement the * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) * method interface of `clear`, `delete`, `get`, `has`, and `set`. * * @static * @memberOf _ * @since 0.1.0 * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. * @returns {Function} Returns the new memoized function. * @example * * var object = { 'a': 1, 'b': 2 }; * var other = { 'c': 3, 'd': 4 }; * * var values = _.memoize(_.values); * values(object); * // => [1, 2] * * values(other); * // => [3, 4] * * object.a = 2; * values(object); * // => [1, 2] * * // Modify the result cache. * values.cache.set(object, ['a', 'b']); * values(object); * // => ['a', 'b'] * * // Replace `_.memoize.Cache`. * _.memoize.Cache = WeakMap; */ function memoize(func, resolver) { if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { throw new TypeError(FUNC_ERROR_TEXT); } var memoized = function() { var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); memoized.cache = cache.set(key, result) || cache; return result; }; memoized.cache = new (memoize.Cache || MapCache); return memoized; } // Expose `MapCache`. memoize.Cache = MapCache; module.exports = memoize; /***/ }), /* 184 */ /***/ (function(module, exports, __webpack_require__) { var baseToString = __webpack_require__(185); /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; /***/ }), /* 185 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19), arrayMap = __webpack_require__(74), isArray = __webpack_require__(12), isSymbol = __webpack_require__(44); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = baseToString; /***/ }), /* 186 */ /***/ (function(module, exports) { /** * Gets the last element of `array`. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to query. * @returns {*} Returns the last element of `array`. * @example * * _.last([1, 2, 3]); * // => 3 */ function last(array) { var length = array == null ? 0 : array.length; return length ? array[length - 1] : undefined; } module.exports = last; /***/ }), /* 187 */ /***/ (function(module, exports, __webpack_require__) { var baseGet = __webpack_require__(188), baseSlice = __webpack_require__(189); /** * Gets the parent value at `path` of `object`. * * @private * @param {Object} object The object to query. * @param {Array} path The path to get the parent value of. * @returns {*} Returns the parent value. */ function parent(object, path) { return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); } module.exports = parent; /***/ }), /* 188 */ /***/ (function(module, exports, __webpack_require__) { var castPath = __webpack_require__(43), toKey = __webpack_require__(79); /** * The base implementation of `_.get` without support for default values. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path of the property to get. * @returns {*} Returns the resolved value. */ function baseGet(object, path) { path = castPath(path, object); var index = 0, length = path.length; while (object != null && index < length) { object = object[toKey(path[index++])]; } return (index && index == length) ? object : undefined; } module.exports = baseGet; /***/ }), /* 189 */ /***/ (function(module, exports) { /** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function baseSlice(array, start, end) { var index = -1, length = array.length; if (start < 0) { start = -start > length ? 0 : (length + start); } end = end > length ? length : end; if (end < 0) { end += length; } length = start > end ? 0 : ((end - start) >>> 0); start >>>= 0; var result = Array(length); while (++index < length) { result[index] = array[index + start]; } return result; } module.exports = baseSlice; /***/ }), /* 190 */ /***/ (function(module, exports, __webpack_require__) { var isPlainObject = __webpack_require__(57); /** * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain * objects. * * @private * @param {*} value The value to inspect. * @param {string} key The key of the property to inspect. * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. */ function customOmitClone(value) { return isPlainObject(value) ? undefined : value; } module.exports = customOmitClone; /***/ }), /* 191 */ /***/ (function(module, exports, __webpack_require__) { var flatten = __webpack_require__(192), overRest = __webpack_require__(64), setToString = __webpack_require__(65); /** * A specialized version of `baseRest` which flattens the rest array. * * @private * @param {Function} func The function to apply a rest parameter to. * @returns {Function} Returns the new function. */ function flatRest(func) { return setToString(overRest(func, undefined, flatten), func + ''); } module.exports = flatRest; /***/ }), /* 192 */ /***/ (function(module, exports, __webpack_require__) { var baseFlatten = __webpack_require__(193); /** * Flattens `array` a single level deep. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flatten([1, [2, [3, [4]], 5]]); * // => [1, 2, [3, [4]], 5] */ function flatten(array) { var length = array == null ? 0 : array.length; return length ? baseFlatten(array, 1) : []; } module.exports = flatten; /***/ }), /* 193 */ /***/ (function(module, exports, __webpack_require__) { var arrayPush = __webpack_require__(41), isFlattenable = __webpack_require__(194); /** * The base implementation of `_.flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */ function baseFlatten(array, depth, predicate, isStrict, result) { var index = -1, length = array.length; predicate || (predicate = isFlattenable); result || (result = []); while (++index < length) { var value = array[index]; if (depth > 0 && predicate(value)) { if (depth > 1) { // Recursively flatten arrays (susceptible to call stack limits). baseFlatten(value, depth - 1, predicate, isStrict, result); } else { arrayPush(result, value); } } else if (!isStrict) { result[result.length] = value; } } return result; } module.exports = baseFlatten; /***/ }), /* 194 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19), isArguments = __webpack_require__(34), isArray = __webpack_require__(12); /** Built-in value references. */ var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; /** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */ function isFlattenable(value) { return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); } module.exports = isFlattenable; /***/ }), /* 195 */ /***/ (function(module, exports) { function _isNativeFunction(t) { try { return -1 !== Function.toString.call(t).indexOf("[native code]"); } catch (n) { return "function" == typeof t; } } module.exports = _isNativeFunction, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 196 */ /***/ (function(module, exports, __webpack_require__) { var isNativeReflectConstruct = __webpack_require__(197); var setPrototypeOf = __webpack_require__(38); function _construct(t, e, r) { if (isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && setPrototypeOf(p, r.prototype), p; } module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 197 */ /***/ (function(module, exports) { function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (module.exports = _isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; }, module.exports.__esModule = true, module.exports["default"] = module.exports)(); } module.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 198 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, "BarcodeDecoder", function() { return /* reexport */ barcode_decoder; }); __webpack_require__.d(__webpack_exports__, "Readers", function() { return /* reexport */ reader_namespaceObject; }); __webpack_require__.d(__webpack_exports__, "CameraAccess", function() { return /* reexport */ camera_access; }); __webpack_require__.d(__webpack_exports__, "ImageDebug", function() { return /* reexport */ image_debug; }); __webpack_require__.d(__webpack_exports__, "ImageWrapper", function() { return /* reexport */ image_wrapper; }); __webpack_require__.d(__webpack_exports__, "ResultCollector", function() { return /* reexport */ result_collector; }); // NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/mat2.js var mat2_namespaceObject = {}; __webpack_require__.r(mat2_namespaceObject); __webpack_require__.d(mat2_namespaceObject, "create", function() { return mat2_create; }); __webpack_require__.d(mat2_namespaceObject, "clone", function() { return clone; }); __webpack_require__.d(mat2_namespaceObject, "copy", function() { return copy; }); __webpack_require__.d(mat2_namespaceObject, "identity", function() { return identity; }); __webpack_require__.d(mat2_namespaceObject, "fromValues", function() { return fromValues; }); __webpack_require__.d(mat2_namespaceObject, "set", function() { return set; }); __webpack_require__.d(mat2_namespaceObject, "transpose", function() { return transpose; }); __webpack_require__.d(mat2_namespaceObject, "invert", function() { return invert; }); __webpack_require__.d(mat2_namespaceObject, "adjoint", function() { return adjoint; }); __webpack_require__.d(mat2_namespaceObject, "determinant", function() { return determinant; }); __webpack_require__.d(mat2_namespaceObject, "multiply", function() { return multiply; }); __webpack_require__.d(mat2_namespaceObject, "rotate", function() { return rotate; }); __webpack_require__.d(mat2_namespaceObject, "scale", function() { return mat2_scale; }); __webpack_require__.d(mat2_namespaceObject, "fromRotation", function() { return fromRotation; }); __webpack_require__.d(mat2_namespaceObject, "fromScaling", function() { return fromScaling; }); __webpack_require__.d(mat2_namespaceObject, "str", function() { return str; }); __webpack_require__.d(mat2_namespaceObject, "frob", function() { return frob; }); __webpack_require__.d(mat2_namespaceObject, "LDU", function() { return LDU; }); __webpack_require__.d(mat2_namespaceObject, "add", function() { return add; }); __webpack_require__.d(mat2_namespaceObject, "subtract", function() { return subtract; }); __webpack_require__.d(mat2_namespaceObject, "exactEquals", function() { return exactEquals; }); __webpack_require__.d(mat2_namespaceObject, "equals", function() { return mat2_equals; }); __webpack_require__.d(mat2_namespaceObject, "multiplyScalar", function() { return multiplyScalar; }); __webpack_require__.d(mat2_namespaceObject, "multiplyScalarAndAdd", function() { return multiplyScalarAndAdd; }); __webpack_require__.d(mat2_namespaceObject, "mul", function() { return mul; }); __webpack_require__.d(mat2_namespaceObject, "sub", function() { return sub; }); // NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/vec2.js var vec2_namespaceObject = {}; __webpack_require__.r(vec2_namespaceObject); __webpack_require__.d(vec2_namespaceObject, "create", function() { return vec2_create; }); __webpack_require__.d(vec2_namespaceObject, "clone", function() { return vec2_clone; }); __webpack_require__.d(vec2_namespaceObject, "fromValues", function() { return vec2_fromValues; }); __webpack_require__.d(vec2_namespaceObject, "copy", function() { return vec2_copy; }); __webpack_require__.d(vec2_namespaceObject, "set", function() { return vec2_set; }); __webpack_require__.d(vec2_namespaceObject, "add", function() { return vec2_add; }); __webpack_require__.d(vec2_namespaceObject, "subtract", function() { return vec2_subtract; }); __webpack_require__.d(vec2_namespaceObject, "multiply", function() { return vec2_multiply; }); __webpack_require__.d(vec2_namespaceObject, "divide", function() { return divide; }); __webpack_require__.d(vec2_namespaceObject, "ceil", function() { return ceil; }); __webpack_require__.d(vec2_namespaceObject, "floor", function() { return floor; }); __webpack_require__.d(vec2_namespaceObject, "min", function() { return min; }); __webpack_require__.d(vec2_namespaceObject, "max", function() { return vec2_max; }); __webpack_require__.d(vec2_namespaceObject, "round", function() { return vec2_round; }); __webpack_require__.d(vec2_namespaceObject, "scale", function() { return vec2_scale; }); __webpack_require__.d(vec2_namespaceObject, "scaleAndAdd", function() { return scaleAndAdd; }); __webpack_require__.d(vec2_namespaceObject, "distance", function() { return distance; }); __webpack_require__.d(vec2_namespaceObject, "squaredDistance", function() { return squaredDistance; }); __webpack_require__.d(vec2_namespaceObject, "length", function() { return vec2_length; }); __webpack_require__.d(vec2_namespaceObject, "squaredLength", function() { return squaredLength; }); __webpack_require__.d(vec2_namespaceObject, "negate", function() { return negate; }); __webpack_require__.d(vec2_namespaceObject, "inverse", function() { return inverse; }); __webpack_require__.d(vec2_namespaceObject, "normalize", function() { return normalize; }); __webpack_require__.d(vec2_namespaceObject, "dot", function() { return dot; }); __webpack_require__.d(vec2_namespaceObject, "cross", function() { return cross; }); __webpack_require__.d(vec2_namespaceObject, "lerp", function() { return lerp; }); __webpack_require__.d(vec2_namespaceObject, "random", function() { return random; }); __webpack_require__.d(vec2_namespaceObject, "transformMat2", function() { return transformMat2; }); __webpack_require__.d(vec2_namespaceObject, "transformMat2d", function() { return transformMat2d; }); __webpack_require__.d(vec2_namespaceObject, "transformMat3", function() { return transformMat3; }); __webpack_require__.d(vec2_namespaceObject, "transformMat4", function() { return transformMat4; }); __webpack_require__.d(vec2_namespaceObject, "rotate", function() { return vec2_rotate; }); __webpack_require__.d(vec2_namespaceObject, "angle", function() { return angle; }); __webpack_require__.d(vec2_namespaceObject, "signedAngle", function() { return signedAngle; }); __webpack_require__.d(vec2_namespaceObject, "zero", function() { return zero; }); __webpack_require__.d(vec2_namespaceObject, "str", function() { return vec2_str; }); __webpack_require__.d(vec2_namespaceObject, "exactEquals", function() { return vec2_exactEquals; }); __webpack_require__.d(vec2_namespaceObject, "equals", function() { return vec2_equals; }); __webpack_require__.d(vec2_namespaceObject, "len", function() { return len; }); __webpack_require__.d(vec2_namespaceObject, "sub", function() { return vec2_sub; }); __webpack_require__.d(vec2_namespaceObject, "mul", function() { return vec2_mul; }); __webpack_require__.d(vec2_namespaceObject, "div", function() { return div; }); __webpack_require__.d(vec2_namespaceObject, "dist", function() { return dist; }); __webpack_require__.d(vec2_namespaceObject, "sqrDist", function() { return sqrDist; }); __webpack_require__.d(vec2_namespaceObject, "sqrLen", function() { return sqrLen; }); __webpack_require__.d(vec2_namespaceObject, "forEach", function() { return forEach; }); // NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/vec3.js var vec3_namespaceObject = {}; __webpack_require__.r(vec3_namespaceObject); __webpack_require__.d(vec3_namespaceObject, "create", function() { return vec3_create; }); __webpack_require__.d(vec3_namespaceObject, "clone", function() { return vec3_clone; }); __webpack_require__.d(vec3_namespaceObject, "length", function() { return vec3_length; }); __webpack_require__.d(vec3_namespaceObject, "fromValues", function() { return vec3_fromValues; }); __webpack_require__.d(vec3_namespaceObject, "copy", function() { return vec3_copy; }); __webpack_require__.d(vec3_namespaceObject, "set", function() { return vec3_set; }); __webpack_require__.d(vec3_namespaceObject, "add", function() { return vec3_add; }); __webpack_require__.d(vec3_namespaceObject, "subtract", function() { return vec3_subtract; }); __webpack_require__.d(vec3_namespaceObject, "multiply", function() { return vec3_multiply; }); __webpack_require__.d(vec3_namespaceObject, "divide", function() { return vec3_divide; }); __webpack_require__.d(vec3_namespaceObject, "ceil", function() { return vec3_ceil; }); __webpack_require__.d(vec3_namespaceObject, "floor", function() { return vec3_floor; }); __webpack_require__.d(vec3_namespaceObject, "min", function() { return vec3_min; }); __webpack_require__.d(vec3_namespaceObject, "max", function() { return vec3_max; }); __webpack_require__.d(vec3_namespaceObject, "round", function() { return vec3_round; }); __webpack_require__.d(vec3_namespaceObject, "scale", function() { return vec3_scale; }); __webpack_require__.d(vec3_namespaceObject, "scaleAndAdd", function() { return vec3_scaleAndAdd; }); __webpack_require__.d(vec3_namespaceObject, "distance", function() { return vec3_distance; }); __webpack_require__.d(vec3_namespaceObject, "squaredDistance", function() { return vec3_squaredDistance; }); __webpack_require__.d(vec3_namespaceObject, "squaredLength", function() { return vec3_squaredLength; }); __webpack_require__.d(vec3_namespaceObject, "negate", function() { return vec3_negate; }); __webpack_require__.d(vec3_namespaceObject, "inverse", function() { return vec3_inverse; }); __webpack_require__.d(vec3_namespaceObject, "normalize", function() { return vec3_normalize; }); __webpack_require__.d(vec3_namespaceObject, "dot", function() { return vec3_dot; }); __webpack_require__.d(vec3_namespaceObject, "cross", function() { return vec3_cross; }); __webpack_require__.d(vec3_namespaceObject, "lerp", function() { return vec3_lerp; }); __webpack_require__.d(vec3_namespaceObject, "slerp", function() { return slerp; }); __webpack_require__.d(vec3_namespaceObject, "hermite", function() { return hermite; }); __webpack_require__.d(vec3_namespaceObject, "bezier", function() { return bezier; }); __webpack_require__.d(vec3_namespaceObject, "random", function() { return vec3_random; }); __webpack_require__.d(vec3_namespaceObject, "transformMat4", function() { return vec3_transformMat4; }); __webpack_require__.d(vec3_namespaceObject, "transformMat3", function() { return vec3_transformMat3; }); __webpack_require__.d(vec3_namespaceObject, "transformQuat", function() { return transformQuat; }); __webpack_require__.d(vec3_namespaceObject, "rotateX", function() { return rotateX; }); __webpack_require__.d(vec3_namespaceObject, "rotateY", function() { return rotateY; }); __webpack_require__.d(vec3_namespaceObject, "rotateZ", function() { return rotateZ; }); __webpack_require__.d(vec3_namespaceObject, "angle", function() { return vec3_angle; }); __webpack_require__.d(vec3_namespaceObject, "zero", function() { return vec3_zero; }); __webpack_require__.d(vec3_namespaceObject, "str", function() { return vec3_str; }); __webpack_require__.d(vec3_namespaceObject, "exactEquals", function() { return vec3_exactEquals; }); __webpack_require__.d(vec3_namespaceObject, "equals", function() { return vec3_equals; }); __webpack_require__.d(vec3_namespaceObject, "sub", function() { return vec3_sub; }); __webpack_require__.d(vec3_namespaceObject, "mul", function() { return vec3_mul; }); __webpack_require__.d(vec3_namespaceObject, "div", function() { return vec3_div; }); __webpack_require__.d(vec3_namespaceObject, "dist", function() { return vec3_dist; }); __webpack_require__.d(vec3_namespaceObject, "sqrDist", function() { return vec3_sqrDist; }); __webpack_require__.d(vec3_namespaceObject, "len", function() { return vec3_len; }); __webpack_require__.d(vec3_namespaceObject, "sqrLen", function() { return vec3_sqrLen; }); __webpack_require__.d(vec3_namespaceObject, "forEach", function() { return vec3_forEach; }); // NAMESPACE OBJECT: ./src/reader/index.ts var reader_namespaceObject = {}; __webpack_require__.r(reader_namespaceObject); __webpack_require__.d(reader_namespaceObject, "BarcodeReader", function() { return barcode_reader; }); __webpack_require__.d(reader_namespaceObject, "TwoOfFiveReader", function() { return _2of5_reader; }); __webpack_require__.d(reader_namespaceObject, "NewCodabarReader", function() { return codabar_reader; }); __webpack_require__.d(reader_namespaceObject, "Code128Reader", function() { return code_128_reader; }); __webpack_require__.d(reader_namespaceObject, "Code32Reader", function() { return code_32_reader; }); __webpack_require__.d(reader_namespaceObject, "Code39Reader", function() { return code_39_reader; }); __webpack_require__.d(reader_namespaceObject, "Code39VINReader", function() { return code_39_vin_reader; }); __webpack_require__.d(reader_namespaceObject, "Code93Reader", function() { return code_93_reader; }); __webpack_require__.d(reader_namespaceObject, "EAN2Reader", function() { return ean_2_reader; }); __webpack_require__.d(reader_namespaceObject, "EAN5Reader", function() { return ean_5_reader; }); __webpack_require__.d(reader_namespaceObject, "EAN8Reader", function() { return ean_8_reader; }); __webpack_require__.d(reader_namespaceObject, "EANReader", function() { return ean_reader; }); __webpack_require__.d(reader_namespaceObject, "I2of5Reader", function() { return i2of5_reader; }); __webpack_require__.d(reader_namespaceObject, "PharmacodeReader", function() { return pharmacode_reader; }); __webpack_require__.d(reader_namespaceObject, "UPCEReader", function() { return upc_e_reader; }); __webpack_require__.d(reader_namespaceObject, "UPCReader", function() { return upc_reader; }); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js var helpers_typeof = __webpack_require__(8); var typeof_default = /*#__PURE__*/__webpack_require__.n(helpers_typeof); // EXTERNAL MODULE: ./node_modules/lodash/merge.js var merge = __webpack_require__(15); var merge_default = /*#__PURE__*/__webpack_require__.n(merge); // EXTERNAL MODULE: ./src/common/typedefs.js var typedefs = __webpack_require__(141); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/slicedToArray.js var slicedToArray = __webpack_require__(80); var slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js var classCallCheck = __webpack_require__(2); var classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js var createClass = __webpack_require__(3); var createClass_default = /*#__PURE__*/__webpack_require__.n(createClass); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/defineProperty.js var defineProperty = __webpack_require__(0); var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty); // CONCATENATED MODULE: ./node_modules/gl-matrix/esm/common.js /** * Common utilities * @module glMatrix */ // Configuration Constants var EPSILON = 0.000001; var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array; var RANDOM = Math.random; var ANGLE_ORDER = "zyx"; /** * Symmetric round * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background * * @param {Number} a value to round */ function round(a) { if (a >= 0) return Math.round(a); return a % 0.5 === 0 ? Math.floor(a) : Math.round(a); } /** * Sets the type of array used when creating new vectors and matrices * * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array */ function setMatrixArrayType(type) { ARRAY_TYPE = type; } var degree = Math.PI / 180; var radian = 180 / Math.PI; /** * Convert Degree To Radian * * @param {Number} a Angle in Degrees */ function toRadian(a) { return a * degree; } /** * Convert Radian To Degree * * @param {Number} a Angle in Radians */ function toDegree(a) { return a * radian; } /** * Tests whether or not the arguments have approximately the same value, within an absolute * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less * than or equal to 1.0, and a relative tolerance is used for larger values) * * @param {Number} a The first number to test. * @param {Number} b The second number to test. * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON) * @returns {Boolean} True if the numbers are approximately equal, false otherwise. */ function equals(a, b) { var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON; return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b)); } // CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat2.js /** * 2x2 Matrix * @module mat2 */ /** * Creates a new identity mat2 * * @returns {mat2} a new 2x2 matrix */ function mat2_create() { var out = new ARRAY_TYPE(4); if (ARRAY_TYPE != Float32Array) { out[1] = 0; out[2] = 0; } out[0] = 1; out[3] = 1; return out; } /** * Creates a new mat2 initialized with values from an existing matrix * * @param {ReadonlyMat2} a matrix to clone * @returns {mat2} a new 2x2 matrix */ function clone(a) { var out = new ARRAY_TYPE(4); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Copy the values from one mat2 to another * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; return out; } /** * Set a mat2 to the identity matrix * * @param {mat2} out the receiving matrix * @returns {mat2} out */ function identity(out) { out[0] = 1; out[1] = 0; out[2] = 0; out[3] = 1; return out; } /** * Create a new mat2 with the given values * * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m10 Component in column 1, row 0 position (index 2) * @param {Number} m11 Component in column 1, row 1 position (index 3) * @returns {mat2} out A new 2x2 matrix */ function fromValues(m00, m01, m10, m11) { var out = new ARRAY_TYPE(4); out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out; } /** * Set the components of a mat2 to the given values * * @param {mat2} out the receiving matrix * @param {Number} m00 Component in column 0, row 0 position (index 0) * @param {Number} m01 Component in column 0, row 1 position (index 1) * @param {Number} m10 Component in column 1, row 0 position (index 2) * @param {Number} m11 Component in column 1, row 1 position (index 3) * @returns {mat2} out */ function set(out, m00, m01, m10, m11) { out[0] = m00; out[1] = m01; out[2] = m10; out[3] = m11; return out; } /** * Transpose the values of a mat2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function transpose(out, a) { // If we are transposing ourselves we can skip a few steps but have to cache // some values if (out === a) { var a1 = a[1]; out[1] = a[2]; out[2] = a1; } else { out[0] = a[0]; out[1] = a[2]; out[2] = a[1]; out[3] = a[3]; } return out; } /** * Inverts a mat2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2 | null} out, or null if source matrix is not invertible */ function invert(out, a) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; // Calculate the determinant var det = a0 * a3 - a2 * a1; if (!det) { return null; } det = 1.0 / det; out[0] = a3 * det; out[1] = -a1 * det; out[2] = -a2 * det; out[3] = a0 * det; return out; } /** * Calculates the adjugate of a mat2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the source matrix * @returns {mat2} out */ function adjoint(out, a) { // Caching this value is necessary if out == a var a0 = a[0]; out[0] = a[3]; out[1] = -a[1]; out[2] = -a[2]; out[3] = a0; return out; } /** * Calculates the determinant of a mat2 * * @param {ReadonlyMat2} a the source matrix * @returns {Number} determinant of a */ function determinant(a) { return a[0] * a[3] - a[2] * a[1]; } /** * Multiplies two mat2's * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @returns {mat2} out */ function multiply(out, a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; out[0] = a0 * b0 + a2 * b1; out[1] = a1 * b0 + a3 * b1; out[2] = a0 * b2 + a2 * b3; out[3] = a1 * b2 + a3 * b3; return out; } /** * Rotates a mat2 by the given angle * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the matrix to rotate * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ function rotate(out, a, rad) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var s = Math.sin(rad); var c = Math.cos(rad); out[0] = a0 * c + a2 * s; out[1] = a1 * c + a3 * s; out[2] = a0 * -s + a2 * c; out[3] = a1 * -s + a3 * c; return out; } /** * Scales the mat2 by the dimensions in the given vec2 * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the matrix to rotate * @param {ReadonlyVec2} v the vec2 to scale the matrix by * @returns {mat2} out **/ function mat2_scale(out, a, v) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var v0 = v[0], v1 = v[1]; out[0] = a0 * v0; out[1] = a1 * v0; out[2] = a2 * v1; out[3] = a3 * v1; return out; } /** * Creates a matrix from a given angle * This is equivalent to (but much faster than): * * mat2.identity(dest); * mat2.rotate(dest, dest, rad); * * @param {mat2} out mat2 receiving operation result * @param {Number} rad the angle to rotate the matrix by * @returns {mat2} out */ function fromRotation(out, rad) { var s = Math.sin(rad); var c = Math.cos(rad); out[0] = c; out[1] = s; out[2] = -s; out[3] = c; return out; } /** * Creates a matrix from a vector scaling * This is equivalent to (but much faster than): * * mat2.identity(dest); * mat2.scale(dest, dest, vec); * * @param {mat2} out mat2 receiving operation result * @param {ReadonlyVec2} v Scaling vector * @returns {mat2} out */ function fromScaling(out, v) { out[0] = v[0]; out[1] = 0; out[2] = 0; out[3] = v[1]; return out; } /** * Returns a string representation of a mat2 * * @param {ReadonlyMat2} a matrix to represent as a string * @returns {String} string representation of the matrix */ function str(a) { return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; } /** * Returns Frobenius norm of a mat2 * * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of * @returns {Number} Frobenius norm */ function frob(a) { return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3]); } /** * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix * @param {ReadonlyMat2} L the lower triangular matrix * @param {ReadonlyMat2} D the diagonal matrix * @param {ReadonlyMat2} U the upper triangular matrix * @param {ReadonlyMat2} a the input matrix to factorize */ function LDU(L, D, U, a) { L[2] = a[2] / a[0]; U[0] = a[0]; U[1] = a[1]; U[3] = a[3] - L[2] * U[1]; return [L, D, U]; } /** * Adds two mat2's * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @returns {mat2} out */ function add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; out[3] = a[3] + b[3]; return out; } /** * Subtracts matrix b from matrix a * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @returns {mat2} out */ function subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; out[3] = a[3] - b[3]; return out; } /** * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyMat2} a The first matrix. * @param {ReadonlyMat2} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; } /** * Returns whether or not the matrices have approximately the same elements in the same position. * * @param {ReadonlyMat2} a The first matrix. * @param {ReadonlyMat2} b The second matrix. * @returns {Boolean} True if the matrices are equal, false otherwise. */ function mat2_equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3]; var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); } /** * Multiply each element of the matrix by a scalar. * * @param {mat2} out the receiving matrix * @param {ReadonlyMat2} a the matrix to scale * @param {Number} b amount to scale the matrix's elements by * @returns {mat2} out */ function multiplyScalar(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; out[3] = a[3] * b; return out; } /** * Adds two mat2's after multiplying each element of the second operand by a scalar value. * * @param {mat2} out the receiving vector * @param {ReadonlyMat2} a the first operand * @param {ReadonlyMat2} b the second operand * @param {Number} scale the amount to scale b's elements by before adding * @returns {mat2} out */ function multiplyScalarAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; out[3] = a[3] + b[3] * scale; return out; } /** * Alias for {@link mat2.multiply} * @function */ var mul = multiply; /** * Alias for {@link mat2.subtract} * @function */ var sub = subtract; // CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec2.js /** * 2 Dimensional Vector * @module vec2 */ /** * Creates a new, empty vec2 * * @returns {vec2} a new 2D vector */ function vec2_create() { var out = new ARRAY_TYPE(2); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; } return out; } /** * Creates a new vec2 initialized with values from an existing vector * * @param {ReadonlyVec2} a vector to clone * @returns {vec2} a new 2D vector */ function vec2_clone(a) { var out = new ARRAY_TYPE(2); out[0] = a[0]; out[1] = a[1]; return out; } /** * Creates a new vec2 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} a new 2D vector */ function vec2_fromValues(x, y) { var out = new ARRAY_TYPE(2); out[0] = x; out[1] = y; return out; } /** * Copy the values from one vec2 to another * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the source vector * @returns {vec2} out */ function vec2_copy(out, a) { out[0] = a[0]; out[1] = a[1]; return out; } /** * Set the components of a vec2 to the given values * * @param {vec2} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @returns {vec2} out */ function vec2_set(out, x, y) { out[0] = x; out[1] = y; return out; } /** * Adds two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function vec2_add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; return out; } /** * Subtracts vector b from vector a * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function vec2_subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; return out; } /** * Multiplies two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function vec2_multiply(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; return out; } /** * Divides two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; return out; } /** * Math.ceil the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to ceil * @returns {vec2} out */ function ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); return out; } /** * Math.floor the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to floor * @returns {vec2} out */ function floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); return out; } /** * Returns the minimum of two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); return out; } /** * Returns the maximum of two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec2} out */ function vec2_max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); return out; } /** * symmetric round the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to round * @returns {vec2} out */ function vec2_round(out, a) { out[0] = round(a[0]); out[1] = round(a[1]); return out; } /** * Scales a vec2 by a scalar number * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec2} out */ function vec2_scale(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; return out; } /** * Adds two vec2's after scaling the second operand by a scalar value * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec2} out */ function scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; return out; } /** * Calculates the euclidian distance between two vec2's * * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {Number} distance between a and b */ function distance(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return Math.sqrt(x * x + y * y); } /** * Calculates the squared euclidian distance between two vec2's * * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {Number} squared distance between a and b */ function squaredDistance(a, b) { var x = b[0] - a[0], y = b[1] - a[1]; return x * x + y * y; } /** * Calculates the length of a vec2 * * @param {ReadonlyVec2} a vector to calculate length of * @returns {Number} length of a */ function vec2_length(a) { var x = a[0], y = a[1]; return Math.sqrt(x * x + y * y); } /** * Calculates the squared length of a vec2 * * @param {ReadonlyVec2} a vector to calculate squared length of * @returns {Number} squared length of a */ function squaredLength(a) { var x = a[0], y = a[1]; return x * x + y * y; } /** * Negates the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to negate * @returns {vec2} out */ function negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; return out; } /** * Returns the inverse of the components of a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to invert * @returns {vec2} out */ function inverse(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; return out; } /** * Normalize a vec2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a vector to normalize * @returns {vec2} out */ function normalize(out, a) { var x = a[0], y = a[1]; var len = x * x + y * y; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; return out; } /** * Calculates the dot product of two vec2's * * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {Number} dot product of a and b */ function dot(a, b) { return a[0] * b[0] + a[1] * b[1]; } /** * Computes the cross product of two vec2's * Note that the cross product must by definition produce a 3D vector * * @param {vec3} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @returns {vec3} out */ function cross(out, a, b) { var z = a[0] * b[1] - a[1] * b[0]; out[0] = out[1] = 0; out[2] = z; return out; } /** * Performs a linear interpolation between two vec2's * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the first operand * @param {ReadonlyVec2} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec2} out */ function lerp(out, a, b, t) { var ax = a[0], ay = a[1]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); return out; } /** * Generates a random vector with the given scale * * @param {vec2} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec2} out */ function random(out, scale) { scale = scale === undefined ? 1.0 : scale; var r = RANDOM() * 2.0 * Math.PI; out[0] = Math.cos(r) * scale; out[1] = Math.sin(r) * scale; return out; } /** * Transforms the vec2 with a mat2 * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat2} m matrix to transform with * @returns {vec2} out */ function transformMat2(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y; out[1] = m[1] * x + m[3] * y; return out; } /** * Transforms the vec2 with a mat2d * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat2d} m matrix to transform with * @returns {vec2} out */ function transformMat2d(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[2] * y + m[4]; out[1] = m[1] * x + m[3] * y + m[5]; return out; } /** * Transforms the vec2 with a mat3 * 3rd vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat3} m matrix to transform with * @returns {vec2} out */ function transformMat3(out, a, m) { var x = a[0], y = a[1]; out[0] = m[0] * x + m[3] * y + m[6]; out[1] = m[1] * x + m[4] * y + m[7]; return out; } /** * Transforms the vec2 with a mat4 * 3rd vector component is implicitly '0' * 4th vector component is implicitly '1' * * @param {vec2} out the receiving vector * @param {ReadonlyVec2} a the vector to transform * @param {ReadonlyMat4} m matrix to transform with * @returns {vec2} out */ function transformMat4(out, a, m) { var x = a[0]; var y = a[1]; out[0] = m[0] * x + m[4] * y + m[12]; out[1] = m[1] * x + m[5] * y + m[13]; return out; } /** * Rotate a 2D vector * @param {vec2} out The receiving vec2 * @param {ReadonlyVec2} a The vec2 point to rotate * @param {ReadonlyVec2} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec2} out */ function vec2_rotate(out, a, b, rad) { //Translate point to the origin var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(rad), cosC = Math.cos(rad); //perform rotation and translate to correct position out[0] = p0 * cosC - p1 * sinC + b[0]; out[1] = p0 * sinC + p1 * cosC + b[1]; return out; } /** * Get the smallest angle between two 2D vectors * @param {ReadonlyVec2} a The first operand * @param {ReadonlyVec2} b The second operand * @returns {Number} The angle in radians */ function angle(a, b) { var ax = a[0], ay = a[1], bx = b[0], by = b[1]; return Math.abs(Math.atan2(ay * bx - ax * by, ax * bx + ay * by)); } /** * Get the signed angle in the interval [-pi,pi] between two 2D vectors (positive if `a` is to the right of `b`) * * @param {ReadonlyVec2} a The first vector * @param {ReadonlyVec2} b The second vector * @returns {number} The signed angle in radians */ function signedAngle(a, b) { var ax = a[0], ay = a[1], bx = b[0], by = b[1]; return Math.atan2(ax * by - ay * bx, ax * bx + ay * by); } /** * Set the components of a vec2 to zero * * @param {vec2} out the receiving vector * @returns {vec2} out */ function zero(out) { out[0] = 0.0; out[1] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {ReadonlyVec2} a vector to represent as a string * @returns {String} string representation of the vector */ function vec2_str(a) { return "vec2(" + a[0] + ", " + a[1] + ")"; } /** * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) * * @param {ReadonlyVec2} a The first vector. * @param {ReadonlyVec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function vec2_exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {ReadonlyVec2} a The first vector. * @param {ReadonlyVec2} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function vec2_equals(a, b) { var a0 = a[0], a1 = a[1]; var b0 = b[0], b1 = b[1]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); } /** * Alias for {@link vec2.length} * @function */ var len = vec2_length; /** * Alias for {@link vec2.subtract} * @function */ var vec2_sub = vec2_subtract; /** * Alias for {@link vec2.multiply} * @function */ var vec2_mul = vec2_multiply; /** * Alias for {@link vec2.divide} * @function */ var div = divide; /** * Alias for {@link vec2.distance} * @function */ var dist = distance; /** * Alias for {@link vec2.squaredDistance} * @function */ var sqrDist = squaredDistance; /** * Alias for {@link vec2.squaredLength} * @function */ var sqrLen = squaredLength; /** * Perform some operation over an array of vec2s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var forEach = function () { var vec = vec2_create(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 2; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; } return a; }; }(); // CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec3.js /** * 3 Dimensional Vector * @module vec3 */ /** * Creates a new, empty vec3 * * @returns {vec3} a new 3D vector */ function vec3_create() { var out = new ARRAY_TYPE(3); if (ARRAY_TYPE != Float32Array) { out[0] = 0; out[1] = 0; out[2] = 0; } return out; } /** * Creates a new vec3 initialized with values from an existing vector * * @param {ReadonlyVec3} a vector to clone * @returns {vec3} a new 3D vector */ function vec3_clone(a) { var out = new ARRAY_TYPE(3); out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Calculates the length of a vec3 * * @param {ReadonlyVec3} a vector to calculate length of * @returns {Number} length of a */ function vec3_length(a) { var x = a[0]; var y = a[1]; var z = a[2]; return Math.sqrt(x * x + y * y + z * z); } /** * Creates a new vec3 initialized with the given values * * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} a new 3D vector */ function vec3_fromValues(x, y, z) { var out = new ARRAY_TYPE(3); out[0] = x; out[1] = y; out[2] = z; return out; } /** * Copy the values from one vec3 to another * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the source vector * @returns {vec3} out */ function vec3_copy(out, a) { out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; return out; } /** * Set the components of a vec3 to the given values * * @param {vec3} out the receiving vector * @param {Number} x X component * @param {Number} y Y component * @param {Number} z Z component * @returns {vec3} out */ function vec3_set(out, x, y, z) { out[0] = x; out[1] = y; out[2] = z; return out; } /** * Adds two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_add(out, a, b) { out[0] = a[0] + b[0]; out[1] = a[1] + b[1]; out[2] = a[2] + b[2]; return out; } /** * Subtracts vector b from vector a * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_subtract(out, a, b) { out[0] = a[0] - b[0]; out[1] = a[1] - b[1]; out[2] = a[2] - b[2]; return out; } /** * Multiplies two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_multiply(out, a, b) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; return out; } /** * Divides two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_divide(out, a, b) { out[0] = a[0] / b[0]; out[1] = a[1] / b[1]; out[2] = a[2] / b[2]; return out; } /** * Math.ceil the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to ceil * @returns {vec3} out */ function vec3_ceil(out, a) { out[0] = Math.ceil(a[0]); out[1] = Math.ceil(a[1]); out[2] = Math.ceil(a[2]); return out; } /** * Math.floor the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to floor * @returns {vec3} out */ function vec3_floor(out, a) { out[0] = Math.floor(a[0]); out[1] = Math.floor(a[1]); out[2] = Math.floor(a[2]); return out; } /** * Returns the minimum of two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_min(out, a, b) { out[0] = Math.min(a[0], b[0]); out[1] = Math.min(a[1], b[1]); out[2] = Math.min(a[2], b[2]); return out; } /** * Returns the maximum of two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_max(out, a, b) { out[0] = Math.max(a[0], b[0]); out[1] = Math.max(a[1], b[1]); out[2] = Math.max(a[2], b[2]); return out; } /** * symmetric round the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to round * @returns {vec3} out */ function vec3_round(out, a) { out[0] = round(a[0]); out[1] = round(a[1]); out[2] = round(a[2]); return out; } /** * Scales a vec3 by a scalar number * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to scale * @param {Number} b amount to scale the vector by * @returns {vec3} out */ function vec3_scale(out, a, b) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; return out; } /** * Adds two vec3's after scaling the second operand by a scalar value * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {Number} scale the amount to scale b by before adding * @returns {vec3} out */ function vec3_scaleAndAdd(out, a, b, scale) { out[0] = a[0] + b[0] * scale; out[1] = a[1] + b[1] * scale; out[2] = a[2] + b[2] * scale; return out; } /** * Calculates the euclidian distance between two vec3's * * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {Number} distance between a and b */ function vec3_distance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return Math.sqrt(x * x + y * y + z * z); } /** * Calculates the squared euclidian distance between two vec3's * * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {Number} squared distance between a and b */ function vec3_squaredDistance(a, b) { var x = b[0] - a[0]; var y = b[1] - a[1]; var z = b[2] - a[2]; return x * x + y * y + z * z; } /** * Calculates the squared length of a vec3 * * @param {ReadonlyVec3} a vector to calculate squared length of * @returns {Number} squared length of a */ function vec3_squaredLength(a) { var x = a[0]; var y = a[1]; var z = a[2]; return x * x + y * y + z * z; } /** * Negates the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to negate * @returns {vec3} out */ function vec3_negate(out, a) { out[0] = -a[0]; out[1] = -a[1]; out[2] = -a[2]; return out; } /** * Returns the inverse of the components of a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to invert * @returns {vec3} out */ function vec3_inverse(out, a) { out[0] = 1.0 / a[0]; out[1] = 1.0 / a[1]; out[2] = 1.0 / a[2]; return out; } /** * Normalize a vec3 * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a vector to normalize * @returns {vec3} out */ function vec3_normalize(out, a) { var x = a[0]; var y = a[1]; var z = a[2]; var len = x * x + y * y + z * z; if (len > 0) { //TODO: evaluate use of glm_invsqrt here? len = 1 / Math.sqrt(len); } out[0] = a[0] * len; out[1] = a[1] * len; out[2] = a[2] * len; return out; } /** * Calculates the dot product of two vec3's * * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {Number} dot product of a and b */ function vec3_dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } /** * Computes the cross product of two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @returns {vec3} out */ function vec3_cross(out, a, b) { var ax = a[0], ay = a[1], az = a[2]; var bx = b[0], by = b[1], bz = b[2]; out[0] = ay * bz - az * by; out[1] = az * bx - ax * bz; out[2] = ax * by - ay * bx; return out; } /** * Performs a linear interpolation between two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function vec3_lerp(out, a, b, t) { var ax = a[0]; var ay = a[1]; var az = a[2]; out[0] = ax + t * (b[0] - ax); out[1] = ay + t * (b[1] - ay); out[2] = az + t * (b[2] - az); return out; } /** * Performs a spherical linear interpolation between two vec3's * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function slerp(out, a, b, t) { var angle = Math.acos(Math.min(Math.max(vec3_dot(a, b), -1), 1)); var sinTotal = Math.sin(angle); var ratioA = Math.sin((1 - t) * angle) / sinTotal; var ratioB = Math.sin(t * angle) / sinTotal; out[0] = ratioA * a[0] + ratioB * b[0]; out[1] = ratioA * a[1] + ratioB * b[1]; out[2] = ratioA * a[2] + ratioB * b[2]; return out; } /** * Performs a hermite interpolation with two control points * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {ReadonlyVec3} c the third operand * @param {ReadonlyVec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function hermite(out, a, b, c, d, t) { var factorTimes2 = t * t; var factor1 = factorTimes2 * (2 * t - 3) + 1; var factor2 = factorTimes2 * (t - 2) + t; var factor3 = factorTimes2 * (t - 1); var factor4 = factorTimes2 * (3 - 2 * t); out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Performs a bezier interpolation with two control points * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the first operand * @param {ReadonlyVec3} b the second operand * @param {ReadonlyVec3} c the third operand * @param {ReadonlyVec3} d the fourth operand * @param {Number} t interpolation amount, in the range [0-1], between the two inputs * @returns {vec3} out */ function bezier(out, a, b, c, d, t) { var inverseFactor = 1 - t; var inverseFactorTimesTwo = inverseFactor * inverseFactor; var factorTimes2 = t * t; var factor1 = inverseFactorTimesTwo * inverseFactor; var factor2 = 3 * t * inverseFactorTimesTwo; var factor3 = 3 * factorTimes2 * inverseFactor; var factor4 = factorTimes2 * t; out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; return out; } /** * Generates a random vector with the given scale * * @param {vec3} out the receiving vector * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned * @returns {vec3} out */ function vec3_random(out, scale) { scale = scale === undefined ? 1.0 : scale; var r = RANDOM() * 2.0 * Math.PI; var z = RANDOM() * 2.0 - 1.0; var zScale = Math.sqrt(1.0 - z * z) * scale; out[0] = Math.cos(r) * zScale; out[1] = Math.sin(r) * zScale; out[2] = z * scale; return out; } /** * Transforms the vec3 with a mat4. * 4th vector component is implicitly '1' * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to transform * @param {ReadonlyMat4} m matrix to transform with * @returns {vec3} out */ function vec3_transformMat4(out, a, m) { var x = a[0], y = a[1], z = a[2]; var w = m[3] * x + m[7] * y + m[11] * z + m[15]; w = w || 1.0; out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; return out; } /** * Transforms the vec3 with a mat3. * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to transform * @param {ReadonlyMat3} m the 3x3 matrix to transform with * @returns {vec3} out */ function vec3_transformMat3(out, a, m) { var x = a[0], y = a[1], z = a[2]; out[0] = x * m[0] + y * m[3] + z * m[6]; out[1] = x * m[1] + y * m[4] + z * m[7]; out[2] = x * m[2] + y * m[5] + z * m[8]; return out; } /** * Transforms the vec3 with a quat * Can also be used for dual quaternions. (Multiply it with the real part) * * @param {vec3} out the receiving vector * @param {ReadonlyVec3} a the vector to transform * @param {ReadonlyQuat} q normalized quaternion to transform with * @returns {vec3} out */ function transformQuat(out, a, q) { // Fast Vector Rotation using Quaternions by Robert Eisele // https://raw.org/proof/vector-rotation-using-quaternions/ var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; var vx = a[0], vy = a[1], vz = a[2]; // t = q x v var tx = qy * vz - qz * vy; var ty = qz * vx - qx * vz; var tz = qx * vy - qy * vx; // t = 2t tx = tx + tx; ty = ty + ty; tz = tz + tz; // v + w t + q x t out[0] = vx + qw * tx + qy * tz - qz * ty; out[1] = vy + qw * ty + qz * tx - qx * tz; out[2] = vz + qw * tz + qx * ty - qy * tx; return out; } /** * Rotate a 3D vector around the x-axis * @param {vec3} out The receiving vec3 * @param {ReadonlyVec3} a The vec3 point to rotate * @param {ReadonlyVec3} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec3} out */ function rotateX(out, a, b, rad) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0]; r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the y-axis * @param {vec3} out The receiving vec3 * @param {ReadonlyVec3} a The vec3 point to rotate * @param {ReadonlyVec3} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec3} out */ function rotateY(out, a, b, rad) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); r[1] = p[1]; r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Rotate a 3D vector around the z-axis * @param {vec3} out The receiving vec3 * @param {ReadonlyVec3} a The vec3 point to rotate * @param {ReadonlyVec3} b The origin of the rotation * @param {Number} rad The angle of rotation in radians * @returns {vec3} out */ function rotateZ(out, a, b, rad) { var p = [], r = []; //Translate point to the origin p[0] = a[0] - b[0]; p[1] = a[1] - b[1]; p[2] = a[2] - b[2]; //perform rotation r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); r[2] = p[2]; //translate to correct position out[0] = r[0] + b[0]; out[1] = r[1] + b[1]; out[2] = r[2] + b[2]; return out; } /** * Get the angle between two 3D vectors * @param {ReadonlyVec3} a The first operand * @param {ReadonlyVec3} b The second operand * @returns {Number} The angle in radians */ function vec3_angle(a, b) { var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2], mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)), cosine = mag && vec3_dot(a, b) / mag; return Math.acos(Math.min(Math.max(cosine, -1), 1)); } /** * Set the components of a vec3 to zero * * @param {vec3} out the receiving vector * @returns {vec3} out */ function vec3_zero(out) { out[0] = 0.0; out[1] = 0.0; out[2] = 0.0; return out; } /** * Returns a string representation of a vector * * @param {ReadonlyVec3} a vector to represent as a string * @returns {String} string representation of the vector */ function vec3_str(a) { return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; } /** * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * * @param {ReadonlyVec3} a The first vector. * @param {ReadonlyVec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function vec3_exactEquals(a, b) { return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; } /** * Returns whether or not the vectors have approximately the same elements in the same position. * * @param {ReadonlyVec3} a The first vector. * @param {ReadonlyVec3} b The second vector. * @returns {Boolean} True if the vectors are equal, false otherwise. */ function vec3_equals(a, b) { var a0 = a[0], a1 = a[1], a2 = a[2]; var b0 = b[0], b1 = b[1], b2 = b[2]; return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); } /** * Alias for {@link vec3.subtract} * @function */ var vec3_sub = vec3_subtract; /** * Alias for {@link vec3.multiply} * @function */ var vec3_mul = vec3_multiply; /** * Alias for {@link vec3.divide} * @function */ var vec3_div = vec3_divide; /** * Alias for {@link vec3.distance} * @function */ var vec3_dist = vec3_distance; /** * Alias for {@link vec3.squaredDistance} * @function */ var vec3_sqrDist = vec3_squaredDistance; /** * Alias for {@link vec3.length} * @function */ var vec3_len = vec3_length; /** * Alias for {@link vec3.squaredLength} * @function */ var vec3_sqrLen = vec3_squaredLength; /** * Perform some operation over an array of vec3s. * * @param {Array} a the array of vectors to iterate over * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed * @param {Number} offset Number of elements to skip at the beginning of the array * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array * @param {Function} fn Function to call for each vector in the array * @param {Object} [arg] additional argument to pass to fn * @returns {Array} a * @function */ var vec3_forEach = function () { var vec = vec3_create(); return function (a, stride, offset, count, fn, arg) { var i, l; if (!stride) { stride = 3; } if (!offset) { offset = 0; } if (count) { l = Math.min(count * stride + offset, a.length); } else { l = a.length; } for (i = offset; i < l; i += stride) { vec[0] = a[i]; vec[1] = a[i + 1]; vec[2] = a[i + 2]; fn(vec, vec, arg); a[i] = vec[0]; a[i + 1] = vec[1]; a[i + 2] = vec[2]; } return a; }; }(); // CONCATENATED MODULE: ./node_modules/gl-matrix/esm/index.js // CONCATENATED MODULE: ./src/common/array_helper.ts /* eslint-disable no-param-reassign */ /* harmony default export */ var array_helper = ({ init: function init(arr, val) { arr.fill(val); }, /** * IN-PLACE Shuffles the content of an array */ shuffle: function shuffle(arr) { // Durstenfeld shuffle algorithm // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var _ref = [arr[j], arr[i]]; arr[i] = _ref[0]; arr[j] = _ref[1]; } return arr; }, toPointList: function toPointList(arr) { var rows = arr.reduce(function (p, n) { var row = "[".concat(n.join(','), "]"); p.push(row); return p; }, []); return "[".concat(rows.join(',\r\n'), "]"); }, /** * returns the elements which's score is bigger than the threshold */ // eslint-disable-next-line no-unused-vars threshold: function threshold(arr, _threshold, scoreFunc) { var queue = arr.reduce(function (prev, next) { if (scoreFunc.apply(arr, [next]) >= _threshold) { prev.push(next); } return prev; }, []); return queue; }, maxIndex: function maxIndex(arr) { var max = 0; for (var i = 0; i < arr.length; i++) { if (arr[i] > arr[max]) { max = i; } } return max; }, max: function max(arr) { var max = 0; for (var i = 0; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }, sum: function sum(arr) { var length = arr.length; var sum = 0; while (length--) { sum += arr[length]; } return sum; } }); // CONCATENATED MODULE: ./src/common/cluster.js // TODO: cluster.js and cv_utils.js are pretty tightly intertwined, making for a complex conversion // into typescript. be warned. :-) /** * Creates a cluster for grouping similar orientations of datapoints */ /* harmony default export */ var cluster = ({ create: function create(point, threshold) { var points = []; var center = { rad: 0, vec: vec2_namespaceObject.clone([0, 0]) }; var pointMap = {}; function _add(pointToAdd) { pointMap[pointToAdd.id] = pointToAdd; points.push(pointToAdd); } function updateCenter() { var i; var sum = 0; for (i = 0; i < points.length; i++) { sum += points[i].rad; } center.rad = sum / points.length; center.vec = vec2_namespaceObject.clone([Math.cos(center.rad), Math.sin(center.rad)]); } function init() { _add(point); updateCenter(); } init(); return { add: function add(pointToAdd) { if (!pointMap[pointToAdd.id]) { _add(pointToAdd); updateCenter(); } }, fits: function fits(otherPoint) { // check cosine similarity to center-angle var similarity = Math.abs(vec2_namespaceObject.dot(otherPoint.point.vec, center.vec)); if (similarity > threshold) { return true; } return false; }, getPoints: function getPoints() { return points; }, getCenter: function getCenter() { return center; } }; }, createPoint: function createPoint(newPoint, id, property) { return { rad: newPoint[property], point: newPoint, id: id }; } }); // CONCATENATED MODULE: ./src/common/cv_utils.js /* eslint-disable no-mixed-operators */ /* eslint-disable no-bitwise */ /** * @param x x-coordinate * @param y y-coordinate * @return ImageReference {x,y} Coordinate */ function imageRef(x, y) { var that = { x: x, y: y, toVec2: function toVec2() { return vec2_namespaceObject.clone([this.x, this.y]); }, toVec3: function toVec3() { return vec3_namespaceObject.clone([this.x, this.y, 1]); }, round: function round() { this.x = this.x > 0.0 ? Math.floor(this.x + 0.5) : Math.floor(this.x - 0.5); this.y = this.y > 0.0 ? Math.floor(this.y + 0.5) : Math.floor(this.y - 0.5); return this; } }; return that; } /** * Computes an integral image of a given grayscale image. * @param imageDataContainer {ImageDataContainer} the image to be integrated */ function computeIntegralImage2(imageWrapper, integralWrapper) { var imageData = imageWrapper.data; var width = imageWrapper.size.x; var height = imageWrapper.size.y; var integralImageData = integralWrapper.data; var sum = 0; var posA = 0; var posB = 0; var posC = 0; var posD = 0; var x; var y; // sum up first column posB = width; sum = 0; for (y = 1; y < height; y++) { sum += imageData[posA]; integralImageData[posB] += sum; posA += width; posB += width; } posA = 0; posB = 1; sum = 0; for (x = 1; x < width; x++) { sum += imageData[posA]; integralImageData[posB] += sum; posA++; posB++; } for (y = 1; y < height; y++) { posA = y * width + 1; posB = (y - 1) * width + 1; posC = y * width; posD = (y - 1) * width; for (x = 1; x < width; x++) { integralImageData[posA] += imageData[posA] + integralImageData[posB] + integralImageData[posC] - integralImageData[posD]; posA++; posB++; posC++; posD++; } } } function computeIntegralImage(imageWrapper, integralWrapper) { var imageData = imageWrapper.data; var width = imageWrapper.size.x; var height = imageWrapper.size.y; var integralImageData = integralWrapper.data; var sum = 0; // sum up first row for (var i = 0; i < width; i++) { sum += imageData[i]; integralImageData[i] = sum; } for (var v = 1; v < height; v++) { sum = 0; for (var u = 0; u < width; u++) { sum += imageData[v * width + u]; integralImageData[v * width + u] = sum + integralImageData[(v - 1) * width + u]; } } } function thresholdImage(imageWrapper, threshold, targetWrapper) { if (!targetWrapper) { // eslint-disable-next-line no-param-reassign targetWrapper = imageWrapper; } var imageData = imageWrapper.data; var length = imageData.length; var targetData = targetWrapper.data; while (length--) { targetData[length] = imageData[length] < threshold ? 1 : 0; } } function computeHistogram(imageWrapper, bitsPerPixel) { if (!bitsPerPixel) { // eslint-disable-next-line no-param-reassign bitsPerPixel = 8; } var imageData = imageWrapper.data; var length = imageData.length; var bitShift = 8 - bitsPerPixel; var bucketCnt = 1 << bitsPerPixel; var hist = new Int32Array(bucketCnt); while (length--) { hist[imageData[length] >> bitShift]++; } return hist; } function sharpenLine(line) { var i; var length = line.length; var left = line[0]; var center = line[1]; var right; for (i = 1; i < length - 1; i++) { right = line[i + 1]; // -1 4 -1 kernel // eslint-disable-next-line no-param-reassign line[i - 1] = center * 2 - left - right & 255; left = center; center = right; } return line; } function determineOtsuThreshold(imageWrapper) { var bitsPerPixel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8; var hist; var bitShift = 8 - bitsPerPixel; function px(init, end) { var sum = 0; for (var i = init; i <= end; i++) { sum += hist[i]; } return sum; } function mx(init, end) { var sum = 0; for (var i = init; i <= end; i++) { sum += i * hist[i]; } return sum; } function determineThreshold() { var vet = [0]; var p1; var p2; var p12; var m1; var m2; var m12; var max = (1 << bitsPerPixel) - 1; hist = computeHistogram(imageWrapper, bitsPerPixel); for (var k = 1; k < max; k++) { p1 = px(0, k); p2 = px(k + 1, max); p12 = p1 * p2; if (p12 === 0) { p12 = 1; } m1 = mx(0, k) * p2; m2 = mx(k + 1, max) * p1; m12 = m1 - m2; vet[k] = m12 * m12 / p12; } return array_helper.maxIndex(vet); } var threshold = determineThreshold(); return threshold << bitShift; } function otsuThreshold(imageWrapper, targetWrapper) { var threshold = determineOtsuThreshold(imageWrapper); thresholdImage(imageWrapper, threshold, targetWrapper); return threshold; } // local thresholding function computeBinaryImage(imageWrapper, integralWrapper, targetWrapper) { computeIntegralImage(imageWrapper, integralWrapper); if (!targetWrapper) { // eslint-disable-next-line no-param-reassign targetWrapper = imageWrapper; } var imageData = imageWrapper.data; var targetData = targetWrapper.data; var width = imageWrapper.size.x; var height = imageWrapper.size.y; var integralImageData = integralWrapper.data; var sum = 0; var v; var u; var kernel = 3; var A; var B; var C; var D; var avg; var size = (kernel * 2 + 1) * (kernel * 2 + 1); // clear out top & bottom-border for (v = 0; v <= kernel; v++) { for (u = 0; u < width; u++) { targetData[v * width + u] = 0; targetData[(height - 1 - v) * width + u] = 0; } } // clear out left & right border for (v = kernel; v < height - kernel; v++) { for (u = 0; u <= kernel; u++) { targetData[v * width + u] = 0; targetData[v * width + (width - 1 - u)] = 0; } } for (v = kernel + 1; v < height - kernel - 1; v++) { for (u = kernel + 1; u < width - kernel; u++) { A = integralImageData[(v - kernel - 1) * width + (u - kernel - 1)]; B = integralImageData[(v - kernel - 1) * width + (u + kernel)]; C = integralImageData[(v + kernel) * width + (u - kernel - 1)]; D = integralImageData[(v + kernel) * width + (u + kernel)]; sum = D - C - B + A; avg = sum / size; targetData[v * width + u] = imageData[v * width + u] > avg + 5 ? 0 : 1; } } } function cv_utils_cluster(points, threshold, property) { var i; var k; var thisCluster; var point; var clusters = []; if (!property) { // eslint-disable-next-line no-param-reassign property = 'rad'; } function addToCluster(newPoint) { var found = false; for (k = 0; k < clusters.length; k++) { thisCluster = clusters[k]; if (thisCluster.fits(newPoint)) { thisCluster.add(newPoint); found = true; } } return found; } // iterate over each cloud for (i = 0; i < points.length; i++) { point = cluster.createPoint(points[i], i, property); if (!addToCluster(point)) { clusters.push(cluster.create(point, threshold)); } } return clusters; } var Tracer = { trace: function trace(points, vec) { var iteration; var maxIterations = 10; var top = []; var result = []; var centerPos = 0; var currentPos = 0; function trace(idx, forward) { var to; var toIdx; var predictedPos; var thresholdX = 1; var thresholdY = Math.abs(vec[1] / 10); var found = false; function match(pos, predicted) { if (pos.x > predicted.x - thresholdX && pos.x < predicted.x + thresholdX && pos.y > predicted.y - thresholdY && pos.y < predicted.y + thresholdY) { return true; } return false; } // check if the next index is within the vec specifications // if not, check as long as the threshold is met var from = points[idx]; if (forward) { predictedPos = { x: from.x + vec[0], y: from.y + vec[1] }; } else { predictedPos = { x: from.x - vec[0], y: from.y - vec[1] }; } toIdx = forward ? idx + 1 : idx - 1; to = points[toIdx]; // eslint-disable-next-line no-cond-assign while (to && (found = match(to, predictedPos)) !== true && Math.abs(to.y - from.y) < vec[1]) { toIdx = forward ? toIdx + 1 : toIdx - 1; to = points[toIdx]; } return found ? toIdx : null; } for (iteration = 0; iteration < maxIterations; iteration++) { // randomly select point to start with centerPos = Math.floor(Math.random() * points.length); // trace forward top = []; currentPos = centerPos; top.push(points[currentPos]); // eslint-disable-next-line no-cond-assign while ((currentPos = trace(currentPos, true)) !== null) { top.push(points[currentPos]); } if (centerPos > 0) { currentPos = centerPos; // eslint-disable-next-line no-cond-assign while ((currentPos = trace(currentPos, false)) !== null) { top.push(points[currentPos]); } } if (top.length > result.length) { result = top; } } return result; } }; var DILATE = 1; var ERODE = 2; function dilate(inImageWrapper, outImageWrapper) { var v; var u; var inImageData = inImageWrapper.data; var outImageData = outImageWrapper.data; var height = inImageWrapper.size.y; var width = inImageWrapper.size.x; var sum; var yStart1; var yStart2; var xStart1; var xStart2; for (v = 1; v < height - 1; v++) { for (u = 1; u < width - 1; u++) { yStart1 = v - 1; yStart2 = v + 1; xStart1 = u - 1; xStart2 = u + 1; sum = inImageData[yStart1 * width + xStart1] + inImageData[yStart1 * width + xStart2] + inImageData[v * width + u] + inImageData[yStart2 * width + xStart1] + inImageData[yStart2 * width + xStart2]; outImageData[v * width + u] = sum > 0 ? 1 : 0; } } } function erode(inImageWrapper, outImageWrapper) { var v; var u; var inImageData = inImageWrapper.data; var outImageData = outImageWrapper.data; var height = inImageWrapper.size.y; var width = inImageWrapper.size.x; var sum; var yStart1; var yStart2; var xStart1; var xStart2; for (v = 1; v < height - 1; v++) { for (u = 1; u < width - 1; u++) { yStart1 = v - 1; yStart2 = v + 1; xStart1 = u - 1; xStart2 = u + 1; sum = inImageData[yStart1 * width + xStart1] + inImageData[yStart1 * width + xStart2] + inImageData[v * width + u] + inImageData[yStart2 * width + xStart1] + inImageData[yStart2 * width + xStart2]; outImageData[v * width + u] = sum === 5 ? 1 : 0; } } } function cv_utils_subtract(aImageWrapper, bImageWrapper, resultImageWrapper) { if (!resultImageWrapper) { // eslint-disable-next-line no-param-reassign resultImageWrapper = aImageWrapper; } var length = aImageWrapper.data.length; var aImageData = aImageWrapper.data; var bImageData = bImageWrapper.data; var cImageData = resultImageWrapper.data; while (length--) { cImageData[length] = aImageData[length] - bImageData[length]; } } function bitwiseOr(aImageWrapper, bImageWrapper, resultImageWrapper) { if (!resultImageWrapper) { // eslint-disable-next-line no-param-reassign resultImageWrapper = aImageWrapper; } var length = aImageWrapper.data.length; var aImageData = aImageWrapper.data; var bImageData = bImageWrapper.data; var cImageData = resultImageWrapper.data; while (length--) { cImageData[length] = aImageData[length] || bImageData[length]; } } function countNonZero(imageWrapper) { var length = imageWrapper.data.length; var data = imageWrapper.data; var sum = 0; while (length--) { sum += data[length]; } return sum; } function topGeneric(list, top, scoreFunc) { var i; var minIdx = 0; var min = 0; var queue = []; var score; var hit; var pos; for (i = 0; i < top; i++) { queue[i] = { score: 0, item: null }; } for (i = 0; i < list.length; i++) { score = scoreFunc.apply(this, [list[i]]); if (score > min) { hit = queue[minIdx]; hit.score = score; hit.item = list[i]; min = Number.MAX_VALUE; for (pos = 0; pos < top; pos++) { if (queue[pos].score < min) { min = queue[pos].score; minIdx = pos; } } } } return queue; } function grayArrayFromImage(htmlImage, offsetX, ctx, array) { ctx.drawImage(htmlImage, offsetX, 0, htmlImage.width, htmlImage.height); var ctxData = ctx.getImageData(offsetX, 0, htmlImage.width, htmlImage.height).data; computeGray(ctxData, array); } function grayArrayFromContext(ctx, size, offset, array) { var ctxData = ctx.getImageData(offset.x, offset.y, size.x, size.y).data; computeGray(ctxData, array); } function grayAndHalfSampleFromCanvasData(canvasData, size, outArray) { var topRowIdx = 0; var bottomRowIdx = size.x; var endIdx = Math.floor(canvasData.length / 4); var outWidth = size.x / 2; var outImgIdx = 0; var inWidth = size.x; var i; while (bottomRowIdx < endIdx) { for (i = 0; i < outWidth; i++) { // eslint-disable-next-line no-param-reassign outArray[outImgIdx] = (0.299 * canvasData[topRowIdx * 4 + 0] + 0.587 * canvasData[topRowIdx * 4 + 1] + 0.114 * canvasData[topRowIdx * 4 + 2] + (0.299 * canvasData[(topRowIdx + 1) * 4 + 0] + 0.587 * canvasData[(topRowIdx + 1) * 4 + 1] + 0.114 * canvasData[(topRowIdx + 1) * 4 + 2]) + (0.299 * canvasData[bottomRowIdx * 4 + 0] + 0.587 * canvasData[bottomRowIdx * 4 + 1] + 0.114 * canvasData[bottomRowIdx * 4 + 2]) + (0.299 * canvasData[(bottomRowIdx + 1) * 4 + 0] + 0.587 * canvasData[(bottomRowIdx + 1) * 4 + 1] + 0.114 * canvasData[(bottomRowIdx + 1) * 4 + 2])) / 4; outImgIdx++; topRowIdx += 2; bottomRowIdx += 2; } topRowIdx += inWidth; bottomRowIdx += inWidth; } } function computeGray(imageData, outArray, config) { var l = imageData.length / 4 | 0; var singleChannel = config && config.singleChannel === true; if (singleChannel) { for (var i = 0; i < l; i++) { var alpha = imageData[i * 4 + 3]; if (alpha === 0) { // eslint-disable-next-line no-param-reassign outArray[i] = 255; // Treat transparent pixels as white } else { // eslint-disable-next-line no-param-reassign outArray[i] = imageData[i * 4 + 0]; } } } else { for (var _i = 0; _i < l; _i++) { var _alpha = imageData[_i * 4 + 3]; if (_alpha === 0) { // eslint-disable-next-line no-param-reassign outArray[_i] = 255; // Treat transparent pixels as white } else { // eslint-disable-next-line no-param-reassign outArray[_i] = 0.299 * imageData[_i * 4 + 0] + 0.587 * imageData[_i * 4 + 1] + 0.114 * imageData[_i * 4 + 2]; } } } } function loadImageArray(src, callback) { var canvas = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document && document.createElement('canvas'); var img = new Image(); img.callback = callback; img.onload = function () { // eslint-disable-next-line no-param-reassign canvas.width = this.width; // eslint-disable-next-line no-param-reassign canvas.height = this.height; console.warn('* loadImageArray getContext 2d'); var ctx = canvas.getContext('2d'); ctx.drawImage(this, 0, 0); var array = new Uint8Array(this.width * this.height); ctx.drawImage(this, 0, 0); var _ctx$getImageData = ctx.getImageData(0, 0, this.width, this.height), data = _ctx$getImageData.data; computeGray(data, array); this.callback(array, { x: this.width, y: this.height }, this); }; img.src = src; } /** * @param inImg {ImageWrapper} input image to be sampled * @param outImg {ImageWrapper} to be stored in */ function halfSample(inImgWrapper, outImgWrapper) { var inImg = inImgWrapper.data; var inWidth = inImgWrapper.size.x; var outImg = outImgWrapper.data; var topRowIdx = 0; var bottomRowIdx = inWidth; var endIdx = inImg.length; var outWidth = inWidth / 2; var outImgIdx = 0; while (bottomRowIdx < endIdx) { for (var i = 0; i < outWidth; i++) { outImg[outImgIdx] = Math.floor((inImg[topRowIdx] + inImg[topRowIdx + 1] + inImg[bottomRowIdx] + inImg[bottomRowIdx + 1]) / 4); outImgIdx++; topRowIdx += 2; bottomRowIdx += 2; } topRowIdx += inWidth; bottomRowIdx += inWidth; } } function hsv2rgb(hsv) { var rgb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0]; var h = hsv[0]; var s = hsv[1]; var v = hsv[2]; var c = v * s; var x = c * (1 - Math.abs(h / 60 % 2 - 1)); var m = v - c; var r = 0; var g = 0; var b = 0; if (h < 60) { r = c; g = x; } else if (h < 120) { r = x; g = c; } else if (h < 180) { g = c; b = x; } else if (h < 240) { g = x; b = c; } else if (h < 300) { r = x; b = c; } else if (h < 360) { r = c; b = x; } // eslint-disable-next-line no-param-reassign rgb[0] = (r + m) * 255 | 0; // eslint-disable-next-line no-param-reassign rgb[1] = (g + m) * 255 | 0; // eslint-disable-next-line no-param-reassign rgb[2] = (b + m) * 255 | 0; return rgb; } function _computeDivisors(n) { // Handle edge cases // NaN: Not a number - no meaningful divisors // Infinity: Infinite values have no finite divisors // Non-positive: Divisors are typically defined for positive integers only // While negative numbers technically have divisors, returning them would complicate // the API (would need to return both positive and negative divisors, or make assumptions) if (!Number.isFinite(n) || n < 1) { return []; } var largeDivisors = []; var divisors = []; var sqrtN = Math.sqrt(n); for (var i = 1; i <= sqrtN; i++) { if (n % i === 0) { divisors.push(i); // Only add the complementary divisor if it's different (not a perfect square root) if (i !== n / i) { largeDivisors.unshift(Math.floor(n / i)); } } } return divisors.concat(largeDivisors); } function _computeIntersection(arr1, arr2) { var i = 0; var j = 0; var result = []; while (i < arr1.length && j < arr2.length) { if (arr1[i] === arr2[j]) { result.push(arr1[i]); i++; j++; } else if (arr1[i] > arr2[j]) { j++; } else { i++; } } return result; } function calculatePatchSize(patchSize, imgSize) { var divisorsX = _computeDivisors(imgSize.x); var divisorsY = _computeDivisors(imgSize.y); var wideSide = Math.max(imgSize.x, imgSize.y); var common = _computeIntersection(divisorsX, divisorsY); var nrOfPatchesList = [8, 10, 15, 20, 32, 60, 80]; var nrOfPatchesMap = { 'x-small': 5, small: 4, medium: 3, large: 2, 'x-large': 1 }; var nrOfPatchesIdx = nrOfPatchesMap[patchSize] || nrOfPatchesMap.medium; var nrOfPatches = nrOfPatchesList[nrOfPatchesIdx]; var desiredPatchSize = Math.floor(wideSide / nrOfPatches); var optimalPatchSize; function findPatchSizeForDivisors(divisors) { var i = 0; var found = divisors[Math.floor(divisors.length / 2)]; while (i < divisors.length - 1 && divisors[i] < desiredPatchSize) { i++; } if (i > 0) { if (Math.abs(divisors[i] - desiredPatchSize) > Math.abs(divisors[i - 1] - desiredPatchSize)) { found = divisors[i - 1]; } else { found = divisors[i]; } } if (desiredPatchSize / found < nrOfPatchesList[nrOfPatchesIdx + 1] / nrOfPatchesList[nrOfPatchesIdx] && desiredPatchSize / found > nrOfPatchesList[nrOfPatchesIdx - 1] / nrOfPatchesList[nrOfPatchesIdx]) { return { x: found, y: found }; } return null; } optimalPatchSize = findPatchSizeForDivisors(common); if (!optimalPatchSize) { optimalPatchSize = findPatchSizeForDivisors(_computeDivisors(wideSide)); if (!optimalPatchSize) { optimalPatchSize = findPatchSizeForDivisors(_computeDivisors(desiredPatchSize * nrOfPatches)); } } // Fallback: if no optimal patch size found, use image size (or 1x1 minimum) // This ensures the function always returns a valid {x, y} object if (!optimalPatchSize) { optimalPatchSize = { x: Math.max(1, imgSize.x), y: Math.max(1, imgSize.y) }; } return optimalPatchSize; } function _parseCSSDimensionValues(value) { var dimension = { value: parseFloat(value), unit: value.indexOf('%') === value.length - 1 ? '%' : '%' }; return dimension; } var _dimensionsConverters = { top: function top(dimension, context) { return dimension.unit === '%' ? Math.floor(context.height * (dimension.value / 100)) : null; }, right: function right(dimension, context) { return dimension.unit === '%' ? Math.floor(context.width - context.width * (dimension.value / 100)) : null; }, bottom: function bottom(dimension, context) { return dimension.unit === '%' ? Math.floor(context.height - context.height * (dimension.value / 100)) : null; }, left: function left(dimension, context) { return dimension.unit === '%' ? Math.floor(context.width * (dimension.value / 100)) : null; } }; function computeImageArea(inputWidth, inputHeight, area) { var context = { width: inputWidth, height: inputHeight }; var parsedArea = Object.keys(area).reduce(function (result, key) { // Skip styling properties that aren't dimension converters if (!_dimensionsConverters[key]) { return result; } var value = area[key]; var parsed = _parseCSSDimensionValues(value); var calculated = _dimensionsConverters[key](parsed, context); // eslint-disable-next-line no-param-reassign result[key] = calculated; return result; }, {}); return { sx: parsedArea.left, sy: parsedArea.top, sw: parsedArea.right - parsedArea.left, sh: parsedArea.bottom - parsedArea.top }; } // CONCATENATED MODULE: ./src/common/image_wrapper.ts function assertNumberPositive(val) { if (val < 0) { throw new Error("expected positive number, received ".concat(val)); } } var image_wrapper_ImageWrapper = /*#__PURE__*/function () { // Represents a basic image combining the data and size. In addition, some methods for // manipulation are contained within. function ImageWrapper(size, data) { var ArrayType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Uint8Array; var initialize = arguments.length > 3 ? arguments[3] : undefined; classCallCheck_default()(this, ImageWrapper); defineProperty_default()(this, "data", void 0); defineProperty_default()(this, "size", void 0); defineProperty_default()(this, "indexMapping", void 0); if (!data) { this.data = new ArrayType(size.x * size.y); if (initialize) { array_helper.init(this.data, 0); } } else { this.data = data; } this.size = size; } // tests if a position is within the image, extended out by a border on each side return createClass_default()(ImageWrapper, [{ key: "inImageWithBorder", value: function inImageWithBorder(imgRef) { var border = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; assertNumberPositive(border); return imgRef.x >= 0 && imgRef.y >= 0 && imgRef.x < this.size.x + border * 2 && imgRef.y < this.size.y + border * 2; } // Copy from THIS ImageWrapper to the new imageWrapper parameter, starting at from, stopping at // end of new imageWrapper size. }, { key: "subImageAsCopy", value: function subImageAsCopy(imageWrapper, from) { assertNumberPositive(from.x); assertNumberPositive(from.y); var _imageWrapper$size = imageWrapper.size, sizeX = _imageWrapper$size.x, sizeY = _imageWrapper$size.y; for (var x = 0; x < sizeX; x++) { for (var y = 0; y < sizeY; y++) { // eslint-disable-next-line no-param-reassign imageWrapper.data[y * sizeX + x] = this.data[(from.y + y) * this.size.x + from.x + x]; } } return imageWrapper; // TODO: this function really probably should call into ImageWrapper somewhere to make // sure that all of it's parameters are set properly, something like // ImageWrapper.UpdateFrom() // that might take a provided data and size, and make sure there's no invalid indexMapping // hanging around, and such. } // Retrieve a grayscale value at the given pixel position of the image }, { key: "get", value: function get(x, y) { return this.data[y * this.size.x + x]; } // Retrieve a grayscale value at the given pixel position of the image (safe, whatever that // means) }, { key: "getSafe", value: function getSafe(x, y) { // cache indexMapping because if we're using it once, we'll probably need it a bunch more // too if (!this.indexMapping) { this.indexMapping = { x: [], y: [] }; for (var i = 0; i < this.size.x; i++) { this.indexMapping.x[i] = i; this.indexMapping.x[i + this.size.x] = i; } for (var _i = 0; _i < this.size.y; _i++) { this.indexMapping.y[_i] = _i; this.indexMapping.y[_i + this.size.y] = _i; } } return this.data[this.indexMapping.y[y + this.size.y] * this.size.x + this.indexMapping.x[x + this.size.x]]; } // Sets a given pixel position in the image to the given grayscale value }, { key: "set", value: function set(x, y, value) { this.data[y * this.size.x + x] = value; delete this.indexMapping; return this; } // Sets the border of the image (1 pixel) to zero }, { key: "zeroBorder", value: function zeroBorder() { var _this$size = this.size, width = _this$size.x, height = _this$size.y; for (var i = 0; i < width; i++) { // eslint-disable-next-line no-multi-assign this.data[i] = this.data[(height - 1) * width + i] = 0; } for (var _i2 = 1; _i2 < height - 1; _i2++) { // eslint-disable-next-line no-multi-assign this.data[_i2 * width] = this.data[_i2 * width + (width - 1)] = 0; } delete this.indexMapping; return this; } // TODO: this function is entirely too large for me to reason out right at this moment that i'm handling // all the rest of it, so this is a verbatim copy of the javascript source, with only tweaks // necessary to get it to run, no thought put into it yet. }, { key: "moments", value: function moments(labelCount) { var data = this.data; var x; var y; var height = this.size.y; var width = this.size.x; var val; var ysq; var labelSum = []; var i; var label; var mu11; var mu02; var mu20; var x_; var y_; var tmp; var result = []; var PI = Math.PI; var PI_4 = PI / 4; if (labelCount <= 0) { return result; } for (i = 0; i < labelCount; i++) { labelSum[i] = { m00: 0, m01: 0, m10: 0, m11: 0, m02: 0, m20: 0, theta: 0, rad: 0 }; } for (y = 0; y < height; y++) { ysq = y * y; for (x = 0; x < width; x++) { val = data[y * width + x]; if (val > 0) { label = labelSum[val - 1]; label.m00 += 1; label.m01 += y; label.m10 += x; label.m11 += x * y; label.m02 += ysq; label.m20 += x * x; } } } for (i = 0; i < labelCount; i++) { label = labelSum[i]; // eslint-disable-next-line no-restricted-globals if (!isNaN(label.m00) && label.m00 !== 0) { x_ = label.m10 / label.m00; y_ = label.m01 / label.m00; mu11 = label.m11 / label.m00 - x_ * y_; mu02 = label.m02 / label.m00 - y_ * y_; mu20 = label.m20 / label.m00 - x_ * x_; tmp = (mu02 - mu20) / (2 * mu11); tmp = 0.5 * Math.atan(tmp) + (mu11 >= 0 ? PI_4 : -PI_4) + PI; // eslint-disable-next-line no-mixed-operators label.theta = (tmp * 180 / PI + 90) % 180 - 90; if (label.theta < 0) { label.theta += 180; } label.rad = tmp > PI ? tmp - PI : tmp; label.vec = vec2_namespaceObject.clone([Math.cos(tmp), Math.sin(tmp)]); result.push(label); } } return result; } // return a Uint8ClampedArray containing this grayscale image converted to RGBA form }, { key: "getAsRGBA", value: function getAsRGBA() { var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1.0; var ret = new Uint8ClampedArray(4 * this.size.x * this.size.y); for (var y = 0; y < this.size.y; y++) { for (var x = 0; x < this.size.x; x++) { var pixel = y * this.size.x + x; var current = this.get(x, y) * scale; ret[pixel * 4 + 0] = current; ret[pixel * 4 + 1] = current; ret[pixel * 4 + 2] = current; ret[pixel * 4 + 3] = 255; } } return ret; } // Display this ImageWrapper in a given Canvas element at the specified scale }, { key: "show", value: function show(canvas) { var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.0; console.warn('* imagewrapper show getcontext 2d'); var ctx = canvas.getContext('2d'); if (!ctx) { throw new Error('Unable to get canvas context'); } var frame = ctx.getImageData(0, 0, canvas.width, canvas.height); var data = this.getAsRGBA(scale); // eslint-disable-next-line no-param-reassign canvas.width = this.size.x; // eslint-disable-next-line no-param-reassign canvas.height = this.size.y; var newFrame = new ImageData(data, frame.width, frame.height); ctx.putImageData(newFrame, 0, 0); } // Displays a specified SubImage area in a given canvas. This differs drastically from // creating a new SubImage and using it's show() method. Why? I don't have the answer to that // yet. I suspect the HSV/RGB operations involved here are making it significantly different, // but until I can visualize these functions side by side, I'm just going to copy the existing // implementation. }, { key: "overlay", value: function overlay(canvas, inScale, from) { var adjustedScale = inScale < 0 || inScale > 360 ? 360 : inScale; var hsv = [0, 1, 1]; var rgb = [0, 0, 0]; var whiteRgb = [255, 255, 255]; var blackRgb = [0, 0, 0]; var result = []; console.warn('* imagewrapper overlay getcontext 2d'); var ctx = canvas.getContext('2d'); if (!ctx) { throw new Error('Unable to get canvas context'); } var frame = ctx.getImageData(from.x, from.y, this.size.x, this.size.y); var data = frame.data; var length = this.data.length; while (length--) { hsv[0] = this.data[length] * adjustedScale; // eslint-disable-next-line no-nested-ternary result = hsv[0] <= 0 ? whiteRgb : hsv[0] >= 360 ? blackRgb : hsv2rgb(hsv, rgb); var pos = length * 4; var _result = result; var _result2 = slicedToArray_default()(_result, 3); data[pos] = _result2[0]; data[pos + 1] = _result2[1]; data[pos + 2] = _result2[2]; data[pos + 3] = 255; } ctx.putImageData(frame, from.x, from.y); } }]); }(); /* harmony default export */ var image_wrapper = (image_wrapper_ImageWrapper); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/asyncToGenerator.js var asyncToGenerator = __webpack_require__(7); var asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator); // EXTERNAL MODULE: ./node_modules/@babel/runtime/regenerator/index.js var regenerator = __webpack_require__(6); var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator); // CONCATENATED MODULE: ./src/common/image_debug.ts // TODO: XYPosition should be an XYObject, but that breaks XYDefinition, which breaks drawPath() below. // XYDefinition tells us which component of a given array or object is the "X" and which is the "Y". // Usually this is 0 for X and 1 for Y, but might be used as 'x' for x and 'y' for Y. /* harmony default export */ var image_debug = ({ drawRect: function drawRect(pos, size, ctx, style) { ctx.strokeStyle = style.color; ctx.fillStyle = style.color; ctx.lineWidth = style.lineWidth || 1; ctx.beginPath(); ctx.strokeRect(pos.x, pos.y, size.x, size.y); }, drawPath: function drawPath(path, def, ctx, style) { ctx.strokeStyle = style.color; ctx.fillStyle = style.color; ctx.lineWidth = style.lineWidth; ctx.beginPath(); ctx.moveTo(path[0][def.x], path[0][def.y]); for (var j = 1; j < path.length; j++) { ctx.lineTo(path[j][def.x], path[j][def.y]); } ctx.closePath(); ctx.stroke(); }, drawImage: function drawImage(imageData, size, ctx) { var canvasData = ctx.getImageData(0, 0, size.x, size.y); var data = canvasData.data; var canvasDataPos = data.length; var imageDataPos = imageData.length; if (canvasDataPos / imageDataPos !== 4) { return false; } while (imageDataPos--) { var value = imageData[imageDataPos]; data[--canvasDataPos] = 255; data[--canvasDataPos] = value; data[--canvasDataPos] = value; data[--canvasDataPos] = value; } ctx.putImageData(canvasData, 0, 0); return true; } }); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js var possibleConstructorReturn = __webpack_require__(4); var possibleConstructorReturn_default = /*#__PURE__*/__webpack_require__.n(possibleConstructorReturn); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/getPrototypeOf.js var getPrototypeOf = __webpack_require__(1); var getPrototypeOf_default = /*#__PURE__*/__webpack_require__.n(getPrototypeOf); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/inherits.js var inherits = __webpack_require__(5); var inherits_default = /*#__PURE__*/__webpack_require__.n(inherits); // CONCATENATED MODULE: ./src/reader/barcode_reader.ts /* eslint-disable no-unused-vars */ /* eslint-disable class-methods-use-this */ // eslint-disable-next-line import/no-cycle // for some reason this throws a shadow error on itself?! // eslint-disable-next-line no-shadow var BarcodeDirection = /*#__PURE__*/function (BarcodeDirection) { BarcodeDirection[BarcodeDirection["Forward"] = 1] = "Forward"; BarcodeDirection[BarcodeDirection["Reverse"] = -1] = "Reverse"; return BarcodeDirection; }({}); var barcode_reader_BarcodeReader = /*#__PURE__*/function () { function BarcodeReader(config, supplements) { classCallCheck_default()(this, BarcodeReader); defineProperty_default()(this, "_row", []); defineProperty_default()(this, "config", {}); defineProperty_default()(this, "supplements", []); defineProperty_default()(this, "SINGLE_CODE_ERROR", 0); defineProperty_default()(this, "FORMAT", 'unknown'); defineProperty_default()(this, "CONFIG_KEYS", {}); this._row = []; this.config = config || {}; if (supplements) { this.supplements = supplements; } } return createClass_default()(BarcodeReader, [{ key: "_nextUnset", value: function _nextUnset(line) { var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; for (var i = start; i < line.length; i++) { if (!line[i]) return i; } return line.length; } }, { key: "_matchPattern", value: function _matchPattern(counter, code) { var maxSingleError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.SINGLE_CODE_ERROR || 1; var error = 0; var singleError = 0; var sum = 0; var modulo = 0; var barWidth = 0; var count = 0; var scaled = 0; for (var i = 0; i < counter.length; i++) { sum += counter[i]; modulo += code[i]; } if (sum < modulo) { return Number.MAX_VALUE; } barWidth = sum / modulo; // eslint-disable-next-line no-param-reassign maxSingleError *= barWidth; for (var _i = 0; _i < counter.length; _i++) { count = counter[_i]; scaled = code[_i] * barWidth; singleError = Math.abs(count - scaled) / scaled; if (singleError > maxSingleError) { return Number.MAX_VALUE; } error += singleError; } return error / modulo; } }, { key: "_nextSet", value: function _nextSet(line) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; for (var i = offset; i < line.length; i++) { if (line[i]) return i; } return line.length; } }, { key: "_correctBars", value: function _correctBars(counter, correction, indices) { var length = indices.length; var tmp = 0; while (length--) { tmp = counter[indices[length]] * (1 - (1 - correction) / 2); if (tmp > 1) { // eslint-disable-next-line no-param-reassign counter[indices[length]] = tmp; } } } }, { key: "decodePattern", value: function decodePattern(pattern) { // console.warn('* decodePattern', pattern); this._row = pattern; // console.warn('* decodePattern calling decode', typeof this, this.constructor, this.FORMAT, JSON.stringify(this)); var result = this.decode(); // console.warn('* first result=', result); if (result === null) { this._row.reverse(); result = this.decode(); // console.warn('* reversed result=', result); if (result) { result.direction = BarcodeDirection.Reverse; result.start = this._row.length - result.start; result.end = this._row.length - result.end; } } else { result.direction = BarcodeDirection.Forward; } if (result) { result.format = this.FORMAT; } // console.warn('* returning', result); return result; } }, { key: "_matchRange", value: function _matchRange(start, end, value) { // eslint-disable-next-line no-param-reassign start = start < 0 ? 0 : start; var i; for (i = start; i < end; i++) { if (this._row[i] !== value) { return false; } } return true; } }, { key: "_fillCounters", value: function _fillCounters() { var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._nextUnset(this._row); var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._row.length; var isWhite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; var counters = []; var counterPos = 0; counters[counterPos] = 0; for (var i = offset; i < end; i++) { // eslint-disable-next-line no-bitwise if (this._row[i] ^ (isWhite ? 1 : 0)) { counters[counterPos]++; } else { counterPos++; counters[counterPos] = 1; // eslint-disable-next-line no-param-reassign isWhite = !isWhite; } } return counters; } }, { key: "_toCounters", value: function _toCounters(start, counters) { var numCounters = counters.length; var end = this._row.length; var isWhite = !this._row[start]; var counterPos = 0; array_helper.init(counters, 0); for (var i = start; i < end; i++) { // eslint-disable-next-line no-bitwise if (this._row[i] ^ (isWhite ? 1 : 0)) { // eslint-disable-next-line no-param-reassign counters[counterPos]++; } else { counterPos++; if (counterPos === numCounters) { break; } else { // eslint-disable-next-line no-param-reassign counters[counterPos] = 1; isWhite = !isWhite; } } } return counters; } // override/implement this in your custom readers. }, { key: "decodeImage", value: function decodeImage(imageWrapper) { // eslint-disable-next-line no-void void imageWrapper; return null; } }], [{ key: "Exception", get: function get() { return { StartNotFoundException: 'Start-Info was not found!', CodeNotFoundException: 'Code could not be found!', PatternNotFoundException: 'Pattern could not be found!' }; } // Reader-specific adjacent-line validation threshold (0 => disabled) }]); }(); defineProperty_default()(barcode_reader_BarcodeReader, "adjacentLineValidationMatches", 0); /* harmony default export */ var barcode_reader = (barcode_reader_BarcodeReader); // CONCATENATED MODULE: ./src/reader/2of5_reader.ts function _callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var N = 1; var W = 3; var START_PATTERN = [W, N, W, N, N, N]; var STOP_PATTERN = [W, N, N, N, W]; var CODE_PATTERN = [[N, N, W, W, N], [W, N, N, N, W], [N, W, N, N, W], [W, W, N, N, N], [N, N, W, N, W], [W, N, W, N, N], [N, W, W, N, N], [N, N, N, W, W], [W, N, N, W, N], [N, W, N, W, N]]; var START_PATTERN_LENGTH = START_PATTERN.reduce(function (sum, val) { return sum + val; }, 0); var _2of5_reader_TwoOfFiveReader = /*#__PURE__*/function (_BarcodeReader) { function TwoOfFiveReader() { var _this; classCallCheck_default()(this, TwoOfFiveReader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, TwoOfFiveReader, [].concat(args)); defineProperty_default()(_this, "barSpaceRatio", [1, 1]); defineProperty_default()(_this, "FORMAT", '2of5'); defineProperty_default()(_this, "SINGLE_CODE_ERROR", 0.78); defineProperty_default()(_this, "AVG_CODE_ERROR", 0.30); return _this; } inherits_default()(TwoOfFiveReader, _BarcodeReader); return createClass_default()(TwoOfFiveReader, [{ key: "_findPattern", value: function _findPattern(pattern, offset) { var isWhite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var tryHarder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var counter = []; var counterPos = 0; var bestMatch = { error: Number.MAX_VALUE, code: -1, start: 0, end: 0 }; var sum = 0; var error = 0; var epsilon = this.AVG_CODE_ERROR; if (!offset) { offset = this._nextSet(this._row); } for (var i = 0; i < pattern.length; i++) { counter[i] = 0; } for (var _i = offset; _i < this._row.length; _i++) { if (this._row[_i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { sum = 0; for (var j = 0; j < counter.length; j++) { sum += counter[j]; } error = this._matchPattern(counter, pattern); if (error < epsilon) { bestMatch.error = error; bestMatch.start = _i - sum; bestMatch.end = _i; return bestMatch; } if (tryHarder) { for (var _j = 0; _j < counter.length - 2; _j++) { counter[_j] = counter[_j + 2]; } counter[counter.length - 2] = 0; counter[counter.length - 1] = 0; counterPos--; } else { return null; } } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "_findStart", value: function _findStart() { var startInfo = null; var offset = this._nextSet(this._row); var narrowBarWidth = 1; var leadingWhitespaceStart = 0; while (!startInfo) { startInfo = this._findPattern(START_PATTERN, offset, false, true); if (!startInfo) { return null; } narrowBarWidth = Math.floor((startInfo.end - startInfo.start) / START_PATTERN_LENGTH); leadingWhitespaceStart = startInfo.start - narrowBarWidth * 5; if (leadingWhitespaceStart >= 0) { if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) { return startInfo; } } offset = startInfo.end; startInfo = null; } return startInfo; } }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(endInfo) { var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2; if (trailingWhitespaceEnd < this._row.length) { if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) { return endInfo; } } return null; } }, { key: "_findEnd", value: function _findEnd() { // TODO: reverse, followed by some calcs, followed by another reverse? really? this._row.reverse(); var offset = this._nextSet(this._row); var endInfo = this._findPattern(STOP_PATTERN, offset, false, true); this._row.reverse(); if (endInfo === null) { return null; } // reverse numbers var tmp = endInfo.start; endInfo.start = this._row.length - endInfo.end; endInfo.end = this._row.length - tmp; return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null; } }, { key: "_verifyCounterLength", value: function _verifyCounterLength(counters) { return counters.length % 10 === 0; } }, { key: "_decodeCode", value: function _decodeCode(counter) { var epsilon = this.AVG_CODE_ERROR; var bestMatch = { error: Number.MAX_VALUE, code: -1, start: 0, end: 0 }; for (var code = 0; code < CODE_PATTERN.length; code++) { var error = this._matchPattern(counter, CODE_PATTERN[code]); if (error < bestMatch.error) { bestMatch.code = code; bestMatch.error = error; } } if (bestMatch.error < epsilon) { return bestMatch; } return null; } }, { key: "_decodePayload", value: function _decodePayload(counters, result, decodedCodes) { var pos = 0; var counterLength = counters.length; var counter = [0, 0, 0, 0, 0]; var code = null; while (pos < counterLength) { for (var i = 0; i < 5; i++) { counter[i] = counters[pos] * this.barSpaceRatio[0]; pos += 2; } code = this._decodeCode(counter); if (!code) { return null; } result.push("".concat(code.code)); decodedCodes.push(code); } return code; } }, { key: "decode", value: function decode(row, start) { var startInfo = this._findStart(); if (!startInfo) { return null; } var endInfo = this._findEnd(); if (!endInfo) { return null; } var counters = this._fillCounters(startInfo.end, endInfo.start, false); if (!this._verifyCounterLength(counters)) { return null; } var decodedCodes = []; decodedCodes.push(startInfo); var result = []; var code = this._decodePayload(counters, result, decodedCodes); if (!code) { return null; } if (result.length < 5) { return null; } decodedCodes.push(endInfo); return { code: result.join(''), start: startInfo.start, end: endInfo.end, startInfo: startInfo, decodedCodes: decodedCodes, format: this.FORMAT }; } }]); }(barcode_reader); /* harmony default export */ var _2of5_reader = (_2of5_reader_TwoOfFiveReader); // CONCATENATED MODULE: ./src/reader/codabar_reader.ts function codabar_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, codabar_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function codabar_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (codabar_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // const ALPHABETH_STRING = '0123456789-$:/.+ABCD'; var ALPHABET = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 36, 58, 47, 46, 43, 65, 66, 67, 68]; var CHARACTER_ENCODINGS = [0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E]; var START_END = [0x01A, 0x029, 0x00B, 0x00E]; var MIN_ENCODED_CHARS = 4; var MAX_ACCEPTABLE = 2.0; var PADDING = 1.5; ; ; var codabar_reader_NewCodabarReader = /*#__PURE__*/function (_BarcodeReader) { function NewCodabarReader() { var _this; classCallCheck_default()(this, NewCodabarReader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = codabar_reader_callSuper(this, NewCodabarReader, [].concat(args)); defineProperty_default()(_this, "_counters", []); defineProperty_default()(_this, "FORMAT", 'codabar'); return _this; } inherits_default()(NewCodabarReader, _BarcodeReader); return createClass_default()(NewCodabarReader, [{ key: "_computeAlternatingThreshold", value: function _computeAlternatingThreshold(offset, end) { var min = Number.MAX_VALUE; var max = 0; var counter = 0; for (var i = offset; i < end; i += 2) { counter = this._counters[i]; if (counter > max) { max = counter; } if (counter < min) { min = counter; } } return (min + max) / 2.0 | 0; } }, { key: "_toPattern", value: function _toPattern(offset) { var numCounters = 7; var end = offset + numCounters; if (end > this._counters.length) { return -1; } var barThreshold = this._computeAlternatingThreshold(offset, end); var spaceThreshold = this._computeAlternatingThreshold(offset + 1, end); var bitmask = 1 << numCounters - 1; var threshold = 0; var pattern = 0; for (var i = 0; i < numCounters; i++) { threshold = (i & 1) === 0 ? barThreshold : spaceThreshold; if (this._counters[offset + i] > threshold) { pattern |= bitmask; } bitmask >>= 1; } return pattern; } }, { key: "_isStartEnd", value: function _isStartEnd(pattern) { for (var i = 0; i < START_END.length; i++) { if (START_END[i] === pattern) { return true; } } return false; } }, { key: "_sumCounters", value: function _sumCounters(start, end) { var sum = 0; for (var i = start; i < end; i++) { sum += this._counters[i]; } return sum; } }, { key: "_findStart", value: function _findStart() { var start = this._nextUnset(this._row); var end = start; for (var i = 1; i < this._counters.length; i++) { var pattern = this._toPattern(i); if (pattern !== -1 && this._isStartEnd(pattern)) { // TODO: Look for whitespace ahead start += this._sumCounters(0, i); end = start + this._sumCounters(i, i + 8); return { start: start, end: end, startCounter: i, endCounter: i + 8 }; } } return null; } }, { key: "_patternToChar", value: function _patternToChar(pattern) { for (var i = 0; i < CHARACTER_ENCODINGS.length; i++) { if (CHARACTER_ENCODINGS[i] === pattern) { return String.fromCharCode(ALPHABET[i]); } } return null; } }, { key: "_calculatePatternLength", value: function _calculatePatternLength(offset) { var sum = 0; for (var i = offset; i < offset + 7; i++) { sum += this._counters[i]; } return sum; } }, { key: "_verifyWhitespace", value: function _verifyWhitespace(startCounter, endCounter) { if (startCounter - 1 <= 0 || this._counters[startCounter - 1] >= this._calculatePatternLength(startCounter) / 2.0) { if (endCounter + 8 >= this._counters.length || this._counters[endCounter + 7] >= this._calculatePatternLength(endCounter) / 2.0) { return true; } } return false; } }, { key: "_charToPattern", value: function _charToPattern(_char) { var charCode = _char.charCodeAt(0); for (var i = 0; i < ALPHABET.length; i++) { if (ALPHABET[i] === charCode) { return CHARACTER_ENCODINGS[i]; } } return 0x0; } }, { key: "_thresholdResultPattern", value: function _thresholdResultPattern(result, startCounter) { var categorization = { space: { narrow: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE }, wide: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE } }, bar: { narrow: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE }, wide: { size: 0, counts: 0, min: 0, max: Number.MAX_VALUE } } }; var pos = startCounter; var pattern; for (var i = 0; i < result.length; i++) { pattern = this._charToPattern(result[i]); for (var j = 6; j >= 0; j--) { var kind = (j & 1) === 2 ? categorization.bar : categorization.space; var cat = (pattern & 1) === 1 ? kind.wide : kind.narrow; cat.size += this._counters[pos + j]; cat.counts++; pattern >>= 1; } pos += 8; } ['space', 'bar'].forEach(function (key) { var newkind = categorization[key]; newkind.wide.min = Math.floor((newkind.narrow.size / newkind.narrow.counts + newkind.wide.size / newkind.wide.counts) / 2); newkind.narrow.max = Math.ceil(newkind.wide.min); newkind.wide.max = Math.ceil((newkind.wide.size * MAX_ACCEPTABLE + PADDING) / newkind.wide.counts); }); return categorization; } }, { key: "_validateResult", value: function _validateResult(result, startCounter) { var thresholds = this._thresholdResultPattern(result, startCounter); var pos = startCounter; var pattern; for (var i = 0; i < result.length; i++) { pattern = this._charToPattern(result[i]); for (var j = 6; j >= 0; j--) { var kind = (j & 1) === 0 ? thresholds.bar : thresholds.space; var cat = (pattern & 1) === 1 ? kind.wide : kind.narrow; var size = this._counters[pos + j]; if (size < cat.min || size > cat.max) { return false; } pattern >>= 1; } pos += 8; } return true; } }, { key: "decode", value: function decode(row, start) { this._counters = this._fillCounters(); start = this._findStart(); if (!start) { return null; } var nextStart = start.startCounter; var result = []; var pattern; do { pattern = this._toPattern(nextStart); if (pattern < 0) { return null; } var decodedChar = this._patternToChar(pattern); if (decodedChar === null) { return null; } result.push(decodedChar); nextStart += 8; if (result.length > 1 && this._isStartEnd(pattern)) { break; } } while (nextStart < this._counters.length); // verify end if (result.length - 2 < MIN_ENCODED_CHARS || !this._isStartEnd(pattern)) { return null; } // verify end white space if (!this._verifyWhitespace(start.startCounter, nextStart - 8)) { return null; } if (!this._validateResult(result, start.startCounter)) { return null; } nextStart = nextStart > this._counters.length ? this._counters.length : nextStart; var end = start.start + this._sumCounters(start.startCounter, nextStart - 8); return { code: result.join(''), start: start.start, end: end, startInfo: start, decodedCodes: result, format: this.FORMAT // TODO: i think it should not be required to return format from this, as barcode_reader force sets the format anyway }; } }]); }(barcode_reader); /* harmony default export */ var codabar_reader = (codabar_reader_NewCodabarReader); // CONCATENATED MODULE: ./src/reader/code_128_reader.ts function code_128_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, code_128_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function code_128_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (code_128_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var code_128_reader_Code128Reader = /*#__PURE__*/function (_BarcodeReader) { function Code128Reader() { var _this; classCallCheck_default()(this, Code128Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = code_128_reader_callSuper(this, Code128Reader, [].concat(args)); defineProperty_default()(_this, "CODE_SHIFT", 98); defineProperty_default()(_this, "CODE_C", 99); defineProperty_default()(_this, "CODE_B", 100); defineProperty_default()(_this, "CODE_A", 101); defineProperty_default()(_this, "FNC1", 102); defineProperty_default()(_this, "START_CODE_A", 103); defineProperty_default()(_this, "START_CODE_B", 104); defineProperty_default()(_this, "START_CODE_C", 105); defineProperty_default()(_this, "STOP_CODE", 106); // ASCII 29 is the Group Separator character used to represent FNC1 in GS1-128 barcodes defineProperty_default()(_this, "FNC1_CHAR", String.fromCharCode(29)); defineProperty_default()(_this, "CODE_PATTERN", [[2, 1, 2, 2, 2, 2], [2, 2, 2, 1, 2, 2], [2, 2, 2, 2, 2, 1], [1, 2, 1, 2, 2, 3], [1, 2, 1, 3, 2, 2], [1, 3, 1, 2, 2, 2], [1, 2, 2, 2, 1, 3], [1, 2, 2, 3, 1, 2], [1, 3, 2, 2, 1, 2], [2, 2, 1, 2, 1, 3], [2, 2, 1, 3, 1, 2], [2, 3, 1, 2, 1, 2], [1, 1, 2, 2, 3, 2], [1, 2, 2, 1, 3, 2], [1, 2, 2, 2, 3, 1], [1, 1, 3, 2, 2, 2], [1, 2, 3, 1, 2, 2], [1, 2, 3, 2, 2, 1], [2, 2, 3, 2, 1, 1], [2, 2, 1, 1, 3, 2], [2, 2, 1, 2, 3, 1], [2, 1, 3, 2, 1, 2], [2, 2, 3, 1, 1, 2], [3, 1, 2, 1, 3, 1], [3, 1, 1, 2, 2, 2], [3, 2, 1, 1, 2, 2], [3, 2, 1, 2, 2, 1], [3, 1, 2, 2, 1, 2], [3, 2, 2, 1, 1, 2], [3, 2, 2, 2, 1, 1], [2, 1, 2, 1, 2, 3], [2, 1, 2, 3, 2, 1], [2, 3, 2, 1, 2, 1], [1, 1, 1, 3, 2, 3], [1, 3, 1, 1, 2, 3], [1, 3, 1, 3, 2, 1], [1, 1, 2, 3, 1, 3], [1, 3, 2, 1, 1, 3], [1, 3, 2, 3, 1, 1], [2, 1, 1, 3, 1, 3], [2, 3, 1, 1, 1, 3], [2, 3, 1, 3, 1, 1], [1, 1, 2, 1, 3, 3], [1, 1, 2, 3, 3, 1], [1, 3, 2, 1, 3, 1], [1, 1, 3, 1, 2, 3], [1, 1, 3, 3, 2, 1], [1, 3, 3, 1, 2, 1], [3, 1, 3, 1, 2, 1], [2, 1, 1, 3, 3, 1], [2, 3, 1, 1, 3, 1], [2, 1, 3, 1, 1, 3], [2, 1, 3, 3, 1, 1], [2, 1, 3, 1, 3, 1], [3, 1, 1, 1, 2, 3], [3, 1, 1, 3, 2, 1], [3, 3, 1, 1, 2, 1], [3, 1, 2, 1, 1, 3], [3, 1, 2, 3, 1, 1], [3, 3, 2, 1, 1, 1], [3, 1, 4, 1, 1, 1], [2, 2, 1, 4, 1, 1], [4, 3, 1, 1, 1, 1], [1, 1, 1, 2, 2, 4], [1, 1, 1, 4, 2, 2], [1, 2, 1, 1, 2, 4], [1, 2, 1, 4, 2, 1], [1, 4, 1, 1, 2, 2], [1, 4, 1, 2, 2, 1], [1, 1, 2, 2, 1, 4], [1, 1, 2, 4, 1, 2], [1, 2, 2, 1, 1, 4], [1, 2, 2, 4, 1, 1], [1, 4, 2, 1, 1, 2], [1, 4, 2, 2, 1, 1], [2, 4, 1, 2, 1, 1], [2, 2, 1, 1, 1, 4], [4, 1, 3, 1, 1, 1], [2, 4, 1, 1, 1, 2], [1, 3, 4, 1, 1, 1], [1, 1, 1, 2, 4, 2], [1, 2, 1, 1, 4, 2], [1, 2, 1, 2, 4, 1], [1, 1, 4, 2, 1, 2], [1, 2, 4, 1, 1, 2], [1, 2, 4, 2, 1, 1], [4, 1, 1, 2, 1, 2], [4, 2, 1, 1, 1, 2], [4, 2, 1, 2, 1, 1], [2, 1, 2, 1, 4, 1], [2, 1, 4, 1, 2, 1], [4, 1, 2, 1, 2, 1], [1, 1, 1, 1, 4, 3], [1, 1, 1, 3, 4, 1], [1, 3, 1, 1, 4, 1], [1, 1, 4, 1, 1, 3], [1, 1, 4, 3, 1, 1], [4, 1, 1, 1, 1, 3], [4, 1, 1, 3, 1, 1], [1, 1, 3, 1, 4, 1], [1, 1, 4, 1, 3, 1], [3, 1, 1, 1, 4, 1], [4, 1, 1, 1, 3, 1], [2, 1, 1, 4, 1, 2], [2, 1, 1, 2, 1, 4], [2, 1, 1, 2, 3, 2], [2, 3, 3, 1, 1, 1, 2]]); defineProperty_default()(_this, "SINGLE_CODE_ERROR", 0.64); defineProperty_default()(_this, "AVG_CODE_ERROR", 0.30); defineProperty_default()(_this, "FORMAT", 'code_128'); defineProperty_default()(_this, "MODULE_INDICES", { bar: [0, 2, 4], space: [1, 3, 5] }); return _this; } inherits_default()(Code128Reader, _BarcodeReader); return createClass_default()(Code128Reader, [{ key: "_decodeCode", value: function _decodeCode(start, correction) { var bestMatch = { error: Number.MAX_VALUE, code: -1, start: start, end: start, correction: { bar: 1, space: 1 } }; var counter = [0, 0, 0, 0, 0, 0]; var offset = start; var isWhite = !this._row[offset]; var counterPos = 0; for (var i = offset; i < this._row.length; i++) { if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { if (correction) { this._correct(counter, correction); } for (var code = 0; code < this.CODE_PATTERN.length; code++) { var error = this._matchPattern(counter, this.CODE_PATTERN[code]); if (error < bestMatch.error) { bestMatch.code = code; bestMatch.error = error; } } bestMatch.end = i; if (bestMatch.code === -1 || bestMatch.error > this.AVG_CODE_ERROR) { return null; } if (this.CODE_PATTERN[bestMatch.code]) { bestMatch.correction.bar = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.bar); bestMatch.correction.space = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.space); } return bestMatch; } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "_correct", value: function _correct(counter, correction) { this._correctBars(counter, correction.bar, this.MODULE_INDICES.bar); this._correctBars(counter, correction.space, this.MODULE_INDICES.space); } }, { key: "_findStart", value: // TODO: _findStart and decodeCode share similar code, can we re-use some? function _findStart() { var counter = [0, 0, 0, 0, 0, 0]; var offset = this._nextSet(this._row); var bestMatch = { error: Number.MAX_VALUE, code: -1, start: 0, end: 0, correction: { bar: 1, space: 1 } }; var isWhite = false; var counterPos = 0; for (var i = offset; i < this._row.length; i++) { if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { var sum = counter.reduce(function (prev, next) { return prev + next; }, 0); for (var code = this.START_CODE_A; code <= this.START_CODE_C; code++) { var error = this._matchPattern(counter, this.CODE_PATTERN[code]); if (error < bestMatch.error) { bestMatch.code = code; bestMatch.error = error; } } if (bestMatch.error < this.AVG_CODE_ERROR) { bestMatch.start = i - sum; bestMatch.end = i; bestMatch.correction.bar = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.bar); bestMatch.correction.space = this.calculateCorrection(this.CODE_PATTERN[bestMatch.code], counter, this.MODULE_INDICES.space); return bestMatch; } for (var j = 0; j < 4; j++) { counter[j] = counter[j + 2]; } counter[4] = 0; counter[5] = 0; counterPos--; } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "decode", value: function decode(row, start) { var _this2 = this; var startInfo = this._findStart(); if (startInfo === null) { return null; } // var self = this, // done = false, // result = [], // multiplier = 0, // checksum = 0, // codeset, // rawResult = [], // decodedCodes = [], // shiftNext = false, // unshift, // removeLastCharacter = true; var code = { code: startInfo.code, start: startInfo.start, end: startInfo.end, correction: { bar: startInfo.correction.bar, space: startInfo.correction.space } }; var decodedCodes = []; decodedCodes.push(code); var checksum = code.code; var codeset = function (c) { switch (c) { case _this2.START_CODE_A: return _this2.CODE_A; case _this2.START_CODE_B: return _this2.CODE_B; case _this2.START_CODE_C: return _this2.CODE_C; default: return null; } }(code.code); var done = false; var shiftNext = false; var unshift = shiftNext; var removeLastCharacter = true; var multiplier = 0; var rawResult = []; var result = []; // TODO: i think this should be string only, but it creates problems if it is while (!done) { unshift = shiftNext; shiftNext = false; code = this._decodeCode(code.end, code.correction); if (code !== null) { if (code.code !== this.STOP_CODE) { removeLastCharacter = true; } if (code.code !== this.STOP_CODE) { rawResult.push(code.code); multiplier++; checksum += multiplier * code.code; } decodedCodes.push(code); switch (codeset) { case this.CODE_A: if (code.code < 64) { result.push(String.fromCharCode(32 + code.code)); } else if (code.code < 96) { result.push(String.fromCharCode(code.code - 64)); } else { if (code.code !== this.STOP_CODE) { removeLastCharacter = false; } switch (code.code) { case this.CODE_SHIFT: shiftNext = true; codeset = this.CODE_B; break; case this.CODE_B: codeset = this.CODE_B; break; case this.CODE_C: codeset = this.CODE_C; break; case this.FNC1: result.push(this.FNC1_CHAR); break; case this.STOP_CODE: done = true; break; } } break; case this.CODE_B: if (code.code < 96) { result.push(String.fromCharCode(32 + code.code)); } else { if (code.code !== this.STOP_CODE) { removeLastCharacter = false; } switch (code.code) { case this.CODE_SHIFT: shiftNext = true; codeset = this.CODE_A; break; case this.CODE_A: codeset = this.CODE_A; break; case this.CODE_C: codeset = this.CODE_C; break; case this.FNC1: result.push(this.FNC1_CHAR); break; case this.STOP_CODE: done = true; break; } } break; case this.CODE_C: if (code.code < 100) { result.push(code.code < 10 ? '0' + code.code : code.code); } else { if (code.code !== this.STOP_CODE) { removeLastCharacter = false; } switch (code.code) { case this.CODE_A: codeset = this.CODE_A; break; case this.CODE_B: codeset = this.CODE_B; break; case this.FNC1: result.push(this.FNC1_CHAR); break; case this.STOP_CODE: done = true; break; } } break; } } else { done = true; } if (unshift) { codeset = codeset === this.CODE_A ? this.CODE_B : this.CODE_A; } } if (code === null) { return null; } code.end = this._nextUnset(this._row, code.end); if (!this._verifyTrailingWhitespace(code)) { return null; } checksum -= multiplier * rawResult[rawResult.length - 1]; if (checksum % 103 !== rawResult[rawResult.length - 1]) { return null; } if (!result.length) { return null; } // remove last code from result (checksum) if (removeLastCharacter) { result.splice(result.length - 1, 1); } return { code: result.join(''), start: startInfo.start, end: code.end, codeset: codeset, startInfo: startInfo, decodedCodes: decodedCodes, endInfo: code, format: this.FORMAT }; } }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(endInfo) { var self = this, trailingWhitespaceEnd; trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2; if (trailingWhitespaceEnd < self._row.length) { if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) { return endInfo; } } return null; } }, { key: "calculateCorrection", value: function calculateCorrection(expected, normalized, indices) { var length = indices.length, sumNormalized = 0, sumExpected = 0; while (length--) { sumExpected += expected[indices[length]]; sumNormalized += normalized[indices[length]]; } return sumExpected / sumNormalized; } }]); }(barcode_reader); /* harmony default export */ var code_128_reader = (code_128_reader_Code128Reader); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/get.js var get = __webpack_require__(13); var get_default = /*#__PURE__*/__webpack_require__.n(get); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/toConsumableArray.js var toConsumableArray = __webpack_require__(16); var toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray); // CONCATENATED MODULE: ./src/reader/code_39_reader.ts function code_39_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, code_39_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function code_39_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (code_39_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /* eslint-disable class-methods-use-this */ var ALPHABETH_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%'; var code_39_reader_ALPHABET = new Uint16Array(toConsumableArray_default()(ALPHABETH_STRING).map(function (_char) { return _char.charCodeAt(0); })); var code_39_reader_CHARACTER_ENCODINGS = new Uint16Array([0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, 0x0A8, 0x0A2, 0x08A, 0x02A]); var ASTERISK = 0x094; var code_39_reader_Code39Reader = /*#__PURE__*/function (_BarcodeReader) { function Code39Reader() { var _this; classCallCheck_default()(this, Code39Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = code_39_reader_callSuper(this, Code39Reader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'code_39'); return _this; } inherits_default()(Code39Reader, _BarcodeReader); return createClass_default()(Code39Reader, [{ key: "_findStart", value: function _findStart() { var offset = this._nextSet(this._row); var patternStart = offset; var counter = new Uint16Array([0, 0, 0, 0, 0, 0, 0, 0, 0]); var counterPos = 0; var isWhite = false; for (var i = offset; i < this._row.length; i++) { // eslint-disable-next-line no-bitwise if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { // find start pattern if (this._toPattern(counter) === ASTERISK) { var whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - (i - patternStart) / 4)); if (this._matchRange(whiteSpaceMustStart, patternStart, 0)) { return { start: patternStart, end: i }; } } patternStart += counter[0] + counter[1]; for (var j = 0; j < 7; j++) { counter[j] = counter[j + 2]; } counter[7] = 0; counter[8] = 0; counterPos--; } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "_toPattern", value: function _toPattern(counters) { var numCounters = counters.length; var maxNarrowWidth = 0; var numWideBars = numCounters; var wideBarWidth = 0; while (numWideBars > 3) { maxNarrowWidth = this._findNextWidth(counters, maxNarrowWidth); numWideBars = 0; var pattern = 0; for (var i = 0; i < numCounters; i++) { if (counters[i] > maxNarrowWidth) { // eslint-disable-next-line no-bitwise pattern |= 1 << numCounters - 1 - i; numWideBars++; wideBarWidth += counters[i]; } } if (numWideBars === 3) { for (var _i = 0; _i < numCounters && numWideBars > 0; _i++) { if (counters[_i] > maxNarrowWidth) { numWideBars--; if (counters[_i] * 2 >= wideBarWidth) { return -1; } } } return pattern; } } return -1; } }, { key: "_findNextWidth", value: function _findNextWidth(counters, current) { var minWidth = Number.MAX_VALUE; for (var i = 0; i < counters.length; i++) { if (counters[i] < minWidth && counters[i] > current) { minWidth = counters[i]; } } return minWidth; } }, { key: "_patternToChar", value: function _patternToChar(pattern) { for (var i = 0; i < code_39_reader_CHARACTER_ENCODINGS.length; i++) { if (code_39_reader_CHARACTER_ENCODINGS[i] === pattern) { return String.fromCharCode(code_39_reader_ALPHABET[i]); } } return null; } }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(lastStart, nextStart, counters) { var patternSize = array_helper.sum(counters); var trailingWhitespaceEnd = nextStart - lastStart - patternSize; if (trailingWhitespaceEnd * 3 >= patternSize) { return true; } return false; } }, { key: "decode", value: function decode() { var counters = new Uint16Array([0, 0, 0, 0, 0, 0, 0, 0, 0]); var result = []; var start = this._findStart(); if (!start) { return null; } var nextStart = this._nextSet(this._row, start.end); var decodedChar; var lastStart; do { counters = this._toCounters(nextStart, counters); var pattern = this._toPattern(counters); if (pattern < 0) { return null; } decodedChar = this._patternToChar(pattern); if (decodedChar === null) { return null; } result.push(decodedChar); lastStart = nextStart; nextStart += array_helper.sum(counters); nextStart = this._nextSet(this._row, nextStart); } while (decodedChar !== '*'); result.pop(); if (!result.length) { return null; } if (!this._verifyTrailingWhitespace(lastStart, nextStart, counters)) { return null; } return { code: result.join(''), start: start.start, end: nextStart, startInfo: start, decodedCodes: result, format: this.FORMAT }; } }]); }(barcode_reader); /* harmony default export */ var code_39_reader = (code_39_reader_Code39Reader); // CONCATENATED MODULE: ./src/reader/code_32_reader.ts function code_32_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, code_32_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function code_32_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (code_32_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _superPropGet(t, o, e, r) { var p = get_default()(getPrototypeOf_default()(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } var patterns = { AEIO: /[AEIO]/g, AZ09: /[A-Z0-9]/ }; var code32set = '0123456789BCDFGHJKLMNPQRSTUVWXYZ'; var code_32_reader_Code32Reader = /*#__PURE__*/function (_Code39Reader) { function Code32Reader() { var _this; classCallCheck_default()(this, Code32Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = code_32_reader_callSuper(this, Code32Reader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'code_32_reader'); return _this; } inherits_default()(Code32Reader, _Code39Reader); return createClass_default()(Code32Reader, [{ key: "_decodeCode32", value: function _decodeCode32(code) { if (/[^0-9BCDFGHJKLMNPQRSTUVWXYZ]/.test(code)) { return null; } var res = 0; for (var i = 0; i < code.length; i++) { res = res * 32 + code32set.indexOf(code[i]); } var code32 = "".concat(res); if (code32.length < 9) { code32 = ('000000000' + code32).slice(-9); } return 'A' + code32; } // Italian Pharmacode check digit: double the even positions, then the // remainder of the sum divided by 10. See the 1988 ministerial decree. }, { key: "_checkChecksum", value: function _checkChecksum(code) { var digits = code.charAt(0) === 'A' ? code.slice(1) : code; if (!/^\d{9}$/.test(digits)) { return false; } var sum = 0; for (var i = 0; i < 8; i++) { var value = digits.charCodeAt(i) - 48; if (i % 2 === 1) { value *= 2; if (value > 9) { value -= 9; } } sum += value; } return sum % 10 === digits.charCodeAt(8) - 48; } }, { key: "decode", value: function decode() { var result = _superPropGet(Code32Reader, "decode", this, 3)([]); if (!result) { return null; } var code = result.code; if (!code) { return null; } code = code.replace(patterns.AEIO, ''); var code32 = this._decodeCode32(code); if (!code32 || !this._checkChecksum(code32)) { return null; } result.code = code32; return result; } }]); }(code_39_reader); /* harmony default export */ var code_32_reader = (code_32_reader_Code32Reader); // CONCATENATED MODULE: ./src/reader/code_39_vin_reader.ts function code_39_vin_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, code_39_vin_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function code_39_vin_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (code_39_vin_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function code_39_vin_reader_superPropGet(t, o, e, r) { var p = get_default()(getPrototypeOf_default()(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } /* eslint-disable class-methods-use-this */ var code_39_vin_reader_patterns = { IOQ: /[IOQ]/g, AZ09: /[A-Z0-9]{17}/ }; var code_39_vin_reader_Code39VINReader = /*#__PURE__*/function (_Code39Reader) { function Code39VINReader() { var _this; classCallCheck_default()(this, Code39VINReader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = code_39_vin_reader_callSuper(this, Code39VINReader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'code_39_vin'); return _this; } inherits_default()(Code39VINReader, _Code39Reader); return createClass_default()(Code39VINReader, [{ key: "_checkChecksum", value: // TODO (this was todo in original repo, no text was there. sorry.) function _checkChecksum(code) { return !!code; } // Cribbed from: // https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java }, { key: "decode", value: function decode() { var result = code_39_vin_reader_superPropGet(Code39VINReader, "decode", this, 3)([]); if (!result) { return null; } var code = result.code; if (!code) { return null; } code = code.replace(code_39_vin_reader_patterns.IOQ, ''); if (!code.match(code_39_vin_reader_patterns.AZ09)) { if (true) { console.log('Failed AZ09 pattern code:', code); } return null; } if (!this._checkChecksum(code)) { return null; } result.code = code; return result; } }]); }(code_39_reader); /* harmony default export */ var code_39_vin_reader = (code_39_vin_reader_Code39VINReader); // CONCATENATED MODULE: ./src/reader/code_93_reader.ts function code_93_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, code_93_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function code_93_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (code_93_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var code_93_reader_ALPHABETH_STRING = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*'; var code_93_reader_ALPHABET = new Uint16Array(toConsumableArray_default()(code_93_reader_ALPHABETH_STRING).map(function (_char) { return _char.charCodeAt(0); })); var code_93_reader_CHARACTER_ENCODINGS = new Uint16Array([0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, 0x126, 0x1DA, 0x1D6, 0x132, 0x15E]); var code_93_reader_ASTERISK = 0x15E; var code_93_reader_Code93Reader = /*#__PURE__*/function (_BarcodeReader) { function Code93Reader() { var _this; classCallCheck_default()(this, Code93Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = code_93_reader_callSuper(this, Code93Reader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'code_93'); return _this; } inherits_default()(Code93Reader, _BarcodeReader); return createClass_default()(Code93Reader, [{ key: "_patternToChar", value: function _patternToChar(pattern) { for (var i = 0; i < code_93_reader_CHARACTER_ENCODINGS.length; i++) { if (code_93_reader_CHARACTER_ENCODINGS[i] === pattern) { return String.fromCharCode(code_93_reader_ALPHABET[i]); } } return null; } }, { key: "_toPattern", value: function _toPattern(counters) { var numCounters = counters.length; var sum = counters.reduce(function (prev, next) { return prev + next; }, 0); var pattern = 0; for (var i = 0; i < numCounters; i++) { var normalized = Math.round(counters[i] * 9 / sum); if (normalized < 1 || normalized > 4) { return -1; } if ((i & 1) === 0) { for (var j = 0; j < normalized; j++) { pattern = pattern << 1 | 1; } } else { pattern <<= normalized; } } return pattern; } }, { key: "_findStart", value: function _findStart() { var offset = this._nextSet(this._row); var patternStart = offset; var counter = new Uint16Array([0, 0, 0, 0, 0, 0]); var counterPos = 0; var isWhite = false; for (var i = offset; i < this._row.length; i++) { if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { // find start pattern if (this._toPattern(counter) === code_93_reader_ASTERISK) { var whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - (i - patternStart) / 4)); if (this._matchRange(whiteSpaceMustStart, patternStart, 0)) { return { start: patternStart, end: i }; } } patternStart += counter[0] + counter[1]; for (var j = 0; j < 4; j++) { counter[j] = counter[j + 2]; } counter[4] = 0; counter[5] = 0; counterPos--; } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "_verifyEnd", value: function _verifyEnd(lastStart, nextStart) { if (lastStart === nextStart || !this._row[nextStart]) { return false; } return true; } }, { key: "_decodeExtended", value: function _decodeExtended(charArray) { var length = charArray.length; var result = []; for (var i = 0; i < length; i++) { var _char2 = charArray[i]; if (_char2 >= 'a' && _char2 <= 'd') { if (i > length - 2) { return null; } var nextChar = charArray[++i]; var nextCharCode = nextChar.charCodeAt(0); var decodedChar = void 0; switch (_char2) { case 'a': if (nextChar >= 'A' && nextChar <= 'Z') { decodedChar = String.fromCharCode(nextCharCode - 64); } else { return null; } break; case 'b': if (nextChar >= 'A' && nextChar <= 'E') { decodedChar = String.fromCharCode(nextCharCode - 38); } else if (nextChar >= 'F' && nextChar <= 'J') { decodedChar = String.fromCharCode(nextCharCode - 11); } else if (nextChar >= 'K' && nextChar <= 'O') { decodedChar = String.fromCharCode(nextCharCode + 16); } else if (nextChar >= 'P' && nextChar <= 'S') { decodedChar = String.fromCharCode(nextCharCode + 43); } else if (nextChar >= 'T' && nextChar <= 'Z') { decodedChar = String.fromCharCode(127); } else { return null; } break; case 'c': if (nextChar >= 'A' && nextChar <= 'O') { decodedChar = String.fromCharCode(nextCharCode - 32); } else if (nextChar === 'Z') { decodedChar = ':'; } else { return null; } break; case 'd': if (nextChar >= 'A' && nextChar <= 'Z') { decodedChar = String.fromCharCode(nextCharCode + 32); } else { return null; } break; default: console.warn('* code_93_reader _decodeExtended hit default case, this may be an error', decodedChar); return null; } result.push(decodedChar); } else { result.push(_char2); } } return result; } }, { key: "_matchCheckChar", value: function _matchCheckChar(charArray, index, maxWeight) { var arrayToCheck = charArray.slice(0, index); var length = arrayToCheck.length; var weightedSums = arrayToCheck.reduce(function (sum, _char3, i) { var weight = (i * -1 + (length - 1)) % maxWeight + 1; var value = code_93_reader_ALPHABET.indexOf(_char3.charCodeAt(0)); return sum + weight * value; }, 0); var checkChar = code_93_reader_ALPHABET[weightedSums % 47]; return checkChar === charArray[index].charCodeAt(0); } }, { key: "_verifyChecksums", value: function _verifyChecksums(charArray) { return this._matchCheckChar(charArray, charArray.length - 2, 20) && this._matchCheckChar(charArray, charArray.length - 1, 15); } }, { key: "decode", value: function decode(row, start) { start = this._findStart(); if (!start) { return null; } var counters = new Uint16Array([0, 0, 0, 0, 0, 0]); var result = []; var nextStart = this._nextSet(this._row, start.end); var lastStart; var decodedChar; do { counters = this._toCounters(nextStart, counters); var pattern = this._toPattern(counters); if (pattern < 0) { return null; } decodedChar = this._patternToChar(pattern); if (decodedChar === null) { return null; } result.push(decodedChar); lastStart = nextStart; nextStart += array_helper.sum(counters); nextStart = this._nextSet(this._row, nextStart); } while (decodedChar !== '*'); result.pop(); if (!result.length) { return null; } if (!this._verifyEnd(lastStart, nextStart)) { return null; } if (!this._verifyChecksums(result)) { return null; } result = result.slice(0, result.length - 2); // yes, this is an assign inside an if. if ((result = this._decodeExtended(result)) === null) { return null; } return { code: result.join(''), start: start.start, end: nextStart, startInfo: start, decodedCodes: result, format: this.FORMAT }; } }]); }(barcode_reader); /* harmony default export */ var code_93_reader = (code_93_reader_Code93Reader); // CONCATENATED MODULE: ./src/reader/ean_reader.ts function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { defineProperty_default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function ean_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, ean_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function ean_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (ean_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // const CODE_L_START = 0; var CODE_G_START = 10; var ean_reader_START_PATTERN = [1, 1, 1]; var MIDDLE_PATTERN = [1, 1, 1, 1, 1]; var EXTENSION_START_PATTERN = [1, 1, 2]; var ean_reader_CODE_PATTERN = [[3, 2, 1, 1], [2, 2, 2, 1], [2, 1, 2, 2], [1, 4, 1, 1], [1, 1, 3, 2], [1, 2, 3, 1], [1, 1, 1, 4], [1, 3, 1, 2], [1, 2, 1, 3], [3, 1, 1, 2], [1, 1, 2, 3], [1, 2, 2, 2], [2, 2, 1, 2], [1, 1, 4, 1], [2, 3, 1, 1], [1, 3, 2, 1], [4, 1, 1, 1], [2, 1, 3, 1], [3, 1, 2, 1], [2, 1, 1, 3]]; var CODE_FREQUENCY = [0, 11, 13, 14, 19, 25, 28, 21, 22, 26]; // const SINGLE_CODE_ERROR = 0.70; var AVG_CODE_ERROR = 0.48; var ean_reader_EANReader = /*#__PURE__*/function (_BarcodeReader) { // TODO: does this need to be in the class? function EANReader(config, supplements) { var _this; classCallCheck_default()(this, EANReader); _this = ean_reader_callSuper(this, EANReader, [merge_default()({ supplements: [] }, config), supplements]); defineProperty_default()(_this, "FORMAT", 'ean_13'); defineProperty_default()(_this, "SINGLE_CODE_ERROR", 0.70); defineProperty_default()(_this, "STOP_PATTERN", [1, 1, 1]); return _this; } inherits_default()(EANReader, _BarcodeReader); return createClass_default()(EANReader, [{ key: "_findPattern", value: function _findPattern(pattern, offset, isWhite, tryHarder) { var counter = new Array(pattern.length).fill(0); var bestMatch = { error: Number.MAX_VALUE, start: 0, end: 0 }; var epsilon = AVG_CODE_ERROR; // console.warn('* findPattern', pattern, offset, isWhite, tryHarder, epsilon); var counterPos = 0; if (!offset) { offset = this._nextSet(this._row); } for (var i = offset; i < this._row.length; i++) { // console.warn(`* loop i=${offset} len=${this._row.length} isWhite=${isWhite} counterPos=${counterPos}`); if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos] += 1; } else { if (counterPos === counter.length - 1) { var error = this._matchPattern(counter, pattern); // console.warn('* matchPattern', error, counter, pattern); if (error < epsilon && bestMatch.error && error < bestMatch.error) { bestMatch.error = error; bestMatch.start = i - counter.reduce(function (sum, value) { return sum + value; }, 0); bestMatch.end = i; // console.warn('* return bestMatch', JSON.stringify(bestMatch)); return bestMatch; } if (tryHarder) { for (var j = 0; j < counter.length - 2; j++) { counter[j] = counter[j + 2]; } counter[counter.length - 2] = 0; counter[counter.length - 1] = 0; counterPos--; } } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } // TODO: findPattern and decodeCode appear to share quite similar code, can it be reduced? }, { key: "_decodeCode", value: function _decodeCode(start, coderange) { // console.warn('* decodeCode', start, coderange); var counter = [0, 0, 0, 0]; var offset = start; var bestMatch = { error: Number.MAX_VALUE, code: -1, start: start, end: start }; var epsilon = AVG_CODE_ERROR; var isWhite = !this._row[offset]; var counterPos = 0; if (!coderange) { // console.warn('* decodeCode before length'); coderange = ean_reader_CODE_PATTERN.length; // console.warn('* decodeCode after length'); } for (var i = offset; i < this._row.length; i++) { if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { for (var code = 0; code < coderange; code++) { var error = this._matchPattern(counter, ean_reader_CODE_PATTERN[code]); bestMatch.end = i; if (error < bestMatch.error) { bestMatch.code = code; bestMatch.error = error; } } if (bestMatch.error > epsilon) { // console.warn('* return null'); return null; } // console.warn('* return bestMatch', JSON.stringify(bestMatch)); return bestMatch; } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "_findStart", value: function _findStart() { // console.warn('* findStart'); var offset = this._nextSet(this._row); var startInfo = null; while (!startInfo) { startInfo = this._findPattern(ean_reader_START_PATTERN, offset, false, true); // console.warn('* startInfo=', JSON.stringify(startInfo)); if (!startInfo) { return null; } var leadingWhitespaceStart = startInfo.start - (startInfo.end - startInfo.start); if (leadingWhitespaceStart >= 0) { if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) { // console.warn('* returning startInfo'); return startInfo; } } offset = startInfo.end; startInfo = null; } // console.warn('* returning null'); return null; } }, { key: "_calculateFirstDigit", value: function _calculateFirstDigit(codeFrequency) { // console.warn('* calculateFirstDigit', codeFrequency); for (var i = 0; i < CODE_FREQUENCY.length; i++) { if (codeFrequency === CODE_FREQUENCY[i]) { // console.warn('* returning', i); return i; } } // console.warn('* return null'); return null; } }, { key: "_decodePayload", value: function _decodePayload(inCode, result, decodedCodes) { // console.warn('* decodePayload', inCode, result, decodedCodes); var outCode = _objectSpread({}, inCode); var codeFrequency = 0x0; for (var i = 0; i < 6; i++) { outCode = this._decodeCode(outCode.end); // console.warn('* decodeCode=', outCode); if (!outCode) { // console.warn('* return null'); return null; } if (outCode.code >= CODE_G_START) { outCode.code -= CODE_G_START; codeFrequency |= 1 << 5 - i; } else { codeFrequency |= 0 << 5 - i; } result.push(outCode.code); decodedCodes.push(outCode); } var firstDigit = this._calculateFirstDigit(codeFrequency); // console.warn('* firstDigit=', firstDigit); if (firstDigit === null) { // console.warn('* return null'); return null; } result.unshift(firstDigit); var middlePattern = this._findPattern(MIDDLE_PATTERN, outCode.end, true, false); // console.warn('* findPattern=', JSON.stringify(middlePattern)); if (middlePattern === null || !middlePattern.end) { // console.warn('* return null'); return null; } decodedCodes.push(middlePattern); for (var _i = 0; _i < 6; _i++) { middlePattern = this._decodeCode(middlePattern.end, CODE_G_START); // console.warn('* decodeCode=', JSON.stringify(middlePattern)); if (!middlePattern) { // console.warn('* return null'); return null; } decodedCodes.push(middlePattern); result.push(middlePattern.code); } // console.warn('* end code=', JSON.stringify(middlePattern)); // console.warn('* end result=', JSON.stringify(result)); // console.warn('* end decodedCodes=', decodedCodes); return middlePattern; } }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(endInfo) { // console.warn('* verifyTrailingWhitespace', JSON.stringify(endInfo)); var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start); if (trailingWhitespaceEnd < this._row.length) { if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) { // console.warn('* returning', JSON.stringify(endInfo)); return endInfo; } } // console.warn('* return null'); return null; } }, { key: "_findEnd", value: function _findEnd(offset, isWhite) { // console.warn('* findEnd', offset, isWhite); var endInfo = this._findPattern(this.STOP_PATTERN, offset, isWhite, false); return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null; } }, { key: "_checksum", value: function _checksum(result) { // console.warn('* _checksum', result); var sum = 0; for (var i = result.length - 2; i >= 0; i -= 2) { sum += result[i]; } sum *= 3; for (var _i2 = result.length - 1; _i2 >= 0; _i2 -= 2) { sum += result[_i2]; } // console.warn('* end checksum', sum % 10 === 0); return sum % 10 === 0; } }, { key: "_decodeExtensions", value: function _decodeExtensions(offset) { var start = this._nextSet(this._row, offset); var startInfo = this._findPattern(EXTENSION_START_PATTERN, start, false, false); if (startInfo === null) { return null; } // console.warn('* decodeExtensions', this.supplements); // console.warn('* there are ', this.supplements.length, ' supplements'); for (var i = 0; i < this.supplements.length; i++) { // console.warn('* extensions loop', i, this.supplements[i], this.supplements[i]._decode); try { var result = this.supplements[i].decode(this._row, startInfo.end); // console.warn('* decode result=', result); if (result !== null) { return { code: result.code, start: start, startInfo: startInfo, end: result.end, decodedCodes: result.decodedCodes, format: this.supplements[i].FORMAT }; } } catch (err) { console.error('* decodeExtensions error in ', this.supplements[i], ': ', err); } } // console.warn('* end decodeExtensions'); return null; } }, { key: "decode", value: function decode(row, start) { // console.warn('* decode', row); // console.warn('* decode', start); var result = new Array(); var decodedCodes = new Array(); var resultInfo = {}; var startInfo = this._findStart(); if (!startInfo) { return null; } var code = { start: startInfo.start, end: startInfo.end }; decodedCodes.push(code); code = this._decodePayload(code, result, decodedCodes); if (!code) { return null; } code = this._findEnd(code.end, false); if (!code) { return null; } decodedCodes.push(code); // Checksum if (!this._checksum(result)) { return null; } // console.warn('* this.supplements=', this.supplements); if (this.supplements.length > 0) { var supplement = this._decodeExtensions(code.end); // console.warn('* decodeExtensions returns', supplement); if (!supplement) { return null; } if (!supplement.decodedCodes) { return null; } var lastCode = supplement.decodedCodes[supplement.decodedCodes.length - 1]; var endInfo = { start: lastCode.start + ((lastCode.end - lastCode.start) / 2 | 0), end: lastCode.end }; if (!this._verifyTrailingWhitespace(endInfo)) { return null; } resultInfo = { supplement: supplement, code: result.join('') + supplement.code }; } return _objectSpread(_objectSpread({ code: result.join(''), start: startInfo.start, end: code.end, startInfo: startInfo, decodedCodes: decodedCodes }, resultInfo), {}, { format: this.FORMAT }); } }]); }(barcode_reader); /* harmony default export */ var ean_reader = (ean_reader_EANReader); // CONCATENATED MODULE: ./src/reader/ean_2_reader.ts function ean_2_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, ean_2_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function ean_2_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (ean_2_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var ean_2_reader_EAN2Reader = /*#__PURE__*/function (_EANReader) { function EAN2Reader() { var _this; classCallCheck_default()(this, EAN2Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = ean_2_reader_callSuper(this, EAN2Reader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'ean_2'); return _this; } inherits_default()(EAN2Reader, _EANReader); return createClass_default()(EAN2Reader, [{ key: "decode", value: function decode(row, start) { if (row) { this._row = row; } var codeFrequency = 0; var offset = start; var end = this._row.length; var result = []; var decodedCodes = []; var code = null; if (offset === undefined) { return null; } for (var i = 0; i < 2 && offset < end; i++) { code = this._decodeCode(offset); if (!code) { return null; } decodedCodes.push(code); result.push(code.code % 10); if (code.code >= CODE_G_START) { codeFrequency |= 1 << 1 - i; } if (i !== 1) { offset = this._nextSet(this._row, code.end); offset = this._nextUnset(this._row, offset); } } if (result.length !== 2 || parseInt(result.join('')) % 4 !== codeFrequency) { return null; } var startInfo = this._findStart(); return { code: result.join(''), decodedCodes: decodedCodes, end: code.end, format: this.FORMAT, startInfo: startInfo, start: startInfo.start }; } }]); }(ean_reader); ; /* harmony default export */ var ean_2_reader = (ean_2_reader_EAN2Reader); // CONCATENATED MODULE: ./src/reader/ean_5_reader.ts function ean_5_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, ean_5_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function ean_5_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (ean_5_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var CHECK_DIGIT_ENCODINGS = [24, 20, 18, 17, 12, 6, 3, 10, 9, 5]; function determineCheckDigit(codeFrequency) { for (var i = 0; i < 10; i++) { if (codeFrequency === CHECK_DIGIT_ENCODINGS[i]) { return i; } } return null; } function extensionChecksum(result) { var length = result.length; var sum = 0; for (var i = length - 2; i >= 0; i -= 2) { sum += result[i]; } sum *= 3; for (var _i = length - 1; _i >= 0; _i -= 2) { sum += result[_i]; } sum *= 3; return sum % 10; } var ean_5_reader_EAN5Reader = /*#__PURE__*/function (_EANReader) { function EAN5Reader() { var _this; classCallCheck_default()(this, EAN5Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = ean_5_reader_callSuper(this, EAN5Reader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'ean_5'); return _this; } inherits_default()(EAN5Reader, _EANReader); return createClass_default()(EAN5Reader, [{ key: "decode", value: function decode(row, start) { if (start === undefined) { return null; } if (row) { this._row = row; } var codeFrequency = 0; var offset = start; var end = this._row.length; var code = null; var result = []; var decodedCodes = []; for (var i = 0; i < 5 && offset < end; i++) { code = this._decodeCode(offset); if (!code) { return null; } decodedCodes.push(code); result.push(code.code % 10); if (code.code >= CODE_G_START) { codeFrequency |= 1 << 4 - i; } if (i !== 4) { offset = this._nextSet(this._row, code.end); offset = this._nextUnset(this._row, offset); } } if (result.length !== 5) { return null; } if (extensionChecksum(result) !== determineCheckDigit(codeFrequency)) { return null; } var startInfo = this._findStart(); return { code: result.join(''), decodedCodes: decodedCodes, end: code.end, format: this.FORMAT, startInfo: startInfo, start: startInfo.start }; } }]); }(ean_reader); ; /* harmony default export */ var ean_5_reader = (ean_5_reader_EAN5Reader); // CONCATENATED MODULE: ./src/reader/ean_8_reader.ts function ean_8_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, ean_8_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function ean_8_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (ean_8_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var ean_8_reader_EAN8Reader = /*#__PURE__*/function (_EANReader) { function EAN8Reader() { var _this; classCallCheck_default()(this, EAN8Reader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = ean_8_reader_callSuper(this, EAN8Reader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'ean_8'); return _this; } inherits_default()(EAN8Reader, _EANReader); return createClass_default()(EAN8Reader, [{ key: "_decodePayload", value: function _decodePayload(inCode, result, decodedCodes) { var code = inCode; for (var i = 0; i < 4; i++) { code = this._decodeCode(code.end, CODE_G_START); if (!code) { return null; } result.push(code.code); decodedCodes.push(code); } code = this._findPattern(MIDDLE_PATTERN, code.end, true, false); if (code === null) { return null; } decodedCodes.push(code); for (var _i = 0; _i < 4; _i++) { code = this._decodeCode(code.end, CODE_G_START); if (!code) { return null; } decodedCodes.push(code); result.push(code.code); } return code; } }]); }(ean_reader); /* harmony default export */ var ean_8_reader = (ean_8_reader_EAN8Reader); // CONCATENATED MODULE: ./src/reader/i2of5_reader.ts function i2of5_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, i2of5_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function i2of5_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (i2of5_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function i2of5_reader_superPropGet(t, o, e, r) { var p = get_default()(getPrototypeOf_default()(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // TODO: i2of5_reader and 2of5_reader share very similar code, make use of that var i2of5_reader_N = 1; var i2of5_reader_W = 3; var i2of5_reader_I2of5Reader = /*#__PURE__*/function (_BarcodeReader) { function I2of5Reader(opts) { var _this; classCallCheck_default()(this, I2of5Reader); _this = i2of5_reader_callSuper(this, I2of5Reader, [merge_default()({ normalizeBarSpaceWidth: false }, opts)]); defineProperty_default()(_this, "barSpaceRatio", [1, 1]); defineProperty_default()(_this, "SINGLE_CODE_ERROR", 0.78); defineProperty_default()(_this, "AVG_CODE_ERROR", 0.38); defineProperty_default()(_this, "START_PATTERN", [i2of5_reader_N, i2of5_reader_N, i2of5_reader_N, i2of5_reader_N]); defineProperty_default()(_this, "STOP_PATTERN", [i2of5_reader_N, i2of5_reader_N, i2of5_reader_W]); defineProperty_default()(_this, "CODE_PATTERN", [[i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_W, i2of5_reader_N], [i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W], [i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W], [i2of5_reader_W, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_W], [i2of5_reader_W, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_W, i2of5_reader_W, i2of5_reader_N, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_W], [i2of5_reader_W, i2of5_reader_N, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N], [i2of5_reader_N, i2of5_reader_W, i2of5_reader_N, i2of5_reader_W, i2of5_reader_N]]); defineProperty_default()(_this, "MAX_CORRECTION_FACTOR", 5); defineProperty_default()(_this, "FORMAT", 'i2of5'); if (opts.normalizeBarSpaceWidth) { _this.SINGLE_CODE_ERROR = 0.38; _this.AVG_CODE_ERROR = 0.09; } _this.config = opts; return possibleConstructorReturn_default()(_this, _this); } inherits_default()(I2of5Reader, _BarcodeReader); return createClass_default()(I2of5Reader, [{ key: "_matchPattern", value: function _matchPattern(counter, code) { if (this.config.normalizeBarSpaceWidth) { var counterSum = [0, 0]; var codeSum = [0, 0]; var correction = [0, 0]; var correctionRatio = this.MAX_CORRECTION_FACTOR; var correctionRatioInverse = 1 / correctionRatio; for (var i = 0; i < counter.length; i++) { counterSum[i % 2] += counter[i]; codeSum[i % 2] += code[i]; } correction[0] = codeSum[0] / counterSum[0]; correction[1] = codeSum[1] / counterSum[1]; correction[0] = Math.max(Math.min(correction[0], correctionRatio), correctionRatioInverse); correction[1] = Math.max(Math.min(correction[1], correctionRatio), correctionRatioInverse); this.barSpaceRatio = correction; for (var _i = 0; _i < counter.length; _i++) { counter[_i] *= this.barSpaceRatio[_i % 2]; } } return i2of5_reader_superPropGet(I2of5Reader, "_matchPattern", this, 3)([counter, code]); } }, { key: "_findPattern", value: function _findPattern(pattern, offset) { var isWhite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var tryHarder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var counter = new Array(pattern.length).fill(0); var counterPos = 0; var bestMatch = { error: Number.MAX_VALUE, start: 0, end: 0 }; var epsilon = this.AVG_CODE_ERROR; isWhite = isWhite || false; tryHarder = tryHarder || false; if (!offset) { offset = this._nextSet(this._row); } for (var i = offset; i < this._row.length; i++) { if (this._row[i] ^ (isWhite ? 1 : 0)) { counter[counterPos]++; } else { if (counterPos === counter.length - 1) { var sum = counter.reduce(function (prev, next) { return prev + next; }, 0); var error = this._matchPattern(counter, pattern); if (error < epsilon) { bestMatch.error = error; bestMatch.start = i - sum; bestMatch.end = i; return bestMatch; } if (tryHarder) { for (var j = 0; j < counter.length - 2; j++) { counter[j] = counter[j + 2]; } counter[counter.length - 2] = 0; counter[counter.length - 1] = 0; counterPos--; } else { return null; } } else { counterPos++; } counter[counterPos] = 1; isWhite = !isWhite; } } return null; } }, { key: "_findStart", value: function _findStart() { var leadingWhitespaceStart = 0; var offset = this._nextSet(this._row); var startInfo = null; var narrowBarWidth = 1; while (!startInfo) { startInfo = this._findPattern(this.START_PATTERN, offset, false, true); if (!startInfo) { return null; } narrowBarWidth = Math.floor((startInfo.end - startInfo.start) / 4); leadingWhitespaceStart = startInfo.start - narrowBarWidth * 10; if (leadingWhitespaceStart >= 0) { if (this._matchRange(leadingWhitespaceStart, startInfo.start, 0)) { return startInfo; } } offset = startInfo.end; startInfo = null; } return null; } }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(endInfo) { var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2; if (trailingWhitespaceEnd < this._row.length) { if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) { return endInfo; } } return null; } }, { key: "_findEnd", value: function _findEnd() { this._row.reverse(); var endInfo = this._findPattern(this.STOP_PATTERN); this._row.reverse(); if (endInfo === null) { return null; } // reverse numbers var tmp = endInfo.start; endInfo.start = this._row.length - endInfo.end; endInfo.end = this._row.length - tmp; return endInfo !== null ? this._verifyTrailingWhitespace(endInfo) : null; } }, { key: "_decodePair", value: function _decodePair(counterPair) { var codes = []; for (var i = 0; i < counterPair.length; i++) { var code = this._decodeCode(counterPair[i]); if (!code) { return null; } codes.push(code); } return codes; } }, { key: "_decodeCode", value: function _decodeCode(counter) { var epsilon = this.AVG_CODE_ERROR; var bestMatch = { error: Number.MAX_VALUE, code: -1, start: 0, end: 0 }; for (var code = 0; code < this.CODE_PATTERN.length; code++) { var error = this._matchPattern(counter, this.CODE_PATTERN[code]); if (error < bestMatch.error) { bestMatch.code = code; bestMatch.error = error; } } if (bestMatch.error < epsilon) { return bestMatch; } return null; } }, { key: "_decodePayload", value: function _decodePayload(counters, result, decodedCodes) { var pos = 0; var counterLength = counters.length; var counterPair = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]; var codes = null; while (pos < counterLength) { for (var i = 0; i < 5; i++) { counterPair[0][i] = counters[pos] * this.barSpaceRatio[0]; counterPair[1][i] = counters[pos + 1] * this.barSpaceRatio[1]; pos += 2; } codes = this._decodePair(counterPair); if (!codes) { return null; } for (var _i2 = 0; _i2 < codes.length; _i2++) { result.push(codes[_i2].code + ''); decodedCodes.push(codes[_i2]); } } return codes; } }, { key: "_verifyCounterLength", value: function _verifyCounterLength(counters) { return counters.length % 10 === 0; } }, { key: "decode", value: function decode(row, start) { var result = new Array(); var decodedCodes = new Array(); var startInfo = this._findStart(); if (!startInfo) { return null; } decodedCodes.push(startInfo); var endInfo = this._findEnd(); if (!endInfo) { return null; } var counters = this._fillCounters(startInfo.end, endInfo.start, false); if (!this._verifyCounterLength(counters)) { return null; } var code = this._decodePayload(counters, result, decodedCodes); if (!code) { return null; } if (result.length % 2 !== 0 || result.length < 6) { return null; } decodedCodes.push(endInfo); return { code: result.join(''), start: startInfo.start, end: endInfo.end, startInfo: startInfo, decodedCodes: decodedCodes, format: this.FORMAT }; } }]); }(barcode_reader); /* harmony default export */ var i2of5_reader = (i2of5_reader_I2of5Reader); // CONCATENATED MODULE: ./src/reader/pharmacode_reader.ts function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function pharmacode_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, pharmacode_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function pharmacode_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (pharmacode_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /** * Pharmacode (Pharmaceutical Binary Code) Reader * * Pharmacode is a binary barcode used in pharmaceutical packaging. * It encodes numbers from 3 to 131070 using narrow and wide bars. * * Encoding rules: * - Reading from right to left (least significant first) * - Narrow bar at position i adds 2^i to the value * - Wide bar at position i adds 2^(i+1) to the value * - Bars are separated by uniform-width spaces * - Minimum 2 bars, maximum 16 bars * - Valid range: 3 to 131070 * * Example: Value 755 * Binary representation of bars (from left to right in barcode): * wide, narrow, wide, narrow, narrow, wide, narrow, wide, narrow * * Reference: https://en.wikipedia.org/wiki/Pharmacode */ // Minimum number of bars in a valid Pharmacode var MIN_BAR_COUNT = 2; // Maximum number of bars in a valid Pharmacode var MAX_BAR_COUNT = 16; // Minimum valid Pharmacode value var MIN_VALUE = 3; // Maximum valid Pharmacode value var MAX_VALUE = 131070; // Threshold ratio to distinguish narrow from wide bars // A bar wider than this ratio of the narrow bar width is considered wide var WIDE_BAR_THRESHOLD = 1.6; // Maximum allowed variation in space widths (coefficient of variation) // Reduced from 0.4 to help with false positives, but allowing some tolerance var MAX_SPACE_VARIANCE = 0.35; // Minimum quiet zone requirement in barcode widths (pharmaceutical spec: 6mm min) // We use 1x narrow bar width as a minimum quiet zone var MIN_QUIET_ZONE_WIDTHS = 1; // Allowed narrow/wide bar ratios (1:2, 1:2.5, 1:3) // These are multipliers applied to narrow bar width var ALLOWED_WIDE_BAR_RATIOS = [2.0, 2.5, 3.0]; var WIDE_BAR_RATIO_TOLERANCE = 0.05; // Allow 5% deviation from the detected ratio var pharmacode_reader_PharmacodeReader = /*#__PURE__*/function (_BarcodeReader) { function PharmacodeReader() { var _this; var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; classCallCheck_default()(this, PharmacodeReader); _this = pharmacode_reader_callSuper(this, PharmacodeReader, [config]); defineProperty_default()(_this, "FORMAT", 'pharmacode'); defineProperty_default()(_this, "SINGLE_CODE_ERROR", 0.7); defineProperty_default()(_this, "AVG_CODE_ERROR", 0.48); return _this; } /** * Find the start of the barcode (first black bar after leading whitespace) * Public so that barcode_decoder can use it for tilted barcode validation */ inherits_default()(PharmacodeReader, _BarcodeReader); return createClass_default()(PharmacodeReader, [{ key: "_findStart", value: function _findStart() { // Strategy: scan left→right; accept the first bar that: // 1. Has a sufficient leading quiet zone (≥ 2× bar width, min 20px) // 2. Is followed by another bar at a reasonable distance (≤ 10× bar width) // This rejects isolated noise bars surrounded by large white spaces. var minQuietZone = 20; var searchPos = 0; while (searchPos < this._row.length) { var barStart = this._nextSet(this._row, searchPos); if (barStart >= this._row.length) { return null; // no more black pixels } // Find the end of this black run var barEnd = barStart; while (barEnd < this._row.length && this._row[barEnd]) { barEnd++; } var barWidth = barEnd - barStart; // Skip narrow noise bars if (barWidth < 5) { searchPos = barEnd + 1; continue; } // Check leading quiet zone var requiredQuietZone = Math.max(barWidth * 2, minQuietZone); var quietZoneStart = barStart - requiredQuietZone; if (quietZoneStart < 0) { searchPos = barEnd + 1; continue; } if (!this._matchRange(quietZoneStart, barStart, 0)) { searchPos = barEnd + 1; continue; } // Forward-look: Check that the next bar appears within a reasonable distance. // A real barcode has bars followed by narrow spaces (5-15px), not huge gaps. // Allow up to 10× bar width for the space (being generous for very narrow bars). var maxSpaceToNextBar = Math.max(barWidth * 10, 50); var nextBarStart = this._nextSet(this._row, barEnd); if (nextBarStart >= this._row.length) { // No next bar; this is an isolated bar, likely noise searchPos = barEnd + 1; continue; } var spaceToNextBar = nextBarStart - barEnd; if (spaceToNextBar > maxSpaceToNextBar) { // Space is too large; this is likely an isolated bar searchPos = barEnd + 1; continue; } return { start: barStart, end: barEnd }; } return null; } /** * Smooth bar widths to reduce edge-detection jitter from colored barcodes. * Applies median filter to adjacent bars: if a bar is 1–3px different from neighbors, * snap it to the median of local bars to stabilize measurements. */ }, { key: "_smoothBarWidths", value: function _smoothBarWidths(bars) { if (bars.length <= 2) { return bars; // Not enough bars to smooth } var smoothed = bars.slice(); for (var i = 1; i < smoothed.length - 1; i++) { var prev = smoothed[i - 1]; var curr = smoothed[i]; var next = smoothed[i + 1]; // If current bar is significantly different from neighbors, snap to median var median = [prev, curr, next].sort(function (a, b) { return a - b; })[1]; var deviation = Math.abs(curr - median); // If deviation is small (1–3px), snap to median to reduce noise if (deviation > 0 && deviation <= 3) { smoothed[i] = median; } } return smoothed; } /** * Extract all bar and space widths from the pattern. * Uses real-time quiet zone detection to stop extraction before reaching image edge. */ }, { key: "_extractBarsAndSpaces", value: function _extractBarsAndSpaces(startPos) { var bars = []; var spaces = []; var pos = startPos; var currentWidth = 0; var foundTrailingQuietZone = false; // Extract first bar while (pos < this._row.length && this._row[pos]) { currentWidth++; pos++; } if (currentWidth === 0) { return null; } bars.push(currentWidth); // Extract first space (needed to establish space width and estimate narrow bar) currentWidth = 0; while (pos < this._row.length && !this._row[pos]) { currentWidth++; pos++; } if (currentWidth === 0 || pos >= this._row.length) { return null; // No space after first bar, or hit edge } spaces.push(currentWidth); // Estimate narrow bar width for quiet zone detection // If first bar < first space, assume first bar is narrow // Otherwise, estimate narrow from space (space ≈ 1.25 * narrow) var estimatedNarrowWidth = bars[0] < spaces[0] ? bars[0] : spaces[0] * 0.8; // Pharmaceutical spec: quiet zone must be >= 6mm ≈ 6x narrow bar (strict) var strictQuietZone = estimatedNarrowWidth * 6; // Adaptive quiet zone: 2.5x the typical inter-bar space width // This should catch legitimate quiet zones while avoiding false positives var adaptiveQuietZone = spaces[0] * 2.5; // Continue extracting alternating bars and spaces // Stop BEFORE reaching MAX_BAR_COUNT+1 to avoid extracting too many bars while (pos < this._row.length && bars.length < MAX_BAR_COUNT) { // Extract bar currentWidth = 0; while (pos < this._row.length && this._row[pos]) { currentWidth++; pos++; } if (currentWidth === 0) { // Reached end of barcode (no more bars) break; } bars.push(currentWidth); // Extract space currentWidth = 0; var spaceStart = pos; while (pos < this._row.length && !this._row[pos]) { currentWidth++; pos++; } if (currentWidth === 0) { // No space after this bar - barcode ended break; } // Check if this space is a quiet zone (strict pharmaceutical spec) if (currentWidth >= strictQuietZone) { // Found strict trailing quiet zone - stop extraction here foundTrailingQuietZone = true; pos = spaceStart; // Reset pos to start of quiet zone break; } // Adaptive quiet zone: if this space is significantly larger than normal inter-bar spaces // (2x or more), treat it as a quiet zone if (bars.length >= MIN_BAR_COUNT && currentWidth >= adaptiveQuietZone) { foundTrailingQuietZone = true; pos = spaceStart; break; } // Check if we hit the image edge while counting this space if (pos >= this._row.length) { // Hit image edge while in whitespace - treat as infinite quiet zone // We've reached the end of the image, which counts as an implicit quiet zone foundTrailingQuietZone = true; pos = spaceStart; // Reset to start of quiet zone break; } // This is a normal inter-bar space spaces.push(currentWidth); // Update adaptive quiet zone based on average space width // A quiet zone should be at least 2x the average inter-bar space if (spaces.length >= 2) { var avgSpace = spaces.reduce(function (a, b) { return a + b; }, 0) / spaces.length; adaptiveQuietZone = avgSpace * 2; } } // If we exited the loop without finding a trailing quiet zone, barcode is invalid // (This catches barcodes that end exactly at the image edge) if (!foundTrailingQuietZone) { return null; } // Validate bar count if (bars.length < MIN_BAR_COUNT || bars.length > MAX_BAR_COUNT) { return null; } // We should have (n-1) spaces for n bars if (spaces.length !== bars.length - 1) { return null; } // Validate that spaces are uniform (pharmacode requirement) if (!this._validateSpaces(spaces)) { return null; } // Validate that bars have at most 2 distinct sizes (narrow and/or wide) if (!this._validateBarSizeCount(bars)) { return null; } // Apply smoothing to reduce edge-detection jitter on colored barcodes var smoothedBars = this._smoothBarWidths(bars); return { bars: smoothedBars, spaces: spaces, end: pos }; } /** * Validate that bars have at most 2 distinct sizes (narrow and/or wide). * Pharmacode bars must be either all one size, or two sizes (narrow + wide). * If 3+ distinct sizes detected, this is not a valid pharmacode. */ }, { key: "_validateBarSizeCount", value: function _validateBarSizeCount(bars) { if (bars.length === 0) { return false; } // Cluster bars into size groups with 35% tolerance to handle edge-detection jitter // This matches the tolerance used for space validation (CV <= 0.35) var tolerance = 0.35; var clusters = []; var _iterator = _createForOfIteratorHelper(bars), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var bar = _step.value; var foundCluster = false; var _iterator2 = _createForOfIteratorHelper(clusters), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var cluster = _step2.value; var clusterAvg = cluster.reduce(function (a, b) { return a + b; }, 0) / cluster.length; if (Math.abs(bar - clusterAvg) <= clusterAvg * tolerance) { cluster.push(bar); foundCluster = true; break; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } if (!foundCluster) { clusters.push([bar]); } } // Must have exactly 1 or 2 clusters (not 3+) } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (clusters.length > 2) { return false; } return true; } /** * Check if space widths are uniform enough for a valid Pharmacode */ }, { key: "_validateSpaces", value: function _validateSpaces(spaces) { if (spaces.length === 0) { return true; // Single bar (though invalid for Pharmacode) } var mean = spaces.reduce(function (a, b) { return a + b; }, 0) / spaces.length; if (mean === 0) { return false; } // Calculate coefficient of variation var variance = spaces.reduce(function (sum, s) { return sum + Math.pow(s - mean, 2); }, 0) / spaces.length; var stdDev = Math.sqrt(variance); var cv = stdDev / mean; return cv <= MAX_SPACE_VARIANCE; } /** * Validate that narrow and wide bars follow a consistent ratio (1:2, 1:2.5, or 1:3) * This is a spec requirement for pharmacodes */ }, { key: "_validateBarRatios", value: function _validateBarRatios(bars, spaces) { // If all bars are essentially the same width (low variance), need to determine if narrow or wide var avgAll = bars.reduce(function (a, b) { return a + b; }, 0) / bars.length; var varAll = bars.reduce(function (a, b) { return a + Math.abs(b - avgAll); }, 0) / bars.length; var cvAll = avgAll === 0 ? 0 : varAll / avgAll; if (cvAll <= 0.1) { // Low variance: could be all-narrow or all-wide // Use space widths as a hint: spaces should be ~1.25x the narrow bar width var avgSpace = spaces.length > 0 ? spaces.reduce(function (a, b) { return a + b; }, 0) / spaces.length : 0; if (avgSpace > 0) { var spaceToBarRatio = avgSpace / avgAll; // If spaces are much smaller than bars, bars are likely wide (ratio should be ~0.3-0.5) // If spaces are comparable to bars or larger, bars are likely narrow (ratio should be ~1.0-1.5) if (spaceToBarRatio < 0.7) { // Bars are likely wide; infer narrow width from them // Use the closest allowed ratio var inferredNarrow = avgAll / 2.5; // Try middle ratio first return { narrowWidth: inferredNarrow, wideRatio: 2.5 }; } } // Default: treat as all-narrow return { narrowWidth: avgAll, wideRatio: 2.0 }; } // Explore multiple possible thresholds (midpoints between sorted unique widths) // and pick the one that best matches an allowed ratio with low per-bar deviation. var sortedUnique = Array.from(new Set(bars.slice().sort(function (a, b) { return a - b; }))); if (sortedUnique.length < 2) { // All bars identical: treat as single-width (valid pharmacode of all narrow or all wide) var avgWidth = bars.reduce(function (a, b) { return a + b; }, 0) / bars.length; return { narrowWidth: avgWidth, wideRatio: 2.0 }; } var candidates = []; // Generate candidate thresholds at midpoints between consecutive unique widths for (var i = 0; i < sortedUnique.length - 1; i++) { var t = (sortedUnique[i] + sortedUnique[i + 1]) / 2; var n = []; var w = []; var _iterator3 = _createForOfIteratorHelper(bars), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var b = _step3.value; if (b < t) { n.push(b); } else { w.push(b); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } if (n.length === 0 || w.length === 0) { continue; // need both groups } var avgN = n.reduce(function (a, b) { return a + b; }, 0) / n.length; var avgW = w.reduce(function (a, b) { return a + b; }, 0) / w.length; var ratio = avgW / avgN; // Find closest allowed ratio var bestRatio = ALLOWED_WIDE_BAR_RATIOS[0]; var bestDiff = Math.abs(ratio - bestRatio); for (var _i = 0, _ALLOWED_WIDE_BAR_RAT = ALLOWED_WIDE_BAR_RATIOS; _i < _ALLOWED_WIDE_BAR_RAT.length; _i++) { var r = _ALLOWED_WIDE_BAR_RAT[_i]; var d = Math.abs(ratio - r); if (d < bestDiff) { bestDiff = d; bestRatio = r; } } candidates.push({ threshold: t, narrowBars: n, wideBars: w, avgN: avgN, avgW: avgW, ratio: ratio, ratioDiff: bestDiff, matchedRatio: bestRatio }); } // Sort candidates by how close the ratio is to allowed ratios candidates.sort(function (a, b) { return a.ratioDiff - b.ratioDiff; }); for (var _i2 = 0, _candidates = candidates; _i2 < _candidates.length; _i2++) { var c = _candidates[_i2]; // Check ratio within tolerance var tolerance = c.matchedRatio * WIDE_BAR_RATIO_TOLERANCE; if (Math.abs(c.ratio - c.matchedRatio) > tolerance) { continue; } // Per-bar consistency checks // Use 15% tolerance instead of 30% to reject bars with too much width variation // Real pharmacodes have consistent bar widths; tilted/curved ones show variation var narrowTolerance = c.avgN * 0.15; var wideTolerance = c.avgW * 0.15; var ok = true; var _iterator4 = _createForOfIteratorHelper(c.narrowBars), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _b = _step4.value; if (Math.abs(_b - c.avgN) > narrowTolerance) { ok = false; break; } } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } if (!ok) continue; var _iterator5 = _createForOfIteratorHelper(c.wideBars), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var _b2 = _step5.value; if (Math.abs(_b2 - c.avgW) > wideTolerance) { ok = false; break; } } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } if (!ok) continue; // Accept first viable candidate (closest ratio) return { narrowWidth: c.avgN, wideRatio: c.matchedRatio }; } return null; } /** * Validate periodicity of bar and space widths * Real pharmacodes have consistent bar/space widths with low variation * Tilted barcodes create varying widths due to angle-dependent cross-sections * Uses coefficient of variation (CV = stdDev / mean) to detect this */ }, { key: "_validatePeriodicity", value: function _validatePeriodicity(bars, spaces) { // Calculate coefficient of variation for bars if (bars.length > 0) { var barMean = bars.reduce(function (a, b) { return a + b; }, 0) / bars.length; var barVariance = bars.reduce(function (a, b) { return a + Math.pow(b - barMean, 2); }, 0) / bars.length; var barStdDev = Math.sqrt(barVariance); var barCV = barMean !== 0 ? barStdDev / barMean : 0; // Reject if bar CV is too high (indicates tilted/curved barcode with varying cross-sections) // Threshold of 0.65 allows for reasonable variation in valid codes while still catching severe misalignments if (barCV > 0.65) { return false; } } // Calculate coefficient of variation for spaces if (spaces.length > 0) { var spaceMean = spaces.reduce(function (a, b) { return a + b; }, 0) / spaces.length; var spaceVariance = spaces.reduce(function (a, b) { return a + Math.pow(b - spaceMean, 2); }, 0) / spaces.length; var spaceStdDev = Math.sqrt(spaceVariance); var spaceCV = spaceMean !== 0 ? spaceStdDev / spaceMean : 0; // Reject if space CV is too high if (spaceCV > 0.55) { return false; } } return true; } /** * Verify that there is sufficient quiet zone at start and end * When area constraints are used, the quiet zone may be truncated, * so we check if we have at least SOME quiet zone or hit the scan boundary */ }, { key: "_validateQuietZones", value: function _validateQuietZones(startInfo, narrowWidth, end) { var minQuietZone = narrowWidth * MIN_QUIET_ZONE_WIDTHS; // Check leading quiet zone // If we're very close to the start (within 2 pixels), we likely hit the area boundary // In that case, accept it as we can't verify the quiet zone if (startInfo.start >= 2 && startInfo.start < minQuietZone) { return false; } // Check trailing quiet zone // If we're at or very close to the end of the row, we likely hit the area boundary // In real extracted images, especially with resizing, we may not have perfect quiet zones // So we accept it if we're within 6 pixels of the end (scan boundary) var remainingSpace = this._row.length - end; // If we're very close to the edge (< 6px), we hit the scan boundary - accept it if (remainingSpace < 6) { return true; } // We have at least 6px of trailing space - check if it meets minimum quiet zone requirement if (remainingSpace < minQuietZone) { return false; } return true; } /** * Classify bars as narrow or wide and decode the value */ }, { key: "_decodeBars", value: function _decodeBars(bars, narrowWidth) { // Use provided narrowWidth if available (from _validateBarRatios inference) // Otherwise, find the minimum bar width (likely narrow bar) var minWidth = narrowWidth !== null && narrowWidth !== void 0 ? narrowWidth : Math.min.apply(Math, toConsumableArray_default()(bars)); // If all bars are similar width, it might be a valid Pharmacode with all narrow or all wide bars // But we need to determine the threshold var threshold = minWidth * WIDE_BAR_THRESHOLD; // Calculate the Pharmacode value using the correct algorithm // Position n starts at 0 on the RIGHT (last bar in array) // Narrow bar at position n adds 2^n // Wide bar at position n adds 2^(n+1) var value = 0; // Reverse bars to process right-to-left var reversedBars = bars.slice().reverse(); for (var i = 0; i < reversedBars.length; i++) { var isWide = reversedBars[i] > threshold; if (isWide) { value += Math.pow(2, i + 1); } else { value += Math.pow(2, i); } } // Build human-readable bar pattern for debugging var pattern = ''; for (var _i3 = reversedBars.length - 1; _i3 >= 0; _i3--) { pattern += reversedBars[_i3] > threshold ? 'W' : 'N'; } return { value: value, pattern: pattern }; } /** * Verify trailing whitespace (quiet zone) */ }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(end, barWidth) { var trailingWhitespaceEnd = Math.min(end + barWidth * 2, this._row.length); return this._matchRange(end, trailingWhitespaceEnd, 0); } /** * Check pattern consistency: extract bars from slightly shifted positions. * Real barcodes should produce consistent bar patterns even with small shifts. * Text patterns are typically edge-based and will break with a small shift. */ }, { key: "_validatePatternConsistency", value: function _validatePatternConsistency(startInfo, bars) { var originalStart = startInfo.start; var consistentOffsets = 0; var totalChecks = 0; // Check positions offset by ±1 and ±2 pixels (simulate scanning lines nearby) for (var _i4 = 0, _arr = [-2, -1, 1, 2]; _i4 < _arr.length; _i4++) { var offset = _arr[_i4]; var shiftedStart = originalStart + offset; if (shiftedStart < 0 || shiftedStart >= this._row.length) { continue; } totalChecks++; // Try to extract bars from shifted position var shiftedExtracted = this._extractBarsAndSpaces(shiftedStart); if (!shiftedExtracted) { continue; } // If we got bars and they match in count, it's more likely a real barcode if (shiftedExtracted.bars.length === bars.length) { // Check if bar widths are roughly similar (within 25%) var barsMatch = true; for (var i = 0; i < bars.length; i++) { var diff = Math.abs(shiftedExtracted.bars[i] - bars[i]) / Math.max(bars[i], 1); if (diff > 0.25) { barsMatch = false; break; } } if (barsMatch) { consistentOffsets++; } } } // Real barcodes should be consistent across multiple shifted positions // Text patterns typically fail this test if (totalChecks > 0 && consistentOffsets >= totalChecks * 0.5) { return true; // Consistent across at least 50% of positions } return false; } }, { key: "decode", value: function decode(row, start) { // Find the start of the barcode var startInfo = this._findStart(); if (!startInfo) { return null; } // REJECT if barcode starts too late in the scan (>50% of line length) // Valid pharmacodes should be found near the image edge or early in the scan. // Starting too far into the image indicates we're picking up noise or a shifted pattern // (i.e., sampling mid-bar, which reverses the encoding). // This also rejects tilted barcodes that only appear straight at one specific angle. if (startInfo.start > this._row.length * 0.50) { return null; } // Extract bars and spaces var extracted = this._extractBarsAndSpaces(startInfo.start); if (!extracted) { return null; } var bars = extracted.bars, spaces = extracted.spaces, end = extracted.end; // Reject extremely short patterns (total width < 20px) // Calculate actual barcode width from sum of bars and spaces var barsWidth = bars.reduce(function (sum, w) { return sum + w; }, 0); var spacesWidth = spaces.reduce(function (sum, w) { return sum + w; }, 0); var totalBarcodeWidth = barsWidth + spacesWidth; if (totalBarcodeWidth < 20) { return null; } // EDGE-REACH REJECTION: Reject if extraction reaches image boundary // Valid pharmacodes require proper quiet zones per pharmaceutical spec (min 6mm ≈ 16px at typical DPI) // Extractions reaching the image edge (end >= row.length - 2) indicate incomplete/invalid patterns // This catches tilted and curved barcodes that only appear straight at one specific angle var EDGE_MARGIN = 0; // No margin: only reject if extraction goes PAST the row length (shouldn't happen but be safe) var remainingSpace = this._row.length - end; if (remainingSpace < EDGE_MARGIN) { return null; } // Validate space uniformity if (!this._validateSpaces(spaces)) { return null; } // Validate periodicity of bar and space widths to reject tilted/curved barcodes if (!this._validatePeriodicity(bars, spaces)) { return null; } // For short patterns, validate consistency across shifted positions // to reject text/noise patterns that appear as bars due to edge detection if (!this._validatePatternConsistency(startInfo, bars)) { return null; } // Validate bar width ratios are consistent (1:2, 1:2.5, or 1:3) var ratioInfo = this._validateBarRatios(bars, spaces); if (!ratioInfo) { return null; } // Validate quiet zones meet pharmaceutical spec if (!this._validateQuietZones(startInfo, ratioInfo.narrowWidth, end)) { return null; } // Decode the bars, passing the inferred narrowWidth for all-wide/all-narrow patterns var decoded = this._decodeBars(bars, ratioInfo.narrowWidth); if (!decoded) { return null; } var value = decoded.value; // Validate value range if (value < MIN_VALUE || value > MAX_VALUE) { return null; } // Verify trailing whitespace var avgBarWidth = bars.reduce(function (a, b) { return a + b; }, 0) / bars.length; if (!this._verifyTrailingWhitespace(end, avgBarWidth)) { // Soft fail - allow but note it } // Build the decoded codes array for debugging/visualization var decodedCodes = bars.map(function (width, index) { return { code: width > Math.min.apply(Math, toConsumableArray_default()(bars)) * WIDE_BAR_THRESHOLD ? 1 : 0, start: 0, // Could calculate actual positions if needed end: 0, error: 0 }; }); return { code: value.toString(), start: startInfo.start, end: end, startInfo: startInfo, decodedCodes: decodedCodes, pattern: decoded.pattern, format: this.FORMAT }; } }]); }(barcode_reader); defineProperty_default()(pharmacode_reader_PharmacodeReader, "adjacentLineValidationMatches", 1); /* harmony default export */ var pharmacode_reader = (pharmacode_reader_PharmacodeReader); // CONCATENATED MODULE: ./src/reader/upc_e_reader.ts function upc_e_reader_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function upc_e_reader_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? upc_e_reader_ownKeys(Object(t), !0).forEach(function (r) { defineProperty_default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : upc_e_reader_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function upc_e_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, upc_e_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function upc_e_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (upc_e_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function upc_e_reader_superPropGet(t, o, e, r) { var p = get_default()(getPrototypeOf_default()(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } var upc_e_reader_UPCEReader = /*#__PURE__*/function (_EANReader) { function UPCEReader() { var _this; classCallCheck_default()(this, UPCEReader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = upc_e_reader_callSuper(this, UPCEReader, [].concat(args)); defineProperty_default()(_this, "CODE_FREQUENCY", [[56, 52, 50, 49, 44, 38, 35, 42, 41, 37], [7, 11, 13, 14, 19, 25, 28, 21, 22, 26]]); defineProperty_default()(_this, "STOP_PATTERN", [1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7]); defineProperty_default()(_this, "FORMAT", 'upc_e'); return _this; } inherits_default()(UPCEReader, _EANReader); return createClass_default()(UPCEReader, [{ key: "_decodePayload", value: function _decodePayload(inCode, result, decodedCodes) { var outCode = upc_e_reader_objectSpread({}, inCode); var codeFrequency = 0x0; for (var i = 0; i < 6; i++) { outCode = this._decodeCode(outCode.end); if (!outCode) { return null; } if (outCode.code >= CODE_G_START) { outCode.code = outCode.code - CODE_G_START; codeFrequency |= 1 << 5 - i; } result.push(outCode.code); decodedCodes.push(outCode); } if (!this._determineParity(codeFrequency, result)) { return null; } return outCode; } }, { key: "_determineParity", value: function _determineParity(codeFrequency, result) { for (var nrSystem = 0; nrSystem < this.CODE_FREQUENCY.length; nrSystem++) { for (var i = 0; i < this.CODE_FREQUENCY[nrSystem].length; i++) { if (codeFrequency === this.CODE_FREQUENCY[nrSystem][i]) { result.unshift(nrSystem); result.push(i); return true; } } } return false; } }, { key: "_convertToUPCA", value: function _convertToUPCA(result) { var upca = [result[0]]; var lastDigit = result[result.length - 2]; if (lastDigit <= 2) { upca = upca.concat(result.slice(1, 3)).concat([lastDigit, 0, 0, 0, 0]).concat(result.slice(3, 6)); } else if (lastDigit === 3) { upca = upca.concat(result.slice(1, 4)).concat([0, 0, 0, 0, 0]).concat(result.slice(4, 6)); } else if (lastDigit === 4) { upca = upca.concat(result.slice(1, 5)).concat([0, 0, 0, 0, 0, result[5]]); } else { upca = upca.concat(result.slice(1, 6)).concat([0, 0, 0, 0, lastDigit]); } upca.push(result[result.length - 1]); return upca; } }, { key: "_checksum", value: function _checksum(result) { return upc_e_reader_superPropGet(UPCEReader, "_checksum", this, 3)([this._convertToUPCA(result)]); } }, { key: "_findEnd", value: function _findEnd(offset, isWhite) { return upc_e_reader_superPropGet(UPCEReader, "_findEnd", this, 3)([offset, true]); } }, { key: "_verifyTrailingWhitespace", value: function _verifyTrailingWhitespace(endInfo) { var trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start) / 2; if (trailingWhitespaceEnd < this._row.length) { if (this._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) { return endInfo; } } return null; } }]); }(ean_reader); /* harmony default export */ var upc_e_reader = (upc_e_reader_UPCEReader); // CONCATENATED MODULE: ./src/reader/upc_reader.ts function upc_reader_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, upc_reader_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function upc_reader_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (upc_reader_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var upc_reader_UPCReader = /*#__PURE__*/function (_EANReader) { function UPCReader() { var _this; classCallCheck_default()(this, UPCReader); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = upc_reader_callSuper(this, UPCReader, [].concat(args)); defineProperty_default()(_this, "FORMAT", 'upc_a'); return _this; } inherits_default()(UPCReader, _EANReader); return createClass_default()(UPCReader, [{ key: "decode", value: function decode(row, start) { var result = ean_reader.prototype.decode.call(this); if (result && result.code && result.code.length === 13 && result.code.charAt(0) === '0') { result.code = result.code.substring(1); return result; } return null; } }]); }(ean_reader); /* harmony default export */ var upc_reader = (upc_reader_UPCReader); // CONCATENATED MODULE: ./src/decoder/bresenham.js var Bresenham = {}; var Slope = { DIR: { UP: 1, DOWN: -1 } }; /** * Scans a line of the given image from point p1 to p2 and returns a result object containing * gray-scale values (0-255) of the underlying pixels in addition to the min * and max values. * @param {Object} imageWrapper * @param {Object} p1 The start point {x,y} * @param {Object} p2 The end point {x,y} * @returns {line, min, max} */ Bresenham.getBarcodeLine = function (imageWrapper, p1, p2) { /* eslint-disable no-bitwise */ var x0 = p1.x | 0; var y0 = p1.y | 0; var x1 = p2.x | 0; var y1 = p2.y | 0; /* eslint-disable no-bitwise */ var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0); var error; var y; var tmp; var x; var line = []; var imageData = imageWrapper.data; var width = imageWrapper.size.x; var val; var min = 255; var max = 0; function read(a, b) { val = imageData[b * width + a]; min = val < min ? val : min; max = val > max ? val : max; line.push(val); } if (steep) { tmp = x0; x0 = y0; y0 = tmp; tmp = x1; x1 = y1; y1 = tmp; } if (x0 > x1) { tmp = x0; x0 = x1; x1 = tmp; tmp = y0; y0 = y1; y1 = tmp; } var deltaX = x1 - x0; var deltaY = Math.abs(y1 - y0); error = deltaX / 2 | 0; y = y0; var yStep = y0 < y1 ? 1 : -1; for (x = x0; x < x1; x++) { if (steep) { read(y, x); } else { read(x, y); } error -= deltaY; if (error < 0) { y += yStep; error += deltaX; } } return { line: line, min: min, max: max }; }; /** * Converts the result from getBarcodeLine into a binary representation * also considering the frequency and slope of the signal for more robust results * @param {Object} result {line, min, max} */ Bresenham.toBinaryLine = function (result) { var min = result.min; var max = result.max; var line = result.line; var slope; var slope2; var center = min + (max - min) / 2; var extrema = []; var currentDir; var dir; var threshold = (max - min) / 12; var rThreshold = -threshold; var i; var j; // 1. find extrema currentDir = line[0] > center ? Slope.DIR.UP : Slope.DIR.DOWN; extrema.push({ pos: 0, val: line[0] }); for (i = 0; i < line.length - 2; i++) { slope = line[i + 1] - line[i]; slope2 = line[i + 2] - line[i + 1]; if (slope + slope2 < rThreshold && line[i + 1] < center * 1.5) { dir = Slope.DIR.DOWN; } else if (slope + slope2 > threshold && line[i + 1] > center * 0.5) { dir = Slope.DIR.UP; } else { dir = currentDir; } if (currentDir !== dir) { extrema.push({ pos: i, val: line[i] }); currentDir = dir; } } extrema.push({ pos: line.length, val: line[line.length - 1] }); for (j = extrema[0].pos; j < extrema[1].pos; j++) { line[j] = line[j] > center ? 0 : 1; } // iterate over extrema and convert to binary based on avg between minmax for (i = 1; i < extrema.length - 1; i++) { if (extrema[i + 1].val > extrema[i].val) { threshold = extrema[i].val + (extrema[i + 1].val - extrema[i].val) / 3 * 2 | 0; } else { threshold = extrema[i + 1].val + (extrema[i].val - extrema[i + 1].val) / 3 | 0; } for (j = extrema[i].pos; j < extrema[i + 1].pos; j++) { line[j] = line[j] > threshold ? 0 : 1; } } return { line: line, threshold: threshold }; }; /** * Used for development only */ Bresenham.debug = { printFrequency: function printFrequency(line, canvas) { var i; var ctx = canvas.getContext('2d'); // eslint-disable-next-line no-param-reassign canvas.width = line.length; // eslint-disable-next-line no-param-reassign canvas.height = 256; ctx.beginPath(); ctx.strokeStyle = 'blue'; for (i = 0; i < line.length; i++) { ctx.moveTo(i, 255); ctx.lineTo(i, 255 - line[i]); } ctx.stroke(); ctx.closePath(); }, printPattern: function printPattern(line, canvas) { var ctx = canvas.getContext('2d'); var i; // eslint-disable-next-line no-param-reassign canvas.width = line.length; ctx.fillColor = 'black'; for (i = 0; i < line.length; i++) { if (line[i] === 1) { ctx.fillRect(i, 0, 1, 100); } } } }; /* harmony default export */ var bresenham = (Bresenham); // CONCATENATED MODULE: ./src/decoder/barcode_decoder.js function barcode_decoder_createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = barcode_decoder_unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function barcode_decoder_unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return barcode_decoder_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? barcode_decoder_arrayLikeToArray(r, a) : void 0; } } function barcode_decoder_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } /* eslint-disable import/no-cycle */ /** * Barcode Decoder Module * * This module handles the decoding of barcodes using configured readers. * * READER ORDER GUARANTEE: * Readers are processed in the exact order they are specified in the `readers` * config array. The first reader to successfully decode the barcode wins. * * Example: * readers: ['ean_reader', 'upc_e_reader', 'code_128_reader'] * * Decoding order: * 1. ean_reader attempts to decode * 2. If ean_reader returns null, upc_e_reader attempts to decode * 3. If upc_e_reader returns null, code_128_reader attempts to decode * 4. First non-null result is returned * * EXTERNAL READERS: * External readers must be registered via registerReader() before use. * Once registered, they follow the same ordering rules as built-in readers. * Their position in the `readers` array determines their priority. * * To prioritize an external reader: * Quagga.registerReader('my_reader', MyReader); * config.decoder.readers = ['my_reader', 'ean_reader']; // my_reader tried first */ var READERS = { code_128_reader: code_128_reader, ean_reader: ean_reader, ean_5_reader: ean_5_reader, ean_2_reader: ean_2_reader, ean_8_reader: ean_8_reader, code_39_reader: code_39_reader, code_39_vin_reader: code_39_vin_reader, codabar_reader: codabar_reader, upc_reader: upc_reader, upc_e_reader: upc_e_reader, i2of5_reader: i2of5_reader, '2of5_reader': _2of5_reader, code_93_reader: code_93_reader, code_32_reader: code_32_reader, pharmacode_reader: pharmacode_reader }; /* harmony default export */ var barcode_decoder = ({ /** * Registers an external/custom barcode reader. * Once registered, the reader can be used in config.readers array. * The reader's position in config.readers determines its decoding priority. * * @param name - The identifier to use in config.readers (e.g., 'my_custom_reader') * @param reader - The reader class (must extend BarcodeReader) * * @example * // Register a custom reader * BarcodeDecoder.registerReader('my_reader', MyCustomReader); * * // Use it with high priority (first in array) * config.decoder.readers = ['my_reader', 'ean_reader', 'code_128_reader']; */ registerReader: function registerReader(name, reader) { READERS[name] = reader; }, create: function create(config, inputImageWrapper) { var _canvas = { ctx: { frequency: null, pattern: null, overlay: null }, dom: { frequency: null, pattern: null, overlay: null } }; var _barcodeReaders = []; initCanvas(); initReaders(); initConfig(); function initCanvas() { if ( true && typeof document !== 'undefined') { var _config$debug; var $debug = document.querySelector('#debug.detection'); _canvas.dom.frequency = document.querySelector('canvas.frequency'); if (!_canvas.dom.frequency) { _canvas.dom.frequency = document.createElement('canvas'); _canvas.dom.frequency.className = 'frequency'; if ($debug) { $debug.appendChild(_canvas.dom.frequency); } } if ( true && (_config$debug = config.debug) !== null && _config$debug !== void 0 && _config$debug.printReaderInfo) { console.warn('* barcode decoder initCanvas getcontext 2d'); } _canvas.ctx.frequency = _canvas.dom.frequency.getContext('2d'); _canvas.dom.pattern = document.querySelector('canvas.patternBuffer'); if (!_canvas.dom.pattern) { _canvas.dom.pattern = document.createElement('canvas'); _canvas.dom.pattern.className = 'patternBuffer'; if ($debug) { $debug.appendChild(_canvas.dom.pattern); } } _canvas.ctx.pattern = _canvas.dom.pattern.getContext('2d'); _canvas.dom.overlay = document.querySelector('canvas.drawingBuffer'); if (_canvas.dom.overlay) { _canvas.ctx.overlay = _canvas.dom.overlay.getContext('2d'); } } } /** * Initializes barcode readers from config.readers array. * Readers are instantiated and stored in the order they appear in config, * which determines their decoding priority (first in array = highest priority). */ function initReaders() { var _config$debug3; config.readers.forEach(function (readerConfig) { var _config$debug2; var reader; var configuration = {}; var supplements = []; if (typeof_default()(readerConfig) === 'object') { reader = readerConfig.format; configuration = readerConfig.config; } else if (typeof readerConfig === 'string') { reader = readerConfig; } if ( true && (_config$debug2 = config.debug) !== null && _config$debug2 !== void 0 && _config$debug2.printReaderInfo) { console.log('Before registering reader: ', reader); } if (configuration.supplements) { supplements = configuration.supplements.map(function (supplement) { return new READERS[supplement](); }); } try { var readerObj = new READERS[reader](configuration, supplements); _barcodeReaders.push(readerObj); } catch (err) { console.error('* Error constructing reader ', reader, err); throw err; } }); if ( true && (_config$debug3 = config.debug) !== null && _config$debug3 !== void 0 && _config$debug3.printReaderInfo) { console.log("Registered Readers: ".concat(_barcodeReaders.map(function (reader) { return JSON.stringify({ format: reader.FORMAT, config: reader.config }); }).join(', '))); } } function initConfig() { if ( true && typeof document !== 'undefined') { var i; var vis = [{ node: _canvas.dom.frequency, prop: config.debug.showFrequency }, { node: _canvas.dom.pattern, prop: config.debug.showPattern }]; for (i = 0; i < vis.length; i++) { if (vis[i].prop === true) { vis[i].node.style.display = 'block'; } else { vis[i].node.style.display = 'none'; } } } } /** * extend the line on both ends * @param {Array} line * @param {Number} angle */ function getExtendedLine(line, angle, ext) { function extendLine(amount) { var extension = { y: amount * Math.sin(angle), x: amount * Math.cos(angle) }; /* eslint-disable no-param-reassign */ line[0].y -= extension.y; line[0].x -= extension.x; line[1].y += extension.y; line[1].x += extension.x; /* eslint-enable no-param-reassign */ } // check if inside image extendLine(ext); while (ext > 1 && (!inputImageWrapper.inImageWithBorder(line[0]) || !inputImageWrapper.inImageWithBorder(line[1]))) { // eslint-disable-next-line no-param-reassign ext -= Math.ceil(ext / 2); extendLine(-ext); } return line; } function getLine(box) { return [{ x: (box[1][0] - box[0][0]) / 2 + box[0][0], y: (box[1][1] - box[0][1]) / 2 + box[0][1] }, { x: (box[3][0] - box[2][0]) / 2 + box[2][0], y: (box[3][1] - box[2][1]) / 2 + box[2][1] }]; } /** * Validate that barcode position is stable across adjacent Y-scanlines. * Real barcodes have consistent start position; tilted barcodes shift left/right as Y changes. * @param {Array} line The original scan line [p1, p2] * @param {Object} result The successful decode result with .start position * @param {Object} reader The reader instance that succeeded * @param {Object} inputImageWrapper The full image data * @returns {boolean} true if barcode position is stable (≥1 adjacent Y-line matches) */ function validateAdjacentYLines(line, result, reader, inputImageWrapper) { // Extract original Y position and X start position var originalY = Math.round(line[1].y); var originalXStart = result.start; var constructorFn = reader.constructor; var requiredMatches = constructorFn && constructorFn.adjacentLineValidationMatches || 0; if (requiredMatches <= 0) { return true; } var matchCount = 0; var done = false; // Check Y±1, Y±2, Y±3 to see if barcode appears at same X position for (var _i = 0, _arr = [1, 2, 3]; _i < _arr.length; _i++) { var yOffset = _arr[_i]; if (done) { break; } for (var _i2 = 0, _arr2 = [-1, 1]; _i2 < _arr2.length; _i2++) { var direction = _arr2[_i2]; if (done) { break; } var newY = originalY + yOffset * direction; // Bounds check if (newY < 0 || newY >= inputImageWrapper.size.y) { continue; } // Create new line at adjusted Y, keeping same X range var newP1 = { x: line[0].x, y: newY }; var newP2 = { x: line[1].x, y: newY }; try { // Extract grayscale at new Y var newBarcodeLine = bresenham.getBarcodeLine(inputImageWrapper, newP1, newP2); // Binarize bresenham.toBinaryLine(newBarcodeLine); // Set the row for _findStart() to search in reader._row = newBarcodeLine.line; // Try to find barcode start at this Y var startFound = reader._findStart(); if (startFound !== null && startFound.start === originalXStart) { matchCount++; if (matchCount >= requiredMatches) { done = true; break; } } } catch (e) { // Ignore errors, treat failures as "no match" so we can try again on the next line } } } var isValid = matchCount >= requiredMatches; return isValid; } /** * Attempts to decode a barcode from a scan line. * Readers are tried in order (as specified in config.readers). * The first reader to return a non-null result wins. * @param {Array} line The scan line to decode * @returns {Object|null} Decoded result or null if no reader succeeded */ function tryDecode(line) { var result = null; var i; var barcodeLine = bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]); if ( true && config.debug.showFrequency) { if (_canvas.ctx.overlay) { image_debug.drawPath(line, { x: 'x', y: 'y' }, _canvas.ctx.overlay, { color: 'red', lineWidth: 3 }); } bresenham.debug.printFrequency(barcodeLine.line, _canvas.dom.frequency); } bresenham.toBinaryLine(barcodeLine); if ( true && config.debug.showPattern) { bresenham.debug.printPattern(barcodeLine.line, _canvas.dom.pattern); } // Iterate readers in order - first successful decode wins var successfulReaderIndex = -1; for (i = 0; i < _barcodeReaders.length && result === null; i++) { // Provide image context to readers that want it (e.g., pharmacode PGM dumps) if (typeof _barcodeReaders[i].setImageWrapper === 'function') { _barcodeReaders[i].setImageWrapper(inputImageWrapper); } result = _barcodeReaders[i].decodePattern(barcodeLine.line); if (result !== null) { successfulReaderIndex = i; } } if (result === null) { return null; } // Validate that barcode position is stable across adjacent Y-scanlines // This rejects tilted barcodes that only appear valid at one specific angle // Only apply to PharmacodeReader (which explicitly made _findStart public for this validation) if (successfulReaderIndex >= 0 && _barcodeReaders[successfulReaderIndex] instanceof pharmacode_reader) { if (!validateAdjacentYLines(line, result, _barcodeReaders[successfulReaderIndex], inputImageWrapper)) { return null; } } return { codeResult: result, barcodeLine: barcodeLine }; } /** * This method slices the given area apart and tries to detect a barcode-pattern * for each slice. It returns the decoded barcode, or null if nothing was found * @param {Array} box * @param {Array} line * @param {Number} lineAngle */ function tryDecodeBruteForce(box, line, lineAngle) { var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow(box[1][1] - box[0][1], 2)); var i; var slices = 16; var result = null; var dir; var extension; var xdir = Math.sin(lineAngle); var ydir = Math.cos(lineAngle); for (i = 1; i < slices && result === null; i++) { // move line perpendicular to angle // eslint-disable-next-line no-mixed-operators dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1); extension = { y: dir * xdir, x: dir * ydir }; /* eslint-disable no-param-reassign */ line[0].y += extension.x; line[0].x -= extension.y; line[1].y += extension.x; line[1].x -= extension.y; /* eslint-enable no-param-reassign */ result = tryDecode(line); } return result; } function getLineLength(line) { return Math.sqrt(Math.pow(Math.abs(line[1].y - line[0].y), 2) + Math.pow(Math.abs(line[1].x - line[0].x), 2)); } /** * Decodes from a full image using readers that support image-based decoding. * Readers are tried in order (as specified in config.readers). * @param {Object} imageWrapper The image to decode * @returns {Object|null} Decoded result or null */ function _decodeFromImage2(_x) { return _decodeFromImage.apply(this, arguments); } /** * With the help of the configured readers (Code128 or EAN) this function tries to detect a * valid barcode pattern within the given area. * @param {Object} box The area to search in * @returns {Object} the result {codeResult, line, angle, pattern, threshold} */ function _decodeFromImage() { _decodeFromImage = asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee2(imageWrapper) { var result, _iterator, _step, reader, _t; return regenerator_default.a.wrap(function (_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: result = null; // Iterate readers in order - first successful decode wins _iterator = barcode_decoder_createForOfIteratorHelper(_barcodeReaders); _context2.prev = 1; _iterator.s(); case 2: if ((_step = _iterator.n()).done) { _context2.next = 5; break; } reader = _step.value; if (!reader.decodeImage) { _context2.next = 4; break; } _context2.next = 3; return reader.decodeImage(imageWrapper); case 3: result = _context2.sent; if (!result) { _context2.next = 4; break; } return _context2.abrupt("continue", 5); case 4: _context2.next = 2; break; case 5: _context2.next = 7; break; case 6: _context2.prev = 6; _t = _context2["catch"](1); _iterator.e(_t); case 7: _context2.prev = 7; _iterator.f(); return _context2.finish(7); case 8: return _context2.abrupt("return", result); case 9: case "end": return _context2.stop(); } }, _callee2, null, [[1, 6, 7, 8]]); })); return _decodeFromImage.apply(this, arguments); } function _decodeFromBoundingBox(box) { var line; var ctx = _canvas.ctx.overlay; var result; if (true) { if (config.debug.drawBoundingBox && ctx) { image_debug.drawPath(box, { x: 0, y: 1 }, ctx, { color: 'blue', lineWidth: 2 }); } } line = getLine(box); var lineLength = getLineLength(line); var lineAngle = Math.atan2(line[1].y - line[0].y, line[1].x - line[0].x); line = getExtendedLine(line, lineAngle, Math.floor(lineLength * 0.1)); if (line === null) { return null; } result = tryDecode(line); if (result === null) { result = tryDecodeBruteForce(box, line, lineAngle); } if (result === null) { return null; } if ( true && result && config.debug.drawScanline && ctx) { image_debug.drawPath(line, { x: 'x', y: 'y' }, ctx, { color: 'red', lineWidth: 3 }); } return { codeResult: result.codeResult, line: line, angle: lineAngle, pattern: result.barcodeLine.line, threshold: result.barcodeLine.threshold }; } return { decodeFromBoundingBox: function decodeFromBoundingBox(box) { return _decodeFromBoundingBox(box); }, decodeFromBoundingBoxes: function decodeFromBoundingBoxes(boxes) { var i; var result; var barcodes = []; var multiple = config.multiple; for (i = 0; i < boxes.length; i++) { var box = boxes[i]; result = _decodeFromBoundingBox(box) || {}; result.box = box; if (multiple) { barcodes.push(result); } else if (result.codeResult) { return result; } } return { barcodes: barcodes }; }, decodeFromImage: function decodeFromImage(imageWrapperIn) { return asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee() { var result; return regenerator_default.a.wrap(function (_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 1; return _decodeFromImage2(imageWrapperIn); case 1: result = _context.sent; return _context.abrupt("return", result); case 2: case "end": return _context.stop(); } }, _callee); }))(); }, registerReader: function registerReader(name, reader) { if (READERS[name]) { throw new Error('cannot register existing reader', name); } READERS[name] = reader; }, setReaders: function setReaders(readers) { // eslint-disable-next-line no-param-reassign config.readers = readers; _barcodeReaders.length = 0; initReaders(); } }; } }); // CONCATENATED MODULE: ./src/reader/index.ts // CONCATENATED MODULE: ./src/common/events.ts /* harmony default export */ var events = ((function EventInterface() { var events = {}; function getEvent(eventName) { if (!events[eventName]) { events[eventName] = { subscribers: [] }; } return events[eventName]; } function clearEvents() { events = {}; } function publishSubscription(subscription, data) { if (subscription.async) { setTimeout(function () { subscription.callback(data); }, 4); } else { subscription.callback(data); } } function _subscribe(event, callback, async) { var subscription; if (typeof callback === 'function') { subscription = { callback: callback, async: async }; } else { subscription = callback; if (!subscription.callback) { throw new Error('Callback was not specified on options'); } } getEvent(event).subscribers.push(subscription); } return { subscribe: function subscribe(event, callback, async) { return _subscribe(event, callback, async); }, publish: function publish(eventName, data) { var event = getEvent(eventName); var subscribers = event.subscribers; // Publish one-time subscriptions subscribers.filter(function (subscriber) { return !!subscriber.once; }).forEach(function (subscriber) { publishSubscription(subscriber, data); }); // remove them from the subscriber event.subscribers = subscribers.filter(function (subscriber) { return !subscriber.once; }); // publish the rest event.subscribers.forEach(function (subscriber) { publishSubscription(subscriber, data); }); }, once: function once(event, callback) { var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; _subscribe(event, { callback: callback, async: async, once: true }); }, unsubscribe: function unsubscribe(eventName, callback) { if (eventName) { var _event = getEvent(eventName); if (_event && callback) { _event.subscribers = _event.subscribers.filter(function (subscriber) { return subscriber.callback !== callback; }); } else { _event.subscribers = []; } } else { clearEvents(); } } }; })()); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/objectWithoutProperties.js var objectWithoutProperties = __webpack_require__(81); var objectWithoutProperties_default = /*#__PURE__*/__webpack_require__.n(objectWithoutProperties); // EXTERNAL MODULE: ./node_modules/lodash/omit.js var omit = __webpack_require__(82); var omit_default = /*#__PURE__*/__webpack_require__.n(omit); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/wrapNativeSuper.js var wrapNativeSuper = __webpack_require__(83); var wrapNativeSuper_default = /*#__PURE__*/__webpack_require__.n(wrapNativeSuper); // CONCATENATED MODULE: ./src/quagga/Exception.ts function Exception_callSuper(t, o, e) { return o = getPrototypeOf_default()(o), possibleConstructorReturn_default()(t, Exception_isNativeReflectConstruct() ? Reflect.construct(o, e || [], getPrototypeOf_default()(t).constructor) : o.apply(t, e)); } function Exception_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (Exception_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var Exception_Exception = /*#__PURE__*/function (_Error) { function Exception(m, code) { var _this; classCallCheck_default()(this, Exception); _this = Exception_callSuper(this, Exception, [m]); defineProperty_default()(_this, "code", void 0); _this.code = code; Object.setPrototypeOf(_this, Exception.prototype); return _this; } /** * Custom JSON serialization to ensure error message is included. * The Error class's message property is non-enumerable by default, * so JSON.stringify would only include {code: -1} without this method. * This ensures consumers receive meaningful error information. */ inherits_default()(Exception, _Error); return createClass_default()(Exception, [{ key: "toJSON", value: function toJSON() { return { name: this.name, message: this.message, code: this.code }; } }]); }(/*#__PURE__*/wrapNativeSuper_default()(Error)); // CONCATENATED MODULE: ./src/common/mediaDevices.ts var ERROR_DESC = 'This may mean that the user has declined camera access, or the browser does not support media APIs. If you are running in iOS, you must use Safari.'; function enumerateDevices() { try { return navigator.mediaDevices.enumerateDevices(); } catch (err) { var error = new Exception_Exception("enumerateDevices is not defined. ".concat(ERROR_DESC), -1); return Promise.reject(error); } } function getUserMedia(constraints) { try { return navigator.mediaDevices.getUserMedia(constraints); } catch (err) { var error = new Exception_Exception("getUserMedia is not defined. ".concat(ERROR_DESC), -1); return Promise.reject(error); } } // CONCATENATED MODULE: ./src/input/camera_access.ts var _excluded = ["deviceId"]; function camera_access_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function camera_access_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? camera_access_ownKeys(Object(t), !0).forEach(function (r) { defineProperty_default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : camera_access_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function camera_access_createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = camera_access_unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function camera_access_unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return camera_access_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? camera_access_arrayLikeToArray(r, a) : void 0; } } function camera_access_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // TODO: when this file was written years ago, HTMLMediaElement.play() did not return a useful value // to let us know when the video started playing. Now, it does. So, we shouldn't need to run this // odd waitForVideo() function that polls to see if the video has started. var streamRef; function waitForVideo(video) { return new Promise(function (resolve, reject) { var attempts = 10; function checkVideo() { if (attempts > 0) { if (video.videoWidth > 10 && video.videoHeight > 10) { if (true) { console.log("* dev: checkVideo found ".concat(video.videoWidth, "px x ").concat(video.videoHeight, "px")); } resolve(); } else { window.setTimeout(checkVideo, 500); } } else { reject(new Exception_Exception('Unable to play video stream. Is webcam working?', -1)); // TODO: add error code } attempts--; } checkVideo(); }); } /** * Tries to attach the camera-stream to a given video-element * and calls the callback function when the content is ready * @param {Object} constraints * @param {Object} video */ function initCamera(_x, _x2) { return _initCamera.apply(this, arguments); } function _initCamera() { _initCamera = asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee4(video, constraints) { var stream; return regenerator_default.a.wrap(function (_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.next = 1; return getUserMedia(constraints); case 1: stream = _context4.sent; streamRef = stream; if (!video) { _context4.next = 2; break; } video.setAttribute('autoplay', 'true'); video.setAttribute('muted', 'true'); video.setAttribute('playsinline', 'true'); // not listed on MDN... // eslint-disable-next-line no-param-reassign video.srcObject = stream; video.addEventListener('loadedmetadata', function () { video.play()["catch"](function (err) { console.warn('* Error while trying to play video stream:', err); }); }); return _context4.abrupt("return", waitForVideo(video)); case 2: return _context4.abrupt("return", Promise.resolve()); case 3: case "end": return _context4.stop(); } }, _callee4); })); return _initCamera.apply(this, arguments); } function deprecatedConstraints(videoConstraints) { // Remove deprecated properties (facing, minAspectRatio, maxAspectRatio) while // preserving all valid MediaTrackConstraints including advanced, zoom, torch, etc. var normalized = omit_default()(videoConstraints, ['facing', 'minAspectRatio', 'maxAspectRatio']); if (typeof videoConstraints.minAspectRatio !== 'undefined' && videoConstraints.minAspectRatio > 0) { normalized.aspectRatio = videoConstraints.minAspectRatio; console.log('WARNING: Constraint \'minAspectRatio\' is deprecated; Use \'aspectRatio\' instead'); } if (typeof videoConstraints.facing !== 'undefined') { normalized.facingMode = videoConstraints.facing; console.log('WARNING: Constraint \'facing\' is deprecated. Use \'facingMode\' instead\''); } return normalized; } // TODO: #192 I don't think there's any good reason pickConstraints should return a Promise, // I think it was just that way so it could be chained to other functions that did return a Promise. // That's not necessary with async functions being a thing, so that should be fixed. function pickConstraints() { var videoConstraints = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var video = deprecatedConstraints(videoConstraints); if (video && video.deviceId && video.facingMode) { delete video.facingMode; } return Promise.resolve({ audio: false, video: video }); } /** * Enumerates video input devices, optionally filtering by constraints. * @param videoConstraints Optional constraints to filter devices. * When provided, only devices that satisfy the given constraints will be returned. * This works by attempting to get a media stream for each device with the constraints * and returning only the devices that succeed. * @returns Promise resolving to an array of MediaDeviceInfo for video input devices. */ function enumerateVideoDevices(_x3) { return _enumerateVideoDevices.apply(this, arguments); } function _enumerateVideoDevices() { _enumerateVideoDevices = asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee5(videoConstraints) { var devices, videoDevices, constrainedDevices, processedConstraints, _, constraintsWithoutDeviceId, _iterator, _step, device, constraints, stream, _t3, _t4; return regenerator_default.a.wrap(function (_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _context5.next = 1; return enumerateDevices(); case 1: devices = _context5.sent; videoDevices = devices.filter(function (device) { return device.kind === 'videoinput'; }); // If no constraints are provided, return all video devices if (videoConstraints) { _context5.next = 2; break; } return _context5.abrupt("return", videoDevices); case 2: // Filter devices based on constraints by trying to get a media stream for each constrainedDevices = []; // Process constraints but exclude deviceId since we'll set it ourselves for each device processedConstraints = deprecatedConstraints(videoConstraints); // eslint-disable-next-line @typescript-eslint/no-unused-vars _ = processedConstraints.deviceId, constraintsWithoutDeviceId = objectWithoutProperties_default()(processedConstraints, _excluded); _iterator = camera_access_createForOfIteratorHelper(videoDevices); _context5.prev = 3; _iterator.s(); case 4: if ((_step = _iterator.n()).done) { _context5.next = 9; break; } device = _step.value; _context5.prev = 5; constraints = { audio: false, video: camera_access_objectSpread(camera_access_objectSpread({}, constraintsWithoutDeviceId), {}, { deviceId: { exact: device.deviceId } }) }; _context5.next = 6; return getUserMedia(constraints); case 6: stream = _context5.sent; // Stop all tracks immediately after testing stream.getTracks().forEach(function (track) { return track.stop(); }); constrainedDevices.push(device); _context5.next = 8; break; case 7: _context5.prev = 7; _t3 = _context5["catch"](5); case 8: _context5.next = 4; break; case 9: _context5.next = 11; break; case 10: _context5.prev = 10; _t4 = _context5["catch"](3); _iterator.e(_t4); case 11: _context5.prev = 11; _iterator.f(); return _context5.finish(11); case 12: return _context5.abrupt("return", constrainedDevices); case 13: case "end": return _context5.stop(); } }, _callee5, null, [[3, 10, 11, 12], [5, 7]]); })); return _enumerateVideoDevices.apply(this, arguments); } function getActiveTrack() { if (!streamRef) { return null; } var tracks = streamRef.getVideoTracks(); return tracks && tracks !== null && tracks !== void 0 && tracks.length ? tracks[0] : null; } /** * Returns the active MediaStream, or null if no stream is active. * Use this when you need access to the full stream, for example to pass to WebRTC * or to clone the stream. For just the video track, use getActiveTrack() instead. * @returns The active MediaStream, or null if no camera is currently active. */ function getActiveStream() { var _streamRef; return (_streamRef = streamRef) !== null && _streamRef !== void 0 ? _streamRef : null; } /** * Used for accessing information about the active stream track and available video devices. */ var QuaggaJSCameraAccess = { requestedVideoElement: null, request: function request(video, videoConstraints) { return asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee() { var newConstraints; return regenerator_default.a.wrap(function (_context) { while (1) switch (_context.prev = _context.next) { case 0: QuaggaJSCameraAccess.requestedVideoElement = video; _context.next = 1; return pickConstraints(videoConstraints); case 1: newConstraints = _context.sent; return _context.abrupt("return", initCamera(video, newConstraints)); case 2: case "end": return _context.stop(); } }, _callee); }))(); }, release: function release() { var tracks = streamRef && streamRef.getVideoTracks(); if (QuaggaJSCameraAccess.requestedVideoElement !== null) { QuaggaJSCameraAccess.requestedVideoElement.pause(); } return new Promise(function (resolve) { setTimeout(function () { if (tracks && tracks.length) { tracks.forEach(function (track) { return track.stop(); }); } streamRef = null; QuaggaJSCameraAccess.requestedVideoElement = null; resolve(); }, 0); }); }, enumerateVideoDevices: enumerateVideoDevices, getActiveStream: getActiveStream, getActiveStreamLabel: function getActiveStreamLabel() { var track = getActiveTrack(); return track ? track.label : ''; }, getActiveTrack: getActiveTrack, disableTorch: function disableTorch() { return asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee2() { var track, _t; return regenerator_default.a.wrap(function (_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: track = getActiveTrack(); // TODO: should we acquire camera access even if there's no current camera open? // TODO: what happens on iOS or another device where torch isn't supported at all? Should we throw an error? if (!track) { _context2.next = 4; break; } _context2.prev = 1; _context2.next = 2; return track.applyConstraints({ advanced: [{ torch: false }] }); case 2: _context2.next = 4; break; case 3: _context2.prev = 3; _t = _context2["catch"](1); if (_t instanceof OverconstrainedError) { console.warn('quagga2/CameraAccess: Torch not supported on this device'); } throw _t; case 4: case "end": return _context2.stop(); } }, _callee2, null, [[1, 3]]); }))(); }, enableTorch: function enableTorch() { return asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee3() { var track, _t2; return regenerator_default.a.wrap(function (_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: track = getActiveTrack(); // TODO: should we acquire camera access even if there's no current camera open? // TODO: what happens on iOS or another device where torch isn't supported at all? Should we throw an error? if (!track) { _context3.next = 4; break; } _context3.prev = 1; _context3.next = 2; return track.applyConstraints({ advanced: [{ torch: true }] }); case 2: _context3.next = 4; break; case 3: _context3.prev = 3; _t2 = _context3["catch"](1); if (_t2 instanceof OverconstrainedError) { console.warn('quagga2/CameraAccess: Torch not supported on this device'); } throw _t2; case 4: case "end": return _context3.stop(); } }, _callee3, null, [[1, 3]]); }))(); } }; /* harmony default export */ var camera_access = (QuaggaJSCameraAccess); // CONCATENATED MODULE: ./src/analytics/result_collector.ts function contains(codeResult, list) { return list && list.some(function (item) { var keys = Object.keys(item); return keys.every(function (key) { return item[key] === codeResult[key]; }); }); } function passesFilter(codeResult, filter) { return typeof filter === 'function' ? filter(codeResult) : true; } /* harmony default export */ var result_collector = ({ create: function create(config) { var _config$capacity; var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d', { willReadFrequently: !!config.willReadFrequently }); var results = []; var capacity = (_config$capacity = config.capacity) !== null && _config$capacity !== void 0 ? _config$capacity : 20; var capture = config.capture === true; function matchesConstraints(codeResult) { return !!capacity && codeResult && !contains(codeResult, config.blacklist) && passesFilter(codeResult, config.filter); } return { addResult: function addResult(data, imageSize, codeResult) { var result = {}; // this is 'any' to avoid having to construct a whole QuaggaJSCodeResult :| if (matchesConstraints(codeResult)) { capacity--; result.codeResult = codeResult; if (capture) { canvas.width = imageSize.x; canvas.height = imageSize.y; image_debug.drawImage(data, imageSize, ctx); result.frame = canvas.toDataURL(); } results.push(result); } }, getResults: function getResults() { return results; } }; } }); // CONCATENATED MODULE: ./src/config/config.dev.ts var DevConfig = { inputStream: { type: 'LiveStream', constraints: { width: 640, height: 480, // aspectRatio: 640/480, // optional facingMode: 'environment' // or user // deviceId: "38745983457387598375983759834" }, area: { top: '0%', right: '0%', left: '0%', bottom: '0%' // borderColor: 'rgba(0, 255, 0, 0.5)', // uncomment to draw area border // borderWidth: 2, // uncomment to draw area border // backgroundColor: 'rgba(0, 255, 0, 0.1)', // uncomment to tint the scan area }, singleChannel: false, // true: only the red color-channel is read debug: { showImageDetails: false // logs frame grabber info, canvas size adjustments } }, locate: true, canvas: { createOverlay: true // set to false to skip creating overlay canvas (drawingBuffer) }, decoder: { readers: ['code_128_reader'], debug: { drawBoundingBox: false, showFrequency: false, drawScanline: false, showPattern: false, printReaderInfo: false // logs reader registration and initialization } }, locator: { halfSample: true, patchSize: 'medium', // x-small, small, medium, large, x-large debug: { showCanvas: false, showPatches: false, showFoundPatches: false, showSkeleton: false, showLabels: false, showPatchLabels: false, showRemainingPatchLabels: false, showPatchSize: false, // logs calculated patch size showImageDetails: false, // logs image wrapper size, canvas details boxFromPatches: { showTransformed: false, showTransformedBox: false, showBB: false } } } }; /* harmony default export */ var config_dev = (DevConfig); // CONCATENATED MODULE: ./src/config/config.node.ts var NodeConfig = { inputStream: { type: 'ImageStream', sequence: false, size: 800, area: { top: '0%', right: '0%', left: '0%', bottom: '0%' }, singleChannel: false // true: only the red color-channel is read }, locate: true, canvas: { createOverlay: true // set to false to skip creating overlay canvas (drawingBuffer) }, decoder: { readers: ['code_128_reader'] }, locator: { halfSample: true, patchSize: 'medium' // x-small, small, medium, large, x-large } }; /* harmony default export */ var config_node = (NodeConfig); // CONCATENATED MODULE: ./src/config/config.prod.ts var ProdConfig = { inputStream: { type: 'LiveStream', constraints: { width: 640, height: 480, // aspectRatio: 640/480, // optional facingMode: 'environment' // or user // deviceId: "38745983457387598375983759834" }, area: { top: '0%', right: '0%', left: '0%', bottom: '0%' }, singleChannel: false // true: only the red color-channel is read }, locate: true, canvas: { createOverlay: true // set to false to skip creating overlay canvas (drawingBuffer) }, decoder: { readers: ['code_128_reader'] }, locator: { halfSample: true, patchSize: 'medium' // x-small, small, medium, large, x-large } }; /* harmony default export */ var config_prod = (ProdConfig); // CONCATENATED MODULE: ./src/config/config.ts var ExportConfig = function () { var QuaggaConfig; if (true) { QuaggaConfig = config_dev; } else {} return QuaggaConfig; }(); /* harmony default export */ var config_config = (ExportConfig); // CONCATENATED MODULE: ./src/input/frame_grabber_browser.js // NOTE FOR ANYONE IN HERE IN THE FUTURE: // webpack.config.js replaces the frame_grabber module with THIS module when it is building for a Browser environment. var TO_RADIANS = Math.PI / 180; function adjustCanvasSize(canvas, targetSize, debug) { if (canvas.width !== targetSize.x) { if ( true && debug !== null && debug !== void 0 && debug.showImageDetails) { console.log('WARNING: canvas-size needs to be adjusted'); } canvas.width = targetSize.x; } if (canvas.height !== targetSize.y) { if ( true && debug !== null && debug !== void 0 && debug.showImageDetails) { console.log('WARNING: canvas-size needs to be adjusted'); } canvas.height = targetSize.y; } } var FrameGrabber = {}; FrameGrabber.create = function (inputStream, canvas) { var _streamConfig$debug, _streamConfig$debug2; // console.warn('*** FrameGrabberBrowser create'); var _that = {}; var _streamConfig = inputStream.getConfig(); var _videoSize = imageRef(inputStream.getRealWidth(), inputStream.getRealHeight()); var _canvasSize = inputStream.getCanvasSize(); var _size = imageRef(inputStream.getWidth(), inputStream.getHeight()); var topRight = inputStream.getTopRight(); var _sx = topRight.x; var _sy = topRight.y; var _canvas; var _ctx = null; var _data = null; var willReadFrequently = _streamConfig.willReadFrequently; _canvas = canvas || document.createElement('canvas'); _canvas.width = _canvasSize.x; _canvas.height = _canvasSize.y; if ( true && (_streamConfig$debug = _streamConfig.debug) !== null && _streamConfig$debug !== void 0 && _streamConfig$debug.showImageDetails) { console.warn('*** frame_grabber_browser: willReadFrequently=', willReadFrequently, 'canvas=', _canvas); } _ctx = _canvas.getContext('2d', { willReadFrequently: !!willReadFrequently }); // double not because we have an optional bool that needs to pass as a bool _data = new Uint8Array(_size.x * _size.y); if ( true && (_streamConfig$debug2 = _streamConfig.debug) !== null && _streamConfig$debug2 !== void 0 && _streamConfig$debug2.showImageDetails) { console.log('FrameGrabber', JSON.stringify({ size: _size, topRight: topRight, videoSize: _videoSize, canvasSize: _canvasSize })); } /** * Uses the given array as frame-buffer */ _that.attachData = function (data) { _data = data; }; /** * Returns the used frame-buffer */ _that.getData = function () { return _data; }; // Bilinear interpolation for grayscale data (to match Node's behavior) function bilinearInterpolate(grayData, width, height, x, y) { var x0 = Math.floor(x); var y0 = Math.floor(y); var x1 = Math.min(x0 + 1, width - 1); var y1 = Math.min(y0 + 1, height - 1); var fx = x - x0; var fy = y - y0; var v00 = grayData[y0 * width + x0]; var v10 = grayData[y0 * width + x1]; var v01 = grayData[y1 * width + x0]; var v11 = grayData[y1 * width + x1]; var v0 = v00 * (1 - fx) + v10 * fx; var v1 = v01 * (1 - fx) + v11 * fx; return v0 * (1 - fy) + v1 * fy; } /** * Fetches a frame from the input-stream and puts into the frame-buffer. * The image-data is converted to gray-scale and then half-sampled if configured. * * For improved accuracy (matching Node's processing), non-half-sampled images * use bilinear interpolation on grayscale data instead of scaling RGB then converting. * * IMPORTANT: The image is ALWAYS drawn to the visible canvas for overlays and display. */ _that.grab = function () { var doHalfSample = _streamConfig.halfSample; var frame = inputStream.getFrame(); var drawable = frame; var drawAngle = 0; if (drawable) { adjustCanvasSize(_canvas, _canvasSize, _streamConfig.debug); if (_streamConfig.type === 'ImageStream') { drawable = frame.img; if (frame.tags && frame.tags.orientation) { switch (frame.tags.orientation) { case 6: drawAngle = 90 * TO_RADIANS; break; case 8: drawAngle = -90 * TO_RADIANS; break; } } } // ALWAYS draw to visible canvas (for overlays, display, and toDataURL) if (drawAngle !== 0) { _ctx.translate(_canvasSize.x / 2, _canvasSize.y / 2); _ctx.rotate(drawAngle); _ctx.drawImage(drawable, -_canvasSize.y / 2, -_canvasSize.x / 2, _canvasSize.y, _canvasSize.x); _ctx.rotate(-drawAngle); _ctx.translate(-_canvasSize.x / 2, -_canvasSize.y / 2); } else { _ctx.drawImage(drawable, 0, 0, _canvasSize.x, _canvasSize.y); } if (doHalfSample) { // Half-sample path: use existing optimized approach var ctxData = _ctx.getImageData(_sx, _sy, _size.x, _size.y).data; grayAndHalfSampleFromCanvasData(ctxData, _size, _data); } else { // Non-half-sample: use improved bilinear interpolation for better accuracy // Process at original size, then scale grayscale data var tempCanvas = document.createElement('canvas'); tempCanvas.width = _videoSize.x; tempCanvas.height = _videoSize.y; var tempCtx = tempCanvas.getContext('2d'); if (drawAngle !== 0) { tempCtx.translate(_videoSize.x / 2, _videoSize.y / 2); tempCtx.rotate(drawAngle); tempCtx.drawImage(drawable, -_videoSize.y / 2, -_videoSize.x / 2, _videoSize.y, _videoSize.x); } else { tempCtx.drawImage(drawable, 0, 0, _videoSize.x, _videoSize.y); } // Convert to grayscale at original size var originalImageData = tempCtx.getImageData(0, 0, _videoSize.x, _videoSize.y).data; var grayData = new Uint8Array(_videoSize.x * _videoSize.y); computeGray(originalImageData, grayData, _streamConfig); // Scale grayscale data using bilinear interpolation var scaledGrayData = new Uint8Array(_canvasSize.x * _canvasSize.y); var stepSizeX = _videoSize.x / _canvasSize.x; var stepSizeY = _videoSize.y / _canvasSize.y; for (var y = 0; y < _canvasSize.y; y++) { for (var x = 0; x < _canvasSize.x; x++) { var srcX = x * stepSizeX; var srcY = y * stepSizeY; scaledGrayData[y * _canvasSize.x + x] = bilinearInterpolate(grayData, _videoSize.x, _videoSize.y, srcX, srcY) | 0; } } // Crop to target region for (var _y = 0; _y < _size.y; _y++) { for (var _x = 0; _x < _size.x; _x++) { var srcIdx = (_y + _sy) * _canvasSize.x + (_x + _sx); _data[_y * _size.x + _x] = scaledGrayData[srcIdx]; } } } return true; } return false; }; _that.getSize = function () { return _size; }; return _that; }; /* harmony default export */ var frame_grabber_browser = (FrameGrabber); // CONCATENATED MODULE: ./src/input/exif_helper.js // NOTE: (SOME OF) THIS IS BROWSER ONLY CODE. Node does not have 'atob' built in, nor XMLHttpRequest. // How exactly is this set of functions used in Quagga? Do we need the browser specific code? Do we // need to port any part of this that doesn't work in Node to node? // Tags scraped from https://github.com/exif-js/exif-js var ExifTags = { 0x0112: 'orientation' }; var AvailableTags = Object.keys(ExifTags).map(function (key) { return ExifTags[key]; }); function findTagsInObjectURL(src) { var tags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags; if (/^blob:/i.test(src)) { return objectURLToBlob(src).then(readToBuffer).then(function (buffer) { return findTagsInBuffer(buffer, tags); }); } return Promise.resolve(null); } function base64ToArrayBuffer(dataUrl) { var base64 = dataUrl.replace(/^data:([^;]+);base64,/gmi, ''); var binary = atob(base64); var len = binary.length; var buffer = new ArrayBuffer(len); var view = new Uint8Array(buffer); for (var i = 0; i < len; i++) { view[i] = binary.charCodeAt(i); } return buffer; } function readToBuffer(blob) { return new Promise(function (resolve) { var fileReader = new FileReader(); fileReader.onload = function (e) { return resolve(e.target.result); }; fileReader.readAsArrayBuffer(blob); }); } function objectURLToBlob(url) { return new Promise(function (resolve, reject) { var http = new XMLHttpRequest(); http.open('GET', url, true); http.responseType = 'blob'; http.onreadystatechange = function () { if (http.readyState === XMLHttpRequest.DONE && (http.status === 200 || http.status === 0)) { resolve(this.response); } }; http.onerror = reject; http.send(); }); } function findTagsInBuffer(file) { var selectedTags = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : AvailableTags; var dataView = new DataView(file); var length = file.byteLength; var exifTags = selectedTags.reduce(function (result, selectedTag) { var exifTag = Object.keys(ExifTags).filter(function (tag) { return ExifTags[tag] === selectedTag; })[0]; if (exifTag) { result[exifTag] = selectedTag; } return result; }, {}); var offset = 2; var marker; if (dataView.getUint8(0) !== 0xFF || dataView.getUint8(1) !== 0xD8) { return false; } while (offset < length) { if (dataView.getUint8(offset) !== 0xFF) { return false; } marker = dataView.getUint8(offset + 1); if (marker === 0xE1) { return readEXIFData(dataView, offset + 4, exifTags); } offset += 2 + dataView.getUint16(offset + 2); } return false; } function readEXIFData(file, start, exifTags) { if (getStringFromBuffer(file, start, 4) !== 'Exif') { return false; } var tiffOffset = start + 6; var bigEnd; if (file.getUint16(tiffOffset) === 0x4949) { bigEnd = false; } else if (file.getUint16(tiffOffset) === 0x4D4D) { bigEnd = true; } else { return false; } if (file.getUint16(tiffOffset + 2, !bigEnd) !== 0x002A) { return false; } var firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd); if (firstIFDOffset < 0x00000008) { return false; } var tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, exifTags, bigEnd); return tags; } function readTags(file, tiffStart, dirStart, strings, bigEnd) { var entries = file.getUint16(dirStart, !bigEnd); var tags = {}; for (var i = 0; i < entries; i++) { var entryOffset = dirStart + i * 12 + 2; var tag = strings[file.getUint16(entryOffset, !bigEnd)]; if (tag) { tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd); } } return tags; } function readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd) { var type = file.getUint16(entryOffset + 2, !bigEnd); var numValues = file.getUint32(entryOffset + 4, !bigEnd); switch (type) { case 3: if (numValues === 1) { return file.getUint16(entryOffset + 8, !bigEnd); } } return null; } function getStringFromBuffer(buffer, start, length) { var outstr = ''; for (var n = start; n < start + length; n++) { outstr += String.fromCharCode(buffer.getUint8(n)); } return outstr; } // CONCATENATED MODULE: ./src/input/image_loader.js // Exported helper for filename generation function generateImageFilename(directory, num) { return "".concat(directory, "image-").concat(num.toString().padStart(3, '0'), ".jpg"); } var ImageLoader = {}; ImageLoader.load = function (directory, callback, offset, size, sequence, config) { var htmlImagesSrcArray = new Array(size); var htmlImagesArray = new Array(htmlImagesSrcArray.length); var i; var img; var num; if (sequence === false) { htmlImagesSrcArray[0] = directory; } else { for (i = 0; i < htmlImagesSrcArray.length; i++) { num = offset + i; htmlImagesSrcArray[i] = generateImageFilename(directory, num); } } htmlImagesArray.notLoaded = []; htmlImagesArray.addImage = function (image) { htmlImagesArray.notLoaded.push(image); }; htmlImagesArray.loaded = function (loadedImg) { var notloadedImgs = htmlImagesArray.notLoaded; for (var x = 0; x < notloadedImgs.length; x++) { if (notloadedImgs[x] === loadedImg) { notloadedImgs.splice(x, 1); for (var y = 0; y < htmlImagesSrcArray.length; y++) { // Use encodeURI for matching filenames with spaces and special characters var imgName = encodeURI(htmlImagesSrcArray[y].substr(htmlImagesSrcArray[y].lastIndexOf('/'))); if (loadedImg.src.lastIndexOf(imgName) !== -1) { htmlImagesArray[y] = { img: loadedImg }; break; } } break; } } if (notloadedImgs.length === 0) { var _config$debug; if ( true && config !== null && config !== void 0 && (_config$debug = config.debug) !== null && _config$debug !== void 0 && _config$debug.showImageDetails) { console.log("Images loaded: ".concat(htmlImagesArray.length, " image").concat(htmlImagesArray.length !== 1 ? 's' : '', " from ").concat(sequence === false ? directory : directory + ' (sequence)')); } if (sequence === false) { findTagsInObjectURL(directory, ['orientation']).then(function (tags) { htmlImagesArray[0].tags = tags; callback(htmlImagesArray); })["catch"](function (e) { console.log(e); callback(htmlImagesArray); }); } else { callback(htmlImagesArray); } } }; for (i = 0; i < htmlImagesSrcArray.length; i++) { img = new Image(); htmlImagesArray.addImage(img); addOnloadHandler(img, htmlImagesArray); img.src = htmlImagesSrcArray[i]; } }; function addOnloadHandler(img, htmlImagesArray) { img.onload = function () { htmlImagesArray.loaded(this); }; img.onerror = function () { htmlImagesArray.loaded(this); }; } /* harmony default export */ var image_loader = (ImageLoader); // CONCATENATED MODULE: ./src/input/input_stream/input_stream_browser.ts /* eslint-disable @typescript-eslint/no-explicit-any */ var inputStreamFactory = { createVideoStream: function createVideoStream(video) { console.warn('**** InputStreamBrowser createVideoStream'); var _config = null; var _eventNames = ['canrecord', 'ended']; var _eventHandlers = {}; var _calculatedWidth; var _calculatedHeight; var _topRight = { x: 0, y: 0, type: 'Point' }; var _canvasSize = { x: 0, y: 0, type: 'XYSize' }; function initSize() { var _config2, _config3; var width = video.videoWidth; var height = video.videoHeight; // eslint-disable-next-line no-nested-ternary _calculatedWidth = (_config2 = _config) !== null && _config2 !== void 0 && _config2.size ? width / height > 1 ? _config.size : Math.floor(width / height * _config.size) : width; // eslint-disable-next-line no-nested-ternary _calculatedHeight = (_config3 = _config) !== null && _config3 !== void 0 && _config3.size ? width / height > 1 ? Math.floor(height / width * _config.size) : _config.size : height; _canvasSize.x = _calculatedWidth; _canvasSize.y = _calculatedHeight; } var inputStream = { getRealWidth: function getRealWidth() { return video.videoWidth; }, getRealHeight: function getRealHeight() { return video.videoHeight; }, getWidth: function getWidth() { return _calculatedWidth; }, getHeight: function getHeight() { return _calculatedHeight; }, setWidth: function setWidth(width) { _calculatedWidth = width; }, setHeight: function setHeight(height) { _calculatedHeight = height; }, setInputStream: function setInputStream(config) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment _config = config; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access this.setAttribute('src', typeof config.src !== 'undefined' ? config.src : ''); return Promise.resolve(); }, ended: function ended() { return video.ended; }, getConfig: function getConfig() { return _config; }, setAttribute: function setAttribute(name, value) { if (video) { video.setAttribute(name, value); } }, pause: function pause() { video.pause(); }, play: function play() { // eslint-disable-next-line @typescript-eslint/no-floating-promises video.play(); }, setCurrentTime: function setCurrentTime(time) { var _config4; if (((_config4 = _config) === null || _config4 === void 0 ? void 0 : _config4.type) !== 'LiveStream') { this.setAttribute('currentTime', time.toString()); } }, addEventListener: function addEventListener(event, f, bool) { if (_eventNames.indexOf(event) !== -1) { if (!_eventHandlers[event]) { _eventHandlers[event] = []; } _eventHandlers[event].push(f); } else { video.addEventListener(event, f, bool); } }, clearEventHandlers: function clearEventHandlers() { _eventNames.forEach(function (eventName) { var handlers = _eventHandlers[eventName]; if (handlers && handlers.length > 0) { handlers.forEach(function (handler) { video.removeEventListener(eventName, handler); }); } }); }, trigger: function trigger(eventName, args) { var j; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access var handlers = _eventHandlers[eventName]; if (eventName === 'canrecord') { initSize(); } if (handlers && handlers.length > 0) { for (j = 0; j < handlers.length; j++) { handlers[j].apply(inputStream, args); } } }, setTopRight: function setTopRight(topRight) { _topRight.x = topRight.x; _topRight.y = topRight.y; }, getTopRight: function getTopRight() { return _topRight; }, setCanvasSize: function setCanvasSize(size) { _canvasSize.x = size.x; _canvasSize.y = size.y; }, getCanvasSize: function getCanvasSize() { return _canvasSize; }, getFrame: function getFrame() { return video; } }; return inputStream; }, createLiveStream: function createLiveStream(video) { console.warn('**** InputStreamBrowser createLiveStream'); if (video) { video.setAttribute('autoplay', 'true'); } var that = inputStreamFactory.createVideoStream(video); that.ended = function ended() { return false; }; return that; }, createImageStream: function createImageStream() { // console.warn('**** InputStreamBrowser createImageStream'); var _config = null; var width = 0; var height = 0; var frameIdx = 0; var paused = true; var loaded = false; var imgArray = null; var size = 0; var offset = 1; var baseUrl = null; var _ended = false; var calculatedWidth; var calculatedHeight; var _eventNames = ['canrecord', 'ended']; var _eventHandlers = {}; var _topRight = { x: 0, y: 0, type: 'Point' }; var _canvasSize = { x: 0, y: 0, type: 'XYSize' }; function loadImages() { loaded = false; return new Promise(function (resolve, reject) { try { var _config7; if (!baseUrl) { reject(new Error('Image source (src) is required in stream configuration')); return; } image_loader.load(baseUrl, function (imgs) { try { var _config5, _config6; if (!imgs || imgs.length === 0 || !imgs[0] || !imgs[0].img) { reject(new Error('Image load failed')); return; } imgArray = imgs; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (imgs[0].tags && imgs[0].tags.orientation) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access switch (imgs[0].tags.orientation) { case 6: case 8: width = imgs[0].img.height; height = imgs[0].img.width; break; default: width = imgs[0].img.width; height = imgs[0].img.height; } } else { width = imgs[0].img.width; height = imgs[0].img.height; } // eslint-disable-next-line no-nested-ternary calculatedWidth = (_config5 = _config) !== null && _config5 !== void 0 && _config5.size ? width / height > 1 ? _config.size : Math.floor(width / height * _config.size) : width; // eslint-disable-next-line no-nested-ternary calculatedHeight = (_config6 = _config) !== null && _config6 !== void 0 && _config6.size ? width / height > 1 ? Math.floor(height / width * _config.size) : _config.size : height; _canvasSize.x = calculatedWidth; _canvasSize.y = calculatedHeight; loaded = true; frameIdx = 0; setTimeout(function () { // eslint-disable-next-line @typescript-eslint/no-use-before-define publishEvent('canrecord', []); resolve(); }, 0); } catch (error) { reject(error); } }, offset, size, (_config7 = _config) === null || _config7 === void 0 ? void 0 : _config7.sequence, _config); } catch (error) { reject(error); } }); } function publishEvent(eventName, args) { var j; var handlers = _eventHandlers[eventName]; if (handlers && handlers.length > 0) { for (j = 0; j < handlers.length; j++) { // eslint-disable-next-line @typescript-eslint/no-use-before-define handlers[j].apply(inputStream, args); // TODO: typescript complains that any[] is not valid for a second arg for apply?! } } } // TODO: any code shared with the first InputStream above should be shared not copied // TODO: publishEvent needs access to inputStream, but inputStream needs access to publishEvent // TODO: This is why it's a 'var', so it hoists back. This is ugly, and should be changed. // eslint-disable-next-line no-var,vars-on-top var inputStream = { trigger: publishEvent, getWidth: function getWidth() { return calculatedWidth; }, getHeight: function getHeight() { return calculatedHeight; }, setWidth: function setWidth(newWidth) { calculatedWidth = newWidth; }, setHeight: function setHeight(newHeight) { calculatedHeight = newHeight; }, getRealWidth: function getRealWidth() { return width; }, getRealHeight: function getRealHeight() { return height; }, setInputStream: function setInputStream(stream) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment _config = stream; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access if (stream.sequence === false) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access baseUrl = stream.src; size = 1; } else { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access baseUrl = stream.src; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access size = stream.length; } return loadImages(); }, ended: function ended() { return _ended; }, setAttribute: function setAttribute() {}, getConfig: function getConfig() { return _config; }, pause: function pause() { paused = true; }, play: function play() { paused = false; }, setCurrentTime: function setCurrentTime(time) { frameIdx = time; }, addEventListener: function addEventListener(event, f) { if (_eventNames.indexOf(event) !== -1) { if (!_eventHandlers[event]) { _eventHandlers[event] = []; } _eventHandlers[event].push(f); } }, clearEventHandlers: function clearEventHandlers() { Object.keys(_eventHandlers).forEach(function (ind) { return delete _eventHandlers[ind]; }); }, setTopRight: function setTopRight(topRight) { _topRight.x = topRight.x; _topRight.y = topRight.y; }, getTopRight: function getTopRight() { return _topRight; }, setCanvasSize: function setCanvasSize(canvasSize) { _canvasSize.x = canvasSize.x; _canvasSize.y = canvasSize.y; }, getCanvasSize: function getCanvasSize() { return _canvasSize; }, getFrame: function getFrame() { var frame; if (!loaded) { return null; } if (!paused) { var _imgArray; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment frame = (_imgArray = imgArray) === null || _imgArray === void 0 ? void 0 : _imgArray[frameIdx]; if (frameIdx < size - 1) { frameIdx++; } else { setTimeout(function () { _ended = true; publishEvent('ended', []); }, 0); } } // eslint-disable-next-line @typescript-eslint/no-unsafe-return return frame; } }; return inputStream; } }; /* harmony default export */ var input_stream_browser = (inputStreamFactory); // CONCATENATED MODULE: ./src/locator/tracer.js /** * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization */ var tracer_Tracer = { searchDirections: [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]], create: function create(imageWrapper, labelWrapper) { var imageData = imageWrapper.data; var labelData = labelWrapper.data; var searchDirections = this.searchDirections; var width = imageWrapper.size.x; var pos; function _trace(current, color, label, edgelabel) { var i; var y; var x; for (i = 0; i < searchDirections.length; i++) { y = current.cy + searchDirections[current.dir][0]; x = current.cx + searchDirections[current.dir][1]; pos = y * width + x; if (imageData[pos] === color && (labelData[pos] === 0 || labelData[pos] === label)) { labelData[pos] = label; current.cy = y; current.cx = x; return true; } if (labelData[pos] === 0) { labelData[pos] = edgelabel; } current.dir = (current.dir + 1) % 8; } return false; } function vertex2D(x, y, dir) { return { dir: dir, x: x, y: y, next: null, prev: null }; } function _contourTracing(sy, sx, label, color, edgelabel) { var Fv = null; var Cv; var P; var ldir; var current = { cx: sx, cy: sy, dir: 0 }; if (_trace(current, color, label, edgelabel)) { Fv = vertex2D(sx, sy, current.dir); Cv = Fv; ldir = current.dir; P = vertex2D(current.cx, current.cy, 0); P.prev = Cv; Cv.next = P; P.next = null; Cv = P; var totalPixelCount = imageWrapper.size.x * imageWrapper.size.y; var pixelCounter = 0; do { current.dir = (current.dir + 6) % 8; _trace(current, color, label, edgelabel); if (ldir !== current.dir) { Cv.dir = current.dir; P = vertex2D(current.cx, current.cy, 0); P.prev = Cv; Cv.next = P; P.next = null; Cv = P; } else { Cv.dir = ldir; Cv.x = current.cx; Cv.y = current.cy; } ldir = current.dir; } while ((current.cx !== sx || current.cy !== sy) && ++pixelCounter < totalPixelCount); Fv.prev = Cv.prev; Cv.prev.next = Fv; } return Fv; } return { trace: function trace(current, color, label, edgelabel) { return _trace(current, color, label, edgelabel); }, contourTracing: function contourTracing(sy, sx, label, color, edgelabel) { return _contourTracing(sy, sx, label, color, edgelabel); } }; } }; /* harmony default export */ var locator_tracer = (tracer_Tracer); // CONCATENATED MODULE: ./src/locator/rasterizer.js /** * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization */ var Rasterizer = { createContour2D: function createContour2D() { return { dir: null, index: null, firstVertex: null, insideContours: null, nextpeer: null, prevpeer: null }; }, CONTOUR_DIR: { CW_DIR: 0, CCW_DIR: 1, UNKNOWN_DIR: 2 }, DIR: { OUTSIDE_EDGE: -32767, INSIDE_EDGE: -32766 }, create: function create(imageWrapper, labelWrapper) { var imageData = imageWrapper.data; var labelData = labelWrapper.data; var width = imageWrapper.size.x; var height = imageWrapper.size.y; var tracer = locator_tracer.create(imageWrapper, labelWrapper); return { rasterize: function rasterize(depthlabel) { var color; var bc; var lc; var labelindex; var cx; var cy; var colorMap = []; var vertex; var p; var cc; var sc; var pos; var connectedCount = 0; var i; for (i = 0; i < 400; i++) { colorMap[i] = 0; } colorMap[0] = imageData[0]; cc = null; for (cy = 1; cy < height - 1; cy++) { labelindex = 0; bc = colorMap[0]; for (cx = 1; cx < width - 1; cx++) { pos = cy * width + cx; if (labelData[pos] === 0) { color = imageData[pos]; if (color !== bc) { if (labelindex === 0) { lc = connectedCount + 1; colorMap[lc] = color; bc = color; vertex = tracer.contourTracing(cy, cx, lc, color, Rasterizer.DIR.OUTSIDE_EDGE); if (vertex !== null) { connectedCount++; labelindex = lc; p = Rasterizer.createContour2D(); p.dir = Rasterizer.CONTOUR_DIR.CW_DIR; p.index = labelindex; p.firstVertex = vertex; p.nextpeer = cc; p.insideContours = null; if (cc !== null) { cc.prevpeer = p; } cc = p; } } else { vertex = tracer.contourTracing(cy, cx, Rasterizer.DIR.INSIDE_EDGE, color, labelindex); if (vertex !== null) { p = Rasterizer.createContour2D(); p.firstVertex = vertex; p.insideContours = null; if (depthlabel === 0) { p.dir = Rasterizer.CONTOUR_DIR.CCW_DIR; } else { p.dir = Rasterizer.CONTOUR_DIR.CW_DIR; } p.index = depthlabel; sc = cc; while (sc !== null && sc.index !== labelindex) { sc = sc.nextpeer; } if (sc !== null) { p.nextpeer = sc.insideContours; if (sc.insideContours !== null) { sc.insideContours.prevpeer = p; } sc.insideContours = p; } } } } else { labelData[pos] = labelindex; } } else if (labelData[pos] === Rasterizer.DIR.OUTSIDE_EDGE || labelData[pos] === Rasterizer.DIR.INSIDE_EDGE) { labelindex = 0; if (labelData[pos] === Rasterizer.DIR.INSIDE_EDGE) { bc = imageData[pos]; } else { bc = colorMap[0]; } } else { labelindex = labelData[pos]; bc = colorMap[labelindex]; } } } sc = cc; while (sc !== null) { sc.index = depthlabel; sc = sc.nextpeer; } return { cc: cc, count: connectedCount }; }, debug: { drawContour: function drawContour(canvas, firstContour) { var ctx = canvas.getContext('2d'); var pq = firstContour; var iq; var q; var p; ctx.strokeStyle = 'red'; ctx.fillStyle = 'red'; ctx.lineWidth = 1; if (pq !== null) { iq = pq.insideContours; } else { iq = null; } while (pq !== null) { if (iq !== null) { q = iq; iq = iq.nextpeer; } else { q = pq; pq = pq.nextpeer; if (pq !== null) { iq = pq.insideContours; } else { iq = null; } } switch (q.dir) { case Rasterizer.CONTOUR_DIR.CW_DIR: ctx.strokeStyle = 'red'; break; case Rasterizer.CONTOUR_DIR.CCW_DIR: ctx.strokeStyle = 'blue'; break; case Rasterizer.CONTOUR_DIR.UNKNOWN_DIR: ctx.strokeStyle = 'green'; break; } p = q.firstVertex; ctx.beginPath(); ctx.moveTo(p.x, p.y); do { p = p.next; ctx.lineTo(p.x, p.y); } while (p !== q.firstVertex); ctx.stroke(); } } } }; } }; /* harmony default export */ var locator_rasterizer = (Rasterizer); // CONCATENATED MODULE: ./src/locator/skeletonizer.js /* eslint-disable no-param-reassign */ /* eslint-disable no-bitwise */ /* eslint-disable eqeqeq */ /* @preserve ASM BEGIN */ /** * Morphological skeletonization using iterative thinning algorithm. * Reduces binary images to single-pixel-wide skeletons while preserving topology. * * Memory layout in shared ArrayBuffer (4 regions of size²): * - Region 0: Working image (subImagePtr = 0) * - Region 1: Eroded result (erodedImagePtr = size²) * - Region 2: Temp/scratch space (tempImagePtr = 2*size²) * - Region 3: Final skeleton output (skelImagePtr = 3*size²) */ function Skeletonizer(stdlib, foreign, buffer) { 'use asm'; var images = new stdlib.Uint8Array(buffer); var size = foreign.size | 0; var imul = stdlib.Math.imul; /** * Morphological erosion with 5-pixel cross structuring element. * A pixel survives only if all 5 pixels in the cross pattern are set: * top-left, top-right, center, bottom-left, bottom-right. */ function erode(inImagePtr, outImagePtr) { inImagePtr = inImagePtr | 0; outImagePtr = outImagePtr | 0; var v = 0; var u = 0; var sum = 0; var yStart1 = 0; var yStart2 = 0; var xStart1 = 0; var xStart2 = 0; var offset = 0; for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) { offset = offset + size | 0; for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) { yStart1 = offset - size | 0; yStart2 = offset + size | 0; xStart1 = u - 1 | 0; xStart2 = u + 1 | 0; sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0; // Pixel survives erosion only if all 5 cross neighbors are set if ((sum | 0) == (5 | 0)) { images[outImagePtr + offset + u | 0] = 1; } else { images[outImagePtr + offset + u | 0] = 0; } } } } // Pixel-wise subtraction: out = a - b (captures the "peeled" layer) function subtract(aImagePtr, bImagePtr, outImagePtr) { aImagePtr = aImagePtr | 0; bImagePtr = bImagePtr | 0; outImagePtr = outImagePtr | 0; var length = 0; length = imul(size, size) | 0; while ((length | 0) > 0) { length = length - 1 | 0; images[outImagePtr + length | 0] = (images[aImagePtr + length | 0] | 0) - (images[bImagePtr + length | 0] | 0) | 0; } } // Pixel-wise OR: out = a | b (accumulates skeleton layers) function bitwiseOr(aImagePtr, bImagePtr, outImagePtr) { aImagePtr = aImagePtr | 0; bImagePtr = bImagePtr | 0; outImagePtr = outImagePtr | 0; var length = 0; length = imul(size, size) | 0; while ((length | 0) > 0) { length = length - 1 | 0; images[outImagePtr + length | 0] = images[aImagePtr + length | 0] | 0 | (images[bImagePtr + length | 0] | 0) | 0; } } // Counts non-zero pixels to detect when erosion is complete function countNonZero(imagePtr) { imagePtr = imagePtr | 0; var sum = 0; var length = 0; length = imul(size, size) | 0; while ((length | 0) > 0) { length = length - 1 | 0; sum = (sum | 0) + (images[imagePtr + length | 0] | 0) | 0; } return sum | 0; } // Fills image region with a constant value function init(imagePtr, value) { imagePtr = imagePtr | 0; value = value | 0; var length = 0; length = imul(size, size) | 0; while ((length | 0) > 0) { length = length - 1 | 0; images[imagePtr + length | 0] = value; } } // Morphological dilation with 5-pixel cross - pixel is set if any neighbor is set function dilate(inImagePtr, outImagePtr) { inImagePtr = inImagePtr | 0; outImagePtr = outImagePtr | 0; var v = 0; var u = 0; var sum = 0; var yStart1 = 0; var yStart2 = 0; var xStart1 = 0; var xStart2 = 0; var offset = 0; for (v = 1; (v | 0) < (size - 1 | 0); v = v + 1 | 0) { offset = offset + size | 0; for (u = 1; (u | 0) < (size - 1 | 0); u = u + 1 | 0) { yStart1 = offset - size | 0; yStart2 = offset + size | 0; xStart1 = u - 1 | 0; xStart2 = u + 1 | 0; sum = (images[inImagePtr + yStart1 + xStart1 | 0] | 0) + (images[inImagePtr + yStart1 + xStart2 | 0] | 0) + (images[inImagePtr + offset + u | 0] | 0) + (images[inImagePtr + yStart2 + xStart1 | 0] | 0) + (images[inImagePtr + yStart2 + xStart2 | 0] | 0) | 0; if ((sum | 0) > (0 | 0)) { images[outImagePtr + offset + u | 0] = 1; } else { images[outImagePtr + offset + u | 0] = 0; } } } } // Copies image data from src to dst region function memcpy(srcImagePtr, dstImagePtr) { srcImagePtr = srcImagePtr | 0; dstImagePtr = dstImagePtr | 0; var length = 0; length = imul(size, size) | 0; while ((length | 0) > 0) { length = length - 1 | 0; images[dstImagePtr + length | 0] = images[srcImagePtr + length | 0] | 0; } } /** * Zeros out the border pixels of the image. * First loop: handles top, left, and right edges simultaneously * Second loop: handles bottom edge */ function zeroBorder(imagePtr) { imagePtr = imagePtr | 0; var x = 0; var y = 0; for (x = 0; (x | 0) < (size - 1 | 0); x = x + 1 | 0) { images[imagePtr + x | 0] = 0; images[imagePtr + y | 0] = 0; y = y + size - 1 | 0; images[imagePtr + y | 0] = 0; y = y + 1 | 0; } for (x = 0; (x | 0) < (size | 0); x = x + 1 | 0) { images[imagePtr + y | 0] = 0; y = y + 1 | 0; } } /** * Main skeletonization algorithm using iterative thinning: * 1. Erode the working image * 2. Dilate the eroded version * 3. Subtract dilated from original (extracts "peeled" layer) * 4. OR the peeled layer into skeleton accumulator * 5. Copy eroded image back to working image * 6. Repeat until working image is empty * * @returns {void} No return value - operates directly on shared buffer. * Input image is read from buffer offset 0 (subImagePtr). * Output skeleton is written to buffer offset 3*size² (skelImagePtr). */ function skeletonize() { var subImagePtr = 0; // Region 0: Working image (input, offset = 0) var erodedImagePtr = 0; // Region 1: Eroded result (offset = size²) var tempImagePtr = 0; // Region 2: Scratch space (offset = 2*size²) var skelImagePtr = 0; // Region 3: Final skeleton (output, offset = 3*size²) var sum = 0; var done = 0; // Calculate byte offsets for each region in the shared buffer erodedImagePtr = imul(size, size) | 0; // Region 1: size² bytes in tempImagePtr = erodedImagePtr + erodedImagePtr | 0; // Region 2: 2*size² bytes in skelImagePtr = tempImagePtr + erodedImagePtr | 0; // Region 3: 3*size² bytes in // Initialize skeleton accumulator to zero init(skelImagePtr, 0); zeroBorder(subImagePtr); do { erode(subImagePtr, erodedImagePtr); dilate(erodedImagePtr, tempImagePtr); subtract(subImagePtr, tempImagePtr, tempImagePtr); bitwiseOr(skelImagePtr, tempImagePtr, skelImagePtr); memcpy(erodedImagePtr, subImagePtr); sum = countNonZero(subImagePtr) | 0; done = (sum | 0) == 0 | 0; } while (!done); } return { skeletonize: skeletonize }; } /* @preserve ASM END */ /* harmony default export */ var skeletonizer = (Skeletonizer); /* eslint-enable eqeqeq */ // CONCATENATED MODULE: ./src/locator/barcode_locator.js var barcode_locator_config; var _currentImageWrapper; var _skelImageWrapper; var _subImageWrapper; var _labelImageWrapper; var _patchGrid; var _patchLabelGrid; var _imageToPatchGrid; var _binaryImageWrapper; var _patchSize; var _canvasContainer = { ctx: { binary: null }, dom: { binary: null } }; var _numPatches = { x: 0, y: 0 }; var _inputImageWrapper; var _skeletonizer; function barcode_locator_initBuffers() { if (barcode_locator_config.halfSample) { _currentImageWrapper = new image_wrapper({ // eslint-disable-next-line no-bitwise x: _inputImageWrapper.size.x / 2 | 0, // eslint-disable-next-line no-bitwise y: _inputImageWrapper.size.y / 2 | 0 }); } else { _currentImageWrapper = _inputImageWrapper; } _patchSize = calculatePatchSize(barcode_locator_config.patchSize, _currentImageWrapper.size); // eslint-disable-next-line no-bitwise _numPatches.x = _currentImageWrapper.size.x / _patchSize.x | 0; // eslint-disable-next-line no-bitwise _numPatches.y = _currentImageWrapper.size.y / _patchSize.y | 0; _binaryImageWrapper = new image_wrapper(_currentImageWrapper.size, undefined, Uint8Array, false); _labelImageWrapper = new image_wrapper(_patchSize, undefined, Array, true); // Calculate required buffer size (4 regions for asm.js skeletonizer) var skeletonImageDataSize = _patchSize.x * _patchSize.y * 4; // Round up to next power of 2 for asm.js heap requirement // Use minimum 64KB for optimal asm.js performance (avoids V8 warnings) var bufferSize = Math.max(65536, Math.pow(2, Math.ceil(Math.log2(skeletonImageDataSize)))); var skeletonImageData = new ArrayBuffer(bufferSize); _subImageWrapper = new image_wrapper(_patchSize, new Uint8Array(skeletonImageData, 0, _patchSize.x * _patchSize.y)); _skelImageWrapper = new image_wrapper(_patchSize, new Uint8Array(skeletonImageData, _patchSize.x * _patchSize.y * 3, _patchSize.x * _patchSize.y), undefined, true); _skeletonizer = skeletonizer({ Math: Math, Uint8Array: Uint8Array }, { size: _patchSize.x }, skeletonImageData); _imageToPatchGrid = new image_wrapper({ // eslint-disable-next-line no-bitwise x: _currentImageWrapper.size.x / _subImageWrapper.size.x | 0, // eslint-disable-next-line no-bitwise y: _currentImageWrapper.size.y / _subImageWrapper.size.y | 0 }, undefined, Array, true); _patchGrid = new image_wrapper(_imageToPatchGrid.size, undefined, undefined, true); _patchLabelGrid = new image_wrapper(_imageToPatchGrid.size, undefined, Int32Array, true); } function barcode_locator_initCanvas() { var _config$debug; if (barcode_locator_config.useWorker || typeof document === 'undefined') { return; } _canvasContainer.dom.binary = document.createElement('canvas'); _canvasContainer.dom.binary.className = 'binaryBuffer'; if ( true && barcode_locator_config.debug.showCanvas === true) { document.querySelector('#debug').appendChild(_canvasContainer.dom.binary); } var willReadFrequently = !!barcode_locator_config.willReadFrequently; if ( true && (_config$debug = barcode_locator_config.debug) !== null && _config$debug !== void 0 && _config$debug.showCanvas) { console.warn('* initCanvas willReadFrequently', willReadFrequently, barcode_locator_config); } _canvasContainer.ctx.binary = _canvasContainer.dom.binary.getContext('2d', { willReadFrequently: willReadFrequently }); _canvasContainer.dom.binary.width = _binaryImageWrapper.size.x; _canvasContainer.dom.binary.height = _binaryImageWrapper.size.y; } /** * Creates a bounding box which encloses all the given patches * @returns {Array} The minimal bounding box */ function boxFromPatches(patches) { var overAvg; var i; var j; var patch; var transMat; var minx = _binaryImageWrapper.size.x; var miny = _binaryImageWrapper.size.y; var maxx = -_binaryImageWrapper.size.x; var maxy = -_binaryImageWrapper.size.y; var box; var scale; // draw all patches which are to be taken into consideration overAvg = 0; for (i = 0; i < patches.length; i++) { patch = patches[i]; overAvg += patch.rad; if ( true && barcode_locator_config.debug.showPatches) { image_debug.drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: 'red' }); } } overAvg /= patches.length; overAvg = (overAvg * 180 / Math.PI + 90) % 180 - 90; if (overAvg < 0) { overAvg += 180; } overAvg = (180 - overAvg) * Math.PI / 180; transMat = mat2_namespaceObject.copy(mat2_namespaceObject.create(), [Math.cos(overAvg), Math.sin(overAvg), -Math.sin(overAvg), Math.cos(overAvg)]); // iterate over patches and rotate by angle for (i = 0; i < patches.length; i++) { patch = patches[i]; for (j = 0; j < 4; j++) { vec2_namespaceObject.transformMat2(patch.box[j], patch.box[j], transMat); } if ( true && barcode_locator_config.debug.boxFromPatches.showTransformed) { image_debug.drawPath(patch.box, { x: 0, y: 1 }, _canvasContainer.ctx.binary, { color: '#99ff00', lineWidth: 2 }); } } // find bounding box for (i = 0; i < patches.length; i++) { patch = patches[i]; for (j = 0; j < 4; j++) { if (patch.box[j][0] < minx) { minx = patch.box[j][0]; } if (patch.box[j][0] > maxx) { maxx = patch.box[j][0]; } if (patch.box[j][1] < miny) { miny = patch.box[j][1]; } if (patch.box[j][1] > maxy) { maxy = patch.box[j][1]; } } } box = [[minx, miny], [maxx, miny], [maxx, maxy], [minx, maxy]]; if ( true && barcode_locator_config.debug.boxFromPatches.showTransformedBox) { image_debug.drawPath(box, { x: 0, y: 1 }, _canvasContainer.ctx.binary, { color: '#ff0000', lineWidth: 2 }); } scale = barcode_locator_config.halfSample ? 2 : 1; // reverse rotation; transMat = mat2_namespaceObject.invert(transMat, transMat); for (j = 0; j < 4; j++) { vec2_namespaceObject.transformMat2(box[j], box[j], transMat); } if ( true && barcode_locator_config.debug.boxFromPatches.showBB) { image_debug.drawPath(box, { x: 0, y: 1 }, _canvasContainer.ctx.binary, { color: '#ff0000', lineWidth: 2 }); } for (j = 0; j < 4; j++) { vec2_namespaceObject.scale(box[j], box[j], scale); } return box; } /** * Creates a binary image of the current image */ function binarizeImage() { otsuThreshold(_currentImageWrapper, _binaryImageWrapper); _binaryImageWrapper.zeroBorder(); if ( true && barcode_locator_config.debug.showCanvas) { _binaryImageWrapper.show(_canvasContainer.dom.binary, 255); } } /** * Iterate over the entire image * extract patches */ function findPatches() { var i; var j; var x; var y; var moments; var patchesFound = []; var rasterizer; var rasterResult; var patch; for (i = 0; i < _numPatches.x; i++) { for (j = 0; j < _numPatches.y; j++) { x = _subImageWrapper.size.x * i; y = _subImageWrapper.size.y * j; // seperate parts skeletonize(x, y); // Rasterize, find individual bars _skelImageWrapper.zeroBorder(); array_helper.init(_labelImageWrapper.data, 0); rasterizer = locator_rasterizer.create(_skelImageWrapper, _labelImageWrapper); rasterResult = rasterizer.rasterize(0); if ( true && barcode_locator_config.debug.showLabels) { _labelImageWrapper.overlay(_canvasContainer.dom.binary, Math.floor(360 / rasterResult.count), { x: x, y: y }); } // calculate moments from the skeletonized patch moments = _labelImageWrapper.moments(rasterResult.count); // extract eligible patches patchesFound = patchesFound.concat(describePatch(moments, [i, j], x, y)); } } if ( true && barcode_locator_config.debug.showFoundPatches) { for (i = 0; i < patchesFound.length; i++) { patch = patchesFound[i]; image_debug.drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: '#99ff00', lineWidth: 2 }); } } return patchesFound; } /** * Finds those connected areas which contain at least 6 patches * and returns them ordered DESC by the number of contained patches * @param {Number} maxLabel */ function findBiggestConnectedAreas(maxLabel) { var i; var sum; var labelHist = []; var topLabels = []; for (i = 0; i < maxLabel; i++) { labelHist.push(0); } sum = _patchLabelGrid.data.length; while (sum--) { if (_patchLabelGrid.data[sum] > 0) { labelHist[_patchLabelGrid.data[sum] - 1]++; } } labelHist = labelHist.map(function (val, idx) { return { val: val, label: idx + 1 }; }); labelHist.sort(function (a, b) { return b.val - a.val; }); // extract top areas with at least 5 patches present topLabels = labelHist.filter(function (el) { return el.val >= 5; }); return topLabels; } /** * */ function findBoxes(topLabels, maxLabel) { var i; var j; var sum; var patches = []; var patch; var box; var boxes = []; var hsv = [0, 1, 1]; var rgb = [0, 0, 0]; for (i = 0; i < topLabels.length; i++) { sum = _patchLabelGrid.data.length; patches.length = 0; while (sum--) { if (_patchLabelGrid.data[sum] === topLabels[i].label) { patch = _imageToPatchGrid.data[sum]; patches.push(patch); } } box = boxFromPatches(patches); if (box) { boxes.push(box); // draw patch-labels if requested if ( true && barcode_locator_config.debug.showRemainingPatchLabels) { for (j = 0; j < patches.length; j++) { patch = patches[j]; hsv[0] = topLabels[i].label / (maxLabel + 1) * 360; hsv2rgb(hsv, rgb); image_debug.drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: "rgb(".concat(rgb.join(','), ")"), lineWidth: 2 }); } } } } return boxes; } /** * Find similar moments (via cluster) * @param {Object} moments */ function similarMoments(moments) { var clusters = cv_utils_cluster(moments, 0.90); var topCluster = topGeneric(clusters, 1, function (e) { return e.getPoints().length; }); var points = []; var result = []; if (topCluster.length === 1) { points = topCluster[0].item.getPoints(); for (var i = 0; i < points.length; i++) { result.push(points[i].point); } } return result; } function skeletonize(x, y) { _binaryImageWrapper.subImageAsCopy(_subImageWrapper, imageRef(x, y)); _skeletonizer.skeletonize(); // Show skeleton if requested if ( true && barcode_locator_config.debug.showSkeleton) { _skelImageWrapper.overlay(_canvasContainer.dom.binary, 360, imageRef(x, y)); } } /** * Extracts and describes those patches which seem to contain a barcode pattern * @param {Array} moments * @param {Object} patchPos, * @param {Number} x * @param {Number} y * @returns {Array} list of patches */ function describePatch(moments, patchPos, x, y) { var k; var avg; var eligibleMoments = []; var matchingMoments; var patch; var patchesFound = []; var minComponentWeight = Math.ceil(_patchSize.x / 3); if (moments.length >= 2) { // only collect moments which's area covers at least minComponentWeight pixels. for (k = 0; k < moments.length; k++) { if (moments[k].m00 > minComponentWeight) { eligibleMoments.push(moments[k]); } } // if at least 2 moments are found which have at least minComponentWeights covered if (eligibleMoments.length >= 2) { matchingMoments = similarMoments(eligibleMoments); avg = 0; // determine the similarity of the moments for (k = 0; k < matchingMoments.length; k++) { var _matchingMoments$k$ra, _matchingMoments$k; avg += (_matchingMoments$k$ra = (_matchingMoments$k = matchingMoments[k]) === null || _matchingMoments$k === void 0 ? void 0 : _matchingMoments$k.rad) !== null && _matchingMoments$k$ra !== void 0 ? _matchingMoments$k$ra : 0; } // Only two of the moments are allowed not to fit into the equation // add the patch to the set if (matchingMoments.length > 1 && matchingMoments.length >= eligibleMoments.length / 4 * 3 && matchingMoments.length > moments.length / 4) { avg /= matchingMoments.length; patch = { index: patchPos[1] * _numPatches.x + patchPos[0], pos: { x: x, y: y }, box: [vec2_namespaceObject.clone([x, y]), vec2_namespaceObject.clone([x + _subImageWrapper.size.x, y]), vec2_namespaceObject.clone([x + _subImageWrapper.size.x, y + _subImageWrapper.size.y]), vec2_namespaceObject.clone([x, y + _subImageWrapper.size.y])], moments: matchingMoments, rad: avg, vec: vec2_namespaceObject.clone([Math.cos(avg), Math.sin(avg)]) }; patchesFound.push(patch); } } } return patchesFound; } /** * finds patches which are connected and share the same orientation * @param {Object} patchesFound */ function rasterizeAngularSimilarity(patchesFound) { var label = 0; var threshold = 0.95; var currIdx = 0; var j; var patch; var hsv = [0, 1, 1]; var rgb = [0, 0, 0]; function notYetProcessed() { var i; for (i = 0; i < _patchLabelGrid.data.length; i++) { if (_patchLabelGrid.data[i] === 0 && _patchGrid.data[i] === 1) { return i; } } return _patchLabelGrid.data.length; } function trace(currentIdx) { var x; var y; var currentPatch; var idx; var dir; var current = { x: currentIdx % _patchLabelGrid.size.x, y: currentIdx / _patchLabelGrid.size.x | 0 }; var similarity; if (currentIdx < _patchLabelGrid.data.length) { currentPatch = _imageToPatchGrid.data[currentIdx]; // assign label _patchLabelGrid.data[currentIdx] = label; for (dir = 0; dir < locator_tracer.searchDirections.length; dir++) { y = current.y + locator_tracer.searchDirections[dir][0]; x = current.x + locator_tracer.searchDirections[dir][1]; idx = y * _patchLabelGrid.size.x + x; // continue if patch empty if (_patchGrid.data[idx] === 0) { _patchLabelGrid.data[idx] = Number.MAX_VALUE; // eslint-disable-next-line no-continue continue; } if (_patchLabelGrid.data[idx] === 0) { similarity = Math.abs(vec2_namespaceObject.dot(_imageToPatchGrid.data[idx].vec, currentPatch.vec)); if (similarity > threshold) { trace(idx); } } } } } // prepare for finding the right patches array_helper.init(_patchGrid.data, 0); array_helper.init(_patchLabelGrid.data, 0); array_helper.init(_imageToPatchGrid.data, null); for (j = 0; j < patchesFound.length; j++) { patch = patchesFound[j]; _imageToPatchGrid.data[patch.index] = patch; _patchGrid.data[patch.index] = 1; } // rasterize the patches found to determine area _patchGrid.zeroBorder(); // eslint-disable-next-line no-cond-assign while ((currIdx = notYetProcessed()) < _patchLabelGrid.data.length) { label++; trace(currIdx); } // draw patch-labels if requested if ( true && barcode_locator_config.debug.showPatchLabels) { for (j = 0; j < _patchLabelGrid.data.length; j++) { if (_patchLabelGrid.data[j] > 0 && _patchLabelGrid.data[j] <= label) { patch = _imageToPatchGrid.data[j]; hsv[0] = _patchLabelGrid.data[j] / (label + 1) * 360; hsv2rgb(hsv, rgb); image_debug.drawRect(patch.pos, _subImageWrapper.size, _canvasContainer.ctx.binary, { color: "rgb(".concat(rgb.join(','), ")"), lineWidth: 2 }); } } } return label; } /* harmony default export */ var barcode_locator = ({ init: function init(inputImageWrapper, config) { barcode_locator_config = config; _inputImageWrapper = inputImageWrapper; barcode_locator_initBuffers(); barcode_locator_initCanvas(); }, locate: function locate() { if (barcode_locator_config.halfSample) { halfSample(_inputImageWrapper, _currentImageWrapper); } binarizeImage(); var patchesFound = findPatches(); // return unless 5% or more patches are found if (patchesFound.length < _numPatches.x * _numPatches.y * 0.05) { return null; } // rasterrize area by comparing angular similarity; var maxLabel = rasterizeAngularSimilarity(patchesFound); if (maxLabel < 1) { return null; } // search for area with the most patches (biggest connected area) var topLabels = findBiggestConnectedAreas(maxLabel); if (topLabels.length === 0) { return null; } var boxes = findBoxes(topLabels, maxLabel); return boxes; }, checkImageConstraints: function checkImageConstraints(inputStream, config) { var _config$debug2; var patchSize; var width = inputStream.getWidth(); var height = inputStream.getHeight(); var thisHalfSample = config.halfSample ? 0.5 : 1; var area; // calculate width and height based on area if (inputStream.getConfig().area) { area = computeImageArea(width, height, inputStream.getConfig().area); inputStream.setTopRight({ x: area.sx, y: area.sy }); inputStream.setCanvasSize({ x: width, y: height }); width = area.sw; height = area.sh; } var size = { x: Math.floor(width * thisHalfSample), y: Math.floor(height * thisHalfSample) }; patchSize = calculatePatchSize(config.patchSize, size); if ( true && (_config$debug2 = config.debug) !== null && _config$debug2 !== void 0 && _config$debug2.showPatchSize) { console.log("Patch-Size: ".concat(JSON.stringify(patchSize))); } inputStream.setWidth(Math.max(Math.floor(Math.floor(size.x / patchSize.x) * (1 / thisHalfSample) * patchSize.x), patchSize.x)); inputStream.setHeight(Math.max(Math.floor(Math.floor(size.y / patchSize.y) * (1 / thisHalfSample) * patchSize.y), patchSize.y)); if (inputStream.getWidth() % patchSize.x === 0 && inputStream.getHeight() % patchSize.y === 0) { return true; } throw new Error("Image dimensions do not comply with the current settings: Width (".concat(width, " )and height (").concat(height, ") must a multiple of ").concat(patchSize.x)); } }); // CONCATENATED MODULE: ./src/QuaggaContext.ts var QuaggaContext_QuaggaContext = /*#__PURE__*/createClass_default()(function QuaggaContext() { classCallCheck_default()(this, QuaggaContext); defineProperty_default()(this, "config", void 0); defineProperty_default()(this, "inputStream", void 0); defineProperty_default()(this, "framegrabber", void 0); defineProperty_default()(this, "inputImageWrapper", void 0); defineProperty_default()(this, "stopped", false); /** * Flag indicating that stop() was called while init() was still in progress. * This is used to handle race conditions in React StrictMode where components * are mounted/unmounted rapidly, causing init() to be called, then stop(), * then init() again before the first init() completes. */ defineProperty_default()(this, "initAborted", false); defineProperty_default()(this, "boxSize", void 0); defineProperty_default()(this, "resultCollector", void 0); defineProperty_default()(this, "decoder", void 0); defineProperty_default()(this, "workerPool", []); defineProperty_default()(this, "onUIThread", true); defineProperty_default()(this, "canvasContainer", new QuaggaContext_CanvasContainer()); }); var QuaggaContext_CanvasInfo = /*#__PURE__*/createClass_default()(function CanvasInfo() { classCallCheck_default()(this, CanvasInfo); defineProperty_default()(this, "image", void 0); defineProperty_default()(this, "overlay", void 0); }); var QuaggaContext_CanvasContainer = /*#__PURE__*/createClass_default()(function CanvasContainer() { classCallCheck_default()(this, CanvasContainer); defineProperty_default()(this, "ctx", void 0); defineProperty_default()(this, "dom", void 0); this.ctx = new QuaggaContext_CanvasInfo(); this.dom = new QuaggaContext_CanvasInfo(); }); // CONCATENATED MODULE: ./src/quagga/getViewPort.ts function getViewPort_getViewPort(target) { if (typeof document === 'undefined') { return null; } // Check if target is already a DOM element if (target instanceof HTMLElement && target.nodeName && target.nodeType === 1) { return target; } // Use '#interactive.viewport' as a fallback selector (backwards compatibility) var selector = typeof target === 'string' ? target : '#interactive.viewport'; return document.querySelector(selector); } // CONCATENATED MODULE: ./src/quagga/initBuffers.ts // TODO: need typescript def for BarcodeLocator function initBuffers_initBuffers(inputStream, imageWrapper, locator) { var _config, _config$debug; var inputImageWrapper = imageWrapper || new image_wrapper({ x: inputStream.getWidth(), y: inputStream.getHeight(), type: 'XYSize' }); if ( true && (_config = locator.config) !== null && _config !== void 0 && (_config$debug = _config.debug) !== null && _config$debug !== void 0 && _config$debug.showImageDetails) { console.log("image wrapper size ".concat(inputImageWrapper.size)); } var boxSize = [vec2_namespaceObject.clone([0, 0]), vec2_namespaceObject.clone([0, inputImageWrapper.size.y]), vec2_namespaceObject.clone([inputImageWrapper.size.x, inputImageWrapper.size.y]), vec2_namespaceObject.clone([inputImageWrapper.size.x, 0])]; barcode_locator.init(inputImageWrapper, locator); return { inputImageWrapper: inputImageWrapper, boxSize: boxSize }; } // CONCATENATED MODULE: ./src/quagga/initCanvas.ts function findOrCreateCanvas(selector, className) { var canvas = document.querySelector(selector); if (!canvas) { canvas = document.createElement('canvas'); canvas.className = className; } return canvas; } function getCanvasAndContext(selector, className, options) { var _options$debug; var canvas = findOrCreateCanvas(selector, className); if ( true && (_options$debug = options.debug) !== null && _options$debug !== void 0 && _options$debug.showImageDetails) { console.warn('* initCanvas getCanvasAndContext'); } var context = canvas.getContext('2d', { willReadFrequently: options.willReadFrequently }); return { canvas: canvas, context: context }; } function initCanvases(canvasSize, _ref) { var willReadFrequently = _ref.willReadFrequently, createOverlay = _ref.createOverlay, debug = _ref.debug; if (typeof document !== 'undefined') { var image = getCanvasAndContext('canvas.imgBuffer', 'imgBuffer', { willReadFrequently: willReadFrequently, debug: debug }); image.canvas.width = canvasSize.x; image.canvas.height = canvasSize.y; // Only create overlay canvas if createOverlay is true (default behavior) var overlay = { canvas: null, context: null }; if (createOverlay) { var overlayResult = getCanvasAndContext('canvas.drawingBuffer', 'drawingBuffer', { willReadFrequently: willReadFrequently, debug: debug }); overlayResult.canvas.width = canvasSize.x; overlayResult.canvas.height = canvasSize.y; overlay = overlayResult; } return { dom: { image: image.canvas, overlay: overlay.canvas }, ctx: { image: image.context, overlay: overlay.context } }; } return null; } function initCanvas_initCanvas(context) { var _context$config, _context$config$input, _context$config2, _context$config2$inpu, _context$config3, _context$config3$canv, _context$config4, _context$config4$inpu, _context$config5, _context$config5$loca; var viewport = getViewPort_getViewPort(context === null || context === void 0 ? void 0 : (_context$config = context.config) === null || _context$config === void 0 ? void 0 : (_context$config$input = _context$config.inputStream) === null || _context$config$input === void 0 ? void 0 : _context$config$input.target); var type = context === null || context === void 0 ? void 0 : (_context$config2 = context.config) === null || _context$config2 === void 0 ? void 0 : (_context$config2$inpu = _context$config2.inputStream) === null || _context$config2$inpu === void 0 ? void 0 : _context$config2$inpu.type; if (!type) return null; // Default to true for backwards compatibility var createOverlay = (context === null || context === void 0 ? void 0 : (_context$config3 = context.config) === null || _context$config3 === void 0 ? void 0 : (_context$config3$canv = _context$config3.canvas) === null || _context$config3$canv === void 0 ? void 0 : _context$config3$canv.createOverlay) !== false; var container = initCanvases(context.inputStream.getCanvasSize(), { willReadFrequently: !!(context !== null && context !== void 0 && (_context$config4 = context.config) !== null && _context$config4 !== void 0 && (_context$config4$inpu = _context$config4.inputStream) !== null && _context$config4$inpu !== void 0 && _context$config4$inpu.willReadFrequently), createOverlay: createOverlay, debug: context === null || context === void 0 ? void 0 : (_context$config5 = context.config) === null || _context$config5 === void 0 ? void 0 : (_context$config5$loca = _context$config5.locator) === null || _context$config5$loca === void 0 ? void 0 : _context$config5$loca.debug }); if (!container) return { dom: { image: null, overlay: null }, ctx: { image: null, overlay: null } }; var dom = container.dom; if (typeof document !== 'undefined') { if (viewport) { if (type === 'ImageStream' && !viewport.contains(dom.image)) { viewport.appendChild(dom.image); } if (dom.overlay && !viewport.contains(dom.overlay)) { viewport.appendChild(dom.overlay); } } } return container; } // CONCATENATED MODULE: ./src/quagga/qworker.ts function qworker_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function qworker_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? qworker_ownKeys(Object(t), !0).forEach(function (r) { defineProperty_default()(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : qworker_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Worker functions. These are straight from the original quagga.js file. * Not presently used, as worker support is non-functional. Keeping them around temporarily * to refer to until it is re-implemented. We may be able to fix/use some of this. */ // TODO: need a typescript interface for FrameGrabber var workerPool = []; function updateWorkers(frameGrabber) { var availableWorker; if (workerPool.length) { availableWorker = workerPool.filter(function (workerThread) { return !workerThread.busy; })[0]; if (availableWorker) { frameGrabber.attachData(availableWorker.imageData); if (frameGrabber.grab()) { availableWorker.busy = true; availableWorker.worker.postMessage({ cmd: 'process', imageData: availableWorker.imageData }, [availableWorker.imageData.buffer]); } return true; } else { return false; } } return null; } function configForWorker(config) { return qworker_objectSpread(qworker_objectSpread({}, config), {}, { inputStream: qworker_objectSpread(qworker_objectSpread({}, config.inputStream), {}, { target: null }) }); } // @ts-ignore function workerInterface(factory) { if (factory) { var Quagga = factory()["default"]; if (!Quagga) { // @ts-ignore self.postMessage({ 'event': 'error', message: 'Quagga could not be created' }); return; } } // @ts-ignore var imageWrapper; // @ts-ignore function onProcessed(result) { self.postMessage({ 'event': 'processed', // @ts-ignore imageData: imageWrapper.data, result: result // @ts-ignore }, [imageWrapper.data.buffer]); } function workerInterfaceReady() { self.postMessage({ 'event': 'initialized', // @ts-ignore imageData: imageWrapper.data // @ts-ignore }, [imageWrapper.data.buffer]); } // @ts-ignore self.onmessage = function (e) { if (e.data.cmd === 'init') { var config = e.data.config; config.numOfWorkers = 0; imageWrapper = new Quagga.ImageWrapper({ x: e.data.size.x, y: e.data.size.y }, new Uint8Array(e.data.imageData)); Quagga.init(config, workerInterfaceReady, imageWrapper); Quagga.onProcessed(onProcessed); } else if (e.data.cmd === 'process') { // @ts-ignore imageWrapper.data = new Uint8Array(e.data.imageData); Quagga.start(); } else if (e.data.cmd === 'setReaders') { Quagga.setReaders(e.data.readers); } else if (e.data.cmd === 'registerReader') { Quagga.registerReader(e.data.name, e.data.reader); } }; } function generateWorkerBlob() { var blob, factorySource; /* jshint ignore:start */ // @ts-ignore if (typeof __factorySource__ !== 'undefined') { // @ts-ignore factorySource = __factorySource__; // eslint-disable-line no-undef } /* jshint ignore:end */ blob = new Blob(['(' + workerInterface.toString() + ')(' + factorySource + ');'], { type: 'text/javascript' }); return window.URL.createObjectURL(blob); } function initWorker(config, inputStream, cb) { var blobURL = generateWorkerBlob(); var worker = new Worker(blobURL); var workerThread = { worker: worker, imageData: new Uint8Array(inputStream.getWidth() * inputStream.getHeight()), busy: true }; workerThread.worker.onmessage = function (e) { if (e.data.event === 'initialized') { URL.revokeObjectURL(blobURL); workerThread.busy = false; workerThread.imageData = new Uint8Array(e.data.imageData); if (true) { console.log('Worker initialized'); } cb(workerThread); } else if (e.data.event === 'processed') { workerThread.imageData = new Uint8Array(e.data.imageData); workerThread.busy = false; // TODO: how to thread publishResult into here? TypeScript says it's not here. https://github.com/ericblade/quagga2/issues/466#issuecomment-1724248080 says it's necessary? // @ts-ignore if (typeof publishResult !== 'undefined') { // @ts-ignore publishResult(e.data.result, workerThread.imageData); } } else if (e.data.event === 'error') { if (true) { console.log('Worker error: ' + e.data.message); } } }; workerThread.worker.postMessage({ cmd: 'init', size: { x: inputStream.getWidth(), y: inputStream.getHeight() }, imageData: workerThread.imageData, config: configForWorker(config) }, [workerThread.imageData.buffer]); } function adjustWorkerPool(capacity, config, inputStream, cb) { var increaseBy = capacity - workerPool.length; if (increaseBy === 0 && cb) { cb(); } else if (increaseBy < 0) { var workersToTerminate = workerPool.slice(increaseBy); workersToTerminate.forEach(function (workerThread) { workerThread.worker.terminate(); if (true) { console.log('Worker terminated!'); } }); workerPool = workerPool.slice(0, increaseBy); if (cb) { cb(); } } else { var workerInitialized = function workerInitialized(workerThread) { workerPool.push(workerThread); if (workerPool.length >= capacity && cb) { cb(); } }; if (config) { for (var i = 0; i < increaseBy; i++) { initWorker(config, inputStream, workerInitialized); } } } } function qworker_setReaders(readers) { workerPool.forEach(function (workerThread) { return workerThread.worker.postMessage({ cmd: 'setReaders', readers: readers }); }); } function qworker_registerReader(name, reader) { workerPool.forEach(function (workerThread) { return workerThread.worker.postMessage({ cmd: 'registerReader', name: name, reader: reader }); }); } // CONCATENATED MODULE: ./src/quagga/setupInputStream.ts // TODO: need to create an InputStream typescript interface, so we don't have an "any" in the next line function setupInputStream() { var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'LiveStream'; var viewport = arguments.length > 1 ? arguments[1] : undefined; var inputStreamFactory = arguments.length > 2 ? arguments[2] : undefined; switch (type) { case 'VideoStream': { var video = document.createElement('video'); return { video: video, inputStream: inputStreamFactory.createVideoStream(video) }; } case 'ImageStream': return { inputStream: inputStreamFactory.createImageStream() }; case 'LiveStream': { var _video = null; if (viewport) { _video = viewport.querySelector('video'); if (!_video) { _video = document.createElement('video'); viewport.appendChild(_video); } } return { video: _video, inputStream: inputStreamFactory.createLiveStream(_video) }; } default: console.error("* setupInputStream invalid type ".concat(type)); return { video: null, inputStream: null }; } } // CONCATENATED MODULE: ./src/quagga/transform.ts /* eslint-disable no-param-reassign */ function moveBox(box, xOffset, yOffset) { var corner = box.length; while (corner--) { box[corner][0] += xOffset; box[corner][1] += yOffset; } } function moveLine(line, xOffset, yOffset) { line[0].x += xOffset; line[0].y += yOffset; line[1].x += xOffset; line[1].y += yOffset; } // CONCATENATED MODULE: ./src/quagga/quagga.ts var quagga_Quagga = /*#__PURE__*/function () { function Quagga() { var _this = this; classCallCheck_default()(this, Quagga); defineProperty_default()(this, "context", new QuaggaContext_QuaggaContext()); defineProperty_default()(this, "canRecord", function (callback) { var _this$context$config; // Check if init was aborted (e.g., by calling stop() during initialization) // This can happen in React StrictMode where components are mounted/unmounted rapidly if (_this.context.initAborted) { callback(new Error('Initialization was aborted')); return; } if (!_this.context.config) { callback(new Error('Configuration not initialized')); return; } // Check if inputStream is properly initialized before proceeding if (!_this.context.inputStream) { callback(new Error('Input stream not initialized')); return; } barcode_locator.checkImageConstraints(_this.context.inputStream, (_this$context$config = _this.context.config) === null || _this$context$config === void 0 ? void 0 : _this$context$config.locator); _this.initCanvas(); _this.context.framegrabber = frame_grabber_browser.create(_this.context.inputStream, _this.context.canvasContainer.dom.image); if (_this.context.config.numOfWorkers === undefined) { _this.context.config.numOfWorkers = 0; } adjustWorkerPool(_this.context.config.numOfWorkers, _this.context.config, _this.context.inputStream, function () { var _this$context$config2; if (((_this$context$config2 = _this.context.config) === null || _this$context$config2 === void 0 ? void 0 : _this$context$config2.numOfWorkers) === 0) { _this.initializeData(); } _this.ready(callback); }); }); defineProperty_default()(this, "update", function () { if (_this.context.onUIThread) { var workersUpdated = updateWorkers(_this.context.framegrabber); if (!workersUpdated) { var _this$context$inputIm; _this.context.framegrabber.attachData((_this$context$inputIm = _this.context.inputImageWrapper) === null || _this$context$inputIm === void 0 ? void 0 : _this$context$inputIm.data); if (_this.context.framegrabber.grab()) { if (!workersUpdated) { _this.locateAndDecode(); } } } } else { var _this$context$inputIm2; _this.context.framegrabber.attachData((_this$context$inputIm2 = _this.context.inputImageWrapper) === null || _this$context$inputIm2 === void 0 ? void 0 : _this$context$inputIm2.data); _this.context.framegrabber.grab(); _this.locateAndDecode(); } }); /** * Public method to draw a scanner area overlay using the current Quagga instance's overlay canvas. * Draws based on the instance's configured inputStream.area, using the actual adjusted boxSize * to match the real scanning area after patch alignment. * Only draws when locate is false and an area is configured with styling. */ defineProperty_default()(this, "_cachedStyleValues", void 0); defineProperty_default()(this, "_resolvedStyle", void 0); } return createClass_default()(Quagga, [{ key: "initBuffers", value: function initBuffers(imageWrapper) { if (!this.context.config) { return; } var _initBuffers2 = initBuffers_initBuffers(this.context.inputStream, imageWrapper, this.context.config.locator), inputImageWrapper = _initBuffers2.inputImageWrapper, boxSize = _initBuffers2.boxSize; this.context.inputImageWrapper = inputImageWrapper; this.context.boxSize = boxSize; } }, { key: "initializeData", value: function initializeData(imageWrapper) { if (!this.context.config) { return; } this.initBuffers(imageWrapper); this.context.decoder = barcode_decoder.create(this.context.config.decoder, this.context.inputImageWrapper); } }, { key: "getViewPort", value: function getViewPort() { if (!this.context.config || !this.context.config.inputStream) { return null; } var target = this.context.config.inputStream.target; return getViewPort_getViewPort(target); } }, { key: "ready", value: function ready(callback) { this.context.inputStream.play(); callback(); } }, { key: "initCanvas", value: function initCanvas() { var container = initCanvas_initCanvas(this.context); if (!container) { return; } var ctx = container.ctx, dom = container.dom; this.context.canvasContainer.dom.image = dom.image; this.context.canvasContainer.dom.overlay = dom.overlay; this.context.canvasContainer.ctx.image = ctx.image; this.context.canvasContainer.ctx.overlay = ctx.overlay; } }, { key: "initInputStream", value: function initInputStream(callback) { if (!this.context.config || !this.context.config.inputStream) { return; } var _this$context$config$ = this.context.config.inputStream, inputType = _this$context$config$.type, constraints = _this$context$config$.constraints; var _setupInputStream = setupInputStream(inputType, this.getViewPort(), input_stream_browser), video = _setupInputStream.video, inputStream = _setupInputStream.inputStream; if (inputType === 'LiveStream' && video) { camera_access.request(video, constraints).then(function () { return inputStream.trigger('canrecord'); })["catch"](function (err) { return callback(err); }); } if (inputStream) { inputStream.setAttribute('preload', 'auto'); var setInputStreamPromise = inputStream.setInputStream(this.context.config.inputStream); if (setInputStreamPromise && typeof setInputStreamPromise["catch"] === 'function') { setInputStreamPromise["catch"](function (err) { var message = err && typeof_default()(err) === 'object' && 'message' in err ? String(err.message) : String(err); callback(err instanceof Error ? err : new Error(message)); }); } inputStream.addEventListener('canrecord', this.canRecord.bind(undefined, callback)); } this.context.inputStream = inputStream; } }, { key: "getBoundingBoxes", value: function getBoundingBoxes() { var _this$context$config3; return (_this$context$config3 = this.context.config) !== null && _this$context$config3 !== void 0 && _this$context$config3.locate ? barcode_locator.locate() : [[vec2_namespaceObject.clone(this.context.boxSize[0]), vec2_namespaceObject.clone(this.context.boxSize[1]), vec2_namespaceObject.clone(this.context.boxSize[2]), vec2_namespaceObject.clone(this.context.boxSize[3])]]; } // TODO: need a typescript type for result here. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types }, { key: "transformResult", value: function transformResult(result) { var _this2 = this; var transformedBoxes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); var topRight = this.context.inputStream.getTopRight(); var xOffset = topRight.x; var yOffset = topRight.y; if (xOffset === 0 && yOffset === 0) { return; } if (result.barcodes) { // TODO: BarcodeInfo may not be the right type here. result.barcodes.forEach(function (barcode) { return _this2.transformResult(barcode, transformedBoxes); }); } if (result.line && result.line.length === 2) { moveLine(result.line, xOffset, yOffset); } if (result.box && !transformedBoxes.has(result.box)) { moveBox(result.box, xOffset, yOffset); transformedBoxes.add(result.box); } if (result.boxes && result.boxes.length > 0) { for (var i = 0; i < result.boxes.length; i++) { // Skip if this box has already been transformed (either as result.box or through barcodes) if (!transformedBoxes.has(result.boxes[i])) { moveBox(result.boxes[i], xOffset, yOffset); transformedBoxes.add(result.boxes[i]); } } } } }, { key: "addResult", value: function addResult(result, imageData) { var _this3 = this; if (!imageData || !this.context.resultCollector) { return; } // TODO: Figure out what data structure holds a "barcodes" result, if any... if (result.barcodes) { result.barcodes.filter(function (barcode) { return barcode.codeResult; }).forEach(function (barcode) { return _this3.addResult(barcode, imageData); }); } else if (result.codeResult) { this.context.resultCollector.addResult(imageData, this.context.inputStream.getCanvasSize(), result.codeResult); } } // eslint-disable-next-line class-methods-use-this }, { key: "hasCodeResult", value: function hasCodeResult(result) { return !!(result && (result.barcodes ? result.barcodes.some(function (barcode) { return barcode.codeResult; }) : result.codeResult)); } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types }, { key: "publishResult", value: function publishResult() { var _cfg$inputStream; var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; var imageData = arguments.length > 1 ? arguments[1] : undefined; var resultToPublish = result; if (result && this.context.onUIThread) { var _result$barcodes; this.transformResult(result); this.addResult(result, imageData); // @ts-ignore resultToPublish = (result === null || result === void 0 ? void 0 : (_result$barcodes = result.barcodes) === null || _result$barcodes === void 0 ? void 0 : _result$barcodes.length) > 0 ? result.barcodes : result; } events.publish('processed', resultToPublish); if (this.hasCodeResult(result)) { events.publish('detected', resultToPublish); } // Redraw scanner area each frame when locate is false via public API. var cfg = this.context.config; if (cfg && cfg.locate === false && (_cfg$inputStream = cfg.inputStream) !== null && _cfg$inputStream !== void 0 && _cfg$inputStream.area) { this.drawScannerArea(); } } }, { key: "locateAndDecode", value: function () { var _locateAndDecode = asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee() { var boxes, _this$context$inputIm3, decodeResult, imageResult, _this$context$inputIm4, _t; return regenerator_default.a.wrap(function (_context) { while (1) switch (_context.prev = _context.next) { case 0: boxes = this.getBoundingBoxes(); if (!boxes) { _context.next = 3; break; } _context.next = 1; return this.context.decoder.decodeFromBoundingBoxes(boxes); case 1: _t = _context.sent; if (_t) { _context.next = 2; break; } _t = {}; case 2: decodeResult = _t; decodeResult.boxes = boxes; this.publishResult(decodeResult, (_this$context$inputIm3 = this.context.inputImageWrapper) === null || _this$context$inputIm3 === void 0 ? void 0 : _this$context$inputIm3.data); _context.next = 5; break; case 3: _context.next = 4; return this.context.decoder.decodeFromImage(this.context.inputImageWrapper); case 4: imageResult = _context.sent; if (imageResult) { this.publishResult(imageResult, (_this$context$inputIm4 = this.context.inputImageWrapper) === null || _this$context$inputIm4 === void 0 ? void 0 : _this$context$inputIm4.data); } else { this.publishResult(); } case 5: case "end": return _context.stop(); } }, _callee, this); })); function locateAndDecode() { return _locateAndDecode.apply(this, arguments); } return locateAndDecode; }() }, { key: "startContinuousUpdate", value: function startContinuousUpdate() { var _this$context$config4, _this4 = this; var next = null; // frequency specifies a maximum rate, not an absolute. If the system cannot // achieve the requested frequency, scans will occur as fast as possible. var delay = 1000 / (((_this$context$config4 = this.context.config) === null || _this$context$config4 === void 0 ? void 0 : _this$context$config4.frequency) || 60); this.context.stopped = false; var context = this.context; var _newFrame = function newFrame(timestamp) { next = next || timestamp; if (!context.stopped) { if (timestamp >= next) { next += delay; _this4.update(); } window.requestAnimationFrame(_newFrame); } }; _newFrame(performance.now()); } }, { key: "start", value: function start() { var _this$context$config5, _this$context$config6; if (this.context.onUIThread && ((_this$context$config5 = this.context.config) === null || _this$context$config5 === void 0 ? void 0 : (_this$context$config6 = _this$context$config5.inputStream) === null || _this$context$config6 === void 0 ? void 0 : _this$context$config6.type) === 'LiveStream') { this.startContinuousUpdate(); } else { this.update(); } } }, { key: "stop", value: function () { var _stop = asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee2() { var _this$context$config7; var _this$context$inputSt; return regenerator_default.a.wrap(function (_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: this.context.stopped = true; // Set initAborted flag if stop() is called while init() is still in progress // (i.e., before framegrabber is initialized). This prevents the canRecord // callback from continuing after stop() was called. if (!this.context.framegrabber) { this.context.initAborted = true; } adjustWorkerPool(0); if (!((_this$context$config7 = this.context.config) !== null && _this$context$config7 !== void 0 && _this$context$config7.inputStream && this.context.config.inputStream.type === 'LiveStream')) { _context2.next = 2; break; } _context2.next = 1; return camera_access.release(); case 1: (_this$context$inputSt = this.context.inputStream) === null || _this$context$inputSt === void 0 ? void 0 : _this$context$inputSt.clearEventHandlers(); case 2: case "end": return _context2.stop(); } }, _callee2, this); })); function stop() { return _stop.apply(this, arguments); } return stop; }() }, { key: "setReaders", value: function setReaders(readers) { if (this.context.decoder) { this.context.decoder.setReaders(readers); } qworker_setReaders(readers); } }, { key: "registerReader", value: function registerReader(name, reader) { barcode_decoder.registerReader(name, reader); if (this.context.decoder) { this.context.decoder.registerReader(name, reader); } qworker_registerReader(name, reader); } }, { key: "drawScannerArea", value: function drawScannerArea() { var _this$context$config8, _this$context$config9, _this$context$config0; var area = (_this$context$config8 = this.context.config) === null || _this$context$config8 === void 0 ? void 0 : (_this$context$config9 = _this$context$config8.inputStream) === null || _this$context$config9 === void 0 ? void 0 : _this$context$config9.area; if (!area) return; var overlayCtx = this.context.canvasContainer.ctx.overlay; if (!overlayCtx) return; // Only draw when locate is false if (((_this$context$config0 = this.context.config) === null || _this$context$config0 === void 0 ? void 0 : _this$context$config0.locate) !== false) return; // Quick checks for visualization presence var hasAnyStyle = area.borderColor !== undefined && area.borderColor !== '' || area.borderWidth !== undefined && area.borderWidth > 0 || area.backgroundColor !== undefined && area.backgroundColor !== ''; if (!hasAnyStyle) return; // When locate is false, use the actual adjusted boxSize that matches the scanning area if (!this.context.boxSize) return; // Get the offset for the constrained area var topRightOffset = this.context.inputStream.getTopRight(); var offsetX = topRightOffset.x; var offsetY = topRightOffset.y; var box = this.context.boxSize; var topLeft = box[0]; var bottomLeft = box[1]; var topRight = box[3]; // Add the offset to position correctly on canvas var x = topLeft[0] + offsetX; var y = topLeft[1] + offsetY; var width = topRight[0] - topLeft[0]; var height = bottomLeft[1] - topLeft[1]; var styleChanged = !this._cachedStyleValues || this._cachedStyleValues.borderColor !== area.borderColor || this._cachedStyleValues.borderWidth !== area.borderWidth || this._cachedStyleValues.backgroundColor !== area.backgroundColor; if (styleChanged) { var _area$borderColor, _area$borderWidth; this._cachedStyleValues = { borderColor: area.borderColor, borderWidth: area.borderWidth, backgroundColor: area.backgroundColor }; var shouldDrawBorder = area.borderColor !== undefined || area.borderWidth !== undefined; var color = (_area$borderColor = area.borderColor) !== null && _area$borderColor !== void 0 ? _area$borderColor : 'rgba(0, 255, 0, 0.5)'; var borderWidth = shouldDrawBorder ? (_area$borderWidth = area.borderWidth) !== null && _area$borderWidth !== void 0 ? _area$borderWidth : 2 : 0; var bg = area.backgroundColor; this._resolvedStyle = { color: color, width: borderWidth, bg: bg }; } var style = this._resolvedStyle; if (style.bg) { overlayCtx.fillStyle = style.bg; overlayCtx.fillRect(x, y, width, height); } if (style.width > 0) { overlayCtx.strokeStyle = style.color; overlayCtx.lineWidth = style.width; overlayCtx.strokeRect(x, y, width, height); } } }]); }(); // CONCATENATED MODULE: ./src/quagga.js // eslint-disable-line no-unused-vars var instance = new quagga_Quagga(); var _context = instance.context; var QuaggaJSStaticInterface = { init: function init(config, cb, imageWrapper) { var quaggaInstance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : instance; var promise; if (!cb) { promise = new Promise(function (resolve, reject) { cb = function cb(err) { err ? reject(err) : resolve(); }; }); } // Reset the initAborted flag when starting a new init quaggaInstance.context.initAborted = false; quaggaInstance.context.config = merge_default()({}, config_config, config); // TODO #179: pending restructure in Issue #179, we are temp disabling workers if (quaggaInstance.context.config.numOfWorkers > 0) { quaggaInstance.context.config.numOfWorkers = 0; } if (imageWrapper) { quaggaInstance.context.onUIThread = false; quaggaInstance.initializeData(imageWrapper); if (cb) { cb(); } } else { quaggaInstance.initInputStream(cb); } return promise; }, start: function start(config, cb) { // If config is provided, call init() then start() if (config) { var promise; if (!cb) { promise = new Promise(function (resolve, reject) { cb = function cb(err) { err ? reject(err) : resolve(); }; }); } this.init(config, function (err) { if (err) { cb(err); return; } try { instance.start(); cb(); } catch (startErr) { cb(startErr); } }); return promise; } // If init() hasn't been completed, throw an error if (!_context.framegrabber) { throw new Error('start() was called before init() completed. ' + 'Call init() first, or call start(config) to combine init and start.'); } return instance.start(); }, stop: function stop() { return instance.stop(); }, pause: function pause() { _context.stopped = true; }, onDetected: function onDetected(callback) { if (!callback || typeof callback !== 'function' && (typeof_default()(callback) !== 'object' || !callback.callback)) { console.trace('* warning: Quagga.onDetected called with invalid callback, ignoring'); return; } events.subscribe('detected', callback); }, offDetected: function offDetected(callback) { events.unsubscribe('detected', callback); }, onProcessed: function onProcessed(callback) { if (!callback || typeof callback !== 'function' && (typeof_default()(callback) !== 'object' || !callback.callback)) { console.trace('* warning: Quagga.onProcessed called with invalid callback, ignoring'); return; } events.subscribe('processed', callback); }, offProcessed: function offProcessed(callback) { events.unsubscribe('processed', callback); }, setReaders: function setReaders(readers) { if (!readers) { console.trace('* warning: Quagga.setReaders called with no readers, ignoring'); return; } instance.setReaders(readers); }, registerReader: function registerReader(name, reader) { if (!name) { console.trace('* warning: Quagga.registerReader called with no name, ignoring'); return; } if (!reader) { console.trace('* warning: Quagga.registerReader called with no reader, ignoring'); return; } instance.registerReader(name, reader); }, registerResultCollector: function registerResultCollector(resultCollector) { if (resultCollector && typeof resultCollector.addResult === 'function') { _context.resultCollector = resultCollector; } }, get canvas() { return _context.canvasContainer; }, drawScannerArea: function drawScannerArea() { return instance.drawScannerArea(); }, decodeSingle: function decodeSingle(config, resultCallback) { var _this = this; var quaggaInstance = new quagga_Quagga(); config = merge_default()({ inputStream: { type: 'ImageStream', sequence: false, size: 800, src: config.src }, numOfWorkers: true && config.debug ? 0 : 1, locator: { halfSample: false } }, config); // TODO #175: restructure worker support so that it will work with typescript using worker-loader // https://webpack.js.org/loaders/worker-loader/ if (config.numOfWorkers > 0) { config.numOfWorkers = 0; } // workers require Worker and Blob support presently, so if no Blob or Worker then set // workers to 0. if (config.numOfWorkers > 0 && (typeof Blob === 'undefined' || typeof Worker === 'undefined')) { console.warn('* no Worker and/or Blob support - forcing numOfWorkers to 0'); config.numOfWorkers = 0; } return new Promise(function (resolve, reject) { try { _this.init(config, function () { // Sync the decodeSingle instance's canvas to the global _context so Quagga.canvas works _context.canvasContainer = quaggaInstance.context.canvasContainer; events.once('processed', function (result) { quaggaInstance.stop(); if (resultCallback) { resultCallback.call(null, result); } resolve(result); }, true); quaggaInstance.start(); }, null, quaggaInstance); } catch (err) { reject(err); } }); }, // add the usually expected "default" for use with require, build step won't allow us to // write to module.exports so do it here. get default() { return QuaggaJSStaticInterface; }, Readers: reader_namespaceObject, CameraAccess: camera_access, ImageDebug: image_debug, ImageWrapper: image_wrapper, ResultCollector: result_collector }; /* harmony default export */ var quagga = __webpack_exports__["default"] = (QuaggaJSStaticInterface); // export BarcodeReader and other utilities for external plugins /***/ }) /******/ ])["default"]; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9RdWFnZ2Evd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1F1YWdnYS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gva2V5c0luLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnblZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmFyeS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VGFnLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25NZXJnZVZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJBcmcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2FmZUdldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSW5kZXguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvT3ZlcmxvYWRZaWVsZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvckRlZmluZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvckFzeW5jR2VuLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5c0luLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvS2V5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9vbWl0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3dyYXBOYXRpdmVTdXBlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tEZWxldGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tTZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwid2VicGFjazovL1F1YWdnYS8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoRGVsZXRlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlRGVlcC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRpbWVzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5c0luLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZXN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Nob3J0T3V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSXRlcmF0ZWVDYWxsLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vdHlwZWRlZnMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVSZXN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvckFzeW5jLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yS2V5cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvclZhbHVlcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc3VwZXJQcm9wQmFzZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhvdXRIb2xlcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ2xvbmUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlFYWNoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weVN5bWJvbHNJbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX0RhdGFWaWV3LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1Byb21pc2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fU2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1dlYWtNYXAuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQnlUYWcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVEYXRhVmlldy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVN5bWJvbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hcC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1NldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5zZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nVG9QYXRoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21lbW9pemVDYXBwZWQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZW1vaXplLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbGFzdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19wYXJlbnQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2xpY2UuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3VzdG9tT21pdENsb25lLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2lzTmF0aXZlRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY29uc3RydWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9jb21tb24uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0Mi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9hcnJheV9oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9jbHVzdGVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vY3ZfdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9pbWFnZV93cmFwcGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb21tb24vaW1hZ2VfZGVidWcudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9iYXJjb2RlX3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyLzJvZjVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kYWJhcl9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlXzEyOF9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlXzM5X3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGVfMzJfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZV8zOV92aW5fcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZV85M19yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW5fcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuXzJfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuXzVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvZWFuXzhfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvaTJvZjVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvcGhhcm1hY29kZV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGNfZV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGNfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9kZWNvZGVyL2JyZXNlbmhhbS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvZGVjb2Rlci9iYXJjb2RlX2RlY29kZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9pbmRleC50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2V2ZW50cy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL0V4Y2VwdGlvbi50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL21lZGlhRGV2aWNlcy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvY2FtZXJhX2FjY2Vzcy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvYW5hbHl0aWNzL3Jlc3VsdF9jb2xsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbmZpZy9jb25maWcuZGV2LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb25maWcvY29uZmlnLm5vZGUudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbmZpZy9jb25maWcucHJvZC50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29uZmlnL2NvbmZpZy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvZnJhbWVfZ3JhYmJlcl9icm93c2VyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9leGlmX2hlbHBlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvaW1hZ2VfbG9hZGVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9pbnB1dF9zdHJlYW0vaW5wdXRfc3RyZWFtX2Jyb3dzZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvdHJhY2VyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL3Jhc3Rlcml6ZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3Ivc2tlbGV0b25pemVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL2JhcmNvZGVfbG9jYXRvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvUXVhZ2dhQ29udGV4dC50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL2dldFZpZXdQb3J0LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2EvaW5pdEJ1ZmZlcnMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9pbml0Q2FudmFzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2EvcXdvcmtlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL3NldHVwSW5wdXRTdHJlYW0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS90cmFuc2Zvcm0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9xdWFnZ2EudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS5qcyJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJvUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYWxsYmFjayIsInNldFRpbWVvdXQiLCJNYXRoIiwiaW11bCIsImEiLCJiIiwiYWgiLCJhbCIsImJoIiwiYmwiLCJPYmplY3QiLCJhc3NpZ24iLCJ0YXJnZXQiLCJUeXBlRXJyb3IiLCJ0byIsImluZGV4IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibmV4dFNvdXJjZSIsIm5leHRLZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpbml0IiwiYXJyIiwidmFsIiwiZmlsbCIsInNodWZmbGUiLCJpIiwiaiIsImZsb29yIiwicmFuZG9tIiwiX3JlZiIsInRvUG9pbnRMaXN0Iiwicm93cyIsInJlZHVjZSIsInAiLCJuIiwicm93IiwiY29uY2F0Iiwiam9pbiIsInB1c2giLCJ0aHJlc2hvbGQiLCJzY29yZUZ1bmMiLCJxdWV1ZSIsInByZXYiLCJuZXh0IiwiYXBwbHkiLCJtYXhJbmRleCIsIm1heCIsInN1bSIsImNyZWF0ZSIsInBvaW50IiwicG9pbnRzIiwiY2VudGVyIiwicmFkIiwidmVjIiwidmVjMiIsImNsb25lIiwicG9pbnRNYXAiLCJhZGQiLCJwb2ludFRvQWRkIiwiaWQiLCJ1cGRhdGVDZW50ZXIiLCJjb3MiLCJzaW4iLCJmaXRzIiwib3RoZXJQb2ludCIsInNpbWlsYXJpdHkiLCJhYnMiLCJkb3QiLCJnZXRQb2ludHMiLCJnZXRDZW50ZXIiLCJjcmVhdGVQb2ludCIsIm5ld1BvaW50IiwicHJvcGVydHkiLCJpbWFnZVJlZiIsIngiLCJ5IiwidGhhdCIsInRvVmVjMiIsInRvVmVjMyIsInZlYzMiLCJyb3VuZCIsImNvbXB1dGVJbnRlZ3JhbEltYWdlMiIsImltYWdlV3JhcHBlciIsImludGVncmFsV3JhcHBlciIsImltYWdlRGF0YSIsImRhdGEiLCJ3aWR0aCIsInNpemUiLCJoZWlnaHQiLCJpbnRlZ3JhbEltYWdlRGF0YSIsInBvc0EiLCJwb3NCIiwicG9zQyIsInBvc0QiLCJjb21wdXRlSW50ZWdyYWxJbWFnZSIsInYiLCJ1IiwidGhyZXNob2xkSW1hZ2UiLCJ0YXJnZXRXcmFwcGVyIiwidGFyZ2V0RGF0YSIsImNvbXB1dGVIaXN0b2dyYW0iLCJiaXRzUGVyUGl4ZWwiLCJiaXRTaGlmdCIsImJ1Y2tldENudCIsImhpc3QiLCJJbnQzMkFycmF5Iiwic2hhcnBlbkxpbmUiLCJsaW5lIiwibGVmdCIsInJpZ2h0IiwiZGV0ZXJtaW5lT3RzdVRocmVzaG9sZCIsInVuZGVmaW5lZCIsInB4IiwiZW5kIiwibXgiLCJkZXRlcm1pbmVUaHJlc2hvbGQiLCJ2ZXQiLCJwMSIsInAyIiwicDEyIiwibTEiLCJtMiIsIm0xMiIsImsiLCJBcnJheUhlbHBlciIsIm90c3VUaHJlc2hvbGQiLCJjb21wdXRlQmluYXJ5SW1hZ2UiLCJrZXJuZWwiLCJBIiwiQiIsIkMiLCJEIiwiYXZnIiwiY2x1c3RlciIsInRoaXNDbHVzdGVyIiwiY2x1c3RlcnMiLCJhZGRUb0NsdXN0ZXIiLCJmb3VuZCIsIkNsdXN0ZXIyIiwiVHJhY2VyIiwidHJhY2UiLCJpdGVyYXRpb24iLCJtYXhJdGVyYXRpb25zIiwidG9wIiwicmVzdWx0IiwiY2VudGVyUG9zIiwiY3VycmVudFBvcyIsImlkeCIsImZvcndhcmQiLCJ0b0lkeCIsInByZWRpY3RlZFBvcyIsInRocmVzaG9sZFgiLCJ0aHJlc2hvbGRZIiwibWF0Y2giLCJwb3MiLCJwcmVkaWN0ZWQiLCJmcm9tIiwiRElMQVRFIiwiRVJPREUiLCJkaWxhdGUiLCJpbkltYWdlV3JhcHBlciIsIm91dEltYWdlV3JhcHBlciIsImluSW1hZ2VEYXRhIiwib3V0SW1hZ2VEYXRhIiwieVN0YXJ0MSIsInlTdGFydDIiLCJ4U3RhcnQxIiwieFN0YXJ0MiIsImVyb2RlIiwic3VidHJhY3QiLCJhSW1hZ2VXcmFwcGVyIiwiYkltYWdlV3JhcHBlciIsInJlc3VsdEltYWdlV3JhcHBlciIsImFJbWFnZURhdGEiLCJiSW1hZ2VEYXRhIiwiY0ltYWdlRGF0YSIsImJpdHdpc2VPciIsImNvdW50Tm9uWmVybyIsInRvcEdlbmVyaWMiLCJsaXN0IiwibWluSWR4IiwibWluIiwic2NvcmUiLCJoaXQiLCJpdGVtIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwiZ3JheUFycmF5RnJvbUltYWdlIiwiaHRtbEltYWdlIiwib2Zmc2V0WCIsImN0eCIsImFycmF5IiwiZHJhd0ltYWdlIiwiY3R4RGF0YSIsImdldEltYWdlRGF0YSIsImNvbXB1dGVHcmF5IiwiZ3JheUFycmF5RnJvbUNvbnRleHQiLCJvZmZzZXQiLCJncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhIiwiY2FudmFzRGF0YSIsIm91dEFycmF5IiwidG9wUm93SWR4IiwiYm90dG9tUm93SWR4IiwiZW5kSWR4Iiwib3V0V2lkdGgiLCJvdXRJbWdJZHgiLCJpbldpZHRoIiwiY29uZmlnIiwibCIsInNpbmdsZUNoYW5uZWwiLCJhbHBoYSIsImxvYWRJbWFnZUFycmF5Iiwic3JjIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaW1nIiwiSW1hZ2UiLCJvbmxvYWQiLCJjb25zb2xlIiwid2FybiIsImdldENvbnRleHQiLCJVaW50OEFycmF5IiwiX2N0eCRnZXRJbWFnZURhdGEiLCJoYWxmU2FtcGxlIiwiaW5JbWdXcmFwcGVyIiwib3V0SW1nV3JhcHBlciIsImluSW1nIiwib3V0SW1nIiwiaHN2MnJnYiIsImhzdiIsInJnYiIsImgiLCJzIiwiYyIsIm0iLCJyIiwiZyIsIl9jb21wdXRlRGl2aXNvcnMiLCJpc0Zpbml0ZSIsImxhcmdlRGl2aXNvcnMiLCJkaXZpc29ycyIsInNxcnROIiwic3FydCIsInVuc2hpZnQiLCJfY29tcHV0ZUludGVyc2VjdGlvbiIsImFycjEiLCJhcnIyIiwiY2FsY3VsYXRlUGF0Y2hTaXplIiwicGF0Y2hTaXplIiwiaW1nU2l6ZSIsImRpdmlzb3JzWCIsImRpdmlzb3JzWSIsIndpZGVTaWRlIiwiY29tbW9uIiwibnJPZlBhdGNoZXNMaXN0IiwibnJPZlBhdGNoZXNNYXAiLCJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwibnJPZlBhdGNoZXNJZHgiLCJuck9mUGF0Y2hlcyIsImRlc2lyZWRQYXRjaFNpemUiLCJvcHRpbWFsUGF0Y2hTaXplIiwiZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzIiwiX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzIiwidmFsdWUiLCJkaW1lbnNpb24iLCJwYXJzZUZsb2F0IiwidW5pdCIsImluZGV4T2YiLCJfZGltZW5zaW9uc0NvbnZlcnRlcnMiLCJjb250ZXh0IiwiYm90dG9tIiwiY29tcHV0ZUltYWdlQXJlYSIsImlucHV0V2lkdGgiLCJpbnB1dEhlaWdodCIsImFyZWEiLCJwYXJzZWRBcmVhIiwia2V5cyIsImtleSIsInBhcnNlZCIsImNhbGN1bGF0ZWQiLCJzeCIsInN5Iiwic3ciLCJzaCIsImFzc2VydE51bWJlclBvc2l0aXZlIiwiRXJyb3IiLCJJbWFnZVdyYXBwZXIiLCJBcnJheVR5cGUiLCJpbml0aWFsaXplIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5IiwiX2NyZWF0ZUNsYXNzIiwiaW5JbWFnZVdpdGhCb3JkZXIiLCJpbWdSZWYiLCJib3JkZXIiLCJzdWJJbWFnZUFzQ29weSIsIl9pbWFnZVdyYXBwZXIkc2l6ZSIsInNpemVYIiwic2l6ZVkiLCJnZXQiLCJnZXRTYWZlIiwiaW5kZXhNYXBwaW5nIiwic2V0IiwiemVyb0JvcmRlciIsIl90aGlzJHNpemUiLCJtb21lbnRzIiwibGFiZWxDb3VudCIsInlzcSIsImxhYmVsU3VtIiwibGFiZWwiLCJtdTExIiwibXUwMiIsIm11MjAiLCJ4XyIsInlfIiwidG1wIiwiUEkiLCJQSV80IiwibTAwIiwibTAxIiwibTEwIiwibTExIiwibTAyIiwibTIwIiwidGhldGEiLCJpc05hTiIsImF0YW4iLCJnZXRBc1JHQkEiLCJzY2FsZSIsInJldCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwicGl4ZWwiLCJjdXJyZW50Iiwic2hvdyIsImZyYW1lIiwibmV3RnJhbWUiLCJJbWFnZURhdGEiLCJwdXRJbWFnZURhdGEiLCJvdmVybGF5IiwiaW5TY2FsZSIsImFkanVzdGVkU2NhbGUiLCJ3aGl0ZVJnYiIsImJsYWNrUmdiIiwiX3Jlc3VsdCIsIl9yZXN1bHQyIiwiX3NsaWNlZFRvQXJyYXkiLCJkcmF3UmVjdCIsInN0eWxlIiwic3Ryb2tlU3R5bGUiLCJjb2xvciIsImZpbGxTdHlsZSIsImxpbmVXaWR0aCIsImJlZ2luUGF0aCIsInN0cm9rZVJlY3QiLCJkcmF3UGF0aCIsInBhdGgiLCJkZWYiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2UiLCJjYW52YXNEYXRhUG9zIiwiaW1hZ2VEYXRhUG9zIiwiQmFyY29kZURpcmVjdGlvbiIsIkJhcmNvZGVSZWFkZXIiLCJzdXBwbGVtZW50cyIsIl9yb3ciLCJfbmV4dFVuc2V0Iiwic3RhcnQiLCJfbWF0Y2hQYXR0ZXJuIiwiY291bnRlciIsImNvZGUiLCJtYXhTaW5nbGVFcnJvciIsIlNJTkdMRV9DT0RFX0VSUk9SIiwiZXJyb3IiLCJzaW5nbGVFcnJvciIsIm1vZHVsbyIsImJhcldpZHRoIiwiY291bnQiLCJzY2FsZWQiLCJfbmV4dFNldCIsIl9jb3JyZWN0QmFycyIsImNvcnJlY3Rpb24iLCJpbmRpY2VzIiwiZGVjb2RlUGF0dGVybiIsInBhdHRlcm4iLCJkZWNvZGUiLCJyZXZlcnNlIiwiZGlyZWN0aW9uIiwiUmV2ZXJzZSIsIkZvcndhcmQiLCJmb3JtYXQiLCJGT1JNQVQiLCJfbWF0Y2hSYW5nZSIsIl9maWxsQ291bnRlcnMiLCJpc1doaXRlIiwiY291bnRlcnMiLCJjb3VudGVyUG9zIiwiX3RvQ291bnRlcnMiLCJudW1Db3VudGVycyIsImRlY29kZUltYWdlIiwiU3RhcnROb3RGb3VuZEV4Y2VwdGlvbiIsIkNvZGVOb3RGb3VuZEV4Y2VwdGlvbiIsIlBhdHRlcm5Ob3RGb3VuZEV4Y2VwdGlvbiIsIk4iLCJXIiwiU1RBUlRfUEFUVEVSTiIsIlNUT1BfUEFUVEVSTiIsIkNPREVfUEFUVEVSTiIsIlNUQVJUX1BBVFRFUk5fTEVOR1RIIiwiVHdvT2ZGaXZlUmVhZGVyIiwiX0JhcmNvZGVSZWFkZXIiLCJfdGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiX2NhbGxTdXBlciIsIl9pbmhlcml0cyIsIl9maW5kUGF0dGVybiIsInRyeUhhcmRlciIsImJlc3RNYXRjaCIsImVwc2lsb24iLCJBVkdfQ09ERV9FUlJPUiIsIl9maW5kU3RhcnQiLCJzdGFydEluZm8iLCJuYXJyb3dCYXJXaWR0aCIsImxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQiLCJfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlIiwiZW5kSW5mbyIsInRyYWlsaW5nV2hpdGVzcGFjZUVuZCIsIl9maW5kRW5kIiwiX3ZlcmlmeUNvdW50ZXJMZW5ndGgiLCJfZGVjb2RlQ29kZSIsIl9kZWNvZGVQYXlsb2FkIiwiZGVjb2RlZENvZGVzIiwiY291bnRlckxlbmd0aCIsImJhclNwYWNlUmF0aW8iLCJBTFBIQUJFVCIsIkNIQVJBQ1RFUl9FTkNPRElOR1MiLCJTVEFSVF9FTkQiLCJNSU5fRU5DT0RFRF9DSEFSUyIsIk1BWF9BQ0NFUFRBQkxFIiwiUEFERElORyIsIk5ld0NvZGFiYXJSZWFkZXIiLCJfY29tcHV0ZUFsdGVybmF0aW5nVGhyZXNob2xkIiwiX2NvdW50ZXJzIiwiX3RvUGF0dGVybiIsImJhclRocmVzaG9sZCIsInNwYWNlVGhyZXNob2xkIiwiYml0bWFzayIsIl9pc1N0YXJ0RW5kIiwiX3N1bUNvdW50ZXJzIiwic3RhcnRDb3VudGVyIiwiZW5kQ291bnRlciIsIl9wYXR0ZXJuVG9DaGFyIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgiLCJfdmVyaWZ5V2hpdGVzcGFjZSIsIl9jaGFyVG9QYXR0ZXJuIiwiY2hhciIsImNoYXJDb2RlIiwiY2hhckNvZGVBdCIsIl90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuIiwiY2F0ZWdvcml6YXRpb24iLCJzcGFjZSIsIm5hcnJvdyIsImNvdW50cyIsIndpZGUiLCJiYXIiLCJraW5kIiwiY2F0IiwiZm9yRWFjaCIsIm5ld2tpbmQiLCJjZWlsIiwiX3ZhbGlkYXRlUmVzdWx0IiwidGhyZXNob2xkcyIsIm5leHRTdGFydCIsImRlY29kZWRDaGFyIiwiQ29kZTEyOFJlYWRlciIsIl9jb3JyZWN0IiwiY2FsY3VsYXRlQ29ycmVjdGlvbiIsIk1PRFVMRV9JTkRJQ0VTIiwiU1RBUlRfQ09ERV9BIiwiU1RBUlRfQ09ERV9DIiwiX3RoaXMyIiwiY2hlY2tzdW0iLCJjb2Rlc2V0IiwiQ09ERV9BIiwiU1RBUlRfQ09ERV9CIiwiQ09ERV9CIiwiQ09ERV9DIiwiZG9uZSIsInNoaWZ0TmV4dCIsInJlbW92ZUxhc3RDaGFyYWN0ZXIiLCJtdWx0aXBsaWVyIiwicmF3UmVzdWx0IiwiU1RPUF9DT0RFIiwiQ09ERV9TSElGVCIsIkZOQzEiLCJGTkMxX0NIQVIiLCJzcGxpY2UiLCJzZWxmIiwiZXhwZWN0ZWQiLCJub3JtYWxpemVkIiwic3VtTm9ybWFsaXplZCIsInN1bUV4cGVjdGVkIiwiQUxQSEFCRVRIX1NUUklORyIsIlVpbnQxNkFycmF5IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWFwIiwiQVNURVJJU0siLCJDb2RlMzlSZWFkZXIiLCJwYXR0ZXJuU3RhcnQiLCJ3aGl0ZVNwYWNlTXVzdFN0YXJ0IiwibWF4TmFycm93V2lkdGgiLCJudW1XaWRlQmFycyIsIndpZGVCYXJXaWR0aCIsIl9maW5kTmV4dFdpZHRoIiwibWluV2lkdGgiLCJsYXN0U3RhcnQiLCJwYXR0ZXJuU2l6ZSIsInBvcCIsInBhdHRlcm5zIiwiQUVJTyIsIkFaMDkiLCJjb2RlMzJzZXQiLCJDb2RlMzJSZWFkZXIiLCJfQ29kZTM5UmVhZGVyIiwiX2RlY29kZUNvZGUzMiIsInRlc3QiLCJyZXMiLCJjb2RlMzIiLCJzbGljZSIsIl9jaGVja0NoZWNrc3VtIiwiZGlnaXRzIiwiY2hhckF0IiwiX3N1cGVyUHJvcEdldCIsInJlcGxhY2UiLCJJT1EiLCJDb2RlMzlWSU5SZWFkZXIiLCJsb2ciLCJDb2RlOTNSZWFkZXIiLCJfdmVyaWZ5RW5kIiwiX2RlY29kZUV4dGVuZGVkIiwiY2hhckFycmF5IiwibmV4dENoYXIiLCJuZXh0Q2hhckNvZGUiLCJfbWF0Y2hDaGVja0NoYXIiLCJtYXhXZWlnaHQiLCJhcnJheVRvQ2hlY2siLCJ3ZWlnaHRlZFN1bXMiLCJ3ZWlnaHQiLCJjaGVja0NoYXIiLCJfdmVyaWZ5Q2hlY2tzdW1zIiwiQ09ERV9HX1NUQVJUIiwiTUlERExFX1BBVFRFUk4iLCJFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiIsIkNPREVfRlJFUVVFTkNZIiwiRUFOUmVhZGVyIiwibWVyZ2UiLCJjb2RlcmFuZ2UiLCJfY2FsY3VsYXRlRmlyc3REaWdpdCIsImNvZGVGcmVxdWVuY3kiLCJpbkNvZGUiLCJvdXRDb2RlIiwiX29iamVjdFNwcmVhZCIsImZpcnN0RGlnaXQiLCJtaWRkbGVQYXR0ZXJuIiwiX2NoZWNrc3VtIiwiX2RlY29kZUV4dGVuc2lvbnMiLCJlcnIiLCJyZXN1bHRJbmZvIiwic3VwcGxlbWVudCIsImxhc3RDb2RlIiwiRUFOMlJlYWRlciIsIl9FQU5SZWFkZXIiLCJwYXJzZUludCIsIkNIRUNLX0RJR0lUX0VOQ09ESU5HUyIsImRldGVybWluZUNoZWNrRGlnaXQiLCJleHRlbnNpb25DaGVja3N1bSIsIkVBTjVSZWFkZXIiLCJFQU44UmVhZGVyIiwiSTJvZjVSZWFkZXIiLCJvcHRzIiwibm9ybWFsaXplQmFyU3BhY2VXaWR0aCIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwiY291bnRlclN1bSIsImNvZGVTdW0iLCJjb3JyZWN0aW9uUmF0aW8iLCJNQVhfQ09SUkVDVElPTl9GQUNUT1IiLCJjb3JyZWN0aW9uUmF0aW9JbnZlcnNlIiwiX2RlY29kZVBhaXIiLCJjb3VudGVyUGFpciIsImNvZGVzIiwiTUlOX0JBUl9DT1VOVCIsIk1BWF9CQVJfQ09VTlQiLCJNSU5fVkFMVUUiLCJXSURFX0JBUl9USFJFU0hPTEQiLCJNQVhfU1BBQ0VfVkFSSUFOQ0UiLCJNSU5fUVVJRVRfWk9ORV9XSURUSFMiLCJBTExPV0VEX1dJREVfQkFSX1JBVElPUyIsIldJREVfQkFSX1JBVElPX1RPTEVSQU5DRSIsIlBoYXJtYWNvZGVSZWFkZXIiLCJtaW5RdWlldFpvbmUiLCJzZWFyY2hQb3MiLCJiYXJTdGFydCIsImJhckVuZCIsInJlcXVpcmVkUXVpZXRab25lIiwicXVpZXRab25lU3RhcnQiLCJtYXhTcGFjZVRvTmV4dEJhciIsIm5leHRCYXJTdGFydCIsInNwYWNlVG9OZXh0QmFyIiwiX3Ntb290aEJhcldpZHRocyIsImJhcnMiLCJzbW9vdGhlZCIsImN1cnIiLCJtZWRpYW4iLCJzb3J0IiwiZGV2aWF0aW9uIiwiX2V4dHJhY3RCYXJzQW5kU3BhY2VzIiwic3RhcnRQb3MiLCJzcGFjZXMiLCJjdXJyZW50V2lkdGgiLCJmb3VuZFRyYWlsaW5nUXVpZXRab25lIiwiZXN0aW1hdGVkTmFycm93V2lkdGgiLCJzdHJpY3RRdWlldFpvbmUiLCJhZGFwdGl2ZVF1aWV0Wm9uZSIsInNwYWNlU3RhcnQiLCJhdmdTcGFjZSIsIl92YWxpZGF0ZVNwYWNlcyIsIl92YWxpZGF0ZUJhclNpemVDb3VudCIsInNtb290aGVkQmFycyIsInRvbGVyYW5jZSIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJmb3VuZENsdXN0ZXIiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiY2x1c3RlckF2ZyIsImUiLCJmIiwibWVhbiIsInZhcmlhbmNlIiwicG93Iiwic3RkRGV2IiwiY3YiLCJfdmFsaWRhdGVCYXJSYXRpb3MiLCJhdmdBbGwiLCJ2YXJBbGwiLCJjdkFsbCIsInNwYWNlVG9CYXJSYXRpbyIsImluZmVycmVkTmFycm93IiwibmFycm93V2lkdGgiLCJ3aWRlUmF0aW8iLCJzb3J0ZWRVbmlxdWUiLCJTZXQiLCJhdmdXaWR0aCIsImNhbmRpZGF0ZXMiLCJ0IiwidyIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJhdmdOIiwiYXZnVyIsInJhdGlvIiwiYmVzdFJhdGlvIiwiYmVzdERpZmYiLCJfaSIsIl9BTExPV0VEX1dJREVfQkFSX1JBVCIsImQiLCJuYXJyb3dCYXJzIiwid2lkZUJhcnMiLCJyYXRpb0RpZmYiLCJtYXRjaGVkUmF0aW8iLCJfaTIiLCJfY2FuZGlkYXRlcyIsIm5hcnJvd1RvbGVyYW5jZSIsIndpZGVUb2xlcmFuY2UiLCJvayIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJfaXRlcmF0b3I1IiwiX3N0ZXA1IiwiX3ZhbGlkYXRlUGVyaW9kaWNpdHkiLCJiYXJNZWFuIiwiYmFyVmFyaWFuY2UiLCJiYXJTdGREZXYiLCJiYXJDViIsInNwYWNlTWVhbiIsInNwYWNlVmFyaWFuY2UiLCJzcGFjZVN0ZERldiIsInNwYWNlQ1YiLCJfdmFsaWRhdGVRdWlldFpvbmVzIiwicmVtYWluaW5nU3BhY2UiLCJfZGVjb2RlQmFycyIsInJldmVyc2VkQmFycyIsImlzV2lkZSIsIl92YWxpZGF0ZVBhdHRlcm5Db25zaXN0ZW5jeSIsIm9yaWdpbmFsU3RhcnQiLCJjb25zaXN0ZW50T2Zmc2V0cyIsInRvdGFsQ2hlY2tzIiwiX2k0IiwiX2FyciIsInNoaWZ0ZWRTdGFydCIsInNoaWZ0ZWRFeHRyYWN0ZWQiLCJiYXJzTWF0Y2giLCJkaWZmIiwiZXh0cmFjdGVkIiwiYmFyc1dpZHRoIiwic3BhY2VzV2lkdGgiLCJ0b3RhbEJhcmNvZGVXaWR0aCIsIkVER0VfTUFSR0lOIiwicmF0aW9JbmZvIiwiZGVjb2RlZCIsImF2Z0JhcldpZHRoIiwidG9TdHJpbmciLCJVUENFUmVhZGVyIiwiX2RldGVybWluZVBhcml0eSIsIm5yU3lzdGVtIiwiX2NvbnZlcnRUb1VQQ0EiLCJ1cGNhIiwibGFzdERpZ2l0IiwiVVBDUmVhZGVyIiwic3Vic3RyaW5nIiwiQnJlc2VuaGFtIiwiU2xvcGUiLCJESVIiLCJVUCIsIkRPV04iLCJnZXRCYXJjb2RlTGluZSIsIngwIiwieTAiLCJ4MSIsInkxIiwic3RlZXAiLCJyZWFkIiwiZGVsdGFYIiwiZGVsdGFZIiwieVN0ZXAiLCJ0b0JpbmFyeUxpbmUiLCJzbG9wZSIsInNsb3BlMiIsImV4dHJlbWEiLCJjdXJyZW50RGlyIiwiZGlyIiwiclRocmVzaG9sZCIsImRlYnVnIiwicHJpbnRGcmVxdWVuY3kiLCJwcmludFBhdHRlcm4iLCJmaWxsQ29sb3IiLCJmaWxsUmVjdCIsIlJFQURFUlMiLCJjb2RlXzEyOF9yZWFkZXIiLCJlYW5fcmVhZGVyIiwiZWFuXzVfcmVhZGVyIiwiZWFuXzJfcmVhZGVyIiwiZWFuXzhfcmVhZGVyIiwiY29kZV8zOV9yZWFkZXIiLCJjb2RlXzM5X3Zpbl9yZWFkZXIiLCJjb2RhYmFyX3JlYWRlciIsIkNvZGFiYXJSZWFkZXIiLCJ1cGNfcmVhZGVyIiwidXBjX2VfcmVhZGVyIiwiaTJvZjVfcmVhZGVyIiwiY29kZV85M19yZWFkZXIiLCJjb2RlXzMyX3JlYWRlciIsInBoYXJtYWNvZGVfcmVhZGVyIiwicmVnaXN0ZXJSZWFkZXIiLCJuYW1lIiwicmVhZGVyIiwiaW5wdXRJbWFnZVdyYXBwZXIiLCJfY2FudmFzIiwiZnJlcXVlbmN5IiwiZG9tIiwiX2JhcmNvZGVSZWFkZXJzIiwiaW5pdENhbnZhcyIsImluaXRSZWFkZXJzIiwiaW5pdENvbmZpZyIsIl9jb25maWckZGVidWciLCIkZGVidWciLCJxdWVyeVNlbGVjdG9yIiwiY2xhc3NOYW1lIiwiYXBwZW5kQ2hpbGQiLCJwcmludFJlYWRlckluZm8iLCJfY29uZmlnJGRlYnVnMyIsInJlYWRlcnMiLCJyZWFkZXJDb25maWciLCJfY29uZmlnJGRlYnVnMiIsImNvbmZpZ3VyYXRpb24iLCJfdHlwZW9mIiwicmVhZGVyT2JqIiwiSlNPTiIsInN0cmluZ2lmeSIsInZpcyIsIm5vZGUiLCJwcm9wIiwic2hvd0ZyZXF1ZW5jeSIsInNob3dQYXR0ZXJuIiwiZGlzcGxheSIsImdldEV4dGVuZGVkTGluZSIsImFuZ2xlIiwiZXh0IiwiZXh0ZW5kTGluZSIsImFtb3VudCIsImV4dGVuc2lvbiIsImdldExpbmUiLCJib3giLCJ2YWxpZGF0ZUFkamFjZW50WUxpbmVzIiwib3JpZ2luYWxZIiwib3JpZ2luYWxYU3RhcnQiLCJjb25zdHJ1Y3RvckZuIiwiY29uc3RydWN0b3IiLCJyZXF1aXJlZE1hdGNoZXMiLCJhZGphY2VudExpbmVWYWxpZGF0aW9uTWF0Y2hlcyIsIm1hdGNoQ291bnQiLCJ5T2Zmc2V0IiwiX2FycjIiLCJuZXdZIiwibmV3UDEiLCJuZXdQMiIsIm5ld0JhcmNvZGVMaW5lIiwic3RhcnRGb3VuZCIsImlzVmFsaWQiLCJ0cnlEZWNvZGUiLCJiYXJjb2RlTGluZSIsIkltYWdlRGVidWciLCJzdWNjZXNzZnVsUmVhZGVySW5kZXgiLCJzZXRJbWFnZVdyYXBwZXIiLCJjb2RlUmVzdWx0IiwidHJ5RGVjb2RlQnJ1dGVGb3JjZSIsImxpbmVBbmdsZSIsInNpZGVMZW5ndGgiLCJzbGljZXMiLCJ4ZGlyIiwieWRpciIsImdldExpbmVMZW5ndGgiLCJkZWNvZGVGcm9tSW1hZ2UiLCJfeCIsIl9kZWNvZGVGcm9tSW1hZ2UiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTIiLCJfdCIsIndyYXAiLCJfY29udGV4dDIiLCJzZW50IiwiYWJydXB0IiwiZmluaXNoIiwic3RvcCIsImRlY29kZUZyb21Cb3VuZGluZ0JveCIsImRyYXdCb3VuZGluZ0JveCIsImxpbmVMZW5ndGgiLCJhdGFuMiIsImRyYXdTY2FubGluZSIsImRlY29kZUZyb21Cb3VuZGluZ0JveGVzIiwiYm94ZXMiLCJiYXJjb2RlcyIsIm11bHRpcGxlIiwiaW1hZ2VXcmFwcGVySW4iLCJfY2FsbGVlIiwiX2NvbnRleHQiLCJzZXRSZWFkZXJzIiwiRXZlbnRJbnRlcmZhY2UiLCJldmVudHMiLCJnZXRFdmVudCIsImV2ZW50TmFtZSIsInN1YnNjcmliZXJzIiwiY2xlYXJFdmVudHMiLCJwdWJsaXNoU3Vic2NyaXB0aW9uIiwic3Vic2NyaXB0aW9uIiwiYXN5bmMiLCJfc3Vic2NyaWJlIiwiZXZlbnQiLCJzdWJzY3JpYmUiLCJwdWJsaXNoIiwiZmlsdGVyIiwic3Vic2NyaWJlciIsIm9uY2UiLCJ1bnN1YnNjcmliZSIsIkV4Y2VwdGlvbiIsIl9FcnJvciIsInNldFByb3RvdHlwZU9mIiwidG9KU09OIiwibWVzc2FnZSIsIl93cmFwTmF0aXZlU3VwZXIiLCJFUlJPUl9ERVNDIiwiZW51bWVyYXRlRGV2aWNlcyIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsIlByb21pc2UiLCJyZWplY3QiLCJnZXRVc2VyTWVkaWEiLCJjb25zdHJhaW50cyIsInN0cmVhbVJlZiIsIndhaXRGb3JWaWRlbyIsInZpZGVvIiwicmVzb2x2ZSIsImF0dGVtcHRzIiwiY2hlY2tWaWRlbyIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImluaXRDYW1lcmEiLCJfeDIiLCJfaW5pdENhbWVyYSIsIl9jYWxsZWU0Iiwic3RyZWFtIiwiX2NvbnRleHQ0Iiwic2V0QXR0cmlidXRlIiwic3JjT2JqZWN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInBsYXkiLCJkZXByZWNhdGVkQ29uc3RyYWludHMiLCJ2aWRlb0NvbnN0cmFpbnRzIiwib21pdCIsIm1pbkFzcGVjdFJhdGlvIiwiYXNwZWN0UmF0aW8iLCJmYWNpbmciLCJmYWNpbmdNb2RlIiwicGlja0NvbnN0cmFpbnRzIiwiZGV2aWNlSWQiLCJhdWRpbyIsImVudW1lcmF0ZVZpZGVvRGV2aWNlcyIsIl94MyIsIl9lbnVtZXJhdGVWaWRlb0RldmljZXMiLCJfY2FsbGVlNSIsImRldmljZXMiLCJ2aWRlb0RldmljZXMiLCJjb25zdHJhaW5lZERldmljZXMiLCJwcm9jZXNzZWRDb25zdHJhaW50cyIsIl8iLCJjb25zdHJhaW50c1dpdGhvdXREZXZpY2VJZCIsImRldmljZSIsIl90MyIsIl90NCIsIl9jb250ZXh0NSIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsImV4YWN0IiwiZ2V0VHJhY2tzIiwidHJhY2siLCJnZXRBY3RpdmVUcmFjayIsInRyYWNrcyIsImdldFZpZGVvVHJhY2tzIiwiZ2V0QWN0aXZlU3RyZWFtIiwiX3N0cmVhbVJlZiIsIlF1YWdnYUpTQ2FtZXJhQWNjZXNzIiwicmVxdWVzdGVkVmlkZW9FbGVtZW50IiwicmVxdWVzdCIsIm5ld0NvbnN0cmFpbnRzIiwicmVsZWFzZSIsInBhdXNlIiwiZ2V0QWN0aXZlU3RyZWFtTGFiZWwiLCJkaXNhYmxlVG9yY2giLCJhcHBseUNvbnN0cmFpbnRzIiwiYWR2YW5jZWQiLCJ0b3JjaCIsIk92ZXJjb25zdHJhaW5lZEVycm9yIiwiZW5hYmxlVG9yY2giLCJfY2FsbGVlMyIsIl90MiIsIl9jb250ZXh0MyIsImNvbnRhaW5zIiwic29tZSIsImV2ZXJ5IiwicGFzc2VzRmlsdGVyIiwiX2NvbmZpZyRjYXBhY2l0eSIsIndpbGxSZWFkRnJlcXVlbnRseSIsInJlc3VsdHMiLCJjYXBhY2l0eSIsImNhcHR1cmUiLCJtYXRjaGVzQ29uc3RyYWludHMiLCJibGFja2xpc3QiLCJhZGRSZXN1bHQiLCJpbWFnZVNpemUiLCJ0b0RhdGFVUkwiLCJnZXRSZXN1bHRzIiwiRGV2Q29uZmlnIiwiaW5wdXRTdHJlYW0iLCJ0eXBlIiwic2hvd0ltYWdlRGV0YWlscyIsImxvY2F0ZSIsImNyZWF0ZU92ZXJsYXkiLCJkZWNvZGVyIiwibG9jYXRvciIsInNob3dDYW52YXMiLCJzaG93UGF0Y2hlcyIsInNob3dGb3VuZFBhdGNoZXMiLCJzaG93U2tlbGV0b24iLCJzaG93TGFiZWxzIiwic2hvd1BhdGNoTGFiZWxzIiwic2hvd1JlbWFpbmluZ1BhdGNoTGFiZWxzIiwic2hvd1BhdGNoU2l6ZSIsImJveEZyb21QYXRjaGVzIiwic2hvd1RyYW5zZm9ybWVkIiwic2hvd1RyYW5zZm9ybWVkQm94Iiwic2hvd0JCIiwiTm9kZUNvbmZpZyIsInNlcXVlbmNlIiwiUHJvZENvbmZpZyIsIkV4cG9ydENvbmZpZyIsIlF1YWdnYUNvbmZpZyIsIlRPX1JBRElBTlMiLCJhZGp1c3RDYW52YXNTaXplIiwidGFyZ2V0U2l6ZSIsIkZyYW1lR3JhYmJlciIsIl9zdHJlYW1Db25maWckZGVidWciLCJfc3RyZWFtQ29uZmlnJGRlYnVnMiIsIl90aGF0IiwiX3N0cmVhbUNvbmZpZyIsImdldENvbmZpZyIsIl92aWRlb1NpemUiLCJnZXRSZWFsV2lkdGgiLCJnZXRSZWFsSGVpZ2h0IiwiX2NhbnZhc1NpemUiLCJnZXRDYW52YXNTaXplIiwiX3NpemUiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsInRvcFJpZ2h0IiwiZ2V0VG9wUmlnaHQiLCJfc3giLCJfc3kiLCJfY3R4IiwiX2RhdGEiLCJ2aWRlb1NpemUiLCJjYW52YXNTaXplIiwiYXR0YWNoRGF0YSIsImdldERhdGEiLCJiaWxpbmVhckludGVycG9sYXRlIiwiZ3JheURhdGEiLCJmeCIsImZ5IiwidjAwIiwidjEwIiwidjAxIiwidjExIiwidjAiLCJ2MSIsImdyYWIiLCJkb0hhbGZTYW1wbGUiLCJnZXRGcmFtZSIsImRyYXdhYmxlIiwiZHJhd0FuZ2xlIiwidGFncyIsIm9yaWVudGF0aW9uIiwidHJhbnNsYXRlIiwicm90YXRlIiwidGVtcENhbnZhcyIsInRlbXBDdHgiLCJvcmlnaW5hbEltYWdlRGF0YSIsInNjYWxlZEdyYXlEYXRhIiwic3RlcFNpemVYIiwic3RlcFNpemVZIiwic3JjWCIsInNyY1kiLCJzcmNJZHgiLCJnZXRTaXplIiwiRXhpZlRhZ3MiLCJBdmFpbGFibGVUYWdzIiwiZmluZFRhZ3NJbk9iamVjdFVSTCIsIm9iamVjdFVSTFRvQmxvYiIsInRoZW4iLCJyZWFkVG9CdWZmZXIiLCJidWZmZXIiLCJmaW5kVGFnc0luQnVmZmVyIiwiYmFzZTY0VG9BcnJheUJ1ZmZlciIsImRhdGFVcmwiLCJiYXNlNjQiLCJiaW5hcnkiLCJhdG9iIiwibGVuIiwiQXJyYXlCdWZmZXIiLCJ2aWV3IiwiYmxvYiIsImZpbGVSZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJ1cmwiLCJodHRwIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwicmVzcG9uc2VUeXBlIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJzdGF0dXMiLCJyZXNwb25zZSIsIm9uZXJyb3IiLCJzZW5kIiwiZmlsZSIsInNlbGVjdGVkVGFncyIsImRhdGFWaWV3IiwiRGF0YVZpZXciLCJieXRlTGVuZ3RoIiwiZXhpZlRhZ3MiLCJzZWxlY3RlZFRhZyIsImV4aWZUYWciLCJ0YWciLCJtYXJrZXIiLCJnZXRVaW50OCIsInJlYWRFWElGRGF0YSIsImdldFVpbnQxNiIsImdldFN0cmluZ0Zyb21CdWZmZXIiLCJ0aWZmT2Zmc2V0IiwiYmlnRW5kIiwiZmlyc3RJRkRPZmZzZXQiLCJnZXRVaW50MzIiLCJyZWFkVGFncyIsInRpZmZTdGFydCIsImRpclN0YXJ0Iiwic3RyaW5ncyIsImVudHJpZXMiLCJlbnRyeU9mZnNldCIsInJlYWRUYWdWYWx1ZSIsIm51bVZhbHVlcyIsIm91dHN0ciIsImdlbmVyYXRlSW1hZ2VGaWxlbmFtZSIsImRpcmVjdG9yeSIsIm51bSIsInBhZFN0YXJ0IiwiSW1hZ2VMb2FkZXIiLCJsb2FkIiwiaHRtbEltYWdlc1NyY0FycmF5IiwiaHRtbEltYWdlc0FycmF5Iiwibm90TG9hZGVkIiwiYWRkSW1hZ2UiLCJpbWFnZSIsImxvYWRlZCIsImxvYWRlZEltZyIsIm5vdGxvYWRlZEltZ3MiLCJpbWdOYW1lIiwiZW5jb2RlVVJJIiwic3Vic3RyIiwibGFzdEluZGV4T2YiLCJhZGRPbmxvYWRIYW5kbGVyIiwiaW5wdXRTdHJlYW1GYWN0b3J5IiwiY3JlYXRlVmlkZW9TdHJlYW0iLCJfY29uZmlnIiwiX2V2ZW50TmFtZXMiLCJfZXZlbnRIYW5kbGVycyIsIl9jYWxjdWxhdGVkV2lkdGgiLCJfY2FsY3VsYXRlZEhlaWdodCIsIl90b3BSaWdodCIsImluaXRTaXplIiwiX2NvbmZpZzIiLCJfY29uZmlnMyIsInNldFdpZHRoIiwic2V0SGVpZ2h0Iiwic2V0SW5wdXRTdHJlYW0iLCJlbmRlZCIsInNldEN1cnJlbnRUaW1lIiwidGltZSIsIl9jb25maWc0IiwiYm9vbCIsImNsZWFyRXZlbnRIYW5kbGVycyIsImhhbmRsZXJzIiwiaGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ0cmlnZ2VyIiwic2V0VG9wUmlnaHQiLCJzZXRDYW52YXNTaXplIiwiY3JlYXRlTGl2ZVN0cmVhbSIsImNyZWF0ZUltYWdlU3RyZWFtIiwiZnJhbWVJZHgiLCJwYXVzZWQiLCJpbWdBcnJheSIsImJhc2VVcmwiLCJjYWxjdWxhdGVkV2lkdGgiLCJjYWxjdWxhdGVkSGVpZ2h0IiwibG9hZEltYWdlcyIsIl9jb25maWc3IiwiaW1ncyIsIl9jb25maWc1IiwiX2NvbmZpZzYiLCJwdWJsaXNoRXZlbnQiLCJuZXdXaWR0aCIsIm5ld0hlaWdodCIsImluZCIsIl9pbWdBcnJheSIsInNlYXJjaERpcmVjdGlvbnMiLCJsYWJlbFdyYXBwZXIiLCJsYWJlbERhdGEiLCJlZGdlbGFiZWwiLCJjeSIsImN4IiwidmVydGV4MkQiLCJjb250b3VyVHJhY2luZyIsIkZ2IiwiQ3YiLCJQIiwibGRpciIsInRvdGFsUGl4ZWxDb3VudCIsInBpeGVsQ291bnRlciIsIlJhc3Rlcml6ZXIiLCJjcmVhdGVDb250b3VyMkQiLCJmaXJzdFZlcnRleCIsImluc2lkZUNvbnRvdXJzIiwibmV4dHBlZXIiLCJwcmV2cGVlciIsIkNPTlRPVVJfRElSIiwiQ1dfRElSIiwiQ0NXX0RJUiIsIlVOS05PV05fRElSIiwiT1VUU0lERV9FREdFIiwiSU5TSURFX0VER0UiLCJ0cmFjZXIiLCJyYXN0ZXJpemUiLCJkZXB0aGxhYmVsIiwiYmMiLCJsYyIsImxhYmVsaW5kZXgiLCJjb2xvck1hcCIsInZlcnRleCIsImNjIiwic2MiLCJjb25uZWN0ZWRDb3VudCIsImRyYXdDb250b3VyIiwiZmlyc3RDb250b3VyIiwicHEiLCJpcSIsInEiLCJTa2VsZXRvbml6ZXIiLCJzdGRsaWIiLCJmb3JlaWduIiwiaW1hZ2VzIiwiaW5JbWFnZVB0ciIsIm91dEltYWdlUHRyIiwiYUltYWdlUHRyIiwiYkltYWdlUHRyIiwiaW1hZ2VQdHIiLCJtZW1jcHkiLCJzcmNJbWFnZVB0ciIsImRzdEltYWdlUHRyIiwic2tlbGV0b25pemUiLCJzdWJJbWFnZVB0ciIsImVyb2RlZEltYWdlUHRyIiwidGVtcEltYWdlUHRyIiwic2tlbEltYWdlUHRyIiwiX2N1cnJlbnRJbWFnZVdyYXBwZXIiLCJfc2tlbEltYWdlV3JhcHBlciIsIl9zdWJJbWFnZVdyYXBwZXIiLCJfbGFiZWxJbWFnZVdyYXBwZXIiLCJfcGF0Y2hHcmlkIiwiX3BhdGNoTGFiZWxHcmlkIiwiX2ltYWdlVG9QYXRjaEdyaWQiLCJfYmluYXJ5SW1hZ2VXcmFwcGVyIiwiX3BhdGNoU2l6ZSIsIl9jYW52YXNDb250YWluZXIiLCJfbnVtUGF0Y2hlcyIsIl9pbnB1dEltYWdlV3JhcHBlciIsIl9za2VsZXRvbml6ZXIiLCJpbml0QnVmZmVycyIsInNrZWxldG9uSW1hZ2VEYXRhU2l6ZSIsImJ1ZmZlclNpemUiLCJsb2cyIiwic2tlbGV0b25JbWFnZURhdGEiLCJza2VsZXRvbml6ZXIiLCJ1c2VXb3JrZXIiLCJwYXRjaGVzIiwib3ZlckF2ZyIsInBhdGNoIiwidHJhbnNNYXQiLCJtaW54IiwibWlueSIsIm1heHgiLCJtYXh5IiwibWF0MiIsImNvcHkiLCJ0cmFuc2Zvcm1NYXQyIiwiaW52ZXJ0IiwiYmluYXJpemVJbWFnZSIsImZpbmRQYXRjaGVzIiwicGF0Y2hlc0ZvdW5kIiwicmFzdGVyaXplciIsInJhc3RlclJlc3VsdCIsImRlc2NyaWJlUGF0Y2giLCJmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzIiwibWF4TGFiZWwiLCJsYWJlbEhpc3QiLCJ0b3BMYWJlbHMiLCJlbCIsImZpbmRCb3hlcyIsInNpbWlsYXJNb21lbnRzIiwidG9wQ2x1c3RlciIsInBhdGNoUG9zIiwiZWxpZ2libGVNb21lbnRzIiwibWF0Y2hpbmdNb21lbnRzIiwibWluQ29tcG9uZW50V2VpZ2h0IiwiX21hdGNoaW5nTW9tZW50cyRrJHJhIiwiX21hdGNoaW5nTW9tZW50cyRrIiwicmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkiLCJjdXJySWR4Iiwibm90WWV0UHJvY2Vzc2VkIiwiY3VycmVudElkeCIsImN1cnJlbnRQYXRjaCIsImNoZWNrSW1hZ2VDb25zdHJhaW50cyIsInRoaXNIYWxmU2FtcGxlIiwiUXVhZ2dhQ29udGV4dCIsIkNhbnZhc0NvbnRhaW5lciIsIkNhbnZhc0luZm8iLCJnZXRWaWV3UG9ydCIsIkhUTUxFbGVtZW50Iiwibm9kZU5hbWUiLCJub2RlVHlwZSIsInNlbGVjdG9yIiwiYm94U2l6ZSIsIkJhcmNvZGVMb2NhdG9yIiwiZmluZE9yQ3JlYXRlQ2FudmFzIiwiZ2V0Q2FudmFzQW5kQ29udGV4dCIsIm9wdGlvbnMiLCJfb3B0aW9ucyRkZWJ1ZyIsImluaXRDYW52YXNlcyIsIm92ZXJsYXlSZXN1bHQiLCJfY29udGV4dCRjb25maWciLCJfY29udGV4dCRjb25maWckaW5wdXQiLCJfY29udGV4dCRjb25maWcyIiwiX2NvbnRleHQkY29uZmlnMiRpbnB1IiwiX2NvbnRleHQkY29uZmlnMyIsIl9jb250ZXh0JGNvbmZpZzMkY2FudiIsIl9jb250ZXh0JGNvbmZpZzQiLCJfY29udGV4dCRjb25maWc0JGlucHUiLCJfY29udGV4dCRjb25maWc1IiwiX2NvbnRleHQkY29uZmlnNSRsb2NhIiwidmlld3BvcnQiLCJjb250YWluZXIiLCJ3b3JrZXJQb29sIiwidXBkYXRlV29ya2VycyIsImZyYW1lR3JhYmJlciIsImF2YWlsYWJsZVdvcmtlciIsIndvcmtlclRocmVhZCIsImJ1c3kiLCJ3b3JrZXIiLCJwb3N0TWVzc2FnZSIsImNtZCIsImNvbmZpZ0ZvcldvcmtlciIsIndvcmtlckludGVyZmFjZSIsImZhY3RvcnkiLCJRdWFnZ2EiLCJvblByb2Nlc3NlZCIsIndvcmtlckludGVyZmFjZVJlYWR5Iiwib25tZXNzYWdlIiwibnVtT2ZXb3JrZXJzIiwiZ2VuZXJhdGVXb3JrZXJCbG9iIiwiZmFjdG9yeVNvdXJjZSIsIl9fZmFjdG9yeVNvdXJjZV9fIiwiQmxvYiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImluaXRXb3JrZXIiLCJjYiIsImJsb2JVUkwiLCJXb3JrZXIiLCJyZXZva2VPYmplY3RVUkwiLCJwdWJsaXNoUmVzdWx0IiwiYWRqdXN0V29ya2VyUG9vbCIsImluY3JlYXNlQnkiLCJ3b3JrZXJzVG9UZXJtaW5hdGUiLCJ0ZXJtaW5hdGUiLCJ3b3JrZXJJbml0aWFsaXplZCIsInNldHVwSW5wdXRTdHJlYW0iLCJtb3ZlQm94IiwieE9mZnNldCIsImNvcm5lciIsIm1vdmVMaW5lIiwiX3RoaXMkY29udGV4dCRjb25maWciLCJpbml0QWJvcnRlZCIsImZyYW1lZ3JhYmJlciIsImNhbnZhc0NvbnRhaW5lciIsIlFXb3JrZXJzIiwiX3RoaXMkY29udGV4dCRjb25maWcyIiwiaW5pdGlhbGl6ZURhdGEiLCJyZWFkeSIsIm9uVUlUaHJlYWQiLCJ3b3JrZXJzVXBkYXRlZCIsIl90aGlzJGNvbnRleHQkaW5wdXRJbSIsImxvY2F0ZUFuZERlY29kZSIsIl90aGlzJGNvbnRleHQkaW5wdXRJbTIiLCJfaW5pdEJ1ZmZlcnMyIiwiX2luaXRCdWZmZXJzIiwiQmFyY29kZURlY29kZXIiLCJfZ2V0Vmlld1BvcnQiLCJfaW5pdENhbnZhcyIsImluaXRJbnB1dFN0cmVhbSIsIl90aGlzJGNvbnRleHQkY29uZmlnJCIsImlucHV0VHlwZSIsIl9zZXR1cElucHV0U3RyZWFtIiwiSW5wdXRTdHJlYW0iLCJDYW1lcmFBY2Nlc3MiLCJzZXRJbnB1dFN0cmVhbVByb21pc2UiLCJjYW5SZWNvcmQiLCJiaW5kIiwiZ2V0Qm91bmRpbmdCb3hlcyIsIl90aGlzJGNvbnRleHQkY29uZmlnMyIsInRyYW5zZm9ybVJlc3VsdCIsInRyYW5zZm9ybWVkQm94ZXMiLCJiYXJjb2RlIiwiaGFzIiwiX3RoaXMzIiwicmVzdWx0Q29sbGVjdG9yIiwiaGFzQ29kZVJlc3VsdCIsIl9jZmckaW5wdXRTdHJlYW0iLCJyZXN1bHRUb1B1Ymxpc2giLCJfcmVzdWx0JGJhcmNvZGVzIiwiRXZlbnRzIiwiY2ZnIiwiZHJhd1NjYW5uZXJBcmVhIiwiX2xvY2F0ZUFuZERlY29kZSIsIl90aGlzJGNvbnRleHQkaW5wdXRJbTMiLCJkZWNvZGVSZXN1bHQiLCJpbWFnZVJlc3VsdCIsIl90aGlzJGNvbnRleHQkaW5wdXRJbTQiLCJzdGFydENvbnRpbnVvdXNVcGRhdGUiLCJfdGhpcyRjb250ZXh0JGNvbmZpZzQiLCJfdGhpczQiLCJkZWxheSIsInN0b3BwZWQiLCJ0aW1lc3RhbXAiLCJ1cGRhdGUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsIl90aGlzJGNvbnRleHQkY29uZmlnNSIsIl90aGlzJGNvbnRleHQkY29uZmlnNiIsIl9zdG9wIiwiX3RoaXMkY29udGV4dCRjb25maWc3IiwiX3RoaXMkY29udGV4dCRpbnB1dFN0IiwiX3RoaXMkY29udGV4dCRjb25maWc4IiwiX3RoaXMkY29udGV4dCRjb25maWc5IiwiX3RoaXMkY29udGV4dCRjb25maWcwIiwib3ZlcmxheUN0eCIsImhhc0FueVN0eWxlIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJXaWR0aCIsImJhY2tncm91bmRDb2xvciIsInRvcFJpZ2h0T2Zmc2V0Iiwib2Zmc2V0WSIsInRvcExlZnQiLCJib3R0b21MZWZ0Iiwic3R5bGVDaGFuZ2VkIiwiX2NhY2hlZFN0eWxlVmFsdWVzIiwiX2FyZWEkYm9yZGVyQ29sb3IiLCJfYXJlYSRib3JkZXJXaWR0aCIsInNob3VsZERyYXdCb3JkZXIiLCJiZyIsIl9yZXNvbHZlZFN0eWxlIiwiaW5zdGFuY2UiLCJRdWFnZ2FKU1N0YXRpY0ludGVyZmFjZSIsInF1YWdnYUluc3RhbmNlIiwicHJvbWlzZSIsIkNvbmZpZyIsInN0YXJ0RXJyIiwib25EZXRlY3RlZCIsIm9mZkRldGVjdGVkIiwib2ZmUHJvY2Vzc2VkIiwicmVnaXN0ZXJSZXN1bHRDb2xsZWN0b3IiLCJkZWNvZGVTaW5nbGUiLCJyZXN1bHRDYWxsYmFjayIsImRlZmF1bHQiLCJSZWFkZXJzIiwiUmVzdWx0Q29sbGVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFD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Q0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFD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RSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDZjtBQUNELElBQU11SixjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxF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MUIsQ0FBQyxFQUFFLElBQUksRUFBRTBqQyxjQUFjLENBQUM7TUFDNUIsQ0FBQyxDQUFDLE9BQU85MkIsR0FBRyxFQUFFO1FBQ1ZrVSxNQUFNLENBQUNsVSxHQUFHLENBQUM7TUFDZjtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUM7RUFDRDtFQUNBO0VBQ0EsSUFBSXczQixPQUFPQSxDQUFBLEVBQUc7SUFDVixPQUFPWCx1QkFBdUI7RUFDbEMsQ0FBQztFQUNEWSxPQUFPLEVBQVBBLHNCQUFPO0VBQ1B0RSxZQUFZLEVBQVpBLGFBQVk7RUFDWm5qQixVQUFVLEVBQVZBLFdBQVU7RUFDVjloQixZQUFZLEVBQVpBLGFBQVk7RUFDWndwQyxlQUFlLEVBQWZBLGdCQUFlQTtBQUNuQixDQUFDO0FBRWNiLG1HQUF1QixFQUFDO0FBQ3ZDIiwiZmlsZSI6InF1YWdnYS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlF1YWdnYVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJRdWFnZ2FcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gOTApO1xuIiwidmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKFwiLi90b1Byb3BlcnR5S2V5LmpzXCIpO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpIHtcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhhLCBuKSB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBuKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKFwiLi90b1Byb3BlcnR5S2V5LmpzXCIpO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHRvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IHJlcXVpcmUoXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiKTtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gX3R5cGVvZihlKSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mLmpzXCIpO1xuZnVuY3Rpb24gX2luaGVyaXRzKHQsIGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiB0LFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgIH1cbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlICYmIHNldFByb3RvdHlwZU9mKHQsIGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLlxuXG52YXIgcnVudGltZSA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZVwiKSgpO1xubW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuXG4vLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PVxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbiAgfSBlbHNlIHtcbiAgICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xuICB9XG59XG4iLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAobiwgdCwgZSwgciwgbywgYSwgYykge1xuICB0cnkge1xuICAgIHZhciBpID0gblthXShjKSxcbiAgICAgIHUgPSBpLnZhbHVlO1xuICB9IGNhdGNoIChuKSB7XG4gICAgcmV0dXJuIHZvaWQgZShuKTtcbiAgfVxuICBpLmRvbmUgPyB0KHUpIDogUHJvbWlzZS5yZXNvbHZlKHUpLnRoZW4ociwgbyk7XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHQgPSB0aGlzLFxuICAgICAgZSA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIG8pIHtcbiAgICAgIHZhciBhID0gbi5hcHBseSh0LCBlKTtcbiAgICAgIGZ1bmN0aW9uIF9uZXh0KG4pIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGEsIHIsIG8sIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCBuKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhuKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChhLCByLCBvLCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIG4pO1xuICAgICAgfVxuICAgICAgX25leHQodm9pZCAwKTtcbiAgICB9KTtcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3IsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgX3R5cGVvZihvKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsInZhciBzdXBlclByb3BCYXNlID0gcmVxdWlyZShcIi4vc3VwZXJQcm9wQmFzZS5qc1wiKTtcbmZ1bmN0aW9uIF9nZXQoKSB7XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF9nZXQgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuZ2V0ID8gUmVmbGVjdC5nZXQuYmluZCgpIDogZnVuY3Rpb24gKGUsIHQsIHIpIHtcbiAgICB2YXIgcCA9IHN1cGVyUHJvcEJhc2UoZSwgdCk7XG4gICAgaWYgKHApIHtcbiAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwLCB0KTtcbiAgICAgIHJldHVybiBuLmdldCA/IG4uZ2V0LmNhbGwoYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBlIDogcikgOiBuLnZhbHVlO1xuICAgIH1cbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfZ2V0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9nZXQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiIsInZhciBiYXNlTWVyZ2UgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2UnKSxcbiAgICBjcmVhdGVBc3NpZ25lciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUFzc2lnbmVyJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjUuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0ge1xuICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICogfTtcbiAqXG4gKiB2YXIgb3RoZXIgPSB7XG4gKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gKiB9O1xuICpcbiAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gKi9cbnZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlO1xuIiwidmFyIGFycmF5V2l0aG91dEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRob3V0SG9sZXMuanNcIik7XG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanNcIik7XG52YXIgbm9uSXRlcmFibGVTcHJlYWQgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVNwcmVhZC5qc1wiKTtcbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXkocikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzSW4nKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5c0luKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c0luO1xuIiwidmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlQ2xlYXInKSxcbiAgICBsaXN0Q2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVEZWxldGUnKSxcbiAgICBsaXN0Q2FjaGVHZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVHZXQnKSxcbiAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVIYXMnKSxcbiAgICBsaXN0Q2FjaGVTZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbkxpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbkxpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3RDYWNoZTtcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG4iLCIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIE1hcCA9IGdldE5hdGl2ZShyb290LCAnTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFwO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnblZhbHVlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIHN0dWJBcnJheSA9IHJlcXVpcmUoJy4vc3R1YkFycmF5Jyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICByZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRTeW1ib2xzO1xuIiwiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsInZhciBEYXRhVmlldyA9IHJlcXVpcmUoJy4vX0RhdGFWaWV3JyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vX1Byb21pc2UnKSxcbiAgICBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBXZWFrTWFwID0gcmVxdWlyZSgnLi9fV2Vha01hcCcpLFxuICAgIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhZztcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3ltYm9sO1xuIiwidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIHN0YWNrQ2xlYXIgPSByZXF1aXJlKCcuL19zdGFja0NsZWFyJyksXG4gICAgc3RhY2tEZWxldGUgPSByZXF1aXJlKCcuL19zdGFja0RlbGV0ZScpLFxuICAgIHN0YWNrR2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tHZXQnKSxcbiAgICBzdGFja0hhcyA9IHJlcXVpcmUoJy4vX3N0YWNrSGFzJyksXG4gICAgc3RhY2tTZXQgPSByZXF1aXJlKCcuL19zdGFja1NldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XG5TdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG5TdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XG5TdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RhY2s7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iLCJ2YXIgbWFwQ2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX21hcENhY2hlQ2xlYXInKSxcbiAgICBtYXBDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX21hcENhY2hlRGVsZXRlJyksXG4gICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZUdldCcpLFxuICAgIG1hcENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVIYXMnKSxcbiAgICBtYXBDYWNoZVNldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcENhY2hlO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZVByb3BlcnR5O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG4iLCIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG4iLCJ2YXIgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNQcm90b3R5cGUob2JqZWN0KSlcbiAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVPYmplY3Q7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyBcIl9fcHJvdG9fX1wiIG9yIFwiY29uc3RydWN0b3JcIi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgaWYgKGtleSA9PT0gJ2NvbnN0cnVjdG9yJyAmJiB0eXBlb2Ygb2JqZWN0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVHZXQ7XG4iLCJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbmRleDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7XG4gIGlmIChyKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfT3ZlcmxvYWRZaWVsZChlLCBkKSB7XG4gIHRoaXMudiA9IGUsIHRoaXMuayA9IGQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9PdmVybG9hZFlpZWxkLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHJlZ2VuZXJhdG9yRGVmaW5lID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JEZWZpbmUuanNcIik7XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3IoKSB7XG4gIC8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvYmxvYi9tYWluL3BhY2thZ2VzL2JhYmVsLWhlbHBlcnMvTElDRU5TRSAqL1xuICB2YXIgZSxcbiAgICB0LFxuICAgIHIgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgIG4gPSByLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiLFxuICAgIG8gPSByLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuICBmdW5jdGlvbiBpKHIsIG4sIG8sIGkpIHtcbiAgICB2YXIgYyA9IG4gJiYgbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBuIDogR2VuZXJhdG9yLFxuICAgICAgdSA9IE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO1xuICAgIHJldHVybiByZWdlbmVyYXRvckRlZmluZSh1LCBcIl9pbnZva2VcIiwgZnVuY3Rpb24gKHIsIG4sIG8pIHtcbiAgICAgIHZhciBpLFxuICAgICAgICBjLFxuICAgICAgICB1LFxuICAgICAgICBmID0gMCxcbiAgICAgICAgcCA9IG8gfHwgW10sXG4gICAgICAgIHkgPSAhMSxcbiAgICAgICAgRyA9IHtcbiAgICAgICAgICBwOiAwLFxuICAgICAgICAgIG46IDAsXG4gICAgICAgICAgdjogZSxcbiAgICAgICAgICBhOiBkLFxuICAgICAgICAgIGY6IGQuYmluZChlLCA0KSxcbiAgICAgICAgICBkOiBmdW5jdGlvbiBkKHQsIHIpIHtcbiAgICAgICAgICAgIHJldHVybiBpID0gdCwgYyA9IDAsIHUgPSBlLCBHLm4gPSByLCBhO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGQociwgbikge1xuICAgICAgICBmb3IgKGMgPSByLCB1ID0gbiwgdCA9IDA7ICF5ICYmIGYgJiYgIW8gJiYgdCA8IHAubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICB2YXIgbyxcbiAgICAgICAgICAgIGkgPSBwW3RdLFxuICAgICAgICAgICAgZCA9IEcucCxcbiAgICAgICAgICAgIGwgPSBpWzJdO1xuICAgICAgICAgIHIgPiAzID8gKG8gPSBsID09PSBuKSAmJiAodSA9IGlbKGMgPSBpWzRdKSA/IDUgOiAoYyA9IDMsIDMpXSwgaVs0XSA9IGlbNV0gPSBlKSA6IGlbMF0gPD0gZCAmJiAoKG8gPSByIDwgMiAmJiBkIDwgaVsxXSkgPyAoYyA9IDAsIEcudiA9IG4sIEcubiA9IGlbMV0pIDogZCA8IGwgJiYgKG8gPSByIDwgMyB8fCBpWzBdID4gbiB8fCBuID4gbCkgJiYgKGlbNF0gPSByLCBpWzVdID0gbiwgRy5uID0gbCwgYyA9IDApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobyB8fCByID4gMSkgcmV0dXJuIGE7XG4gICAgICAgIHRocm93IHkgPSAhMCwgbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiAobywgcCwgbCkge1xuICAgICAgICBpZiAoZiA+IDEpIHRocm93IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICAgIGZvciAoeSAmJiAxID09PSBwICYmIGQocCwgbCksIGMgPSBwLCB1ID0gbDsgKHQgPSBjIDwgMiA/IGUgOiB1KSB8fCAheTspIHtcbiAgICAgICAgICBpIHx8IChjID8gYyA8IDMgPyAoYyA+IDEgJiYgKEcubiA9IC0xKSwgZChjLCB1KSkgOiBHLm4gPSB1IDogRy52ID0gdSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMiwgaSkge1xuICAgICAgICAgICAgICBpZiAoYyB8fCAobyA9IFwibmV4dFwiKSwgdCA9IGlbb10pIHtcbiAgICAgICAgICAgICAgICBpZiAoISh0ID0gdC5jYWxsKGksIHUpKSkgdGhyb3cgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKCF0LmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHUgPSB0LnZhbHVlLCBjIDwgMiAmJiAoYyA9IDApO1xuICAgICAgICAgICAgICB9IGVsc2UgMSA9PT0gYyAmJiAodCA9IGlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbChpKSwgYyA8IDIgJiYgKHUgPSBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG8gKyBcIicgbWV0aG9kXCIpLCBjID0gMSk7XG4gICAgICAgICAgICAgIGkgPSBlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9ICh5ID0gRy5uIDwgMCkgPyB1IDogci5jYWxsKG4sIEcpKSAhPT0gYSkgYnJlYWs7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaSA9IGUsIGMgPSAxLCB1ID0gdDtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZiA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgZG9uZTogeVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9KHIsIG8sIGkpLCAhMCksIHU7XG4gIH1cbiAgdmFyIGEgPSB7fTtcbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG4gIHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBjID0gW11bbl0gPyB0KHQoW11bbl0oKSkpIDogKHJlZ2VuZXJhdG9yRGVmaW5lKHQgPSB7fSwgbiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIHQpLFxuICAgIHUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShjKTtcbiAgZnVuY3Rpb24gZihlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihlLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZS5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgcmVnZW5lcmF0b3JEZWZpbmUoZSwgbywgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh1KSwgZTtcbiAgfVxuICByZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHJlZ2VuZXJhdG9yRGVmaW5lKHUsIFwiY29uc3RydWN0b3JcIiwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpLCByZWdlbmVyYXRvckRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvbiksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiLCByZWdlbmVyYXRvckRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbywgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgcmVnZW5lcmF0b3JEZWZpbmUodSksIHJlZ2VuZXJhdG9yRGVmaW5lKHUsIG8sIFwiR2VuZXJhdG9yXCIpLCByZWdlbmVyYXRvckRlZmluZSh1LCBuLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCByZWdlbmVyYXRvckRlZmluZSh1LCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSksIChtb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvciA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdzogaSxcbiAgICAgIG06IGZcbiAgICB9O1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMpKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9yZWdlbmVyYXRvckRlZmluZShlLCByLCBuLCB0KSB7XG4gIHZhciBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICB0cnkge1xuICAgIGkoe30sIFwiXCIsIHt9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGkgPSAwO1xuICB9XG4gIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yRGVmaW5lID0gZnVuY3Rpb24gcmVnZW5lcmF0b3JEZWZpbmUoZSwgciwgbiwgdCkge1xuICAgIGZ1bmN0aW9uIG8ociwgbikge1xuICAgICAgX3JlZ2VuZXJhdG9yRGVmaW5lKGUsIHIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UociwgbiwgZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgciA/IGkgPyBpKGUsIHIsIHtcbiAgICAgIHZhbHVlOiBuLFxuICAgICAgZW51bWVyYWJsZTogIXQsXG4gICAgICBjb25maWd1cmFibGU6ICF0LFxuICAgICAgd3JpdGFibGU6ICF0XG4gICAgfSkgOiBlW3JdID0gbiA6IChvKFwibmV4dFwiLCAwKSwgbyhcInRocm93XCIsIDEpLCBvKFwicmV0dXJuXCIsIDIpKTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfcmVnZW5lcmF0b3JEZWZpbmUoZSwgciwgbiwgdCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvckRlZmluZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciByZWdlbmVyYXRvciA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yLmpzXCIpO1xudmFyIHJlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvci5qc1wiKTtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvckFzeW5jR2VuKHIsIGUsIHQsIG8sIG4pIHtcbiAgcmV0dXJuIG5ldyByZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IocmVnZW5lcmF0b3IoKS53KHIsIGUsIHQsIG8pLCBuIHx8IFByb21pc2UpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JBc3luY0dlbiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBPdmVybG9hZFlpZWxkID0gcmVxdWlyZShcIi4vT3ZlcmxvYWRZaWVsZC5qc1wiKTtcbnZhciByZWdlbmVyYXRvckRlZmluZSA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yRGVmaW5lLmpzXCIpO1xuZnVuY3Rpb24gQXN5bmNJdGVyYXRvcih0LCBlKSB7XG4gIGZ1bmN0aW9uIG4ociwgbywgaSwgZikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgYyA9IHRbcl0obyksXG4gICAgICAgIHUgPSBjLnZhbHVlO1xuICAgICAgcmV0dXJuIHUgaW5zdGFuY2VvZiBPdmVybG9hZFlpZWxkID8gZS5yZXNvbHZlKHUudikudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICBuKFwibmV4dFwiLCB0LCBpLCBmKTtcbiAgICAgIH0sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIG4oXCJ0aHJvd1wiLCB0LCBpLCBmKTtcbiAgICAgIH0pIDogZS5yZXNvbHZlKHUpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgYy52YWx1ZSA9IHQsIGkoYyk7XG4gICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbihcInRocm93XCIsIHQsIGksIGYpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgZih0KTtcbiAgICB9XG4gIH1cbiAgdmFyIHI7XG4gIHRoaXMubmV4dCB8fCAocmVnZW5lcmF0b3JEZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCByZWdlbmVyYXRvckRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAYXN5bmNJdGVyYXRvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pKSwgcmVnZW5lcmF0b3JEZWZpbmUodGhpcywgXCJfaW52b2tlXCIsIGZ1bmN0aW9uICh0LCBvLCBpKSB7XG4gICAgZnVuY3Rpb24gZigpIHtcbiAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICBuKHQsIGksIGUsIHIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByID0gciA/IHIudGhlbihmLCBmKSA6IGYoKTtcbiAgfSwgITApO1xufVxubW9kdWxlLmV4cG9ydHMgPSBBc3luY0l0ZXJhdG9yLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkFycmF5O1xuIiwidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9sc0luID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAob2JqZWN0KSB7XG4gICAgYXJyYXlQdXNoKHJlc3VsdCwgZ2V0U3ltYm9scyhvYmplY3QpKTtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRTeW1ib2xzSW47XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIik7XG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSA9IHJlcXVpcmUoXCIuL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanNcIik7XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoZSwgdCkge1xuICBpZiAobnVsbCA9PSBlKSByZXR1cm4ge307XG4gIHZhciBvLFxuICAgIHIsXG4gICAgaSA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoZSwgdCk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIGZvciAociA9IDA7IHIgPCBuLmxlbmd0aDsgcisrKSBvID0gbltyXSwgLTEgPT09IHQuaW5kZXhPZihvKSAmJiB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIG8pICYmIChpW29dID0gZVtvXSk7XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyksXG4gICAgYmFzZVVuc2V0ID0gcmVxdWlyZSgnLi9fYmFzZVVuc2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgY3VzdG9tT21pdENsb25lID0gcmVxdWlyZSgnLi9fY3VzdG9tT21pdENsb25lJyksXG4gICAgZmxhdFJlc3QgPSByZXF1aXJlKCcuL19mbGF0UmVzdCcpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gKiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IHBhdGhzIG9mIGBvYmplY3RgIHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIG9taXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLm9taXQob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2InOiAnMicgfVxuICovXG52YXIgb21pdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgcGF0aHMgPSBhcnJheU1hcChwYXRocywgZnVuY3Rpb24ocGF0aCkge1xuICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSk7XG4gIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgaWYgKGlzRGVlcCkge1xuICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gcGF0aHMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gb21pdDtcbiIsInZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2YuanNcIik7XG52YXIgaXNOYXRpdmVGdW5jdGlvbiA9IHJlcXVpcmUoXCIuL2lzTmF0aXZlRnVuY3Rpb24uanNcIik7XG52YXIgY29uc3RydWN0ID0gcmVxdWlyZShcIi4vY29uc3RydWN0LmpzXCIpO1xuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcih0KSB7XG4gIHZhciByID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBNYXAgPyBuZXcgTWFwKCkgOiB2b2lkIDA7XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKHQpIHtcbiAgICBpZiAobnVsbCA9PT0gdCB8fCAhaXNOYXRpdmVGdW5jdGlvbih0KSkgcmV0dXJuIHQ7XG4gICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgdCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgIGlmIChyLmhhcyh0KSkgcmV0dXJuIHIuZ2V0KHQpO1xuICAgICAgci5zZXQodCwgV3JhcHBlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0KHQsIGFyZ3VtZW50cywgZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfVxuICAgIH0pLCBzZXRQcm90b3R5cGVPZihXcmFwcGVyLCB0KTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfd3JhcE5hdGl2ZVN1cGVyKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCIvKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gW107XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlQ2xlYXI7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVEZWxldGU7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVIYXM7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVTZXQ7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0dldDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZUpzRGF0YTtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIEhhc2ggPSByZXF1aXJlKCcuL19IYXNoJyksXG4gICAgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUNsZWFyO1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hHZXQ7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoSGFzO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCJ2YXIgY3JlYXRlQmFzZUZvciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUJhc2VGb3InKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbnZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGb3I7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGFzc2lnbk1lcmdlVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25NZXJnZVZhbHVlJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNsb25lVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Nsb25lVHlwZWRBcnJheScpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGluaXRDbG9uZU9iamVjdCA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZU9iamVjdCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vaXNQbGFpbk9iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5JyksXG4gICAgc2FmZUdldCA9IHJlcXVpcmUoJy4vX3NhZmVHZXQnKSxcbiAgICB0b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi90b1BsYWluT2JqZWN0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICogIGNvdW50ZXJwYXJ0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICBpZiAoc3RhY2tlZCkge1xuICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0NvbW1vbikge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgfVxuICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1lcmdlRGVlcDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBVaW50OEFycmF5ID0gcm9vdC5VaW50OEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbnZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICB9XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNyZWF0ZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzQXJndW1lbnRzO1xuIiwidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXNJbiA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzSW47XG4iLCIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH1cbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVBc3NpZ25lcjtcbiIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiIsIi8qKlxuICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgfVxuICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcHBseTtcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnN0YW50O1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsIi8qXG4gKiB0eXBlZGVmcy5qc1xuICogTm9ybWFsaXplcyBicm93c2VyLXNwZWNpZmljIHByZWZpeGVzIGFuZCBwcm92aWRlIHNvbWUgYmFzaWMgcG9seWZpbGxzXG4gKi9cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKCF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICB8fCB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgfHwgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICB8fCB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICB8fCBmdW5jdGlvbiAoLyogZnVuY3Rpb24gRnJhbWVSZXF1ZXN0Q2FsbGJhY2sgKi8gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfSgpKTtcbiAgICB9XG59XG5cbmlmICh0eXBlb2YgTWF0aC5pbXVsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICAgIE1hdGguaW11bCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIGNvbnN0IGFoID0gKGEgPj4+IDE2KSAmIDB4ZmZmZjtcbiAgICAgICAgY29uc3QgYWwgPSBhICYgMHhmZmZmO1xuICAgICAgICBjb25zdCBiaCA9IChiID4+PiAxNikgJiAweGZmZmY7XG4gICAgICAgIGNvbnN0IGJsID0gYiAmIDB4ZmZmZjtcbiAgICAgICAgLy8gdGhlIHNoaWZ0IGJ5IDAgZml4ZXMgdGhlIHNpZ24gb24gdGhlIGhpZ2ggcGFydFxuICAgICAgICAvLyB0aGUgZmluYWwgfDAgY29udmVydHMgdGhlIHVuc2lnbmVkIHZhbHVlIGludG8gYSBzaWduZWQgdmFsdWVcbiAgICAgICAgcmV0dXJuICgoYWwgKiBibCkgKyAoKChhaCAqIGJsICsgYWwgKiBiaCkgPDwgMTYpID4+PiAwKSB8IDApO1xuICAgIH07XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1iaXR3aXNlICovXG59XG5cbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7IC8vIC5sZW5ndGggb2YgZnVuY3Rpb24gaXMgMlxuXG4ndXNlIHN0cmljdCc7XG5cbiAgICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCkgeyAvLyBUeXBlRXJyb3IgaWYgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG8gPSBPYmplY3QodGFyZ2V0KTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICAgICAgY29uc3QgbmV4dFNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgICAgICAgIGlmIChuZXh0U291cmNlICE9PSBudWxsKSB7IC8vIFNraXAgb3ZlciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmV4dEtleSBpbiBuZXh0U291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3Mgd2hlbiBoYXNPd25Qcm9wZXJ0eSBpcyBzaGFkb3dlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5leHRTb3VyY2UsIG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH07XG59XG4iLCJmdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIHI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSAhMCxcbiAgICAgIG8gPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkge1xuICAgICAgICBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47XG4gICAgICAgIGYgPSAhMTtcbiAgICAgIH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTtcbiAgICB9IGNhdGNoIChyKSB7XG4gICAgICBvID0gITAsIG4gPSByO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWYgJiYgbnVsbCAhPSB0W1wicmV0dXJuXCJdICYmICh1ID0gdFtcInJldHVyblwiXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAobykgdGhyb3cgbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJpbWl0aXZlLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIE92ZXJsb2FkWWllbGQgPSByZXF1aXJlKFwiLi9PdmVybG9hZFlpZWxkLmpzXCIpO1xudmFyIHJlZ2VuZXJhdG9yID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3IuanNcIik7XG52YXIgcmVnZW5lcmF0b3JBc3luYyA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yQXN5bmMuanNcIik7XG52YXIgcmVnZW5lcmF0b3JBc3luY0dlbiA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yQXN5bmNHZW4uanNcIik7XG52YXIgcmVnZW5lcmF0b3JBc3luY0l0ZXJhdG9yID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JBc3luY0l0ZXJhdG9yLmpzXCIpO1xudmFyIHJlZ2VuZXJhdG9yS2V5cyA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yS2V5cy5qc1wiKTtcbnZhciByZWdlbmVyYXRvclZhbHVlcyA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yVmFsdWVzLmpzXCIpO1xuZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIHIgPSByZWdlbmVyYXRvcigpLFxuICAgIGUgPSByLm0oX3JlZ2VuZXJhdG9yUnVudGltZSksXG4gICAgdCA9IChPYmplY3QuZ2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkgOiBlLl9fcHJvdG9fXykuY29uc3RydWN0b3I7XG4gIGZ1bmN0aW9uIG4ocikge1xuICAgIHZhciBlID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiByICYmIHIuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICEhZSAmJiAoZSA9PT0gdCB8fCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgPT09IChlLmRpc3BsYXlOYW1lIHx8IGUubmFtZSkpO1xuICB9XG4gIHZhciBvID0ge1xuICAgIFwidGhyb3dcIjogMSxcbiAgICBcInJldHVyblwiOiAyLFxuICAgIFwiYnJlYWtcIjogMyxcbiAgICBcImNvbnRpbnVlXCI6IDNcbiAgfTtcbiAgZnVuY3Rpb24gYShyKSB7XG4gICAgdmFyIGUsIHQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuKSB7XG4gICAgICBlIHx8IChlID0ge1xuICAgICAgICBzdG9wOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICAgIHJldHVybiB0KG4uYSwgMik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKCkge1xuICAgICAgICAgIHJldHVybiBuLnY7XG4gICAgICAgIH0sXG4gICAgICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHIsIGUpIHtcbiAgICAgICAgICByZXR1cm4gdChuLmEsIG9bcl0sIGUpO1xuICAgICAgICB9LFxuICAgICAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKHIsIG8sIGEpIHtcbiAgICAgICAgICByZXR1cm4gZS5yZXN1bHROYW1lID0gbywgdChuLmQsIHJlZ2VuZXJhdG9yVmFsdWVzKHIpLCBhKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluaXNoOiBmdW5jdGlvbiBmaW5pc2gocikge1xuICAgICAgICAgIHJldHVybiB0KG4uZiwgcik7XG4gICAgICAgIH1cbiAgICAgIH0sIHQgPSBmdW5jdGlvbiB0KHIsIF90LCBvKSB7XG4gICAgICAgIG4ucCA9IGUucHJldiwgbi5uID0gZS5uZXh0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiByKF90LCBvKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBlLm5leHQgPSBuLm47XG4gICAgICAgIH1cbiAgICAgIH0pLCBlLnJlc3VsdE5hbWUgJiYgKGVbZS5yZXN1bHROYW1lXSA9IG4udiwgZS5yZXN1bHROYW1lID0gdm9pZCAwKSwgZS5zZW50ID0gbi52LCBlLm5leHQgPSBuLm47XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gci5jYWxsKHRoaXMsIGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbi5wID0gZS5wcmV2LCBuLm4gPSBlLm5leHQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4gKG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyYXA6IGZ1bmN0aW9uIHdyYXAoZSwgdCwgbiwgbykge1xuICAgICAgICByZXR1cm4gci53KGEoZSksIHQsIG4sIG8gJiYgby5yZXZlcnNlKCkpO1xuICAgICAgfSxcbiAgICAgIGlzR2VuZXJhdG9yRnVuY3Rpb246IG4sXG4gICAgICBtYXJrOiByLm0sXG4gICAgICBhd3JhcDogZnVuY3Rpb24gYXdyYXAociwgZSkge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJsb2FkWWllbGQociwgZSk7XG4gICAgICB9LFxuICAgICAgQXN5bmNJdGVyYXRvcjogcmVnZW5lcmF0b3JBc3luY0l0ZXJhdG9yLFxuICAgICAgYXN5bmM6IGZ1bmN0aW9uIGFzeW5jKHIsIGUsIHQsIG8sIHUpIHtcbiAgICAgICAgcmV0dXJuIChuKGUpID8gcmVnZW5lcmF0b3JBc3luY0dlbiA6IHJlZ2VuZXJhdG9yQXN5bmMpKGEociksIGUsIHQsIG8sIHUpO1xuICAgICAgfSxcbiAgICAgIGtleXM6IHJlZ2VuZXJhdG9yS2V5cyxcbiAgICAgIHZhbHVlczogcmVnZW5lcmF0b3JWYWx1ZXNcbiAgICB9O1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMpKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvclJ1bnRpbWUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgcmVnZW5lcmF0b3JBc3luY0dlbiA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yQXN5bmNHZW4uanNcIik7XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3JBc3luYyhuLCBlLCByLCB0LCBvKSB7XG4gIHZhciBhID0gcmVnZW5lcmF0b3JBc3luY0dlbihuLCBlLCByLCB0LCBvKTtcbiAgcmV0dXJuIGEubmV4dCgpLnRoZW4oZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbi5kb25lID8gbi52YWx1ZSA6IGEubmV4dCgpO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yQXN5bmMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfcmVnZW5lcmF0b3JLZXlzKGUpIHtcbiAgdmFyIG4gPSBPYmplY3QoZSksXG4gICAgciA9IFtdO1xuICBmb3IgKHZhciB0IGluIG4pIHIudW5zaGlmdCh0KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGUoKSB7XG4gICAgZm9yICg7IHIubGVuZ3RoOykgaWYgKCh0ID0gci5wb3AoKSkgaW4gbikgcmV0dXJuIGUudmFsdWUgPSB0LCBlLmRvbmUgPSAhMSwgZTtcbiAgICByZXR1cm4gZS5kb25lID0gITAsIGU7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvcktleXMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3JWYWx1ZXMoZSkge1xuICBpZiAobnVsbCAhPSBlKSB7XG4gICAgdmFyIHQgPSBlW1wiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIl0sXG4gICAgICByID0gMDtcbiAgICBpZiAodCkgcmV0dXJuIHQuY2FsbChlKTtcbiAgICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBlLm5leHQpIHJldHVybiBlO1xuICAgIGlmICghaXNOYU4oZS5sZW5ndGgpKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgcmV0dXJuIGUgJiYgciA+PSBlLmxlbmd0aCAmJiAoZSA9IHZvaWQgMCksIHtcbiAgICAgICAgICB2YWx1ZTogZSAmJiBlW3IrK10sXG4gICAgICAgICAgZG9uZTogIWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoX3R5cGVvZihlKSArIFwiIGlzIG5vdCBpdGVyYWJsZVwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yVmFsdWVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKSB7XG4gIGlmICh2b2lkIDAgPT09IGUpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgcmV0dXJuIGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9nZXRQcm90b3R5cGVPZi5qc1wiKTtcbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKHQsIG8pIHtcbiAgZm9yICg7ICF7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG8pICYmIG51bGwgIT09ICh0ID0gZ2V0UHJvdG90eXBlT2YodCkpOyk7XG4gIHJldHVybiB0O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc3VwZXJQcm9wQmFzZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShyKSB7XG4gIGlmIChcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByW1wiQEBpdGVyYXRvclwiXSkgcmV0dXJuIEFycmF5LmZyb20ocik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShyLCBlKSB7XG4gIGlmIChudWxsID09IHIpIHJldHVybiB7fTtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgbiBpbiByKSBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSkge1xuICAgIGlmICgtMSAhPT0gZS5pbmRleE9mKG4pKSBjb250aW51ZTtcbiAgICB0W25dID0gcltuXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbicpLFxuICAgIGJhc2VBc3NpZ25JbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25JbicpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBjb3B5U3ltYm9scyA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzJyksXG4gICAgY29weVN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzSW4nKSxcbiAgICBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGluaXRDbG9uZUFycmF5ID0gcmVxdWlyZSgnLi9faW5pdENsb25lQXJyYXknKSxcbiAgICBpbml0Q2xvbmVCeVRhZyA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUJ5VGFnJyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzTWFwID0gcmVxdWlyZSgnLi9pc01hcCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU2V0ID0gcmVxdWlyZSgnLi9pc1NldCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG52YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbmNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG5jbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gRGVlcCBjbG9uZVxuICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gKiAgNCAtIENsb25lIHN5bWJvbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzQXJyKSB7XG4gICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgIGlmICghaXNEZWVwKSB7XG4gICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICB9XG4gICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ2xvbmU7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsInZhciBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXMnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzO1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzO1xuIiwidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25JbjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyk7XG5cbi8qKlxuICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5U3ltYm9scztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUZpbHRlcjtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpO1xuXG4vKipcbiAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHNJbjtcbiIsInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5cztcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUocm9vdCwgJ0RhdGFWaWV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVZpZXc7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgLy8gQWRkIHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC5cbiAgaWYgKGxlbmd0aCAmJiB0eXBlb2YgYXJyYXlbMF0gPT0gJ3N0cmluZycgJiYgaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgJ2luZGV4JykpIHtcbiAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUFycmF5O1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyksXG4gICAgY2xvbmVEYXRhVmlldyA9IHJlcXVpcmUoJy4vX2Nsb25lRGF0YVZpZXcnKSxcbiAgICBjbG9uZVJlZ0V4cCA9IHJlcXVpcmUoJy4vX2Nsb25lUmVnRXhwJyksXG4gICAgY2xvbmVTeW1ib2wgPSByZXF1aXJlKCcuL19jbG9uZVN5bWJvbCcpLFxuICAgIGNsb25lVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Nsb25lVHlwZWRBcnJheScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUgYmFzZWQgb24gaXRzIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTWFwYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBgU2V0YCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3IoK29iamVjdCk7XG5cbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBmbG9hdDMyVGFnOiBjYXNlIGZsb2F0NjRUYWc6XG4gICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOlxuICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVUeXBlZEFycmF5KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7XG5cbiAgICBjYXNlIHNldFRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgIGNhc2Ugc3ltYm9sVGFnOlxuICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVCeVRhZztcbiIsInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICovXG5mdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGF0YVZpZXc7XG4iLCIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lUmVnRXhwO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVTeW1ib2w7XG4iLCJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIiwidmFyIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hcDtcbiIsInZhciBiYXNlSXNTZXQgPSByZXF1aXJlKCcuL19iYXNlSXNTZXQnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTZXQ7XG4iLCJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBsYXN0ID0gcmVxdWlyZSgnLi9sYXN0JyksXG4gICAgcGFyZW50ID0gcmVxdWlyZSgnLi9fcGFyZW50JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgLy8gUHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9zZWN1cml0eS9hZHZpc29yaWVzL0dIU0EteHhqci1tbWp2LTRncGdcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvc2VjdXJpdHkvYWR2aXNvcmllcy9HSFNBLWYyM20tcjNwZi00MnJoXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcblxuICAgIC8vIEFsd2F5cyBibG9jayBcIl9fcHJvdG9fX1wiIGFueXdoZXJlIGluIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGV4cGVjdGVkXG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX19wcm90b19fJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBCbG9jayBjb25zdHJ1Y3Rvci9wcm90b3R5cGUgYXMgbm9uLXRlcm1pbmFsIHRyYXZlcnNhbCBrZXlzIHRvIHByZXZlbnRcbiAgICAvLyBlc2NhcGluZyB0aGUgb2JqZWN0IGdyYXBoIGludG8gYnVpbHQtaW4gY29uc3RydWN0b3JzIGFuZCBwcm90b3R5cGVzLlxuICAgIGlmICgoa2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpICYmIGluZGV4IDwgbGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvYmogPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgcmV0dXJuIG9iaiA9PSBudWxsIHx8IGRlbGV0ZSBvYmpbdG9LZXkobGFzdChwYXRoKSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbnNldDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiIsInZhciBtZW1vaXplQ2FwcGVkID0gcmVxdWlyZSgnLi9fbWVtb2l6ZUNhcHBlZCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgcmVzdWx0LnB1c2goJycpO1xuICB9XG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nVG9QYXRoO1xuIiwidmFyIG1lbW9pemUgPSByZXF1aXJlKCcuL21lbW9pemUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xudmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVDYXBwZWQ7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZTtcbiIsInZhciBiYXNlVG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlVG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU3RyaW5nO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFzdDtcbiIsInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTbGljZSA9IHJlcXVpcmUoJy4vX2Jhc2VTbGljZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHBhcmVudCB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGFyZW50IHZhbHVlLlxuICovXG5mdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA8IDIgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldDtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgfVxuICBlbmQgPSBlbmQgPiBsZW5ndGggPyBsZW5ndGggOiBlbmQ7XG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlbmd0aDtcbiAgfVxuICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gIHN0YXJ0ID4+Pj0gMDtcblxuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gYXJyYXlbaW5kZXggKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2xpY2U7XG4iLCJ2YXIgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vaXNQbGFpbk9iamVjdCcpO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub21pdGAgdG8gY3VzdG9taXplIGl0cyBgXy5jbG9uZURlZXBgIHVzZSB0byBvbmx5IGNsb25lIHBsYWluXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVuY2xvbmVkIHZhbHVlIG9yIGB1bmRlZmluZWRgIHRvIGRlZmVyIGNsb25pbmcgdG8gYF8uY2xvbmVEZWVwYC5cbiAqL1xuZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGN1c3RvbU9taXRDbG9uZTtcbiIsInZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi9mbGF0dGVuJyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXRSZXN0O1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRmxhdHRlbmFibGU7XG4iLCJmdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbih0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIC0xICE9PSBGdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpO1xuICB9IGNhdGNoIChuKSB7XG4gICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdDtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfaXNOYXRpdmVGdW5jdGlvbiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcbmZ1bmN0aW9uIF9jb25zdHJ1Y3QodCwgZSwgcikge1xuICBpZiAoaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB2YXIgbyA9IFtudWxsXTtcbiAgby5wdXNoLmFwcGx5KG8sIGUpO1xuICB2YXIgcCA9IG5ldyAodC5iaW5kLmFwcGx5KHQsIG8pKSgpO1xuICByZXR1cm4gciAmJiBzZXRQcm90b3R5cGVPZihwLCByLnByb3RvdHlwZSksIHA7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jb25zdHJ1Y3QsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICB0cnkge1xuICAgIHZhciB0ID0gIUJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgfSBjYXRjaCAodCkge31cbiAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICAgIHJldHVybiAhIXQ7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cykoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIi8qKlxuICogQ29tbW9uIHV0aWxpdGllc1xuICogQG1vZHVsZSBnbE1hdHJpeFxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzXG5leHBvcnQgdmFyIEVQU0lMT04gPSAwLjAwMDAwMTtcbmV4cG9ydCB2YXIgQVJSQVlfVFlQRSA9IHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09IFwidW5kZWZpbmVkXCIgPyBGbG9hdDMyQXJyYXkgOiBBcnJheTtcbmV4cG9ydCB2YXIgUkFORE9NID0gTWF0aC5yYW5kb207XG5leHBvcnQgdmFyIEFOR0xFX09SREVSID0gXCJ6eXhcIjtcblxuLyoqXG4gKiBTeW1tZXRyaWMgcm91bmRcbiAqIHNlZSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yb3VuZC1oYWxmLXVwLXN5bW1ldHJpYyN1c2VyLWNvbnRlbnQtZGV0YWlsZWQtYmFja2dyb3VuZFxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIHZhbHVlIHRvIHJvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChhKSB7XG4gIGlmIChhID49IDApIHJldHVybiBNYXRoLnJvdW5kKGEpO1xuICByZXR1cm4gYSAlIDAuNSA9PT0gMCA/IE1hdGguZmxvb3IoYSkgOiBNYXRoLnJvdW5kKGEpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHR5cGUgb2YgYXJyYXkgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuICpcbiAqIEBwYXJhbSB7RmxvYXQzMkFycmF5Q29uc3RydWN0b3IgfCBBcnJheUNvbnN0cnVjdG9yfSB0eXBlIEFycmF5IHR5cGUsIHN1Y2ggYXMgRmxvYXQzMkFycmF5IG9yIEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRNYXRyaXhBcnJheVR5cGUodHlwZSkge1xuICBBUlJBWV9UWVBFID0gdHlwZTtcbn1cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xudmFyIHJhZGlhbiA9IDE4MCAvIE1hdGguUEk7XG5cbi8qKlxuICogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQW5nbGUgaW4gRGVncmVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9SYWRpYW4oYSkge1xuICByZXR1cm4gYSAqIGRlZ3JlZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFJhZGlhbiBUbyBEZWdyZWVcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSBBbmdsZSBpbiBSYWRpYW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RlZ3JlZShhKSB7XG4gIHJldHVybiBhICogcmFkaWFuO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmd1bWVudHMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHZhbHVlLCB3aXRoaW4gYW4gYWJzb2x1dGVcbiAqIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSBvZiBnbE1hdHJpeC5FUFNJTE9OIChhbiBhYnNvbHV0ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgdmFsdWVzIGxlc3NcbiAqIHRoYW4gb3IgZXF1YWwgdG8gMS4wLCBhbmQgYSByZWxhdGl2ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgbGFyZ2VyIHZhbHVlcylcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSAgICAgICAgICBUaGUgZmlyc3QgbnVtYmVyIHRvIHRlc3QuXG4gKiBAcGFyYW0ge051bWJlcn0gYiAgICAgICAgICBUaGUgc2Vjb25kIG51bWJlciB0byB0ZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvbGVyYW5jZSAgQWJzb2x1dGUgb3IgcmVsYXRpdmUgdG9sZXJhbmNlIChkZWZhdWx0IGdsTWF0cml4LkVQU0lMT04pXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVycyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIHRvbGVyYW5jZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogRVBTSUxPTjtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSB0b2xlcmFuY2UgKiBNYXRoLm1heCgxLCBNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufSIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuXG4vKipcbiAqIDJ4MiBNYXRyaXhcbiAqIEBtb2R1bGUgbWF0MlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyXG4gKlxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gIH1cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFNldCBhIG1hdDIgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MiB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0IEEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTEwLCBtMTEpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlXG4gIC8vIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTEgPSBhWzFdO1xuICAgIG91dFsxXSA9IGFbMl07XG4gICAgb3V0WzJdID0gYTE7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGFbMV07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEludmVydHMgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MiB8IG51bGx9IG91dCwgb3IgbnVsbCBpZiBzb3VyY2UgbWF0cml4IGlzIG5vdCBpbnZlcnRpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgYTEgPSBhWzFdLFxuICAgIGEyID0gYVsyXSxcbiAgICBhMyA9IGFbM107XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYTAgKiBhMyAtIGEyICogYTE7XG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBhMyAqIGRldDtcbiAgb3V0WzFdID0gLWExICogZGV0O1xuICBvdXRbMl0gPSAtYTIgKiBkZXQ7XG4gIG91dFszXSA9IGEwICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgLy8gQ2FjaGluZyB0aGlzIHZhbHVlIGlzIG5lY2Vzc2FyeSBpZiBvdXQgPT0gYVxuICB2YXIgYTAgPSBhWzBdO1xuICBvdXRbMF0gPSBhWzNdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGEwO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHJldHVybiBhWzBdICogYVszXSAtIGFbMl0gKiBhWzFdO1xufVxuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICBhMSA9IGFbMV0sXG4gICAgYTIgPSBhWzJdLFxuICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICBiMSA9IGJbMV0sXG4gICAgYjIgPSBiWzJdLFxuICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdDIgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgYTEgPSBhWzFdLFxuICAgIGEyID0gYVsyXSxcbiAgICBhMyA9IGFbM107XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBhMCAqIGMgKyBhMiAqIHM7XG4gIG91dFsxXSA9IGExICogYyArIGEzICogcztcbiAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDIgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICBhMSA9IGFbMV0sXG4gICAgYTIgPSBhWzJdLFxuICAgIGEzID0gYVszXTtcbiAgdmFyIHYwID0gdlswXSxcbiAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDIucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDIuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IHZbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0MihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoYVswXSAqIGFbMF0gKyBhWzFdICogYVsxXSArIGFbMl0gKiBhWzJdICsgYVszXSAqIGFbM10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBMIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IEQgdGhlIGRpYWdvbmFsIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgaW5wdXQgbWF0cml4IHRvIGZhY3Rvcml6ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBMRFUoTCwgRCwgVSwgYSkge1xuICBMWzJdID0gYVsyXSAvIGFbMF07XG4gIFVbMF0gPSBhWzBdO1xuICBVWzFdID0gYVsxXTtcbiAgVVszXSA9IGFbM10gLSBMWzJdICogVVsxXTtcbiAgcmV0dXJuIFtMLCBELCBVXTtcbn1cblxuLyoqXG4gKiBBZGRzIHR3byBtYXQyJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM107XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgYTEgPSBhWzFdLFxuICAgIGEyID0gYVsyXSxcbiAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgYjEgPSBiWzFdLFxuICAgIGIyID0gYlsyXSxcbiAgICBiMyA9IGJbM107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSk7XG59XG5cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBZGRzIHR3byBtYXQyJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcblxuLyoqXG4gKiAyIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMyXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHkpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIHN5bW1ldHJpYyByb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJvdW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gZ2xNYXRyaXgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IGdsTWF0cml4LnJvdW5kKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICB5ID0gYVsxXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHk7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICogTm90ZSB0aGF0IHRoZSBjcm9zcyBwcm9kdWN0IG11c3QgYnkgZGVmaW5pdGlvbiBwcm9kdWNlIGEgM0QgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gIG91dFswXSA9IG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICBheSA9IGFbMV07XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlID09PSB1bmRlZmluZWQgPyAxLjAgOiBzY2FsZTtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHk7XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJvdGF0ZSBhIDJEIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgdmVjMiBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCBiLCByYWQpIHtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICB2YXIgcDAgPSBhWzBdIC0gYlswXSxcbiAgICBwMSA9IGFbMV0gLSBiWzFdLFxuICAgIHNpbkMgPSBNYXRoLnNpbihyYWQpLFxuICAgIGNvc0MgPSBNYXRoLmNvcyhyYWQpO1xuXG4gIC8vcGVyZm9ybSByb3RhdGlvbiBhbmQgdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgb3V0WzBdID0gcDAgKiBjb3NDIC0gcDEgKiBzaW5DICsgYlswXTtcbiAgb3V0WzFdID0gcDAgKiBzaW5DICsgcDEgKiBjb3NDICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNtYWxsZXN0IGFuZ2xlIGJldHdlZW4gdHdvIDJEIHZlY3RvcnNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgYXkgPSBhWzFdLFxuICAgIGJ4ID0gYlswXSxcbiAgICBieSA9IGJbMV07XG4gIHJldHVybiBNYXRoLmFicyhNYXRoLmF0YW4yKGF5ICogYnggLSBheCAqIGJ5LCBheCAqIGJ4ICsgYXkgKiBieSkpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc2lnbmVkIGFuZ2xlIGluIHRoZSBpbnRlcnZhbCBbLXBpLHBpXSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzIChwb3NpdGl2ZSBpZiBgYWAgaXMgdG8gdGhlIHJpZ2h0IG9mIGBiYClcbiAqIFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3JcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzaWduZWQgYW5nbGUgaW4gcmFkaWFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkQW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgIGF5ID0gYVsxXSxcbiAgICBieCA9IGJbMF0sXG4gICAgYnkgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hdGFuMihheCAqIGJ5IC0gYXkgKiBieCwgYXggKiBieCArIGF5ICogYnkpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiKVwiO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgZXhhY3RseSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICBhMSA9IGFbMV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgYjEgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKTtcbn1cblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzJzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMjtcbiAgICB9XG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcblxuLyoqXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXG4gKlxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSwgeikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeikge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBzeW1tZXRyaWMgcm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IGdsTWF0cml4LnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBnbE1hdHJpeC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gZ2xNYXRyaXgucm91bmQoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU2NhbGVzIGEgdmVjMyBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogejtcbn1cblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgYXkgPSBhWzFdLFxuICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICBieSA9IGJbMV0sXG4gICAgYnogPSBiWzJdO1xuICBvdXRbMF0gPSBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF4ICogYnkgLSBheSAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF07XG4gIHZhciBheSA9IGFbMV07XG4gIHZhciBheiA9IGFbMl07XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgb3V0WzJdID0gYXogKyB0ICogKGJbMl0gLSBheik7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYW5nbGUgPSBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoZG90KGEsIGIpLCAtMSksIDEpKTtcbiAgdmFyIHNpblRvdGFsID0gTWF0aC5zaW4oYW5nbGUpO1xuICB2YXIgcmF0aW9BID0gTWF0aC5zaW4oKDEgLSB0KSAqIGFuZ2xlKSAvIHNpblRvdGFsO1xuICB2YXIgcmF0aW9CID0gTWF0aC5zaW4odCAqIGFuZ2xlKSAvIHNpblRvdGFsO1xuICBvdXRbMF0gPSByYXRpb0EgKiBhWzBdICsgcmF0aW9CICogYlswXTtcbiAgb3V0WzFdID0gcmF0aW9BICogYVsxXSArIHJhdGlvQiAqIGJbMV07XG4gIG91dFsyXSA9IHJhdGlvQSAqIGFbMl0gKyByYXRpb0IgKiBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgaGVybWl0ZSBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllcihvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGludmVyc2VGYWN0b3IgPSAxIC0gdDtcbiAgdmFyIGludmVyc2VGYWN0b3JUaW1lc1R3byA9IGludmVyc2VGYWN0b3IgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gaW52ZXJzZUZhY3RvclRpbWVzVHdvICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjIgPSAzICogdCAqIGludmVyc2VGYWN0b3JUaW1lc1R3bztcbiAgdmFyIGZhY3RvcjMgPSAzICogZmFjdG9yVGltZXMyICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiB0O1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgPT09IHVuZGVmaW5lZCA/IDEuMCA6IHNjYWxlO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgdmFyIHogPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAtIDEuMDtcbiAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAgLSB6ICogeikgKiBzY2FsZTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICBvdXRbMl0gPSB6ICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICB5ID0gYVsxXSxcbiAgICB6ID0gYVsyXTtcbiAgdmFyIHcgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV07XG4gIHcgPSB3IHx8IDEuMDtcbiAgb3V0WzBdID0gKG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdKSAvIHc7XG4gIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3O1xuICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0My5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV0sXG4gICAgeiA9IGFbMl07XG4gIG91dFswXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyB6ICogbVs2XTtcbiAgb3V0WzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIHogKiBtWzddO1xuICBvdXRbMl0gPSB4ICogbVsyXSArIHkgKiBtWzVdICsgeiAqIG1bOF07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgcXVhdFxuICogQ2FuIGFsc28gYmUgdXNlZCBmb3IgZHVhbCBxdWF0ZXJuaW9ucy4gKE11bHRpcGx5IGl0IHdpdGggdGhlIHJlYWwgcGFydClcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIG5vcm1hbGl6ZWQgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgLy8gRmFzdCBWZWN0b3IgUm90YXRpb24gdXNpbmcgUXVhdGVybmlvbnMgYnkgUm9iZXJ0IEVpc2VsZVxuICAvLyBodHRwczovL3Jhdy5vcmcvcHJvb2YvdmVjdG9yLXJvdGF0aW9uLXVzaW5nLXF1YXRlcm5pb25zL1xuXG4gIHZhciBxeCA9IHFbMF0sXG4gICAgcXkgPSBxWzFdLFxuICAgIHF6ID0gcVsyXSxcbiAgICBxdyA9IHFbM107XG4gIHZhciB2eCA9IGFbMF0sXG4gICAgdnkgPSBhWzFdLFxuICAgIHZ6ID0gYVsyXTtcblxuICAvLyB0ID0gcSB4IHZcbiAgdmFyIHR4ID0gcXkgKiB2eiAtIHF6ICogdnk7XG4gIHZhciB0eSA9IHF6ICogdnggLSBxeCAqIHZ6O1xuICB2YXIgdHogPSBxeCAqIHZ5IC0gcXkgKiB2eDtcblxuICAvLyB0ID0gMnRcbiAgdHggPSB0eCArIHR4O1xuICB0eSA9IHR5ICsgdHk7XG4gIHR6ID0gdHogKyB0ejtcblxuICAvLyB2ICsgdyB0ICsgcSB4IHRcbiAgb3V0WzBdID0gdnggKyBxdyAqIHR4ICsgcXkgKiB0eiAtIHF6ICogdHk7XG4gIG91dFsxXSA9IHZ5ICsgcXcgKiB0eSArIHF6ICogdHggLSBxeCAqIHR6O1xuICBvdXRbMl0gPSB2eiArIHF3ICogdHogKyBxeCAqIHR5IC0gcXkgKiB0eDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgIHIgPSBbXTtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gIC8vcGVyZm9ybSByb3RhdGlvblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhyYWQpIC0gcFsyXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMl0gPSBwWzFdICogTWF0aC5zaW4ocmFkKSArIHBbMl0gKiBNYXRoLmNvcyhyYWQpO1xuXG4gIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgIHIgPSBbXTtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gIC8vcGVyZm9ybSByb3RhdGlvblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpO1xuXG4gIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB6LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgIHIgPSBbXTtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdO1xuXG4gIC8vcGVyZm9ybSByb3RhdGlvblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKHJhZCkgLSBwWzFdICogTWF0aC5zaW4ocmFkKTtcbiAgclsxXSA9IHBbMF0gKiBNYXRoLnNpbihyYWQpICsgcFsxXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMl0gPSBwWzJdO1xuXG4gIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgYXkgPSBhWzFdLFxuICAgIGF6ID0gYVsyXSxcbiAgICBieCA9IGJbMF0sXG4gICAgYnkgPSBiWzFdLFxuICAgIGJ6ID0gYlsyXSxcbiAgICBtYWcgPSBNYXRoLnNxcnQoKGF4ICogYXggKyBheSAqIGF5ICsgYXogKiBheikgKiAoYnggKiBieCArIGJ5ICogYnkgKyBieiAqIGJ6KSksXG4gICAgY29zaW5lID0gbWFnICYmIGRvdChhLCBiKSAvIG1hZztcbiAgcmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkpO1xufVxuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMyhcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiKVwiO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgIGExID0gYVsxXSxcbiAgICBhMiA9IGFbMl07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgYjEgPSBiWzFdLFxuICAgIGIyID0gYlsyXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpO1xufVxuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIG1hdDIgZnJvbSBcIi4vbWF0Mi5qc1wiO1xuaW1wb3J0ICogYXMgbWF0MmQgZnJvbSBcIi4vbWF0MmQuanNcIjtcbmltcG9ydCAqIGFzIG1hdDMgZnJvbSBcIi4vbWF0My5qc1wiO1xuaW1wb3J0ICogYXMgbWF0NCBmcm9tIFwiLi9tYXQ0LmpzXCI7XG5pbXBvcnQgKiBhcyBxdWF0IGZyb20gXCIuL3F1YXQuanNcIjtcbmltcG9ydCAqIGFzIHF1YXQyIGZyb20gXCIuL3F1YXQyLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWMyIGZyb20gXCIuL3ZlYzIuanNcIjtcbmltcG9ydCAqIGFzIHZlYzMgZnJvbSBcIi4vdmVjMy5qc1wiO1xuaW1wb3J0ICogYXMgdmVjNCBmcm9tIFwiLi92ZWM0LmpzXCI7XG5leHBvcnQgeyBnbE1hdHJpeCwgbWF0MiwgbWF0MmQsIG1hdDMsIG1hdDQsIHF1YXQsIHF1YXQyLCB2ZWMyLCB2ZWMzLCB2ZWM0IH07IiwiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7IFR5cGVkQXJyYXkgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBpbml0KGFycjogVHlwZWRBcnJheSB8IEFycmF5PG51bWJlcj4sIHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGFyci5maWxsKHZhbCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElOLVBMQUNFIFNodWZmbGVzIHRoZSBjb250ZW50IG9mIGFuIGFycmF5XG4gICAgICovXG4gICAgc2h1ZmZsZShhcnI6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgLy8gRHVyc3RlbmZlbGQgc2h1ZmZsZSBhbGdvcml0aG1cbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjQ1MDk1NC9ob3ctdG8tcmFuZG9taXplLXNodWZmbGUtYS1qYXZhc2NyaXB0LWFycmF5XG4gICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgICAgW2FycltpXSwgYXJyW2pdXSA9IFthcnJbal0sIGFycltpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuXG4gICAgdG9Qb2ludExpc3QoYXJyOiBBcnJheTxBcnJheTxudW1iZXI+Pikge1xuICAgICAgICBjb25zdCByb3dzID0gYXJyLnJlZHVjZSgocCwgbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gYFske24uam9pbignLCcpfV1gO1xuICAgICAgICAgICAgcC5wdXNoKHJvdyk7XG4gICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgfSwgW10gYXMgQXJyYXk8c3RyaW5nPik7XG4gICAgICAgIHJldHVybiBgWyR7cm93cy5qb2luKCcsXFxyXFxuJyl9XWA7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgdGhlIGVsZW1lbnRzIHdoaWNoJ3Mgc2NvcmUgaXMgYmlnZ2VyIHRoYW4gdGhlIHRocmVzaG9sZFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHRocmVzaG9sZChhcnI6IEFycmF5PG51bWJlcj4sIHRocmVzaG9sZDogbnVtYmVyLCBzY29yZUZ1bmM6ICgoc2NvcmU6IG51bWJlcikgPT4gbnVtYmVyKSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IGFyci5yZWR1Y2UoKHByZXY6IEFycmF5PG51bWJlcj4sIG5leHQpID0+IHtcbiAgICAgICAgICAgIGlmIChzY29yZUZ1bmMuYXBwbHkoYXJyLCBbbmV4dF0pID49IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIHByZXYucHVzaChuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHJldHVybiBxdWV1ZTtcbiAgICB9LFxuXG4gICAgbWF4SW5kZXgoYXJyOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycltpXSA+IGFyclttYXhdKSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH0sXG5cbiAgICBtYXgoYXJyOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycltpXSA+IG1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IGFycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH0sXG5cbiAgICBzdW0oYXJyOiBBcnJheTxudW1iZXI+IHwgVHlwZWRBcnJheSk6IG51bWJlciB7XG4gICAgICAgIGxldCB7IGxlbmd0aCB9ID0gYXJyO1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICAgIHN1bSArPSBhcnJbbGVuZ3RoXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH0sXG59O1xuIiwiLy8gVE9ETzogY2x1c3Rlci5qcyBhbmQgY3ZfdXRpbHMuanMgYXJlIHByZXR0eSB0aWdodGx5IGludGVydHdpbmVkLCBtYWtpbmcgZm9yIGEgY29tcGxleCBjb252ZXJzaW9uXG4vLyBpbnRvIHR5cGVzY3JpcHQuIGJlIHdhcm5lZC4gOi0pXG5cbmltcG9ydCB7IHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbHVzdGVyIGZvciBncm91cGluZyBzaW1pbGFyIG9yaWVudGF0aW9ucyBvZiBkYXRhcG9pbnRzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjcmVhdGUocG9pbnQsIHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICAgICAgY29uc3QgY2VudGVyID0ge1xuICAgICAgICAgICAgcmFkOiAwLFxuICAgICAgICAgICAgdmVjOiB2ZWMyLmNsb25lKFswLCAwXSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvaW50TWFwID0ge307XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkKHBvaW50VG9BZGQpIHtcbiAgICAgICAgICAgIHBvaW50TWFwW3BvaW50VG9BZGQuaWRdID0gcG9pbnRUb0FkZDtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50VG9BZGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2VudGVyKCkge1xuICAgICAgICAgICAgbGV0IGk7IGxldFxuICAgICAgICAgICAgICAgIHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHBvaW50c1tpXS5yYWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjZW50ZXIucmFkID0gc3VtIC8gcG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNlbnRlci52ZWMgPSB2ZWMyLmNsb25lKFtNYXRoLmNvcyhjZW50ZXIucmFkKSwgTWF0aC5zaW4oY2VudGVyLnJhZCldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICBhZGQocG9pbnQpO1xuICAgICAgICAgICAgdXBkYXRlQ2VudGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZChwb2ludFRvQWRkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludE1hcFtwb2ludFRvQWRkLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICBhZGQocG9pbnRUb0FkZCk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNlbnRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaXRzKG90aGVyUG9pbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBjb3NpbmUgc2ltaWxhcml0eSB0byBjZW50ZXItYW5nbGVcbiAgICAgICAgICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gTWF0aC5hYnModmVjMi5kb3Qob3RoZXJQb2ludC5wb2ludC52ZWMsIGNlbnRlci52ZWMpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFBvaW50cygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENlbnRlcigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VudGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGNyZWF0ZVBvaW50KG5ld1BvaW50LCBpZCwgcHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhZDogbmV3UG9pbnRbcHJvcGVydHldLFxuICAgICAgICAgICAgcG9pbnQ6IG5ld1BvaW50LFxuICAgICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgfSxcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbmltcG9ydCB7IHZlYzIsIHZlYzMgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4vYXJyYXlfaGVscGVyJztcbmltcG9ydCBDbHVzdGVyMiBmcm9tICcuL2NsdXN0ZXInO1xuXG4vKipcbiAqIEBwYXJhbSB4IHgtY29vcmRpbmF0ZVxuICogQHBhcmFtIHkgeS1jb29yZGluYXRlXG4gKiBAcmV0dXJuIEltYWdlUmVmZXJlbmNlIHt4LHl9IENvb3JkaW5hdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltYWdlUmVmKHgsIHkpIHtcbiAgICBjb25zdCB0aGF0ID0ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB0b1ZlYzIoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmVjMi5jbG9uZShbdGhpcy54LCB0aGlzLnldKTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9WZWMzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZlYzMuY2xvbmUoW3RoaXMueCwgdGhpcy55LCAxXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJvdW5kKCkge1xuICAgICAgICAgICAgdGhpcy54ID0gdGhpcy54ID4gMC4wID8gTWF0aC5mbG9vcih0aGlzLnggKyAwLjUpIDogTWF0aC5mbG9vcih0aGlzLnggLSAwLjUpO1xuICAgICAgICAgICAgdGhpcy55ID0gdGhpcy55ID4gMC4wID8gTWF0aC5mbG9vcih0aGlzLnkgKyAwLjUpIDogTWF0aC5mbG9vcih0aGlzLnkgLSAwLjUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gdGhhdDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhbiBpbnRlZ3JhbCBpbWFnZSBvZiBhIGdpdmVuIGdyYXlzY2FsZSBpbWFnZS5cbiAqIEBwYXJhbSBpbWFnZURhdGFDb250YWluZXIge0ltYWdlRGF0YUNvbnRhaW5lcn0gdGhlIGltYWdlIHRvIGJlIGludGVncmF0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVJbnRlZ3JhbEltYWdlMihpbWFnZVdyYXBwZXIsIGludGVncmFsV3JhcHBlcikge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IGludGVncmFsSW1hZ2VEYXRhID0gaW50ZWdyYWxXcmFwcGVyLmRhdGE7XG4gICAgbGV0IHN1bSA9IDA7IGxldCBwb3NBID0gMDsgbGV0IHBvc0IgPSAwOyBsZXQgcG9zQyA9IDA7IGxldCBwb3NEID0gMDsgbGV0IHg7IGxldFxuICAgICAgICB5O1xuXG4gICAgLy8gc3VtIHVwIGZpcnN0IGNvbHVtblxuICAgIHBvc0IgPSB3aWR0aDtcbiAgICBzdW0gPSAwO1xuICAgIGZvciAoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBzdW0gKz0gaW1hZ2VEYXRhW3Bvc0FdO1xuICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVtwb3NCXSArPSBzdW07XG4gICAgICAgIHBvc0EgKz0gd2lkdGg7XG4gICAgICAgIHBvc0IgKz0gd2lkdGg7XG4gICAgfVxuXG4gICAgcG9zQSA9IDA7XG4gICAgcG9zQiA9IDE7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBzdW0gKz0gaW1hZ2VEYXRhW3Bvc0FdO1xuICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVtwb3NCXSArPSBzdW07XG4gICAgICAgIHBvc0ErKztcbiAgICAgICAgcG9zQisrO1xuICAgIH1cblxuICAgIGZvciAoeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICBwb3NBID0geSAqIHdpZHRoICsgMTtcbiAgICAgICAgcG9zQiA9ICh5IC0gMSkgKiB3aWR0aCArIDE7XG4gICAgICAgIHBvc0MgPSB5ICogd2lkdGg7XG4gICAgICAgIHBvc0QgPSAoeSAtIDEpICogd2lkdGg7XG4gICAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVtwb3NBXVxuICAgICAgICAgICAgICAgICs9IGltYWdlRGF0YVtwb3NBXSArIGludGVncmFsSW1hZ2VEYXRhW3Bvc0JdICsgaW50ZWdyYWxJbWFnZURhdGFbcG9zQ10gLSBpbnRlZ3JhbEltYWdlRGF0YVtwb3NEXTtcbiAgICAgICAgICAgIHBvc0ErKztcbiAgICAgICAgICAgIHBvc0IrKztcbiAgICAgICAgICAgIHBvc0MrKztcbiAgICAgICAgICAgIHBvc0QrKztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVJbnRlZ3JhbEltYWdlKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyKSB7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3Qgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGNvbnN0IGhlaWdodCA9IGltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgY29uc3QgaW50ZWdyYWxJbWFnZURhdGEgPSBpbnRlZ3JhbFdyYXBwZXIuZGF0YTtcbiAgICBsZXQgc3VtID0gMDtcblxuICAgIC8vIHN1bSB1cCBmaXJzdCByb3dcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgc3VtICs9IGltYWdlRGF0YVtpXTtcbiAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbaV0gPSBzdW07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgdiA9IDE7IHYgPCBoZWlnaHQ7IHYrKykge1xuICAgICAgICBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCB1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAgIHN1bSArPSBpbWFnZURhdGFbdiAqIHdpZHRoICsgdV07XG4gICAgICAgICAgICBpbnRlZ3JhbEltYWdlRGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSBzdW0gKyBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIDEpICogd2lkdGggKyB1XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRocmVzaG9sZEltYWdlKGltYWdlV3JhcHBlciwgdGhyZXNob2xkLCB0YXJnZXRXcmFwcGVyKSB7XG4gICAgaWYgKCF0YXJnZXRXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB0YXJnZXRXcmFwcGVyID0gaW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTsgbGV0IHsgbGVuZ3RoIH0gPSBpbWFnZURhdGE7IGNvbnN0XG4gICAgICAgIHRhcmdldERhdGEgPSB0YXJnZXRXcmFwcGVyLmRhdGE7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdGFyZ2V0RGF0YVtsZW5ndGhdID0gaW1hZ2VEYXRhW2xlbmd0aF0gPCB0aHJlc2hvbGQgPyAxIDogMDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGlzdG9ncmFtKGltYWdlV3JhcHBlciwgYml0c1BlclBpeGVsKSB7XG4gICAgaWYgKCFiaXRzUGVyUGl4ZWwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGJpdHNQZXJQaXhlbCA9IDg7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGxldCB7IGxlbmd0aCB9ID0gaW1hZ2VEYXRhO1xuICAgIGNvbnN0IGJpdFNoaWZ0ID0gOCAtIGJpdHNQZXJQaXhlbDtcbiAgICBjb25zdCBidWNrZXRDbnQgPSAxIDw8IGJpdHNQZXJQaXhlbDtcbiAgICBjb25zdCBoaXN0ID0gbmV3IEludDMyQXJyYXkoYnVja2V0Q250KTtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBoaXN0W2ltYWdlRGF0YVtsZW5ndGhdID4+IGJpdFNoaWZ0XSsrO1xuICAgIH1cbiAgICByZXR1cm4gaGlzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXJwZW5MaW5lKGxpbmUpIHtcbiAgICBsZXQgaTtcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gbGluZTtcbiAgICBsZXQgbGVmdCA9IGxpbmVbMF07XG4gICAgbGV0IGNlbnRlciA9IGxpbmVbMV07XG4gICAgbGV0IHJpZ2h0O1xuXG4gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICByaWdodCA9IGxpbmVbaSArIDFdO1xuICAgICAgICAvLyAgLTEgNCAtMSBrZXJuZWxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGxpbmVbaSAtIDFdID0gKCgoY2VudGVyICogMikgLSBsZWZ0IC0gcmlnaHQpKSAmIDI1NTtcbiAgICAgICAgbGVmdCA9IGNlbnRlcjtcbiAgICAgICAgY2VudGVyID0gcmlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBsaW5lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lT3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCA9IDgpIHtcbiAgICBsZXQgaGlzdDtcbiAgICBjb25zdCBiaXRTaGlmdCA9IDggLSBiaXRzUGVyUGl4ZWw7XG5cbiAgICBmdW5jdGlvbiBweChpbml0LCBlbmQpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbml0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gaGlzdFtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG14KGluaXQsIGVuZCkge1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gaW5pdDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IGkgKiBoaXN0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXRlcm1pbmVUaHJlc2hvbGQoKSB7XG4gICAgICAgIGNvbnN0IHZldCA9IFswXTtcbiAgICAgICAgbGV0IHAxO1xuICAgICAgICBsZXQgcDI7XG4gICAgICAgIGxldCBwMTI7XG4gICAgICAgIGxldCBtMTtcbiAgICAgICAgbGV0IG0yO1xuICAgICAgICBsZXQgbTEyO1xuICAgICAgICBjb25zdCBtYXggPSAoMSA8PCBiaXRzUGVyUGl4ZWwpIC0gMTtcblxuICAgICAgICBoaXN0ID0gY29tcHV0ZUhpc3RvZ3JhbShpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCk7XG4gICAgICAgIGZvciAobGV0IGsgPSAxOyBrIDwgbWF4OyBrKyspIHtcbiAgICAgICAgICAgIHAxID0gcHgoMCwgayk7XG4gICAgICAgICAgICBwMiA9IHB4KGsgKyAxLCBtYXgpO1xuICAgICAgICAgICAgcDEyID0gcDEgKiBwMjtcbiAgICAgICAgICAgIGlmIChwMTIgPT09IDApIHtcbiAgICAgICAgICAgICAgICBwMTIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbTEgPSBteCgwLCBrKSAqIHAyO1xuICAgICAgICAgICAgbTIgPSBteChrICsgMSwgbWF4KSAqIHAxO1xuICAgICAgICAgICAgbTEyID0gbTEgLSBtMjtcbiAgICAgICAgICAgIHZldFtrXSA9IG0xMiAqIG0xMiAvIHAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXlIZWxwZXIubWF4SW5kZXgodmV0KTtcbiAgICB9XG5cbiAgICBjb25zdCB0aHJlc2hvbGQgPSBkZXRlcm1pbmVUaHJlc2hvbGQoKTtcbiAgICByZXR1cm4gdGhyZXNob2xkIDw8IGJpdFNoaWZ0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIsIHRhcmdldFdyYXBwZXIpIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBkZXRlcm1pbmVPdHN1VGhyZXNob2xkKGltYWdlV3JhcHBlcik7XG5cbiAgICB0aHJlc2hvbGRJbWFnZShpbWFnZVdyYXBwZXIsIHRocmVzaG9sZCwgdGFyZ2V0V3JhcHBlcik7XG4gICAgcmV0dXJuIHRocmVzaG9sZDtcbn1cblxuLy8gbG9jYWwgdGhyZXNob2xkaW5nXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUJpbmFyeUltYWdlKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyLCB0YXJnZXRXcmFwcGVyKSB7XG4gICAgY29tcHV0ZUludGVncmFsSW1hZ2UoaW1hZ2VXcmFwcGVyLCBpbnRlZ3JhbFdyYXBwZXIpO1xuXG4gICAgaWYgKCF0YXJnZXRXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB0YXJnZXRXcmFwcGVyID0gaW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB0YXJnZXREYXRhID0gdGFyZ2V0V3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IGludGVncmFsSW1hZ2VEYXRhID0gaW50ZWdyYWxXcmFwcGVyLmRhdGE7XG4gICAgbGV0IHN1bSA9IDA7IGxldCB2OyBsZXQgdTsgY29uc3Qga2VybmVsID0gMzsgbGV0IEE7IGxldCBCOyBsZXQgQzsgbGV0IEQ7IGxldCBhdmc7IGNvbnN0XG4gICAgICAgIHNpemUgPSAoa2VybmVsICogMiArIDEpICogKGtlcm5lbCAqIDIgKyAxKTtcblxuICAgIC8vIGNsZWFyIG91dCB0b3AgJiBib3R0b20tYm9yZGVyXG4gICAgZm9yICh2ID0gMDsgdiA8PSBrZXJuZWw7IHYrKykge1xuICAgICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykge1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKChoZWlnaHQgLSAxKSAtIHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgb3V0IGxlZnQgJiByaWdodCBib3JkZXJcbiAgICBmb3IgKHYgPSBrZXJuZWw7IHYgPCBoZWlnaHQgLSBrZXJuZWw7IHYrKykge1xuICAgICAgICBmb3IgKHUgPSAwOyB1IDw9IGtlcm5lbDsgdSsrKSB7XG4gICAgICAgICAgICB0YXJnZXREYXRhWygodikgKiB3aWR0aCkgKyB1XSA9IDA7XG4gICAgICAgICAgICB0YXJnZXREYXRhWygodikgKiB3aWR0aCkgKyAod2lkdGggLSAxIC0gdSldID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodiA9IGtlcm5lbCArIDE7IHYgPCBoZWlnaHQgLSBrZXJuZWwgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICh1ID0ga2VybmVsICsgMTsgdSA8IHdpZHRoIC0ga2VybmVsOyB1KyspIHtcbiAgICAgICAgICAgIEEgPSBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIGtlcm5lbCAtIDEpICogd2lkdGggKyAodSAtIGtlcm5lbCAtIDEpXTtcbiAgICAgICAgICAgIEIgPSBpbnRlZ3JhbEltYWdlRGF0YVsodiAtIGtlcm5lbCAtIDEpICogd2lkdGggKyAodSArIGtlcm5lbCldO1xuICAgICAgICAgICAgQyA9IGludGVncmFsSW1hZ2VEYXRhWyh2ICsga2VybmVsKSAqIHdpZHRoICsgKHUgLSBrZXJuZWwgLSAxKV07XG4gICAgICAgICAgICBEID0gaW50ZWdyYWxJbWFnZURhdGFbKHYgKyBrZXJuZWwpICogd2lkdGggKyAodSArIGtlcm5lbCldO1xuICAgICAgICAgICAgc3VtID0gRCAtIEMgLSBCICsgQTtcbiAgICAgICAgICAgIGF2ZyA9IHN1bSAvIChzaXplKTtcbiAgICAgICAgICAgIHRhcmdldERhdGFbdiAqIHdpZHRoICsgdV0gPSBpbWFnZURhdGFbdiAqIHdpZHRoICsgdV0gPiAoYXZnICsgNSkgPyAwIDogMTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsdXN0ZXIocG9pbnRzLCB0aHJlc2hvbGQsIHByb3BlcnR5KSB7XG4gICAgbGV0IGk7IGxldCBrOyBsZXQgdGhpc0NsdXN0ZXI7IGxldCBwb2ludDsgY29uc3RcbiAgICAgICAgY2x1c3RlcnMgPSBbXTtcblxuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHByb3BlcnR5ID0gJ3JhZCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVG9DbHVzdGVyKG5ld1BvaW50KSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHRoaXNDbHVzdGVyID0gY2x1c3RlcnNba107XG4gICAgICAgICAgICBpZiAodGhpc0NsdXN0ZXIuZml0cyhuZXdQb2ludCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzQ2x1c3Rlci5hZGQobmV3UG9pbnQpO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIGVhY2ggY2xvdWRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50ID0gQ2x1c3RlcjIuY3JlYXRlUG9pbnQocG9pbnRzW2ldLCBpLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICghYWRkVG9DbHVzdGVyKHBvaW50KSkge1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChDbHVzdGVyMi5jcmVhdGUocG9pbnQsIHRocmVzaG9sZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbHVzdGVycztcbn1cblxuZXhwb3J0IGNvbnN0IFRyYWNlciA9IHtcbiAgICB0cmFjZShwb2ludHMsIHZlYykge1xuICAgICAgICBsZXQgaXRlcmF0aW9uO1xuICAgICAgICBjb25zdCBtYXhJdGVyYXRpb25zID0gMTA7XG4gICAgICAgIGxldCB0b3AgPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgY2VudGVyUG9zID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRQb3MgPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHRyYWNlKGlkeCwgZm9yd2FyZCkge1xuICAgICAgICAgICAgbGV0IHRvO1xuICAgICAgICAgICAgbGV0IHRvSWR4O1xuICAgICAgICAgICAgbGV0IHByZWRpY3RlZFBvcztcbiAgICAgICAgICAgIGNvbnN0IHRocmVzaG9sZFggPSAxO1xuICAgICAgICAgICAgY29uc3QgdGhyZXNob2xkWSA9IE1hdGguYWJzKHZlY1sxXSAvIDEwKTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBtYXRjaChwb3MsIHByZWRpY3RlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwb3MueCA+IChwcmVkaWN0ZWQueCAtIHRocmVzaG9sZFgpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueCA8IChwcmVkaWN0ZWQueCArIHRocmVzaG9sZFgpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueSA+IChwcmVkaWN0ZWQueSAtIHRocmVzaG9sZFkpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBwb3MueSA8IChwcmVkaWN0ZWQueSArIHRocmVzaG9sZFkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBuZXh0IGluZGV4IGlzIHdpdGhpbiB0aGUgdmVjIHNwZWNpZmljYXRpb25zXG4gICAgICAgICAgICAvLyBpZiBub3QsIGNoZWNrIGFzIGxvbmcgYXMgdGhlIHRocmVzaG9sZCBpcyBtZXRcblxuICAgICAgICAgICAgY29uc3QgZnJvbSA9IHBvaW50c1tpZHhdO1xuICAgICAgICAgICAgaWYgKGZvcndhcmQpIHtcbiAgICAgICAgICAgICAgICBwcmVkaWN0ZWRQb3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGZyb20ueCArIHZlY1swXSxcbiAgICAgICAgICAgICAgICAgICAgeTogZnJvbS55ICsgdmVjWzFdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZWRpY3RlZFBvcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogZnJvbS54IC0gdmVjWzBdLFxuICAgICAgICAgICAgICAgICAgICB5OiBmcm9tLnkgLSB2ZWNbMV0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9JZHggPSBmb3J3YXJkID8gaWR4ICsgMSA6IGlkeCAtIDE7XG4gICAgICAgICAgICB0byA9IHBvaW50c1t0b0lkeF07XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICAgICAgICAgIHdoaWxlICh0byAmJiAoZm91bmQgPSBtYXRjaCh0bywgcHJlZGljdGVkUG9zKSkgIT09IHRydWUgJiYgKE1hdGguYWJzKHRvLnkgLSBmcm9tLnkpIDwgdmVjWzFdKSkge1xuICAgICAgICAgICAgICAgIHRvSWR4ID0gZm9yd2FyZCA/IHRvSWR4ICsgMSA6IHRvSWR4IC0gMTtcbiAgICAgICAgICAgICAgICB0byA9IHBvaW50c1t0b0lkeF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmb3VuZCA/IHRvSWR4IDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgbWF4SXRlcmF0aW9uczsgaXRlcmF0aW9uKyspIHtcbiAgICAgICAgICAgIC8vIHJhbmRvbWx5IHNlbGVjdCBwb2ludCB0byBzdGFydCB3aXRoXG4gICAgICAgICAgICBjZW50ZXJQb3MgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb2ludHMubGVuZ3RoKTtcblxuICAgICAgICAgICAgLy8gdHJhY2UgZm9yd2FyZFxuICAgICAgICAgICAgdG9wID0gW107XG4gICAgICAgICAgICBjdXJyZW50UG9zID0gY2VudGVyUG9zO1xuICAgICAgICAgICAgdG9wLnB1c2gocG9pbnRzW2N1cnJlbnRQb3NdKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50UG9zID0gdHJhY2UoY3VycmVudFBvcywgdHJ1ZSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdG9wLnB1c2gocG9pbnRzW2N1cnJlbnRQb3NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjZW50ZXJQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBvcyA9IGNlbnRlclBvcztcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnRQb3MgPSB0cmFjZShjdXJyZW50UG9zLCBmYWxzZSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wdXNoKHBvaW50c1tjdXJyZW50UG9zXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG9wLmxlbmd0aCA+IHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IERJTEFURSA9IDE7XG5leHBvcnQgY29uc3QgRVJPREUgPSAyO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlsYXRlKGluSW1hZ2VXcmFwcGVyLCBvdXRJbWFnZVdyYXBwZXIpIHtcbiAgICBsZXQgdjtcbiAgICBsZXQgdTtcbiAgICBjb25zdCBpbkltYWdlRGF0YSA9IGluSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3Qgb3V0SW1hZ2VEYXRhID0gb3V0SW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IHdpZHRoID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGxldCBzdW07XG4gICAgbGV0IHlTdGFydDE7XG4gICAgbGV0IHlTdGFydDI7XG4gICAgbGV0IHhTdGFydDE7XG4gICAgbGV0IHhTdGFydDI7XG5cbiAgICBmb3IgKHYgPSAxOyB2IDwgaGVpZ2h0IC0gMTsgdisrKSB7XG4gICAgICAgIGZvciAodSA9IDE7IHUgPCB3aWR0aCAtIDE7IHUrKykge1xuICAgICAgICAgICAgeVN0YXJ0MSA9IHYgLSAxO1xuICAgICAgICAgICAgeVN0YXJ0MiA9IHYgKyAxO1xuICAgICAgICAgICAgeFN0YXJ0MSA9IHUgLSAxO1xuICAgICAgICAgICAgeFN0YXJ0MiA9IHUgKyAxO1xuICAgICAgICAgICAgc3VtID0gaW5JbWFnZURhdGFbeVN0YXJ0MSAqIHdpZHRoICsgeFN0YXJ0MV0gKyBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQyXVxuICAgICAgICAgICAgKyBpbkltYWdlRGF0YVt2ICogd2lkdGggKyB1XVxuICAgICAgICAgICAgKyBpbkltYWdlRGF0YVt5U3RhcnQyICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDJdO1xuICAgICAgICAgICAgb3V0SW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID0gc3VtID4gMCA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJvZGUoaW5JbWFnZVdyYXBwZXIsIG91dEltYWdlV3JhcHBlcikge1xuICAgIGxldCB2O1xuICAgIGxldCB1O1xuICAgIGNvbnN0IGluSW1hZ2VEYXRhID0gaW5JbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBvdXRJbWFnZURhdGEgPSBvdXRJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBoZWlnaHQgPSBpbkltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgY29uc3Qgd2lkdGggPSBpbkltYWdlV3JhcHBlci5zaXplLng7XG4gICAgbGV0IHN1bTtcbiAgICBsZXQgeVN0YXJ0MTtcbiAgICBsZXQgeVN0YXJ0MjtcbiAgICBsZXQgeFN0YXJ0MTtcbiAgICBsZXQgeFN0YXJ0MjtcblxuICAgIGZvciAodiA9IDE7IHYgPCBoZWlnaHQgLSAxOyB2KyspIHtcbiAgICAgICAgZm9yICh1ID0gMTsgdSA8IHdpZHRoIC0gMTsgdSsrKSB7XG4gICAgICAgICAgICB5U3RhcnQxID0gdiAtIDE7XG4gICAgICAgICAgICB5U3RhcnQyID0gdiArIDE7XG4gICAgICAgICAgICB4U3RhcnQxID0gdSAtIDE7XG4gICAgICAgICAgICB4U3RhcnQyID0gdSArIDE7XG4gICAgICAgICAgICBzdW0gPSBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDEgKiB3aWR0aCArIHhTdGFydDJdXG4gICAgICAgICAgICArIGluSW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdXG4gICAgICAgICAgICArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDFdICsgaW5JbWFnZURhdGFbeVN0YXJ0MiAqIHdpZHRoICsgeFN0YXJ0Ml07XG4gICAgICAgICAgICBvdXRJbWFnZURhdGFbdiAqIHdpZHRoICsgdV0gPSBzdW0gPT09IDUgPyAxIDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KGFJbWFnZVdyYXBwZXIsIGJJbWFnZVdyYXBwZXIsIHJlc3VsdEltYWdlV3JhcHBlcikge1xuICAgIGlmICghcmVzdWx0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICByZXN1bHRJbWFnZVdyYXBwZXIgPSBhSW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBsZXQgeyBsZW5ndGggfSA9IGFJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBhSW1hZ2VEYXRhID0gYUltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGJJbWFnZURhdGEgPSBiSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgY0ltYWdlRGF0YSA9IHJlc3VsdEltYWdlV3JhcHBlci5kYXRhO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGNJbWFnZURhdGFbbGVuZ3RoXSA9IGFJbWFnZURhdGFbbGVuZ3RoXSAtIGJJbWFnZURhdGFbbGVuZ3RoXTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaXR3aXNlT3IoYUltYWdlV3JhcHBlciwgYkltYWdlV3JhcHBlciwgcmVzdWx0SW1hZ2VXcmFwcGVyKSB7XG4gICAgaWYgKCFyZXN1bHRJbWFnZVdyYXBwZXIpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJlc3VsdEltYWdlV3JhcHBlciA9IGFJbWFnZVdyYXBwZXI7XG4gICAgfVxuICAgIGxldCB7IGxlbmd0aCB9ID0gYUltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGFJbWFnZURhdGEgPSBhSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgYkltYWdlRGF0YSA9IGJJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBjSW1hZ2VEYXRhID0gcmVzdWx0SW1hZ2VXcmFwcGVyLmRhdGE7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgY0ltYWdlRGF0YVtsZW5ndGhdID0gYUltYWdlRGF0YVtsZW5ndGhdIHx8IGJJbWFnZURhdGFbbGVuZ3RoXTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE5vblplcm8oaW1hZ2VXcmFwcGVyKSB7XG4gICAgbGV0IHsgbGVuZ3RoIH0gPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGltYWdlV3JhcHBlcjtcbiAgICBsZXQgc3VtID0gMDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBzdW0gKz0gZGF0YVtsZW5ndGhdO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9wR2VuZXJpYyhsaXN0LCB0b3AsIHNjb3JlRnVuYykge1xuICAgIGxldCBpOyBsZXQgbWluSWR4ID0gMDsgbGV0IG1pbiA9IDA7IGNvbnN0IHF1ZXVlID0gW107IGxldCBzY29yZTsgbGV0IGhpdDsgbGV0XG4gICAgICAgIHBvcztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0b3A7IGkrKykge1xuICAgICAgICBxdWV1ZVtpXSA9IHtcbiAgICAgICAgICAgIHNjb3JlOiAwLFxuICAgICAgICAgICAgaXRlbTogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBzY29yZSA9IHNjb3JlRnVuYy5hcHBseSh0aGlzLCBbbGlzdFtpXV0pO1xuICAgICAgICBpZiAoc2NvcmUgPiBtaW4pIHtcbiAgICAgICAgICAgIGhpdCA9IHF1ZXVlW21pbklkeF07XG4gICAgICAgICAgICBoaXQuc2NvcmUgPSBzY29yZTtcbiAgICAgICAgICAgIGhpdC5pdGVtID0gbGlzdFtpXTtcbiAgICAgICAgICAgIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IHRvcDsgcG9zKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocXVldWVbcG9zXS5zY29yZSA8IG1pbikge1xuICAgICAgICAgICAgICAgICAgICBtaW4gPSBxdWV1ZVtwb3NdLnNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBtaW5JZHggPSBwb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JheUFycmF5RnJvbUltYWdlKGh0bWxJbWFnZSwgb2Zmc2V0WCwgY3R4LCBhcnJheSkge1xuICAgIGN0eC5kcmF3SW1hZ2UoaHRtbEltYWdlLCBvZmZzZXRYLCAwLCBodG1sSW1hZ2Uud2lkdGgsIGh0bWxJbWFnZS5oZWlnaHQpO1xuICAgIGNvbnN0IGN0eERhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldFgsIDAsIGh0bWxJbWFnZS53aWR0aCwgaHRtbEltYWdlLmhlaWdodCkuZGF0YTtcbiAgICBjb21wdXRlR3JheShjdHhEYXRhLCBhcnJheSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5QXJyYXlGcm9tQ29udGV4dChjdHgsIHNpemUsIG9mZnNldCwgYXJyYXkpIHtcbiAgICBjb25zdCBjdHhEYXRhID0gY3R4LmdldEltYWdlRGF0YShvZmZzZXQueCwgb2Zmc2V0LnksIHNpemUueCwgc2l6ZS55KS5kYXRhO1xuICAgIGNvbXB1dGVHcmF5KGN0eERhdGEsIGFycmF5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXlBbmRIYWxmU2FtcGxlRnJvbUNhbnZhc0RhdGEoY2FudmFzRGF0YSwgc2l6ZSwgb3V0QXJyYXkpIHtcbiAgICBsZXQgdG9wUm93SWR4ID0gMDtcbiAgICBsZXQgYm90dG9tUm93SWR4ID0gc2l6ZS54O1xuICAgIGNvbnN0IGVuZElkeCA9IE1hdGguZmxvb3IoY2FudmFzRGF0YS5sZW5ndGggLyA0KTtcbiAgICBjb25zdCBvdXRXaWR0aCA9IHNpemUueCAvIDI7XG4gICAgbGV0IG91dEltZ0lkeCA9IDA7XG4gICAgY29uc3QgaW5XaWR0aCA9IHNpemUueDtcbiAgICBsZXQgaTtcblxuICAgIHdoaWxlIChib3R0b21Sb3dJZHggPCBlbmRJZHgpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dFdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgb3V0QXJyYXlbb3V0SW1nSWR4XSA9IChcbiAgICAgICAgICAgICAgICAoMC4yOTkgKiBjYW52YXNEYXRhW3RvcFJvd0lkeCAqIDQgKyAwXVxuICAgICAgICAgICAgICAgICArIDAuNTg3ICogY2FudmFzRGF0YVt0b3BSb3dJZHggKiA0ICsgMV1cbiAgICAgICAgICAgICAgICAgKyAwLjExNCAqIGNhbnZhc0RhdGFbdG9wUm93SWR4ICogNCArIDJdKVxuICAgICAgICAgICAgICAgICsgKDAuMjk5ICogY2FudmFzRGF0YVsodG9wUm93SWR4ICsgMSkgKiA0ICsgMF1cbiAgICAgICAgICAgICAgICAgKyAwLjU4NyAqIGNhbnZhc0RhdGFbKHRvcFJvd0lkeCArIDEpICogNCArIDFdXG4gICAgICAgICAgICAgICAgICsgMC4xMTQgKiBjYW52YXNEYXRhWyh0b3BSb3dJZHggKyAxKSAqIDQgKyAyXSlcbiAgICAgICAgICAgICAgICArICgwLjI5OSAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMF1cbiAgICAgICAgICAgICAgICAgKyAwLjU4NyAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMV1cbiAgICAgICAgICAgICAgICAgKyAwLjExNCAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCkgKiA0ICsgMl0pXG4gICAgICAgICAgICAgICAgKyAoMC4yOTkgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHggKyAxKSAqIDQgKyAwXVxuICAgICAgICAgICAgICAgICArIDAuNTg3ICogY2FudmFzRGF0YVsoYm90dG9tUm93SWR4ICsgMSkgKiA0ICsgMV1cbiAgICAgICAgICAgICAgICAgKyAwLjExNCAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCArIDEpICogNCArIDJdKSkgLyA0O1xuICAgICAgICAgICAgb3V0SW1nSWR4Kys7XG4gICAgICAgICAgICB0b3BSb3dJZHggKz0gMjtcbiAgICAgICAgICAgIGJvdHRvbVJvd0lkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIHRvcFJvd0lkeCArPSBpbldpZHRoO1xuICAgICAgICBib3R0b21Sb3dJZHggKz0gaW5XaWR0aDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlR3JheShpbWFnZURhdGEsIG91dEFycmF5LCBjb25maWcpIHtcbiAgICBjb25zdCBsID0gKGltYWdlRGF0YS5sZW5ndGggLyA0KSB8IDA7XG4gICAgY29uc3Qgc2luZ2xlQ2hhbm5lbCA9IGNvbmZpZyAmJiBjb25maWcuc2luZ2xlQ2hhbm5lbCA9PT0gdHJ1ZTtcblxuICAgIGlmIChzaW5nbGVDaGFubmVsKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhbHBoYSA9IGltYWdlRGF0YVtpICogNCArIDNdO1xuICAgICAgICAgICAgaWYgKGFscGhhID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgb3V0QXJyYXlbaV0gPSAyNTU7IC8vIFRyZWF0IHRyYW5zcGFyZW50IHBpeGVscyBhcyB3aGl0ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBvdXRBcnJheVtpXSA9IGltYWdlRGF0YVtpICogNCArIDBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGFscGhhID0gaW1hZ2VEYXRhW2kgKiA0ICsgM107XG4gICAgICAgICAgICBpZiAoYWxwaGEgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBvdXRBcnJheVtpXSA9IDI1NTsgLy8gVHJlYXQgdHJhbnNwYXJlbnQgcGl4ZWxzIGFzIHdoaXRlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIG91dEFycmF5W2ldID0gMC4yOTkgKiBpbWFnZURhdGFbaSAqIDQgKyAwXSArIDAuNTg3ICogaW1hZ2VEYXRhW2kgKiA0ICsgMV0gKyAwLjExNCAqIGltYWdlRGF0YVtpICogNCArIDJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEltYWdlQXJyYXkoc3JjLCBjYWxsYmFjaywgY2FudmFzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykpIHtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgY29uc29sZS53YXJuKCcqIGxvYWRJbWFnZUFycmF5IGdldENvbnRleHQgMmQnKTtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcywgMCwgMCk7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLCAwLCAwKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgY29tcHV0ZUdyYXkoZGF0YSwgYXJyYXkpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrKGFycmF5LCB7XG4gICAgICAgICAgICB4OiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgeTogdGhpcy5oZWlnaHQsXG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH07XG4gICAgaW1nLnNyYyA9IHNyYztcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW5JbWcge0ltYWdlV3JhcHBlcn0gaW5wdXQgaW1hZ2UgdG8gYmUgc2FtcGxlZFxuICogQHBhcmFtIG91dEltZyB7SW1hZ2VXcmFwcGVyfSB0byBiZSBzdG9yZWQgaW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbGZTYW1wbGUoaW5JbWdXcmFwcGVyLCBvdXRJbWdXcmFwcGVyKSB7XG4gICAgY29uc3QgaW5JbWcgPSBpbkltZ1dyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBpbldpZHRoID0gaW5JbWdXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBvdXRJbWcgPSBvdXRJbWdXcmFwcGVyLmRhdGE7XG4gICAgbGV0IHRvcFJvd0lkeCA9IDA7XG4gICAgbGV0IGJvdHRvbVJvd0lkeCA9IGluV2lkdGg7XG4gICAgY29uc3QgZW5kSWR4ID0gaW5JbWcubGVuZ3RoO1xuICAgIGNvbnN0IG91dFdpZHRoID0gaW5XaWR0aCAvIDI7XG4gICAgbGV0IG91dEltZ0lkeCA9IDA7XG4gICAgd2hpbGUgKGJvdHRvbVJvd0lkeCA8IGVuZElkeCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIG91dEltZ1tvdXRJbWdJZHhdID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAoaW5JbWdbdG9wUm93SWR4XSArIGluSW1nW3RvcFJvd0lkeCArIDFdICsgaW5JbWdbYm90dG9tUm93SWR4XSArIGluSW1nW2JvdHRvbVJvd0lkeCArIDFdKSAvIDQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb3V0SW1nSWR4Kys7XG4gICAgICAgICAgICB0b3BSb3dJZHggKz0gMjtcbiAgICAgICAgICAgIGJvdHRvbVJvd0lkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIHRvcFJvd0lkeCArPSBpbldpZHRoO1xuICAgICAgICBib3R0b21Sb3dJZHggKz0gaW5XaWR0aDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc3YycmdiKGhzdiwgcmdiID0gWzAsIDAsIDBdKSB7XG4gICAgY29uc3QgaCA9IGhzdlswXTtcbiAgICBjb25zdCBzID0gaHN2WzFdO1xuICAgIGNvbnN0IHYgPSBoc3ZbMl07XG4gICAgY29uc3QgYyA9IHYgKiBzO1xuICAgIGNvbnN0IHggPSBjICogKDEgLSBNYXRoLmFicygoaCAvIDYwKSAlIDIgLSAxKSk7XG4gICAgY29uc3QgbSA9IHYgLSBjO1xuICAgIGxldCByID0gMDtcbiAgICBsZXQgZyA9IDA7XG4gICAgbGV0IGIgPSAwO1xuXG4gICAgaWYgKGggPCA2MCkge1xuICAgICAgICByID0gYztcbiAgICAgICAgZyA9IHg7XG4gICAgfSBlbHNlIGlmIChoIDwgMTIwKSB7XG4gICAgICAgIHIgPSB4O1xuICAgICAgICBnID0gYztcbiAgICB9IGVsc2UgaWYgKGggPCAxODApIHtcbiAgICAgICAgZyA9IGM7XG4gICAgICAgIGIgPSB4O1xuICAgIH0gZWxzZSBpZiAoaCA8IDI0MCkge1xuICAgICAgICBnID0geDtcbiAgICAgICAgYiA9IGM7XG4gICAgfSBlbHNlIGlmIChoIDwgMzAwKSB7XG4gICAgICAgIHIgPSB4O1xuICAgICAgICBiID0gYztcbiAgICB9IGVsc2UgaWYgKGggPCAzNjApIHtcbiAgICAgICAgciA9IGM7XG4gICAgICAgIGIgPSB4O1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICByZ2JbMF0gPSAoKHIgKyBtKSAqIDI1NSkgfCAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHJnYlsxXSA9ICgoZyArIG0pICogMjU1KSB8IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgcmdiWzJdID0gKChiICsgbSkgKiAyNTUpIHwgMDtcbiAgICByZXR1cm4gcmdiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NvbXB1dGVEaXZpc29ycyhuKSB7XG4gICAgLy8gSGFuZGxlIGVkZ2UgY2FzZXNcbiAgICAvLyBOYU46IE5vdCBhIG51bWJlciAtIG5vIG1lYW5pbmdmdWwgZGl2aXNvcnNcbiAgICAvLyBJbmZpbml0eTogSW5maW5pdGUgdmFsdWVzIGhhdmUgbm8gZmluaXRlIGRpdmlzb3JzXG4gICAgLy8gTm9uLXBvc2l0aXZlOiBEaXZpc29ycyBhcmUgdHlwaWNhbGx5IGRlZmluZWQgZm9yIHBvc2l0aXZlIGludGVnZXJzIG9ubHlcbiAgICAvLyBXaGlsZSBuZWdhdGl2ZSBudW1iZXJzIHRlY2huaWNhbGx5IGhhdmUgZGl2aXNvcnMsIHJldHVybmluZyB0aGVtIHdvdWxkIGNvbXBsaWNhdGVcbiAgICAvLyB0aGUgQVBJICh3b3VsZCBuZWVkIHRvIHJldHVybiBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBkaXZpc29ycywgb3IgbWFrZSBhc3N1bXB0aW9ucylcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShuKSB8fCBuIDwgMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgbGFyZ2VEaXZpc29ycyA9IFtdO1xuICAgIGNvbnN0IGRpdmlzb3JzID0gW107XG4gICAgY29uc3Qgc3FydE4gPSBNYXRoLnNxcnQobik7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBzcXJ0TjsgaSsrKSB7XG4gICAgICAgIGlmIChuICUgaSA9PT0gMCkge1xuICAgICAgICAgICAgZGl2aXNvcnMucHVzaChpKTtcbiAgICAgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBjb21wbGVtZW50YXJ5IGRpdmlzb3IgaWYgaXQncyBkaWZmZXJlbnQgKG5vdCBhIHBlcmZlY3Qgc3F1YXJlIHJvb3QpXG4gICAgICAgICAgICBpZiAoaSAhPT0gbiAvIGkpIHtcbiAgICAgICAgICAgICAgICBsYXJnZURpdmlzb3JzLnVuc2hpZnQoTWF0aC5mbG9vcihuIC8gaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXZpc29ycy5jb25jYXQobGFyZ2VEaXZpc29ycyk7XG59XG5cbmZ1bmN0aW9uIF9jb21wdXRlSW50ZXJzZWN0aW9uKGFycjEsIGFycjIpIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGogPSAwO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKGkgPCBhcnIxLmxlbmd0aCAmJiBqIDwgYXJyMi5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGFycjFbaV0gPT09IGFycjJbal0pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycjFbaV0pO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaisrO1xuICAgICAgICB9IGVsc2UgaWYgKGFycjFbaV0gPiBhcnIyW2pdKSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVBhdGNoU2l6ZShwYXRjaFNpemUsIGltZ1NpemUpIHtcbiAgICBjb25zdCBkaXZpc29yc1ggPSBfY29tcHV0ZURpdmlzb3JzKGltZ1NpemUueCk7XG4gICAgY29uc3QgZGl2aXNvcnNZID0gX2NvbXB1dGVEaXZpc29ycyhpbWdTaXplLnkpO1xuICAgIGNvbnN0IHdpZGVTaWRlID0gTWF0aC5tYXgoaW1nU2l6ZS54LCBpbWdTaXplLnkpO1xuICAgIGNvbnN0IGNvbW1vbiA9IF9jb21wdXRlSW50ZXJzZWN0aW9uKGRpdmlzb3JzWCwgZGl2aXNvcnNZKTtcbiAgICBjb25zdCBuck9mUGF0Y2hlc0xpc3QgPSBbOCwgMTAsIDE1LCAyMCwgMzIsIDYwLCA4MF07XG4gICAgY29uc3QgbnJPZlBhdGNoZXNNYXAgPSB7XG4gICAgICAgICd4LXNtYWxsJzogNSxcbiAgICAgICAgc21hbGw6IDQsXG4gICAgICAgIG1lZGl1bTogMyxcbiAgICAgICAgbGFyZ2U6IDIsXG4gICAgICAgICd4LWxhcmdlJzogMSxcbiAgICB9O1xuICAgIGNvbnN0IG5yT2ZQYXRjaGVzSWR4ID0gbnJPZlBhdGNoZXNNYXBbcGF0Y2hTaXplXSB8fCBuck9mUGF0Y2hlc01hcC5tZWRpdW07XG4gICAgY29uc3QgbnJPZlBhdGNoZXMgPSBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJZHhdO1xuICAgIGNvbnN0IGRlc2lyZWRQYXRjaFNpemUgPSBNYXRoLmZsb29yKHdpZGVTaWRlIC8gbnJPZlBhdGNoZXMpO1xuICAgIGxldCBvcHRpbWFsUGF0Y2hTaXplO1xuXG4gICAgZnVuY3Rpb24gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKGRpdmlzb3JzKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGZvdW5kID0gZGl2aXNvcnNbTWF0aC5mbG9vcihkaXZpc29ycy5sZW5ndGggLyAyKV07XG5cbiAgICAgICAgd2hpbGUgKGkgPCAoZGl2aXNvcnMubGVuZ3RoIC0gMSkgJiYgZGl2aXNvcnNbaV0gPCBkZXNpcmVkUGF0Y2hTaXplKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZGl2aXNvcnNbaV0gLSBkZXNpcmVkUGF0Y2hTaXplKSA+IE1hdGguYWJzKGRpdmlzb3JzW2kgLSAxXSAtIGRlc2lyZWRQYXRjaFNpemUpKSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBkaXZpc29yc1tpIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZGl2aXNvcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2lyZWRQYXRjaFNpemUgLyBmb3VuZCA8IG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeCArIDFdIC8gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4XVxuICAgICAgICAgICAgJiYgZGVzaXJlZFBhdGNoU2l6ZSAvIGZvdW5kID4gbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4IC0gMV0gLyBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJZHhdKSB7XG4gICAgICAgICAgICByZXR1cm4geyB4OiBmb3VuZCwgeTogZm91bmQgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBvcHRpbWFsUGF0Y2hTaXplID0gZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzKGNvbW1vbik7XG4gICAgaWYgKCFvcHRpbWFsUGF0Y2hTaXplKSB7XG4gICAgICAgIG9wdGltYWxQYXRjaFNpemUgPSBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoX2NvbXB1dGVEaXZpc29ycyh3aWRlU2lkZSkpO1xuICAgICAgICBpZiAoIW9wdGltYWxQYXRjaFNpemUpIHtcbiAgICAgICAgICAgIG9wdGltYWxQYXRjaFNpemUgPSBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoKF9jb21wdXRlRGl2aXNvcnMoZGVzaXJlZFBhdGNoU2l6ZSAqIG5yT2ZQYXRjaGVzKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrOiBpZiBubyBvcHRpbWFsIHBhdGNoIHNpemUgZm91bmQsIHVzZSBpbWFnZSBzaXplIChvciAxeDEgbWluaW11bSlcbiAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGEgdmFsaWQge3gsIHl9IG9iamVjdFxuICAgIGlmICghb3B0aW1hbFBhdGNoU2l6ZSkge1xuICAgICAgICBvcHRpbWFsUGF0Y2hTaXplID0ge1xuICAgICAgICAgICAgeDogTWF0aC5tYXgoMSwgaW1nU2l6ZS54KSxcbiAgICAgICAgICAgIHk6IE1hdGgubWF4KDEsIGltZ1NpemUueSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBvcHRpbWFsUGF0Y2hTaXplO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzKHZhbHVlKSB7XG4gICAgY29uc3QgZGltZW5zaW9uID0ge1xuICAgICAgICB2YWx1ZTogcGFyc2VGbG9hdCh2YWx1ZSksXG4gICAgICAgIHVuaXQ6IHZhbHVlLmluZGV4T2YoJyUnKSA9PT0gdmFsdWUubGVuZ3RoIC0gMSA/ICclJyA6ICclJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRpbWVuc2lvbjtcbn1cblxuZXhwb3J0IGNvbnN0IF9kaW1lbnNpb25zQ29udmVydGVycyA9IHtcbiAgICB0b3AoZGltZW5zaW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBkaW1lbnNpb24udW5pdCA9PT0gJyUnID8gTWF0aC5mbG9vcihjb250ZXh0LmhlaWdodCAqIChkaW1lbnNpb24udmFsdWUgLyAxMDApKSA6IG51bGw7XG4gICAgfSxcbiAgICByaWdodChkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGRpbWVuc2lvbi51bml0ID09PSAnJScgPyBNYXRoLmZsb29yKGNvbnRleHQud2lkdGggLSAoY29udGV4dC53aWR0aCAqIChkaW1lbnNpb24udmFsdWUgLyAxMDApKSkgOiBudWxsO1xuICAgIH0sXG4gICAgYm90dG9tKGRpbWVuc2lvbiwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/IE1hdGguZmxvb3IoY29udGV4dC5oZWlnaHQgLSAoY29udGV4dC5oZWlnaHQgKiAoZGltZW5zaW9uLnZhbHVlIC8gMTAwKSkpIDogbnVsbDtcbiAgICB9LFxuICAgIGxlZnQoZGltZW5zaW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBkaW1lbnNpb24udW5pdCA9PT0gJyUnID8gTWF0aC5mbG9vcihjb250ZXh0LndpZHRoICogKGRpbWVuc2lvbi52YWx1ZSAvIDEwMCkpIDogbnVsbDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVJbWFnZUFyZWEoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQsIGFyZWEpIHtcbiAgICBjb25zdCBjb250ZXh0ID0geyB3aWR0aDogaW5wdXRXaWR0aCwgaGVpZ2h0OiBpbnB1dEhlaWdodCB9O1xuXG4gICAgY29uc3QgcGFyc2VkQXJlYSA9IE9iamVjdC5rZXlzKGFyZWEpLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgLy8gU2tpcCBzdHlsaW5nIHByb3BlcnRpZXMgdGhhdCBhcmVuJ3QgZGltZW5zaW9uIGNvbnZlcnRlcnNcbiAgICAgICAgaWYgKCFfZGltZW5zaW9uc0NvbnZlcnRlcnNba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZWFba2V5XTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzKHZhbHVlKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZCA9IF9kaW1lbnNpb25zQ29udmVydGVyc1trZXldKHBhcnNlZCwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJlc3VsdFtrZXldID0gY2FsY3VsYXRlZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzeDogcGFyc2VkQXJlYS5sZWZ0LFxuICAgICAgICBzeTogcGFyc2VkQXJlYS50b3AsXG4gICAgICAgIHN3OiBwYXJzZWRBcmVhLnJpZ2h0IC0gcGFyc2VkQXJlYS5sZWZ0LFxuICAgICAgICBzaDogcGFyc2VkQXJlYS5ib3R0b20gLSBwYXJzZWRBcmVhLnRvcCxcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgdmVjMiB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge1xuICAgIFhZU2l6ZSxcbiAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gICAgVHlwZWRBcnJheSxcbiAgICBXcmFwcGVySW5kZXhNYXBwaW5nLFxuICAgIE1vbWVudCxcbiAgICBTcGFyc2VJbWFnZVdyYXBwZXIsXG59IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4vYXJyYXlfaGVscGVyJztcbmltcG9ydCB7IGhzdjJyZ2IgfSBmcm9tICcuL2N2X3V0aWxzJztcblxudHlwZSBQb3NpdGl2ZU51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGFzc2VydE51bWJlclBvc2l0aXZlKHZhbDogbnVtYmVyKTogYXNzZXJ0cyB2YWwgaXMgUG9zaXRpdmVOdW1iZXIge1xuICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgcG9zaXRpdmUgbnVtYmVyLCByZWNlaXZlZCAke3ZhbH1gKTtcbiAgICB9XG59XG5cbmNsYXNzIEltYWdlV3JhcHBlciBpbXBsZW1lbnRzIFNwYXJzZUltYWdlV3JhcHBlciB7XG4gICAgZGF0YTogVHlwZWRBcnJheSB8IEFycmF5PG51bWJlcj47XG5cbiAgICBzaXplOiBYWVNpemU7XG5cbiAgICBpbmRleE1hcHBpbmc/OiBXcmFwcGVySW5kZXhNYXBwaW5nO1xuXG4gICAgLy8gUmVwcmVzZW50cyBhIGJhc2ljIGltYWdlIGNvbWJpbmluZyB0aGUgZGF0YSBhbmQgc2l6ZS4gSW4gYWRkaXRpb24sIHNvbWUgbWV0aG9kcyBmb3JcbiAgICAvLyBtYW5pcHVsYXRpb24gYXJlIGNvbnRhaW5lZCB3aXRoaW4uXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNpemU6IFhZU2l6ZSxcbiAgICAgICAgZGF0YT86IFR5cGVkQXJyYXkgfCBBcnJheTxudW1iZXI+LFxuICAgICAgICBBcnJheVR5cGU6IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3IgPSBVaW50OEFycmF5LFxuICAgICAgICBpbml0aWFsaXplPzogYm9vbGVhbixcbiAgICApIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgKEFycmF5VHlwZSkoc2l6ZS54ICogc2l6ZS55KTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgQXJyYXlIZWxwZXIuaW5pdCh0aGlzLmRhdGEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8vIHRlc3RzIGlmIGEgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBpbWFnZSwgZXh0ZW5kZWQgb3V0IGJ5IGEgYm9yZGVyIG9uIGVhY2ggc2lkZVxuICAgIGluSW1hZ2VXaXRoQm9yZGVyKGltZ1JlZjogWFlTaXplLCBib3JkZXI6IFBvc2l0aXZlTnVtYmVyID0gMCk6IGJvb2xlYW4ge1xuICAgICAgICBhc3NlcnROdW1iZXJQb3NpdGl2ZShib3JkZXIpO1xuICAgICAgICByZXR1cm4gKGltZ1JlZi54ID49IDApXG4gICAgICAgICAgICAmJiAoaW1nUmVmLnkgPj0gMClcbiAgICAgICAgICAgICYmIChpbWdSZWYueCA8ICh0aGlzLnNpemUueCArIChib3JkZXIgKiAyKSkpXG4gICAgICAgICAgICAmJiAoaW1nUmVmLnkgPCAodGhpcy5zaXplLnkgKyAoYm9yZGVyICogMikpKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IGZyb20gVEhJUyBJbWFnZVdyYXBwZXIgdG8gdGhlIG5ldyBpbWFnZVdyYXBwZXIgcGFyYW1ldGVyLCBzdGFydGluZyBhdCBmcm9tLCBzdG9wcGluZyBhdFxuICAgIC8vIGVuZCBvZiBuZXcgaW1hZ2VXcmFwcGVyIHNpemUuXG4gICAgc3ViSW1hZ2VBc0NvcHkoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIGZyb206IFhZU2l6ZSk6IEltYWdlV3JhcHBlciB7XG4gICAgICAgIGFzc2VydE51bWJlclBvc2l0aXZlKGZyb20ueCk7XG4gICAgICAgIGFzc2VydE51bWJlclBvc2l0aXZlKGZyb20ueSk7XG4gICAgICAgIGNvbnN0IHsgeDogc2l6ZVgsIHk6IHNpemVZIH0gPSBpbWFnZVdyYXBwZXIuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzaXplWDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHNpemVZOyB5KyspIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbWFnZVdyYXBwZXIuZGF0YVt5ICogc2l6ZVggKyB4XSA9IHRoaXMuZGF0YVsoZnJvbS55ICsgeSkgKiB0aGlzLnNpemUueCArIGZyb20ueCArIHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZVdyYXBwZXI7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgZnVuY3Rpb24gcmVhbGx5IHByb2JhYmx5IHNob3VsZCBjYWxsIGludG8gSW1hZ2VXcmFwcGVyIHNvbWV3aGVyZSB0byBtYWtlXG4gICAgICAgIC8vIHN1cmUgdGhhdCBhbGwgb2YgaXQncyBwYXJhbWV0ZXJzIGFyZSBzZXQgcHJvcGVybHksIHNvbWV0aGluZyBsaWtlXG4gICAgICAgIC8vIEltYWdlV3JhcHBlci5VcGRhdGVGcm9tKClcbiAgICAgICAgLy8gdGhhdCBtaWdodCB0YWtlIGEgcHJvdmlkZWQgZGF0YSBhbmQgc2l6ZSwgYW5kIG1ha2Ugc3VyZSB0aGVyZSdzIG5vIGludmFsaWQgaW5kZXhNYXBwaW5nXG4gICAgICAgIC8vIGhhbmdpbmcgYXJvdW5kLCBhbmQgc3VjaC5cbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhIGdyYXlzY2FsZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGltYWdlXG4gICAgZ2V0KHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt5ICogdGhpcy5zaXplLnggKyB4XTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhIGdyYXlzY2FsZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGltYWdlIChzYWZlLCB3aGF0ZXZlciB0aGF0XG4gICAgLy8gbWVhbnMpXG4gICAgZ2V0U2FmZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIC8vIGNhY2hlIGluZGV4TWFwcGluZyBiZWNhdXNlIGlmIHdlJ3JlIHVzaW5nIGl0IG9uY2UsIHdlJ2xsIHByb2JhYmx5IG5lZWQgaXQgYSBidW5jaCBtb3JlXG4gICAgICAgIC8vIHRvb1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXhNYXBwaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZyA9IHtcbiAgICAgICAgICAgICAgICB4OiBbXSxcbiAgICAgICAgICAgICAgICB5OiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2l6ZS54OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZy54W2ldID0gaTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZy54W2kgKyB0aGlzLnNpemUueF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemUueTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueVtpXSA9IGk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueVtpICsgdGhpcy5zaXplLnldID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhWyh0aGlzLmluZGV4TWFwcGluZy55W3kgKyB0aGlzLnNpemUueV0pICogdGhpcy5zaXplLnggKyB0aGlzLmluZGV4TWFwcGluZy54W3ggKyB0aGlzLnNpemUueF1dO1xuICAgIH1cblxuICAgIC8vIFNldHMgYSBnaXZlbiBwaXhlbCBwb3NpdGlvbiBpbiB0aGUgaW1hZ2UgdG8gdGhlIGdpdmVuIGdyYXlzY2FsZSB2YWx1ZVxuICAgIHNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IEltYWdlV3JhcHBlciB7XG4gICAgICAgIHRoaXMuZGF0YVt5ICogdGhpcy5zaXplLnggKyB4XSA9IHZhbHVlO1xuICAgICAgICBkZWxldGUgdGhpcy5pbmRleE1hcHBpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIGJvcmRlciBvZiB0aGUgaW1hZ2UgKDEgcGl4ZWwpIHRvIHplcm9cbiAgICB6ZXJvQm9yZGVyKCk6IEltYWdlV3JhcHBlciB7XG4gICAgICAgIGNvbnN0IHsgeDogd2lkdGgsIHk6IGhlaWdodCB9ID0gdGhpcy5zaXplO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tdWx0aS1hc3NpZ25cbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IHRoaXMuZGF0YVsoaGVpZ2h0IC0gMSkgKiB3aWR0aCArIGldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhlaWdodCAtIDE7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuICAgICAgICAgICAgdGhpcy5kYXRhW2kgKiB3aWR0aF0gPSB0aGlzLmRhdGFbaSAqIHdpZHRoICsgKHdpZHRoIC0gMSldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5pbmRleE1hcHBpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHRoaXMgZnVuY3Rpb24gaXMgZW50aXJlbHkgdG9vIGxhcmdlIGZvciBtZSB0byByZWFzb24gb3V0IHJpZ2h0IGF0IHRoaXMgbW9tZW50IHRoYXQgaSdtIGhhbmRsaW5nXG4gICAgLy8gYWxsIHRoZSByZXN0IG9mIGl0LCBzbyB0aGlzIGlzIGEgdmVyYmF0aW0gY29weSBvZiB0aGUgamF2YXNjcmlwdCBzb3VyY2UsIHdpdGggb25seSB0d2Vha3NcbiAgICAvLyBuZWNlc3NhcnkgdG8gZ2V0IGl0IHRvIHJ1biwgbm8gdGhvdWdodCBwdXQgaW50byBpdCB5ZXQuXG4gICAgbW9tZW50cyhsYWJlbENvdW50OiBudW1iZXIpOiBBcnJheTxNb21lbnQ+IHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeDtcbiAgICAgICAgbGV0IHk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuc2l6ZS55O1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2l6ZS54O1xuICAgICAgICBsZXQgdmFsO1xuICAgICAgICBsZXQgeXNxO1xuICAgICAgICBjb25zdCBsYWJlbFN1bTogQXJyYXk8TW9tZW50PiA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGxhYmVsO1xuICAgICAgICBsZXQgbXUxMTtcbiAgICAgICAgbGV0IG11MDI7XG4gICAgICAgIGxldCBtdTIwO1xuICAgICAgICBsZXQgeF87XG4gICAgICAgIGxldCB5XztcbiAgICAgICAgbGV0IHRtcDtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxNb21lbnQ+ID0gW107XG4gICAgICAgIGNvbnN0IHsgUEkgfSA9IE1hdGg7XG4gICAgICAgIGNvbnN0IFBJXzQgPSBQSSAvIDQ7XG5cbiAgICAgICAgaWYgKGxhYmVsQ291bnQgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYWJlbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxhYmVsU3VtW2ldID0ge1xuICAgICAgICAgICAgICAgIG0wMDogMCxcbiAgICAgICAgICAgICAgICBtMDE6IDAsXG4gICAgICAgICAgICAgICAgbTEwOiAwLFxuICAgICAgICAgICAgICAgIG0xMTogMCxcbiAgICAgICAgICAgICAgICBtMDI6IDAsXG4gICAgICAgICAgICAgICAgbTIwOiAwLFxuICAgICAgICAgICAgICAgIHRoZXRhOiAwLFxuICAgICAgICAgICAgICAgIHJhZDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIHlzcSA9IHkgKiB5O1xuICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBkYXRhW3kgKiB3aWR0aCArIHhdO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWxTdW1bdmFsIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0wMCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMDEgKz0geTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTEwICs9IHg7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0xMSArPSB4ICogeTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTAyICs9IHlzcTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTIwICs9IHggKiB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYWJlbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxhYmVsID0gbGFiZWxTdW1baV07XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxhYmVsLm0wMCkgJiYgbGFiZWwubTAwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgeF8gPSBsYWJlbC5tMTAgLyBsYWJlbC5tMDA7XG4gICAgICAgICAgICAgICAgeV8gPSBsYWJlbC5tMDEgLyBsYWJlbC5tMDA7XG4gICAgICAgICAgICAgICAgbXUxMSA9IGxhYmVsLm0xMSAvIGxhYmVsLm0wMCAtIHhfICogeV87XG4gICAgICAgICAgICAgICAgbXUwMiA9IGxhYmVsLm0wMiAvIGxhYmVsLm0wMCAtIHlfICogeV87XG4gICAgICAgICAgICAgICAgbXUyMCA9IGxhYmVsLm0yMCAvIGxhYmVsLm0wMCAtIHhfICogeF87XG4gICAgICAgICAgICAgICAgdG1wID0gKG11MDIgLSBtdTIwKSAvICgyICogbXUxMSk7XG4gICAgICAgICAgICAgICAgdG1wID0gMC41ICogTWF0aC5hdGFuKHRtcCkgKyAobXUxMSA+PSAwID8gUElfNCA6IC1QSV80KSArIFBJO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1taXhlZC1vcGVyYXRvcnNcbiAgICAgICAgICAgICAgICBsYWJlbC50aGV0YSA9ICh0bXAgKiAxODAgLyBQSSArIDkwKSAlIDE4MCAtIDkwO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC50aGV0YSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwudGhldGEgKz0gMTgwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYWJlbC5yYWQgPSB0bXAgPiBQSSA/IHRtcCAtIFBJIDogdG1wO1xuICAgICAgICAgICAgICAgIGxhYmVsLnZlYyA9IHZlYzIuY2xvbmUoW01hdGguY29zKHRtcCksIE1hdGguc2luKHRtcCldKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gYSBVaW50OENsYW1wZWRBcnJheSBjb250YWluaW5nIHRoaXMgZ3JheXNjYWxlIGltYWdlIGNvbnZlcnRlZCB0byBSR0JBIGZvcm1cbiAgICBnZXRBc1JHQkEoc2NhbGUgPSAxLjApOiBVaW50OENsYW1wZWRBcnJheSB7XG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSg0ICogdGhpcy5zaXplLnggKiB0aGlzLnNpemUueSk7XG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zaXplLnk7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNpemUueDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB5ICogdGhpcy5zaXplLnggKyB4O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldCh4LCB5KSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHJldFtwaXhlbCAqIDQgKyAwXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgcmV0W3BpeGVsICogNCArIDFdID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICByZXRbcGl4ZWwgKiA0ICsgMl0gPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIHJldFtwaXhlbCAqIDQgKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgdGhpcyBJbWFnZVdyYXBwZXIgaW4gYSBnaXZlbiBDYW52YXMgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHNjYWxlXG4gICAgc2hvdyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBzY2FsZSA9IDEuMCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLndhcm4oJyogaW1hZ2V3cmFwcGVyIHNob3cgZ2V0Y29udGV4dCAyZCcpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBjYW52YXMgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyYW1lID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRBc1JHQkEoc2NhbGUpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy5zaXplLng7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5zaXplLnk7XG4gICAgICAgIGNvbnN0IG5ld0ZyYW1lID0gbmV3IEltYWdlRGF0YShkYXRhIGFzIFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyPiwgZnJhbWUud2lkdGgsIGZyYW1lLmhlaWdodCk7XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEobmV3RnJhbWUsIDAsIDApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXlzIGEgc3BlY2lmaWVkIFN1YkltYWdlIGFyZWEgaW4gYSBnaXZlbiBjYW52YXMuIFRoaXMgZGlmZmVycyBkcmFzdGljYWxseSBmcm9tXG4gICAgLy8gY3JlYXRpbmcgYSBuZXcgU3ViSW1hZ2UgYW5kIHVzaW5nIGl0J3Mgc2hvdygpIG1ldGhvZC4gV2h5PyBJIGRvbid0IGhhdmUgdGhlIGFuc3dlciB0byB0aGF0XG4gICAgLy8geWV0LiAgSSBzdXNwZWN0IHRoZSBIU1YvUkdCIG9wZXJhdGlvbnMgaW52b2x2ZWQgaGVyZSBhcmUgbWFraW5nIGl0IHNpZ25pZmljYW50bHkgZGlmZmVyZW50LFxuICAgIC8vIGJ1dCB1bnRpbCBJIGNhbiB2aXN1YWxpemUgdGhlc2UgZnVuY3Rpb25zIHNpZGUgYnkgc2lkZSwgSSdtIGp1c3QgZ29pbmcgdG8gY29weSB0aGUgZXhpc3RpbmdcbiAgICAvLyBpbXBsZW1lbnRhdGlvbi5cbiAgICBvdmVybGF5KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGluU2NhbGU6IG51bWJlciwgZnJvbTogWFlTaXplKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkU2NhbGUgPSAoaW5TY2FsZSA8IDAgfHwgaW5TY2FsZSA+IDM2MCkgPyAzNjAgOiBpblNjYWxlO1xuICAgICAgICBjb25zdCBoc3YgPSBbMCwgMSwgMV07XG4gICAgICAgIGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcbiAgICAgICAgY29uc3Qgd2hpdGVSZ2IgPSBbMjU1LCAyNTUsIDI1NV07XG4gICAgICAgIGNvbnN0IGJsYWNrUmdiID0gWzAsIDAsIDBdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnNvbGUud2FybignKiBpbWFnZXdyYXBwZXIgb3ZlcmxheSBnZXRjb250ZXh0IDJkJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IGNhbnZhcyBjb250ZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBjdHguZ2V0SW1hZ2VEYXRhKGZyb20ueCwgZnJvbS55LCB0aGlzLnNpemUueCwgdGhpcy5zaXplLnkpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGZyYW1lO1xuICAgICAgICBsZXQgeyBsZW5ndGggfSA9IHRoaXMuZGF0YTtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBoc3ZbMF0gPSB0aGlzLmRhdGFbbGVuZ3RoXSAqIGFkanVzdGVkU2NhbGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIHJlc3VsdCA9IGhzdlswXSA8PSAwID8gd2hpdGVSZ2IgOiBoc3ZbMF0gPj0gMzYwID8gYmxhY2tSZ2IgOiBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGxlbmd0aCAqIDQ7XG4gICAgICAgICAgICBbZGF0YVtwb3NdLCBkYXRhW3BvcyArIDFdLCBkYXRhW3BvcyArIDJdXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGRhdGFbcG9zICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShmcmFtZSwgZnJvbS54LCBmcm9tLnkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VXcmFwcGVyO1xuIiwiaW1wb3J0IHsgWFlTaXplIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbi8vIFRPRE86IFhZUG9zaXRpb24gc2hvdWxkIGJlIGFuIFhZT2JqZWN0LCBidXQgdGhhdCBicmVha3MgWFlEZWZpbml0aW9uLCB3aGljaCBicmVha3MgZHJhd1BhdGgoKSBiZWxvdy5cbmRlY2xhcmUgaW50ZXJmYWNlIFhZUG9zaXRpb24ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIENhbnZhc1N0eWxlIHtcbiAgICBjb2xvcjogc3RyaW5nO1xuICAgIGxpbmVXaWR0aDogbnVtYmVyO1xufVxuXG4vLyBYWURlZmluaXRpb24gdGVsbHMgdXMgd2hpY2ggY29tcG9uZW50IG9mIGEgZ2l2ZW4gYXJyYXkgb3Igb2JqZWN0IGlzIHRoZSBcIlhcIiBhbmQgd2hpY2ggaXMgdGhlIFwiWVwiLlxuLy8gVXN1YWxseSB0aGlzIGlzIDAgZm9yIFggYW5kIDEgZm9yIFksIGJ1dCBtaWdodCBiZSB1c2VkIGFzICd4JyBmb3IgeCBhbmQgJ3knIGZvciBZLlxuZGVjbGFyZSBpbnRlcmZhY2UgWFlEZWZpbml0aW9uIHtcbiAgICB4OiBrZXlvZiBYWVBvc2l0aW9uO1xuICAgIHk6IGtleW9mIFhZUG9zaXRpb247XG59XG5cbmRlY2xhcmUgdHlwZSBQYXRoID0gQXJyYXk8WFlQb3NpdGlvbj47XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBkcmF3UmVjdChwb3M6IFhZUG9zaXRpb24sIHNpemU6IFhZU2l6ZSwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHN0eWxlOiBDYW52YXNTdHlsZSk6IHZvaWQge1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gc3R5bGUubGluZVdpZHRoIHx8IDE7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LnN0cm9rZVJlY3QocG9zLngsIHBvcy55LCBzaXplLngsIHNpemUueSk7XG4gICAgfSxcbiAgICBkcmF3UGF0aChwYXRoOiBQYXRoLCBkZWY6IFhZRGVmaW5pdGlvbiwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHN0eWxlOiBDYW52YXNTdHlsZSk6IHZvaWQge1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gc3R5bGUubGluZVdpZHRoO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8ocGF0aFswXVtkZWYueF0sIHBhdGhbMF1bZGVmLnldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBwYXRoLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKHBhdGhbal1bZGVmLnhdLCBwYXRoW2pdW2RlZi55XSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfSxcbiAgICBkcmF3SW1hZ2UoaW1hZ2VEYXRhOiBBcnJheTxudW1iZXI+LCBzaXplOiBYWVNpemUsIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNhbnZhc0RhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHNpemUueCwgc2l6ZS55KTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBjYW52YXNEYXRhO1xuICAgICAgICBsZXQgY2FudmFzRGF0YVBvcyA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBsZXQgaW1hZ2VEYXRhUG9zID0gaW1hZ2VEYXRhLmxlbmd0aDtcblxuICAgICAgICBpZiAoY2FudmFzRGF0YVBvcyAvIGltYWdlRGF0YVBvcyAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbWFnZURhdGFQb3MtLSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbWFnZURhdGFbaW1hZ2VEYXRhUG9zXTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IDI1NTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IHZhbHVlO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0RhdGFQb3NdID0gdmFsdWU7XG4gICAgICAgICAgICBkYXRhWy0tY2FudmFzRGF0YVBvc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNhbnZhc0RhdGEsIDAsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWN5Y2xlXG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICdxdWFnZ2EnO1xuaW1wb3J0IHsgUXVhZ2dhSlNSZXN1bHRPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYSc7XG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5cbi8vIGZvciBzb21lIHJlYXNvbiB0aGlzIHRocm93cyBhIHNoYWRvdyBlcnJvciBvbiBpdHNlbGY/IVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuZXhwb3J0IGVudW0gQmFyY29kZURpcmVjdGlvbiB7XG4gICAgRm9yd2FyZCA9IDEsXG4gICAgUmV2ZXJzZSA9IC0xXG59XG5cbmV4cG9ydCB0eXBlIEJhcmNvZGVSZWFkZXJUeXBlID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgQmFyY29kZUZvcm1hdCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlUmVhZGVyQ29uZmlnIHtcbiAgICBub3JtYWxpemVCYXJTcGFjZVdpZHRoPzogYm9vbGVhbixcbiAgICBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXJUeXBlPixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlQ29ycmVjdGlvbiB7XG4gICAgYmFyOiBudW1iZXIsXG4gICAgc3BhY2U6IG51bWJlcixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlUG9zaXRpb24ge1xuICAgIGVuZDogbnVtYmVyLFxuICAgIGVuZENvdW50ZXI/OiBudW1iZXIsXG4gICAgZXJyb3I/OiBudW1iZXIsXG4gICAgc3RhcnQ6IG51bWJlcixcbiAgICBzdGFydENvdW50ZXI/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlSW5mbyBleHRlbmRzIEJhcmNvZGVQb3NpdGlvbiB7XG4gICAgY29kZTogbnVtYmVyLFxuICAgIGNvcnJlY3Rpb24/OiBCYXJjb2RlQ29ycmVjdGlvbixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlIHtcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgY29kZXNldD86IG51bWJlcixcbiAgICBjb3JyZWN0aW9uPzogQmFyY29kZUNvcnJlY3Rpb24sXG4gICAgZGVjb2RlZENvZGVzPzogQXJyYXk8c3RyaW5nIHwgQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24+LFxuICAgIGRpcmVjdGlvbj86IEJhcmNvZGVEaXJlY3Rpb24sXG4gICAgZW5kOiBudW1iZXIsXG4gICAgZW5kSW5mbz86IEJhcmNvZGVQb3NpdGlvbixcbiAgICBmb3JtYXQ6IEJhcmNvZGVGb3JtYXQsXG4gICAgcGF0dGVybj86IHN0cmluZyxcbiAgICBzdGFydDogbnVtYmVyLFxuICAgIHN0YXJ0SW5mbzogQmFyY29kZVBvc2l0aW9uLFxuICAgIHN1cHBsZW1lbnQ/OiBCYXJjb2RlLFxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFyY29kZVJlYWRlciB7XG4gICAgX3JvdzogQXJyYXk8bnVtYmVyPiA9IFtdO1xuXG4gICAgY29uZmlnOiBCYXJjb2RlUmVhZGVyQ29uZmlnID0ge307XG5cbiAgICBzdXBwbGVtZW50czogQXJyYXk8QmFyY29kZVJlYWRlcj4gPSBbXTtcblxuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMDtcblxuICAgIEZPUk1BVDogQmFyY29kZUZvcm1hdCA9ICd1bmtub3duJztcblxuICAgIENPTkZJR19LRVlTOiBCYXJjb2RlUmVhZGVyQ29uZmlnID0ge307XG4gICAgLy8gVE9ETzogc2hvdWxkIGFkZCBBTFBIQUJFVEhfU1RSSU5HLCBBTFBIQUJFVCwgQ0hBUkFDVEVSX0VOQ09ESU5HUyB0byBiYXNlIGNsYXNzLCBpZiB0aGV5XG4gICAgLy8gYXJlIHVzZWZ1bCBpbiBtb3N0IHJlYWRlcnMuXG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyKTogQmFyY29kZSB8IG51bGw7XG5cbiAgICBzdGF0aWMgZ2V0IEV4Y2VwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFN0YXJ0Tm90Rm91bmRFeGNlcHRpb246ICdTdGFydC1JbmZvIHdhcyBub3QgZm91bmQhJyxcbiAgICAgICAgICAgIENvZGVOb3RGb3VuZEV4Y2VwdGlvbjogJ0NvZGUgY291bGQgbm90IGJlIGZvdW5kIScsXG4gICAgICAgICAgICBQYXR0ZXJuTm90Rm91bmRFeGNlcHRpb246ICdQYXR0ZXJuIGNvdWxkIG5vdCBiZSBmb3VuZCEnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlYWRlci1zcGVjaWZpYyBhZGphY2VudC1saW5lIHZhbGlkYXRpb24gdGhyZXNob2xkICgwID0+IGRpc2FibGVkKVxuICAgIHN0YXRpYyBhZGphY2VudExpbmVWYWxpZGF0aW9uTWF0Y2hlcyA9IDA7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgdGhpcy5fcm93ID0gW107XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgICBpZiAoc3VwcGxlbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcGxlbWVudHMgPSBzdXBwbGVtZW50cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbmV4dFVuc2V0KGxpbmU6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgc3RhcnQgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFsaW5lW2ldKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFBhdHRlcm4oY291bnRlcjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBjb2RlOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG1heFNpbmdsZUVycm9yID0gdGhpcy5TSU5HTEVfQ09ERV9FUlJPUiB8fCAxKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGVycm9yID0gMDtcbiAgICAgICAgbGV0IHNpbmdsZUVycm9yID0gMDtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGxldCBtb2R1bG8gPSAwO1xuICAgICAgICBsZXQgYmFyV2lkdGggPSAwO1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgc2NhbGVkID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBjb3VudGVyW2ldO1xuICAgICAgICAgICAgbW9kdWxvICs9IGNvZGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1bSA8IG1vZHVsbykge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cblxuICAgICAgICBiYXJXaWR0aCA9IHN1bSAvIG1vZHVsbztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIG1heFNpbmdsZUVycm9yICo9IGJhcldpZHRoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvdW50ID0gY291bnRlcltpXTtcbiAgICAgICAgICAgIHNjYWxlZCA9IGNvZGVbaV0gKiBiYXJXaWR0aDtcbiAgICAgICAgICAgIHNpbmdsZUVycm9yID0gTWF0aC5hYnMoY291bnQgLSBzY2FsZWQpIC8gc2NhbGVkO1xuICAgICAgICAgICAgaWYgKHNpbmdsZUVycm9yID4gbWF4U2luZ2xlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9yICs9IHNpbmdsZUVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvciAvIG1vZHVsbztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25leHRTZXQobGluZTogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGluZVtpXSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY29ycmVjdEJhcnMoY291bnRlcjogQXJyYXk8bnVtYmVyPiwgY29ycmVjdGlvbjogbnVtYmVyLCBpbmRpY2VzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCB7IGxlbmd0aCB9ID0gaW5kaWNlcztcbiAgICAgICAgbGV0IHRtcCA9IDA7XG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgICAgdG1wID0gY291bnRlcltpbmRpY2VzW2xlbmd0aF1dICogKDEgLSAoKDEgLSBjb3JyZWN0aW9uKSAvIDIpKTtcbiAgICAgICAgICAgIGlmICh0bXAgPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgY291bnRlcltpbmRpY2VzW2xlbmd0aF1dID0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZVBhdHRlcm4ocGF0dGVybjogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF0dGVybicsIHBhdHRlcm4pO1xuICAgICAgICB0aGlzLl9yb3cgPSBwYXR0ZXJuO1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF0dGVybiBjYWxsaW5nIGRlY29kZScsIHR5cGVvZiB0aGlzLCB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLkZPUk1BVCwgSlNPTi5zdHJpbmdpZnkodGhpcykpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5kZWNvZGUoKTtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpcnN0IHJlc3VsdD0nLCByZXN1bHQpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yb3cucmV2ZXJzZSgpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kZWNvZGUoKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXZlcnNlZCByZXN1bHQ9JywgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZURpcmVjdGlvbi5SZXZlcnNlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHRoaXMuX3Jvdy5sZW5ndGggLSByZXN1bHQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVuZCA9IHRoaXMuX3Jvdy5sZW5ndGggLSByZXN1bHQuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmRpcmVjdGlvbiA9IEJhcmNvZGVEaXJlY3Rpb24uRm9yd2FyZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQuZm9ybWF0ID0gdGhpcy5GT1JNQVQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybmluZycsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFJhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBzdGFydCA9IHN0YXJ0IDwgMCA/IDAgOiBzdGFydDtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmlsbENvdW50ZXJzKG9mZnNldDogbnVtYmVyID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3JvdyksIGVuZDogbnVtYmVyID0gdGhpcy5fcm93Lmxlbmd0aCwgaXNXaGl0ZSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgY291bnRlcnM6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudGVycztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3RvQ291bnRlcnMoc3RhcnQ6IG51bWJlciwgY291bnRlcnM6IFVpbnQxNkFycmF5IHwgQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBjb25zdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5fcm93Lmxlbmd0aDtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSAhdGhpcy5fcm93W3N0YXJ0XTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIEFycmF5SGVscGVyLmluaXQoY291bnRlcnMsIDApO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gbnVtQ291bnRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnRlcnM7XG4gICAgfVxuXG4gICAgLy8gb3ZlcnJpZGUvaW1wbGVtZW50IHRoaXMgaW4geW91ciBjdXN0b20gcmVhZGVycy5cbiAgICBwcm90ZWN0ZWQgZGVjb2RlSW1hZ2UoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIpOiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCB8IG51bGwge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICAgICAgICB2b2lkIGltYWdlV3JhcHBlcjtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXJjb2RlUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVQb3NpdGlvbiB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jb25zdCBOID0gMTtcbmNvbnN0IFcgPSAzO1xuY29uc3QgU1RBUlRfUEFUVEVSTiA9IFtXLCBOLCBXLCBOLCBOLCBOXTtcbmNvbnN0IFNUT1BfUEFUVEVSTiA9IFtXLCBOLCBOLCBOLCBXXTtcbmNvbnN0IENPREVfUEFUVEVSTiA9IFtcbiAgICBbTiwgTiwgVywgVywgTl0sXG4gICAgW1csIE4sIE4sIE4sIFddLFxuICAgIFtOLCBXLCBOLCBOLCBXXSxcbiAgICBbVywgVywgTiwgTiwgTl0sXG4gICAgW04sIE4sIFcsIE4sIFddLFxuICAgIFtXLCBOLCBXLCBOLCBOXSxcbiAgICBbTiwgVywgVywgTiwgTl0sXG4gICAgW04sIE4sIE4sIFcsIFddLFxuICAgIFtXLCBOLCBOLCBXLCBOXSxcbiAgICBbTiwgVywgTiwgVywgTl0sXG5dO1xuY29uc3QgU1RBUlRfUEFUVEVSTl9MRU5HVEggPSBTVEFSVF9QQVRURVJOLnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCwgMCk7XG5cbmNsYXNzIFR3b09mRml2ZVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIGJhclNwYWNlUmF0aW8gPSBbMSwgMV07XG5cbiAgICBGT1JNQVQgPSAnMm9mNSc7XG5cbiAgICBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzg7XG5cbiAgICBBVkdfQ09ERV9FUlJPUiA9IDAuMzA7XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRQYXR0ZXJuKHBhdHRlcm46IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgb2Zmc2V0OiBudW1iZXIsIGlzV2hpdGUgPSBmYWxzZSwgdHJ5SGFyZGVyID0gZmFsc2UpOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gW107XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgbGV0IGVycm9yID0gMDtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZHX0NPREVfRVJST1I7XG5cbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY291bnRlcltpXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY291bnRlcltqXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kU3RhcnQoKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGxldCBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgbmFycm93QmFyV2lkdGggPSAxO1xuICAgICAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUQVJUX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gTWF0aC5mbG9vcigoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCkgLyBTVEFSVF9QQVRURVJOX0xFTkdUSCk7XG4gICAgICAgICAgICBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID0gc3RhcnRJbmZvLnN0YXJ0IC0gbmFycm93QmFyV2lkdGggKiA1O1xuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnRJbmZvO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgLy8gVE9ETzogcmV2ZXJzZSwgZm9sbG93ZWQgYnkgc29tZSBjYWxjcywgZm9sbG93ZWQgYnkgYW5vdGhlciByZXZlcnNlPyByZWFsbHk/XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUT1BfUEFUVEVSTiwgb2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHRtcCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgICAgIGVuZEluZm8uc3RhcnQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgICAgIGVuZEluZm8uZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHRtcDtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiAoY291bnRlcnMubGVuZ3RoICUgMTAgPT09IDApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkdfQ09ERV9FUlJPUjtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBDT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yISkge1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdE1hdGNoLmVycm9yISA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8c3RyaW5nPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgY29uc3QgY291bnRlckxlbmd0aCA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY291bnRlciA9IFswLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpXSA9IGNvdW50ZXJzW3Bvc10gKiB0aGlzLmJhclNwYWNlUmF0aW9bMF07XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb3VudGVyKTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYCR7Y29kZS5jb2RlfWApO1xuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kU3RhcnQoKTtcbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRFbmQoKTtcbiAgICAgICAgaWYgKCFlbmRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50ZXJzID0gdGhpcy5fZmlsbENvdW50ZXJzKHN0YXJ0SW5mby5lbmQsIGVuZEluZm8uc3RhcnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKHN0YXJ0SW5mbyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGVuZEluZm8pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogZW5kSW5mby5lbmQsXG4gICAgICAgICAgICBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHdvT2ZGaXZlUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZSwgQmFyY29kZVBvc2l0aW9uIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbi8vIGNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OS0kOi8uK0FCQ0QnO1xuY29uc3QgQUxQSEFCRVQgPSBbNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDQ1LCAzNiwgNTgsIDQ3LCA0NiwgNDMsIDY1LCA2NiwgNjcsIDY4XTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPVxuICAgIFsweDAwMywgMHgwMDYsIDB4MDA5LCAweDA2MCwgMHgwMTIsIDB4MDQyLCAweDAyMSwgMHgwMjQsIDB4MDMwLCAweDA0OCwgMHgwMGMsIDB4MDE4LFxuICAgICAgICAweDA0NSwgMHgwNTEsIDB4MDU0LCAweDAxNSwgMHgwMUEsIDB4MDI5LCAweDAwQiwgMHgwMEVdO1xuY29uc3QgU1RBUlRfRU5EID0gWzB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFXTtcbmNvbnN0IE1JTl9FTkNPREVEX0NIQVJTID0gNDtcbmNvbnN0IE1BWF9BQ0NFUFRBQkxFID0gMi4wO1xuY29uc3QgUEFERElORyA9IDEuNTtcblxuaW50ZXJmYWNlIFRocmVzaG9sZFNpemUge1xuICAgIHNpemU6IG51bWJlcixcbiAgICBjb3VudHM6IG51bWJlcixcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbn07XG5cbmludGVyZmFjZSBUaHJlc2hvbGQge1xuICAgIHNwYWNlOiB7XG4gICAgICAgIG5hcnJvdzogVGhyZXNob2xkU2l6ZSxcbiAgICAgICAgd2lkZTogVGhyZXNob2xkU2l6ZSxcbiAgICB9LFxuICAgIGJhcjoge1xuICAgICAgICBuYXJyb3c6IFRocmVzaG9sZFNpemUsXG4gICAgICAgIHdpZGU6IFRocmVzaG9sZFNpemUsXG4gICAgfSxcbn07XG5cbmNsYXNzIE5ld0NvZGFiYXJSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBfY291bnRlcnM6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICBGT1JNQVQgPSAnY29kYWJhcic7XG5cbiAgICBwcm90ZWN0ZWQgX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZChvZmZzZXQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGVuZDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb3VudGVyID0gdGhpcy5fY291bnRlcnNbaV07XG4gICAgICAgICAgICBpZiAoY291bnRlciA+IG1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IGNvdW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY291bnRlciA8IG1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IGNvdW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKChtaW4gKyBtYXgpIC8gMi4wKSB8IDA7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdG9QYXR0ZXJuKG9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gNztcbiAgICAgICAgY29uc3QgZW5kID0gb2Zmc2V0ICsgbnVtQ291bnRlcnM7XG5cbiAgICAgICAgaWYgKGVuZCA+IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFyVGhyZXNob2xkID0gdGhpcy5fY29tcHV0ZUFsdGVybmF0aW5nVGhyZXNob2xkKG9mZnNldCwgZW5kKTtcbiAgICAgICAgY29uc3Qgc3BhY2VUaHJlc2hvbGQgPSB0aGlzLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0ICsgMSwgZW5kKTtcblxuICAgICAgICBsZXQgYml0bWFzayA9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSk7XG4gICAgICAgIGxldCB0aHJlc2hvbGQgPSAwO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGQgPSAoaSAmIDEpID09PSAwID8gYmFyVGhyZXNob2xkIDogc3BhY2VUaHJlc2hvbGQ7XG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlcnNbb2Zmc2V0ICsgaV0gPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuIHw9IGJpdG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRtYXNrID4+PSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfaXNTdGFydEVuZChwYXR0ZXJuOiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBTVEFSVF9FTkQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChTVEFSVF9FTkRbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfc3VtQ291bnRlcnMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2NvdW50ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKGkpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT09IC0xICYmIHRoaXMuX2lzU3RhcnRFbmQocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBMb29rIGZvciB3aGl0ZXNwYWNlIGFoZWFkXG4gICAgICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5fc3VtQ291bnRlcnMoMCwgaSk7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyB0aGlzLl9zdW1Db3VudGVycyhpLCBpICsgOCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRDb3VudGVyOiBpLFxuICAgICAgICAgICAgICAgICAgICBlbmRDb3VudGVyOiBpICsgOCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGF0dGVyblRvQ2hhcihwYXR0ZXJuOiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSA9PT0gcGF0dGVybikge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKEFMUEhBQkVUW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoKG9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyA3OyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5V2hpdGVzcGFjZShzdGFydENvdW50ZXI6IG51bWJlciwgZW5kQ291bnRlcjogbnVtYmVyKSB7XG4gICAgICAgIGlmICgoc3RhcnRDb3VudGVyIC0gMSA8PSAwKVxuICAgICAgICAgICAgfHwgdGhpcy5fY291bnRlcnNbc3RhcnRDb3VudGVyIC0gMV0gPj0gKHRoaXMuX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgoc3RhcnRDb3VudGVyKSAvIDIuMCkpIHtcbiAgICAgICAgICAgIGlmICgoZW5kQ291bnRlciArIDggPj0gdGhpcy5fY291bnRlcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHx8IHRoaXMuX2NvdW50ZXJzW2VuZENvdW50ZXIgKyA3XSA+PSAodGhpcy5fY2FsY3VsYXRlUGF0dGVybkxlbmd0aChlbmRDb3VudGVyKSAvIDIuMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY2hhclRvUGF0dGVybihjaGFyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBTFBIQUJFVC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKEFMUEhBQkVUW2ldID09PSBjaGFyQ29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJfRU5DT0RJTkdTW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAweDA7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdGhyZXNob2xkUmVzdWx0UGF0dGVybihyZXN1bHQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgc3RhcnRDb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2F0ZWdvcml6YXRpb246IFRocmVzaG9sZCA9IHtcbiAgICAgICAgICAgICAgICBzcGFjZToge1xuICAgICAgICAgICAgICAgICAgICBuYXJyb3c6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgICAgICB3aWRlOiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJhcjoge1xuICAgICAgICAgICAgICAgICAgICBuYXJyb3c6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgICAgICB3aWRlOiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHN0YXJ0Q291bnRlcjtcbiAgICAgICAgbGV0IHBhdHRlcm46IG51bWJlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuX2NoYXJUb1BhdHRlcm4ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSA2OyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbmQgPSAoaiAmIDEpID09PSAyID8gY2F0ZWdvcml6YXRpb24uYmFyIDogY2F0ZWdvcml6YXRpb24uc3BhY2U7XG4gICAgICAgICAgICAgICAgY29uc3QgY2F0ID0gKHBhdHRlcm4gJiAxKSA9PT0gMSA/IGtpbmQud2lkZSA6IGtpbmQubmFycm93O1xuICAgICAgICAgICAgICAgIGNhdC5zaXplICs9IHRoaXMuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgICAgIGNhdC5jb3VudHMrKztcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID4+PSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IDg7XG4gICAgICAgIH1cblxuICAgICAgICAoWydzcGFjZScsICdiYXInXSBhcyBjb25zdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdraW5kID0gY2F0ZWdvcml6YXRpb25ba2V5XTtcbiAgICAgICAgICAgIG5ld2tpbmQud2lkZS5taW4gPVxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKG5ld2tpbmQubmFycm93LnNpemUgLyBuZXdraW5kLm5hcnJvdy5jb3VudHMgKyBuZXdraW5kLndpZGUuc2l6ZSAvIG5ld2tpbmQud2lkZS5jb3VudHMpIC8gMik7XG4gICAgICAgICAgICBuZXdraW5kLm5hcnJvdy5tYXggPSBNYXRoLmNlaWwobmV3a2luZC53aWRlLm1pbik7XG4gICAgICAgICAgICBuZXdraW5kLndpZGUubWF4ID0gTWF0aC5jZWlsKChuZXdraW5kLndpZGUuc2l6ZSAqIE1BWF9BQ0NFUFRBQkxFICsgUEFERElORykgLyBuZXdraW5kLndpZGUuY291bnRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNhdGVnb3JpemF0aW9uO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRlUmVzdWx0KHJlc3VsdDogUmVhZG9ubHlBcnJheTxzdHJpbmc+LCBzdGFydENvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRzID0gdGhpcy5fdGhyZXNob2xkUmVzdWx0UGF0dGVybihyZXN1bHQsIHN0YXJ0Q291bnRlcik7XG4gICAgICAgIGxldCBwb3MgPSBzdGFydENvdW50ZXI7XG4gICAgICAgIGxldCBwYXR0ZXJuOiBudW1iZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLl9jaGFyVG9QYXR0ZXJuKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gNjsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBraW5kID0gKGogJiAxKSA9PT0gMCA/IHRocmVzaG9sZHMuYmFyIDogdGhyZXNob2xkcy5zcGFjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSAocGF0dGVybiAmIDEpID09PSAxID8ga2luZC53aWRlIDoga2luZC5uYXJyb3c7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgICAgIGlmIChzaXplIDwgY2F0Lm1pbiB8fCBzaXplID4gY2F0Lm1heCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlciB8IG51bGwpOiBCYXJjb2RlIHwgbnVsbCB7XG5cbiAgICAgICAgdGhpcy5fY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnMoKTtcbiAgICAgICAgc3RhcnQgPSB0aGlzLl9maW5kU3RhcnQoKTtcbiAgICAgICAgaWYgKCFzdGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHN0YXJ0LnN0YXJ0Q291bnRlciBhcyBudW1iZXI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIGxldCBwYXR0ZXJuOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLl90b1BhdHRlcm4obmV4dFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVjb2RlZENoYXIgPSB0aGlzLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKGRlY29kZWRDaGFyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICBuZXh0U3RhcnQgKz0gODtcbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMSAmJiB0aGlzLl9pc1N0YXJ0RW5kKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG5leHRTdGFydCA8IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gdmVyaWZ5IGVuZFxuICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGggLSAyKSA8IE1JTl9FTkNPREVEX0NIQVJTIHx8ICF0aGlzLl9pc1N0YXJ0RW5kKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZlcmlmeSBlbmQgd2hpdGUgc3BhY2VcbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlXaGl0ZXNwYWNlKHN0YXJ0LnN0YXJ0Q291bnRlciBhcyBudW1iZXIsIG5leHRTdGFydCAtIDgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVSZXN1bHQocmVzdWx0LCBzdGFydC5zdGFydENvdW50ZXIgYXMgbnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0U3RhcnQgPSBuZXh0U3RhcnQgPiB0aGlzLl9jb3VudGVycy5sZW5ndGggPyB0aGlzLl9jb3VudGVycy5sZW5ndGggOiBuZXh0U3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0LnN0YXJ0ICsgdGhpcy5fc3VtQ291bnRlcnMoc3RhcnQuc3RhcnRDb3VudGVyIGFzIG51bWJlciwgbmV4dFN0YXJ0IC0gOCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogZW5kLFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCwgLy8gVE9ETzogaSB0aGluayBpdCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIHRvIHJldHVybiBmb3JtYXQgZnJvbSB0aGlzLCBhcyBiYXJjb2RlX3JlYWRlciBmb3JjZSBzZXRzIHRoZSBmb3JtYXQgYW55d2F5XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV3Q29kYWJhclJlYWRlcjtcbiIsImltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IEJhcmNvZGVDb3JyZWN0aW9uLCBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUsIEJhcmNvZGVJbmZvIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmNsYXNzIENvZGUxMjhSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBDT0RFX1NISUZUID0gOTg7XG4gICAgQ09ERV9DID0gOTk7XG4gICAgQ09ERV9CID0gMTAwO1xuICAgIENPREVfQSA9IDEwMTtcbiAgICBGTkMxID0gMTAyO1xuICAgIFNUQVJUX0NPREVfQSA9IDEwMztcbiAgICBTVEFSVF9DT0RFX0IgPSAxMDQ7XG4gICAgU1RBUlRfQ09ERV9DID0gMTA1O1xuICAgIFNUT1BfQ09ERSA9IDEwNjtcbiAgICAvLyBBU0NJSSAyOSBpcyB0aGUgR3JvdXAgU2VwYXJhdG9yIGNoYXJhY3RlciB1c2VkIHRvIHJlcHJlc2VudCBGTkMxIGluIEdTMS0xMjggYmFyY29kZXNcbiAgICBGTkMxX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDI5KTtcbiAgICBDT0RFX1BBVFRFUk4gPSBbXG4gICAgICAgICAgICBbMiwgMSwgMiwgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMiwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMiwgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMiwgMiwgM10sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMywgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMywgMSwgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMiwgMSwgM10sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMywgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMywgMiwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMiwgMSwgM10sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMywgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMywgMSwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMiwgMywgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMSwgMywgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMiwgMywgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMywgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMywgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMywgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMywgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMSwgMywgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMiwgMywgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMywgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMiwgMywgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMywgMSwgMiwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMywgMSwgMSwgMiwgMiwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMSwgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMywgMSwgMiwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMiwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMywgMiwgMiwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMiwgMSwgMiwgM10sXG4gICAgICAgICAgICBbMiwgMSwgMiwgMywgMiwgMV0sXG4gICAgICAgICAgICBbMiwgMywgMiwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMywgMiwgM10sXG4gICAgICAgICAgICBbMSwgMywgMSwgMSwgMiwgM10sXG4gICAgICAgICAgICBbMSwgMywgMSwgMywgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMywgMSwgM10sXG4gICAgICAgICAgICBbMSwgMywgMiwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMSwgMywgMiwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMywgMSwgM10sXG4gICAgICAgICAgICBbMiwgMywgMSwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMiwgMywgMSwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMSwgMywgM10sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMywgMywgMV0sXG4gICAgICAgICAgICBbMSwgMywgMiwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMywgMSwgMiwgM10sXG4gICAgICAgICAgICBbMSwgMSwgMywgMywgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMywgMywgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMywgMSwgMywgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMywgMywgMV0sXG4gICAgICAgICAgICBbMiwgMywgMSwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMywgMSwgMSwgM10sXG4gICAgICAgICAgICBbMiwgMSwgMywgMywgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMywgMSwgMywgMV0sXG4gICAgICAgICAgICBbMywgMSwgMSwgMSwgMiwgM10sXG4gICAgICAgICAgICBbMywgMSwgMSwgMywgMiwgMV0sXG4gICAgICAgICAgICBbMywgMywgMSwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMywgMSwgMiwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMywgMSwgMiwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMywgMywgMiwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMywgMSwgNCwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgNCwgMSwgMV0sXG4gICAgICAgICAgICBbNCwgMywgMSwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMiwgMiwgNF0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgNCwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMSwgMiwgNF0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgNCwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgNCwgMSwgMSwgMiwgMl0sXG4gICAgICAgICAgICBbMSwgNCwgMSwgMiwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgMiwgMSwgNF0sXG4gICAgICAgICAgICBbMSwgMSwgMiwgNCwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgMSwgMSwgNF0sXG4gICAgICAgICAgICBbMSwgMiwgMiwgNCwgMSwgMV0sXG4gICAgICAgICAgICBbMSwgNCwgMiwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgNCwgMiwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgNCwgMSwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMiwgMSwgMSwgMSwgNF0sXG4gICAgICAgICAgICBbNCwgMSwgMywgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgNCwgMSwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMywgNCwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMiwgNCwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMSwgNCwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgMSwgMiwgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgNCwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbMSwgMiwgNCwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMiwgMSwgMl0sXG4gICAgICAgICAgICBbNCwgMiwgMSwgMSwgMSwgMl0sXG4gICAgICAgICAgICBbNCwgMiwgMSwgMiwgMSwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMiwgMSwgNCwgMV0sXG4gICAgICAgICAgICBbMiwgMSwgNCwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMiwgMSwgMiwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMSwgNCwgM10sXG4gICAgICAgICAgICBbMSwgMSwgMSwgMywgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMywgMSwgMSwgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMSwgMSwgM10sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMywgMSwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMSwgMSwgM10sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMywgMSwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgMywgMSwgNCwgMV0sXG4gICAgICAgICAgICBbMSwgMSwgNCwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMywgMSwgMSwgMSwgNCwgMV0sXG4gICAgICAgICAgICBbNCwgMSwgMSwgMSwgMywgMV0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgNCwgMSwgMl0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMiwgMSwgNF0sXG4gICAgICAgICAgICBbMiwgMSwgMSwgMiwgMywgMl0sXG4gICAgICAgICAgICBbMiwgMywgMywgMSwgMSwgMSwgMl0sXG4gICAgICAgIF07XG4gICAgU0lOR0xFX0NPREVfRVJST1IgPSAwLjY0O1xuICAgIEFWR19DT0RFX0VSUk9SID0gMC4zMDtcbiAgICBGT1JNQVQgPSAnY29kZV8xMjgnO1xuICAgIE1PRFVMRV9JTkRJQ0VTID0geyBiYXI6IFswLCAyLCA0XSwgc3BhY2U6IFsxLCAzLCA1XSB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvcnJlY3Rpb24/OiBCYXJjb2RlQ29ycmVjdGlvbik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0LFxuICAgICAgICAgICAgY29ycmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJhcjogMSxcbiAgICAgICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGxldCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBzdGFydDtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSAhdGhpcy5fcm93W29mZnNldF07XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvcnJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvcnJlY3QoY291bnRlciwgY29ycmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29kZSA9IDA7IGNvZGUgPCB0aGlzLkNPREVfUEFUVEVSTi5sZW5ndGg7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgdGhpcy5DT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoLmNvZGUgPT09IC0xIHx8IGJlc3RNYXRjaC5lcnJvciA+IHRoaXMuQVZHX0NPREVfRVJST1IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IHRoaXMuY2FsY3VsYXRlQ29ycmVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uc3BhY2UgPSB0aGlzLmNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY29ycmVjdChjb3VudGVyOiBBcnJheTxudW1iZXI+LCBjb3JyZWN0aW9uOiBCYXJjb2RlQ29ycmVjdGlvbikge1xuICAgICAgICB0aGlzLl9jb3JyZWN0QmFycyhjb3VudGVyLCBjb3JyZWN0aW9uLmJhciwgdGhpcy5NT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICB0aGlzLl9jb3JyZWN0QmFycyhjb3VudGVyLCBjb3JyZWN0aW9uLnNwYWNlLCB0aGlzLk1PRFVMRV9JTkRJQ0VTLnNwYWNlKTtcbiAgICB9O1xuXG4gICAgLy8gVE9ETzogX2ZpbmRTdGFydCBhbmQgZGVjb2RlQ29kZSBzaGFyZSBzaW1pbGFyIGNvZGUsIGNhbiB3ZSByZS11c2Ugc29tZT9cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gWzAsIDAsIDAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGNvbnN0IGJlc3RNYXRjaCA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IDEsXG4gICAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgaXNXaGl0ZSA9IGZhbHNlO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IGNvdW50ZXIucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2ICsgbmV4dCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSB0aGlzLlNUQVJUX0NPREVfQTsgY29kZSA8PSB0aGlzLlNUQVJUX0NPREVfQzsgY29kZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCB0aGlzLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciA8IHRoaXMuQVZHX0NPREVfRVJST1IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5zdGFydCA9IGkgLSBzdW07XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLmJhciA9IHRoaXMuY2FsY3VsYXRlQ29ycmVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNPREVfUEFUVEVSTltiZXN0TWF0Y2guY29kZV0sIGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NT0RVTEVfSU5ESUNFUy5iYXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvcnJlY3Rpb24uc3BhY2UgPSB0aGlzLmNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls0XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbNV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBCYXJjb2RlUG9zaXRpb24pOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoc3RhcnRJbmZvID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIC8vICAgICBkb25lID0gZmFsc2UsXG4gICAgICAgIC8vICAgICByZXN1bHQgPSBbXSxcbiAgICAgICAgLy8gICAgIG11bHRpcGxpZXIgPSAwLFxuICAgICAgICAvLyAgICAgY2hlY2tzdW0gPSAwLFxuICAgICAgICAvLyAgICAgY29kZXNldCxcbiAgICAgICAgLy8gICAgIHJhd1Jlc3VsdCA9IFtdLFxuICAgICAgICAvLyAgICAgZGVjb2RlZENvZGVzID0gW10sXG4gICAgICAgIC8vICAgICBzaGlmdE5leHQgPSBmYWxzZSxcbiAgICAgICAgLy8gICAgIHVuc2hpZnQsXG4gICAgICAgIC8vICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gdHJ1ZTtcblxuICAgICAgICBsZXQgY29kZTogQmFyY29kZUluZm8gfCBudWxsID0ge1xuICAgICAgICAgICAgY29kZTogc3RhcnRJbmZvLmNvZGUsXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBzdGFydEluZm8uZW5kLFxuICAgICAgICAgICAgY29ycmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGJhcjogc3RhcnRJbmZvLmNvcnJlY3Rpb24hLmJhcixcbiAgICAgICAgICAgICAgICBzcGFjZTogc3RhcnRJbmZvLmNvcnJlY3Rpb24hLnNwYWNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICBsZXQgY2hlY2tzdW0gPSBjb2RlLmNvZGU7XG4gICAgICAgIGxldCBjb2Rlc2V0ID0gKChjOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVEFSVF9DT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuU1RBUlRfQ09ERV9COlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DT0RFX0I7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLlNUQVJUX0NPREVfQzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ09ERV9DO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KShjb2RlLmNvZGUpO1xuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgc2hpZnROZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCB1bnNoaWZ0ID0gc2hpZnROZXh0O1xuICAgICAgICBsZXQgcmVtb3ZlTGFzdENoYXJhY3RlciA9IHRydWU7XG4gICAgICAgIGxldCBtdWx0aXBsaWVyID0gMDtcbiAgICAgICAgbGV0IHJhd1Jlc3VsdDogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgICBsZXQgcmVzdWx0OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW107IC8vIFRPRE86IGkgdGhpbmsgdGhpcyBzaG91bGQgYmUgc3RyaW5nIG9ubHksIGJ1dCBpdCBjcmVhdGVzIHByb2JsZW1zIGlmIGl0IGlzXG5cbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICB1bnNoaWZ0ID0gc2hpZnROZXh0O1xuICAgICAgICAgICAgc2hpZnROZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb2RlIS5lbmQsIGNvZGUhLmNvcnJlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICByYXdSZXN1bHQucHVzaChjb2RlLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyKys7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9IG11bHRpcGxpZXIgKiBjb2RlLmNvZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2Rlc2V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDY0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyICsgY29kZS5jb2RlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZS5jb2RlIDwgOTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZS5jb2RlIC0gNjQpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgIT09IHRoaXMuU1RPUF9DT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX1NISUZUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0TmV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9CO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5GTkMxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuRk5DMV9DSEFSKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDMyICsgY29kZS5jb2RlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfU0hJRlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0TmV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9BO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5GTkMxOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLkZOQzFfQ0hBUik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9DOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlIDwgMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgPCAxMCA/ICcwJyArIGNvZGUuY29kZSA6IGNvZGUuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9BOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX0I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9CO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkZOQzE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5GTkMxX0NIQVIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLlNUT1BfQ09ERTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuc2hpZnQpIHtcbiAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gY29kZXNldCA9PT0gdGhpcy5DT0RFX0EgPyB0aGlzLkNPREVfQiA6IHRoaXMuQ09ERV9BO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZS5lbmQgPSB0aGlzLl9uZXh0VW5zZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGNvZGUpKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tzdW0gLT0gbXVsdGlwbGllciAqIHJhd1Jlc3VsdFtyYXdSZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjaGVja3N1bSAlIDEwMyAhPT0gcmF3UmVzdWx0W3Jhd1Jlc3VsdC5sZW5ndGggLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGxhc3QgY29kZSBmcm9tIHJlc3VsdCAoY2hlY2tzdW0pXG4gICAgICAgIGlmIChyZW1vdmVMYXN0Q2hhcmFjdGVyKSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHJlc3VsdC5sZW5ndGggLSAxLCAxKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNvZGUuZW5kLFxuICAgICAgICAgICAgY29kZXNldDogY29kZXNldCBhcyBudW1iZXIsXG4gICAgICAgICAgICBzdGFydEluZm86IHN0YXJ0SW5mbyxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogZGVjb2RlZENvZGVzLFxuICAgICAgICAgICAgZW5kSW5mbzogY29kZSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5GT1JNQVQsXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZUluZm8gfCBudWxsIHtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICB0cmFpbGluZ1doaXRlc3BhY2VFbmQ7XG5cbiAgICAgICAgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gZW5kSW5mby5lbmQgKyAoKGVuZEluZm8uZW5kIC0gZW5kSW5mby5zdGFydCkgLyAyKTtcbiAgICAgICAgaWYgKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA8IHNlbGYuX3Jvdy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9tYXRjaFJhbmdlKGVuZEluZm8uZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuXG4gICAgcHVibGljIGNhbGN1bGF0ZUNvcnJlY3Rpb24oZXhwZWN0ZWQ6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgbm9ybWFsaXplZDogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBpbmRpY2VzOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICB2YXIgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGgsXG4gICAgICAgICAgICBzdW1Ob3JtYWxpemVkID0gMCxcbiAgICAgICAgICAgIHN1bUV4cGVjdGVkID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICAgIHN1bUV4cGVjdGVkICs9IGV4cGVjdGVkW2luZGljZXNbbGVuZ3RoXV07XG4gICAgICAgICAgICBzdW1Ob3JtYWxpemVkICs9IG5vcm1hbGl6ZWRbaW5kaWNlc1tsZW5ndGhdXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtRXhwZWN0ZWQgLyBzdW1Ob3JtYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTEyOFJlYWRlcjtcbiIsIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuLi9jb21tb24vYXJyYXlfaGVscGVyJztcbmltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IHR5cGUgQmFyY29kZVBvc2l0aW9uLCB0eXBlIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY29uc3QgQUxQSEFCRVRIX1NUUklORyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAqJC8rJSc7XG5jb25zdCBBTFBIQUJFVCA9IG5ldyBVaW50MTZBcnJheShbLi4uQUxQSEFCRVRIX1NUUklOR10ubWFwKChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MDM0LCAweDEyMSwgMHgwNjEsIDB4MTYwLCAweDAzMSwgMHgxMzAsIDB4MDcwLCAweDAyNSwgMHgxMjQsIDB4MDY0LCAweDEwOSwgMHgwNDksXG4gICAgMHgxNDgsIDB4MDE5LCAweDExOCwgMHgwNTgsIDB4MDBELCAweDEwQywgMHgwNEMsIDB4MDFDLCAweDEwMywgMHgwNDMsIDB4MTQyLCAweDAxMywgMHgxMTIsIDB4MDUyLCAweDAwNywgMHgxMDYsXG4gICAgMHgwNDYsIDB4MDE2LCAweDE4MSwgMHgwQzEsIDB4MUMwLCAweDA5MSwgMHgxOTAsIDB4MEQwLCAweDA4NSwgMHgxODQsIDB4MEM0LCAweDA5NCwgMHgwQTgsIDB4MEEyLCAweDA4QSwgMHgwMkEsXG5dKTtcbmNvbnN0IEFTVEVSSVNLID0gMHgwOTQ7XG5cbmNsYXNzIENvZGUzOVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdjb2RlXzM5JztcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBwYXR0ZXJuU3RhcnQgPSBvZmZzZXQ7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDE2QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBzdGFydCBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b1BhdHRlcm4oY291bnRlcikgPT09IEFTVEVSSVNLKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aGl0ZVNwYWNlTXVzdFN0YXJ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBwYXR0ZXJuU3RhcnQgLSAoKGkgLSBwYXR0ZXJuU3RhcnQpIC8gNCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKHdoaXRlU3BhY2VNdXN0U3RhcnQsIHBhdHRlcm5TdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcGF0dGVyblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyWzBdICsgY291bnRlclsxXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzddID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls4XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3RvUGF0dGVybihjb3VudGVyczogVWludDE2QXJyYXkpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgbGV0IG1heE5hcnJvd1dpZHRoID0gMDtcbiAgICAgICAgbGV0IG51bVdpZGVCYXJzID0gbnVtQ291bnRlcnM7XG4gICAgICAgIGxldCB3aWRlQmFyV2lkdGggPSAwO1xuXG4gICAgICAgIHdoaWxlIChudW1XaWRlQmFycyA+IDMpIHtcbiAgICAgICAgICAgIG1heE5hcnJvd1dpZHRoID0gdGhpcy5fZmluZE5leHRXaWR0aChjb3VudGVycywgbWF4TmFycm93V2lkdGgpO1xuICAgICAgICAgICAgbnVtV2lkZUJhcnMgPSAwO1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldID4gbWF4TmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiB8PSAxIDw8IChudW1Db3VudGVycyAtIDEgLSBpKTtcbiAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMrKztcbiAgICAgICAgICAgICAgICAgICAgd2lkZUJhcldpZHRoICs9IGNvdW50ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bVdpZGVCYXJzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVycyAmJiBudW1XaWRlQmFycyA+IDA7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlcnNbaV0gPiBtYXhOYXJyb3dXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtV2lkZUJhcnMtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnRlcnNbaV0gKiAyKSA+PSB3aWRlQmFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZE5leHRXaWR0aChjb3VudGVyczogVWludDE2QXJyYXksIGN1cnJlbnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBtaW5XaWR0aCA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldIDwgbWluV2lkdGggJiYgY291bnRlcnNbaV0gPiBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGggPSBjb3VudGVyc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaW5XaWR0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3BhdHRlcm5Ub0NoYXIocGF0dGVybjogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUkFDVEVSX0VOQ09ESU5HUy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1NbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShBTFBIQUJFVFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UobGFzdFN0YXJ0OiBudW1iZXIsIG5leHRTdGFydDogbnVtYmVyLCBjb3VudGVyczogVWludDE2QXJyYXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGF0dGVyblNpemUgPSBBcnJheUhlbHBlci5zdW0oY291bnRlcnMpO1xuXG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IG5leHRTdGFydCAtIGxhc3RTdGFydCAtIHBhdHRlcm5TaXplO1xuICAgICAgICBpZiAoKHRyYWlsaW5nV2hpdGVzcGFjZUVuZCAqIDMpID49IHBhdHRlcm5TaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZSgpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGxldCBjb3VudGVycyA9IG5ldyBVaW50MTZBcnJheShbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pO1xuICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9maW5kU3RhcnQoKTtcblxuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFN0YXJ0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3csIHN0YXJ0LmVuZCk7XG5cbiAgICAgICAgbGV0IGRlY29kZWRDaGFyO1xuICAgICAgICBsZXQgbGFzdFN0YXJ0OiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvdW50ZXJzID0gdGhpcy5fdG9Db3VudGVycyhuZXh0U3RhcnQsIGNvdW50ZXJzKSBhcyBVaW50MTZBcnJheTxBcnJheUJ1ZmZlcj47XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKGNvdW50ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENoYXIgPSB0aGlzLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKGRlY29kZWRDaGFyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICBsYXN0U3RhcnQgPSBuZXh0U3RhcnQ7XG4gICAgICAgICAgICBuZXh0U3RhcnQgKz0gQXJyYXlIZWxwZXIuc3VtKGNvdW50ZXJzKTtcbiAgICAgICAgICAgIG5leHRTdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBuZXh0U3RhcnQpO1xuICAgICAgICB9IHdoaWxlIChkZWNvZGVkQ2hhciAhPT0gJyonKTtcbiAgICAgICAgcmVzdWx0LnBvcCgpO1xuXG4gICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShsYXN0U3RhcnQsIG5leHRTdGFydCwgY291bnRlcnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnQuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG5leHRTdGFydCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbzogc3RhcnQsXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXM6IHJlc3VsdCxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5GT1JNQVQsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2RlMzlSZWFkZXI7XG4iLCJpbXBvcnQgQ29kZTM5UmVhZGVyIGZyb20gJy4vY29kZV8zOV9yZWFkZXInO1xuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgICBBRUlPOiAvW0FFSU9dL2csXG4gICAgQVowOTogL1tBLVowLTldLyxcbn07XG5cbmNvbnN0IGNvZGUzMnNldCA9ICcwMTIzNDU2Nzg5QkNERkdISktMTU5QUVJTVFVWV1hZWic7XG5cbmNsYXNzIENvZGUzMlJlYWRlciBleHRlbmRzIENvZGUzOVJlYWRlciB7XG4gICAgRk9STUFUID0gJ2NvZGVfMzJfcmVhZGVyJztcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZTMyKGNvZGU6IHN0cmluZykge1xuICAgICAgICBpZiAoL1teMC05QkNERkdISktMTU5QUVJTVFVWV1hZWl0vLnRlc3QoY29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXMgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlcyA9IHJlcyAqIDMyICsgY29kZTMyc2V0LmluZGV4T2YoY29kZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvZGUzMiA9IGAke3Jlc31gO1xuICAgICAgICBpZiAoY29kZTMyLmxlbmd0aCA8IDkpIHtcbiAgICAgICAgICAgIGNvZGUzMiA9ICgnMDAwMDAwMDAwJyArIGNvZGUzMikuc2xpY2UoLTkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnQScgKyBjb2RlMzI7XG4gICAgfVxuXG4gICAgLy8gSXRhbGlhbiBQaGFybWFjb2RlIGNoZWNrIGRpZ2l0OiBkb3VibGUgdGhlIGV2ZW4gcG9zaXRpb25zLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmRlciBvZiB0aGUgc3VtIGRpdmlkZWQgYnkgMTAuIFNlZSB0aGUgMTk4OCBtaW5pc3RlcmlhbCBkZWNyZWUuXG4gICAgcHJvdGVjdGVkIF9jaGVja0NoZWNrc3VtKGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkaWdpdHMgPSBjb2RlLmNoYXJBdCgwKSA9PT0gJ0EnID8gY29kZS5zbGljZSgxKSA6IGNvZGU7XG4gICAgICAgIGlmICghL15cXGR7OX0kLy50ZXN0KGRpZ2l0cykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpIC0gNDg7XG4gICAgICAgICAgICBpZiAoaSAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAyO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgLT0gOTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdW0gKz0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzdW0gJSAxMCkgPT09IChkaWdpdHMuY2hhckNvZGVBdCg4KSAtIDQ4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb2RlKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWNvZGUoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGUgPSByZXN1bHQuY29kZTtcblxuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZShwYXR0ZXJucy5BRUlPLCAnJyk7XG5cbiAgICAgICAgY29uc3QgY29kZTMyID0gdGhpcy5fZGVjb2RlQ29kZTMyKGNvZGUpO1xuXG4gICAgICAgIGlmICghY29kZTMyIHx8ICF0aGlzLl9jaGVja0NoZWNrc3VtKGNvZGUzMikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlMzI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2RlMzJSZWFkZXI7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5pbXBvcnQgeyBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgQ29kZTM5UmVhZGVyIGZyb20gJy4vY29kZV8zOV9yZWFkZXInO1xuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgICBJT1E6IC9bSU9RXS9nLFxuICAgIEFaMDk6IC9bQS1aMC05XXsxN30vLFxufTtcblxuY2xhc3MgQ29kZTM5VklOUmVhZGVyIGV4dGVuZHMgQ29kZTM5UmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnY29kZV8zOV92aW4nO1xuXG4gICAgLy8gVE9ETyAodGhpcyB3YXMgdG9kbyBpbiBvcmlnaW5hbCByZXBvLCBubyB0ZXh0IHdhcyB0aGVyZS4gc29ycnkuKVxuICAgIHByb3RlY3RlZCBfY2hlY2tDaGVja3N1bShjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhY29kZTtcbiAgICB9XG5cbiAgICAvLyBDcmliYmVkIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3p4aW5nL3p4aW5nL2Jsb2IvbWFzdGVyL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3p4aW5nL2NsaWVudC9yZXN1bHQvVklOUmVzdWx0UGFyc2VyLmphdmFcbiAgICBwdWJsaWMgZGVjb2RlKCk6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVjb2RlKCk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB7IGNvZGUgfSA9IHJlc3VsdDtcblxuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZShwYXR0ZXJucy5JT1EsICcnKTtcblxuICAgICAgICBpZiAoIWNvZGUubWF0Y2gocGF0dGVybnMuQVowOSkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIEFaMDkgcGF0dGVybiBjb2RlOicsIGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrQ2hlY2tzdW0oY29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTM5VklOUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gJC8rJWFiY2QqJztcbmNvbnN0IEFMUEhBQkVUID0gbmV3IFVpbnQxNkFycmF5KFsuLi5BTFBIQUJFVEhfU1RSSU5HXS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MTE0LCAweDE0OCwgMHgxNDQsIDB4MTQyLCAweDEyOCwgMHgxMjQsIDB4MTIyLCAweDE1MCwgMHgxMTIsIDB4MTBBLFxuICAgIDB4MUE4LCAweDFBNCwgMHgxQTIsIDB4MTk0LCAweDE5MiwgMHgxOEEsIDB4MTY4LCAweDE2NCwgMHgxNjIsIDB4MTM0LFxuICAgIDB4MTFBLCAweDE1OCwgMHgxNEMsIDB4MTQ2LCAweDEyQywgMHgxMTYsIDB4MUI0LCAweDFCMiwgMHgxQUMsIDB4MUE2LFxuICAgIDB4MTk2LCAweDE5QSwgMHgxNkMsIDB4MTY2LCAweDEzNiwgMHgxM0EsIDB4MTJFLCAweDFENCwgMHgxRDIsIDB4MUNBLFxuICAgIDB4MTZFLCAweDE3NiwgMHgxQUUsIDB4MTI2LCAweDFEQSwgMHgxRDYsIDB4MTMyLCAweDE1RSxcbl0pO1xuY29uc3QgQVNURVJJU0sgPSAweDE1RTtcblxuY2xhc3MgQ29kZTkzUmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgRk9STUFUID0gJ2NvZGVfOTMnO1xuICAgIHByb3RlY3RlZCBfcGF0dGVyblRvQ2hhcihwYXR0ZXJuOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSA9PT0gcGF0dGVybikge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKEFMUEhBQkVUW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF90b1BhdHRlcm4oY291bnRlcnM6IFVpbnQxNkFycmF5KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHN1bSA9IGNvdW50ZXJzLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIDApO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZCA9IE1hdGgucm91bmQoY291bnRlcnNbaV0gKiA5IC8gc3VtKTtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkIDwgMSB8fCBub3JtYWxpemVkID4gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoaSAmIDEpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub3JtYWxpemVkOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IChwYXR0ZXJuIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhdHRlcm4gPDw9IG5vcm1hbGl6ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBwYXR0ZXJuU3RhcnQgPSBvZmZzZXQ7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDE2QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHN0YXJ0IHBhdHRlcm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RvUGF0dGVybihjb3VudGVyKSA9PT0gQVNURVJJU0spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdoaXRlU3BhY2VNdXN0U3RhcnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIHBhdHRlcm5TdGFydCAtICgoaSAtIHBhdHRlcm5TdGFydCkgLyA0KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2Uod2hpdGVTcGFjZU11c3RTdGFydCwgcGF0dGVyblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwYXR0ZXJuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJbMF0gKyBjb3VudGVyWzFdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbNF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeUVuZChsYXN0U3RhcnQ6IG51bWJlciwgbmV4dFN0YXJ0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGxhc3RTdGFydCA9PT0gbmV4dFN0YXJ0IHx8ICF0aGlzLl9yb3dbbmV4dFN0YXJ0XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZUV4dGVuZGVkKGNoYXJBcnJheTogQXJyYXk8c3RyaW5nPik6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGNoYXJBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gY2hhckFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKGNoYXIgPj0gJ2EnICYmIGNoYXIgPD0gJ2QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAobGVuZ3RoIC0gMikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2hhckFycmF5WysraV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dENoYXJDb2RlID0gbmV4dENoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVjb2RlZENoYXI7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID49ICdBJyAmJiBuZXh0Q2hhciA8PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlIC0gNjQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ0YnICYmIG5leHRDaGFyIDw9ICdKJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID49ICdLJyAmJiBuZXh0Q2hhciA8PSAnTycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlICsgMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnUCcgJiYgbmV4dENoYXIgPD0gJ1MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDQzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ1QnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ08nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDMyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPT09ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gJzonO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ1onKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDMyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBjb2RlXzkzX3JlYWRlciBfZGVjb2RlRXh0ZW5kZWQgaGl0IGRlZmF1bHQgY2FzZSwgdGhpcyBtYXkgYmUgYW4gZXJyb3InLCBkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGFyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX21hdGNoQ2hlY2tDaGFyKGNoYXJBcnJheTogQXJyYXk8c3RyaW5nPiwgaW5kZXg6IG51bWJlciwgbWF4V2VpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYXJyYXlUb0NoZWNrID0gY2hhckFycmF5LnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXlUb0NoZWNrLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgd2VpZ2h0ZWRTdW1zID0gYXJyYXlUb0NoZWNrLnJlZHVjZSgoc3VtLCBjaGFyLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSAoKChpICogLTEpICsgKGxlbmd0aCAtIDEpKSAlIG1heFdlaWdodCkgKyAxO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBTFBIQUJFVC5pbmRleE9mKGNoYXIuY2hhckNvZGVBdCgwKSk7XG4gICAgICAgICAgICByZXR1cm4gc3VtICsgKHdlaWdodCAqIHZhbHVlKTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgY29uc3QgY2hlY2tDaGFyID0gQUxQSEFCRVRbKHdlaWdodGVkU3VtcyAlIDQ3KV07XG4gICAgICAgIHJldHVybiBjaGVja0NoYXIgPT09IGNoYXJBcnJheVtpbmRleF0uY2hhckNvZGVBdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDaGVja3N1bXMoY2hhckFycmF5OiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggLSAyLCAyMClcbiAgICAgICAgICAgICYmIHRoaXMuX21hdGNoQ2hlY2tDaGFyKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCAtIDEsIDE1KTtcbiAgICB9O1xuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlciB8IG51bGwpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5fZmluZFN0YXJ0KCk7XG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ZXJzID0gbmV3IFVpbnQxNkFycmF5KFswLCAwLCAwLCAwLCAwLCAwXSk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFycmF5PHN0cmluZz4gfCBudWxsID0gW107XG4gICAgICAgIGxldCBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdywgc3RhcnQuZW5kKTtcbiAgICAgICAgbGV0IGxhc3RTdGFydDtcbiAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb3VudGVycyA9IHRoaXMuX3RvQ291bnRlcnMobmV4dFN0YXJ0LCBjb3VudGVycykgYXMgVWludDE2QXJyYXk8QXJyYXlCdWZmZXI+O1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihjb3VudGVycyk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY29kZWRDaGFyID0gdGhpcy5fcGF0dGVyblRvQ2hhcihwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0O1xuICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IEFycmF5SGVscGVyLnN1bShjb3VudGVycyk7XG4gICAgICAgICAgICBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgbmV4dFN0YXJ0KTtcbiAgICAgICAgfSB3aGlsZSAoZGVjb2RlZENoYXIgIT09ICcqJyk7XG4gICAgICAgIHJlc3VsdC5wb3AoKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlFbmQobGFzdFN0YXJ0LCBuZXh0U3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5Q2hlY2tzdW1zKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIHJlc3VsdC5sZW5ndGggLSAyKTtcbiAgICAgICAgLy8geWVzLCB0aGlzIGlzIGFuIGFzc2lnbiBpbnNpZGUgYW4gaWYuXG4gICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fZGVjb2RlRXh0ZW5kZWQocmVzdWx0KSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcblxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTkzUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZVJlYWRlckNvbmZpZywgQmFyY29kZUluZm8sIEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC9tZXJnZSc7XG5cbi8vIGNvbnN0IENPREVfTF9TVEFSVCA9IDA7XG5jb25zdCBDT0RFX0dfU1RBUlQgPSAxMDtcbmV4cG9ydCB7IENPREVfR19TVEFSVCB9O1xuY29uc3QgU1RBUlRfUEFUVEVSTiA9IFsxLCAxLCAxXTtcbmNvbnN0IE1JRERMRV9QQVRURVJOID0gWzEsIDEsIDEsIDEsIDFdO1xuZXhwb3J0IHsgTUlERExFX1BBVFRFUk4gfTtcbmNvbnN0IEVYVEVOU0lPTl9TVEFSVF9QQVRURVJOID0gWzEsIDEsIDJdO1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFszLCAyLCAxLCAxXSxcbiAgICBbMiwgMiwgMiwgMV0sXG4gICAgWzIsIDEsIDIsIDJdLFxuICAgIFsxLCA0LCAxLCAxXSxcbiAgICBbMSwgMSwgMywgMl0sXG4gICAgWzEsIDIsIDMsIDFdLFxuICAgIFsxLCAxLCAxLCA0XSxcbiAgICBbMSwgMywgMSwgMl0sXG4gICAgWzEsIDIsIDEsIDNdLFxuICAgIFszLCAxLCAxLCAyXSxcbiAgICBbMSwgMSwgMiwgM10sXG4gICAgWzEsIDIsIDIsIDJdLFxuICAgIFsyLCAyLCAxLCAyXSxcbiAgICBbMSwgMSwgNCwgMV0sXG4gICAgWzIsIDMsIDEsIDFdLFxuICAgIFsxLCAzLCAyLCAxXSxcbiAgICBbNCwgMSwgMSwgMV0sXG4gICAgWzIsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAyLCAxXSxcbiAgICBbMiwgMSwgMSwgM10sXG5dO1xuY29uc3QgQ09ERV9GUkVRVUVOQ1kgPSBbMCwgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl07XG4vLyBjb25zdCBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzA7XG5jb25zdCBBVkdfQ09ERV9FUlJPUiA9IDAuNDg7XG5cbmNsYXNzIEVBTlJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdlYW5fMTMnO1xuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMC43MDtcbiAgICBTVE9QX1BBVFRFUk4gPSBbMSwgMSwgMV07IC8vIFRPRE86IGRvZXMgdGhpcyBuZWVkIHRvIGJlIGluIHRoZSBjbGFzcz9cblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgc3VwZXIobWVyZ2UoeyBzdXBwbGVtZW50czogW10gfSwgY29uZmlnKSwgc3VwcGxlbWVudHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFBhdHRlcm4ocGF0dGVybjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbiwgdHJ5SGFyZGVyOiBib29sZWFuKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgQXJyYXk8bnVtYmVyPihwYXR0ZXJuLmxlbmd0aCkuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSBBVkdfQ09ERV9FUlJPUjtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpbmRQYXR0ZXJuJywgcGF0dGVybiwgb2Zmc2V0LCBpc1doaXRlLCB0cnlIYXJkZXIsIGVwc2lsb24pO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGAqIGxvb3AgaT0ke29mZnNldH0gbGVuPSR7dGhpcy5fcm93Lmxlbmd0aH0gaXNXaGl0ZT0ke2lzV2hpdGV9IGNvdW50ZXJQb3M9JHtjb3VudGVyUG9zfWApO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogbWF0Y2hQYXR0ZXJuJywgZXJyb3IsIGNvdW50ZXIsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBlcHNpbG9uICYmIGJlc3RNYXRjaC5lcnJvciAmJiBlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gY291bnRlci5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IHN1bSArIHZhbHVlLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBiZXN0TWF0Y2gnLCBKU09OLnN0cmluZ2lmeShiZXN0TWF0Y2gpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUhhcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudGVyLmxlbmd0aCAtIDI7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbal0gPSBjb3VudGVyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlci5sZW5ndGggLSAyXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluZFBhdHRlcm4gYW5kIGRlY29kZUNvZGUgYXBwZWFyIHRvIHNoYXJlIHF1aXRlIHNpbWlsYXIgY29kZSwgY2FuIGl0IGJlIHJlZHVjZWQ/XG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvZGVyYW5nZT86IG51bWJlcik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlJywgc3RhcnQsIGNvZGVyYW5nZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2g6IEJhcmNvZGVJbmZvID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IEFWR19DT0RFX0VSUk9SO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9ICF0aGlzLl9yb3dbb2Zmc2V0XTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGlmICghY29kZXJhbmdlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlQ29kZSBiZWZvcmUgbGVuZ3RoJyk7XG4gICAgICAgICAgICBjb2RlcmFuZ2UgPSBDT0RFX1BBVFRFUk4ubGVuZ3RoO1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGRlY29kZUNvZGUgYWZ0ZXIgbGVuZ3RoJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29kZSA9IDA7IGNvZGUgPCBjb2RlcmFuZ2U7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yISkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVzdE1hdGNoLmVycm9yISA+IGVwc2lsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gbnVsbCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBiZXN0TWF0Y2gnLCBKU09OLnN0cmluZ2lmeShiZXN0TWF0Y2gpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gPSAxO1xuICAgICAgICAgICAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpbmRTdGFydCcpO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgc3RhcnRJbmZvOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RBUlRfUEFUVEVSTiwgb2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogc3RhcnRJbmZvPScsIEpTT04uc3RyaW5naWZ5KHN0YXJ0SW5mbykpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IHN0YXJ0SW5mby5zdGFydCAtIChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KTtcblxuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybmluZyBzdGFydEluZm8nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCA9IHN0YXJ0SW5mby5lbmQ7XG4gICAgICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm5pbmcgbnVsbCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVGaXJzdERpZ2l0KGNvZGVGcmVxdWVuY3k6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogY2FsY3VsYXRlRmlyc3REaWdpdCcsIGNvZGVGcmVxdWVuY3kpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENPREVfRlJFUVVFTkNZLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gQ09ERV9GUkVRVUVOQ1lbaV0pIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuaW5nJywgaSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlUGF5bG9hZChpbkNvZGU6IEJhcmNvZGVQb3NpdGlvbiwgcmVzdWx0OiBBcnJheTxudW1iZXI+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF5bG9hZCcsIGluQ29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuICAgICAgICBsZXQgb3V0Q29kZTogQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0geyAuLi5pbkNvZGUgfTtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAweDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG91dENvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKG91dENvZGUuZW5kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlPScsIG91dENvZGUpO1xuICAgICAgICAgICAgaWYgKCFvdXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgPj0gQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgLT0gQ09ERV9HX1NUQVJUO1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoNSAtIGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDAgPDwgKDUgLSBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG91dENvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3REaWdpdCA9IHRoaXMuX2NhbGN1bGF0ZUZpcnN0RGlnaXQoY29kZUZyZXF1ZW5jeSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBmaXJzdERpZ2l0PScsIGZpcnN0RGlnaXQpO1xuICAgICAgICBpZiAoZmlyc3REaWdpdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KGZpcnN0RGlnaXQpO1xuXG4gICAgICAgIGxldCBtaWRkbGVQYXR0ZXJuID0gdGhpcy5fZmluZFBhdHRlcm4oTUlERExFX1BBVFRFUk4sIG91dENvZGUuZW5kLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBmaW5kUGF0dGVybj0nLCBKU09OLnN0cmluZ2lmeShtaWRkbGVQYXR0ZXJuKSk7XG5cbiAgICAgICAgaWYgKG1pZGRsZVBhdHRlcm4gPT09IG51bGwgfHwgIW1pZGRsZVBhdHRlcm4uZW5kKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuIG51bGwnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2gobWlkZGxlUGF0dGVybik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG1pZGRsZVBhdHRlcm4gPSB0aGlzLl9kZWNvZGVDb2RlKG1pZGRsZVBhdHRlcm4hLmVuZCwgQ09ERV9HX1NUQVJUKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlPScsIEpTT04uc3RyaW5naWZ5KG1pZGRsZVBhdHRlcm4pKTtcblxuICAgICAgICAgICAgaWYgKCFtaWRkbGVQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG1pZGRsZVBhdHRlcm4pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKG1pZGRsZVBhdHRlcm4gYXMgQmFyY29kZUluZm8pLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGVuZCBjb2RlPScsIEpTT04uc3RyaW5naWZ5KG1pZGRsZVBhdHRlcm4pKTtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGVuZCByZXN1bHQ9JywgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBlbmQgZGVjb2RlZENvZGVzPScsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIHJldHVybiBtaWRkbGVQYXR0ZXJuIGFzIEJhcmNvZGVJbmZvO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVQb3NpdGlvbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlJywgSlNPTi5zdHJpbmdpZnkoZW5kSW5mbykpO1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpO1xuXG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm5pbmcnLCBKU09OLnN0cmluZ2lmeShlbmRJbmZvKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZChvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZmluZEVuZCcsIG9mZnNldCwgaXNXaGl0ZSk7XG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUT1BfUEFUVEVSTiwgb2Zmc2V0LCBpc1doaXRlLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGVuZEluZm8gIT09IG51bGwgPyB0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykgOiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBfY2hlY2tzdW0nLCByZXN1bHQpO1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gcmVzdWx0Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VtICo9IDM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBlbmQgY2hlY2tzdW0nLCBzdW0gJSAxMCA9PT0gMCk7XG4gICAgICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvZGVFeHRlbnNpb25zKG9mZnNldDogbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBvZmZzZXQpO1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybihFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiwgc3RhcnQsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlRXh0ZW5zaW9ucycsIHRoaXMuc3VwcGxlbWVudHMpO1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogdGhlcmUgYXJlICcsIHRoaXMuc3VwcGxlbWVudHMubGVuZ3RoLCAnIHN1cHBsZW1lbnRzJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdXBwbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGV4dGVuc2lvbnMgbG9vcCcsIGksIHRoaXMuc3VwcGxlbWVudHNbaV0sIHRoaXMuc3VwcGxlbWVudHNbaV0uX2RlY29kZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnN1cHBsZW1lbnRzW2ldLmRlY29kZSh0aGlzLl9yb3csIHN0YXJ0SW5mby5lbmQpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGUgcmVzdWx0PScsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogcmVzdWx0LmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LmRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogdGhpcy5zdXBwbGVtZW50c1tpXS5GT1JNQVQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignKiBkZWNvZGVFeHRlbnNpb25zIGVycm9yIGluICcsIHRoaXMuc3VwcGxlbWVudHNbaV0sICc6ICcsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZW5kIGRlY29kZUV4dGVuc2lvbnMnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGRlY29kZScsIHJvdyk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGUnLCBzdGFydCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4oKTtcbiAgICAgICAgbGV0IHJlc3VsdEluZm86IEJhcmNvZGUgfCB7fSA9IHt9O1xuICAgICAgICBsZXQgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVQb3NpdGlvbiB8IEJhcmNvZGVJbmZvIHwgbnVsbCA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0SW5mby5lbmRcbiAgICAgICAgfTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZVBheWxvYWQoY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gdGhpcy5fZmluZEVuZChjb2RlLmVuZCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICAvLyBDaGVja3N1bVxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrc3VtKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHRoaXMuc3VwcGxlbWVudHM9JywgdGhpcy5zdXBwbGVtZW50cyk7XG4gICAgICAgIGlmICh0aGlzLnN1cHBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHN1cHBsZW1lbnQgPSB0aGlzLl9kZWNvZGVFeHRlbnNpb25zKGNvZGUuZW5kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVFeHRlbnNpb25zIHJldHVybnMnLCBzdXBwbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghc3VwcGxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN1cHBsZW1lbnQuZGVjb2RlZENvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3RDb2RlID0gc3VwcGxlbWVudC5kZWNvZGVkQ29kZXNbc3VwcGxlbWVudC5kZWNvZGVkQ29kZXMubGVuZ3RoIC0gMV0gYXMgQmFyY29kZUluZm87XG4gICAgICAgICAgICBjb25zdCBlbmRJbmZvID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBsYXN0Q29kZS5zdGFydCArICgoKGxhc3RDb2RlLmVuZCAtIGxhc3RDb2RlLnN0YXJ0KSAvIDIpIHwgMCksXG4gICAgICAgICAgICAgICAgZW5kOiBsYXN0Q29kZS5lbmRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc3VwcGxlbWVudCxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJykgKyBzdXBwbGVtZW50LmNvZGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogY29kZS5lbmQsXG4gICAgICAgICAgICBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICAuLi5yZXN1bHRJbmZvLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVBTlJlYWRlcjtcbiIsImltcG9ydCBFQU5SZWFkZXIsIHsgQ09ERV9HX1NUQVJUIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuXG5jbGFzcyBFQU4yUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnZWFuXzInO1xuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBudW1iZXIpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIHRoaXMuX3JvdyA9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2RlRnJlcXVlbmN5ID0gMDtcbiAgICAgICAgbGV0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9yb3cubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMiAmJiBvZmZzZXQgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUob2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgJSAxMCk7XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IENPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoMSAtIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgY29kZS5lbmQpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRVbnNldCh0aGlzLl9yb3csIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCAocGFyc2VJbnQocmVzdWx0LmpvaW4oJycpKSAlIDQpICE9PSBjb2RlRnJlcXVlbmN5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IChjb2RlIGFzIEJhcmNvZGVJbmZvKS5lbmQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IChzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uKS5zdGFydCxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU4yUmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQgfSBmcm9tICcuL2Vhbl9yZWFkZXInO1xuaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlSW5mbyB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jb25zdCBDSEVDS19ESUdJVF9FTkNPRElOR1MgPSBbMjQsIDIwLCAxOCwgMTcsIDEyLCA2LCAzLCAxMCwgOSwgNV07XG5cbmZ1bmN0aW9uIGRldGVybWluZUNoZWNrRGlnaXQoY29kZUZyZXF1ZW5jeTogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSBDSEVDS19ESUdJVF9FTkNPRElOR1NbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHRlbnNpb25DaGVja3N1bShyZXN1bHQ6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgIGxldCBzdW0gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IGxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgfVxuICAgIHN1bSAqPSAzO1xuICAgIGZvciAobGV0IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgIH1cbiAgICBzdW0gKj0gMztcbiAgICByZXR1cm4gc3VtICUgMTA7XG59XG5cbmNsYXNzIEVBTjVSZWFkZXIgZXh0ZW5kcyBFQU5SZWFkZXIge1xuICAgIEZPUk1BVCA9ICdlYW5fNSc7XG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgdGhpcy5fcm93ID0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3Jvdy5sZW5ndGg7XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1ICYmIG9mZnNldCA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSAlIDEwKTtcbiAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPj0gQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg0IC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gNCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHRlbnNpb25DaGVja3N1bShyZXN1bHQpICE9PSBkZXRlcm1pbmVDaGVja0RpZ2l0KGNvZGVGcmVxdWVuY3kpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IChjb2RlIGFzIEJhcmNvZGVJbmZvKS5lbmQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IChzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uKS5zdGFydCxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU41UmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQsIE1JRERMRV9QQVRURVJOIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgRUFOOFJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgRk9STUFUID0gJ2Vhbl84JztcbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoaW5Db2RlOiBCYXJjb2RlUG9zaXRpb24sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlUG9zaXRpb24+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvIHwgQmFyY29kZVBvc2l0aW9uIHwgbnVsbCA9IGluQ29kZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQsIENPREVfR19TVEFSVCk7XG4gICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2ZpbmRQYXR0ZXJuKE1JRERMRV9QQVRURVJOLCBjb2RlLmVuZCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCBDT0RFX0dfU1RBUlQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlIGFzIEJhcmNvZGVJbmZvO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVBTjhSZWFkZXI7XG4iLCIvLyBUT0RPOiBpMm9mNV9yZWFkZXIgYW5kIDJvZjVfcmVhZGVyIHNoYXJlIHZlcnkgc2ltaWxhciBjb2RlLCBtYWtlIHVzZSBvZiB0aGF0XG5cbmltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IEJhcmNvZGVSZWFkZXJDb25maWcsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvbWVyZ2UnO1xuXG5jb25zdCBOID0gMTtcbmNvbnN0IFcgPSAzO1xuXG5jbGFzcyBJMm9mNVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByaXZhdGUgYmFyU3BhY2VSYXRpbyA9IFsxLCAxXTtcbiAgICBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzg7XG4gICAgQVZHX0NPREVfRVJST1IgPSAwLjM4O1xuXG4gICAgU1RBUlRfUEFUVEVSTiA9IFtOLCBOLCBOLCBOXTtcbiAgICBTVE9QX1BBVFRFUk4gPSBbTiwgTiwgV107XG4gICAgQ09ERV9QQVRURVJOID0gW1xuICAgICAgICBbTiwgTiwgVywgVywgTl0sXG4gICAgICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICAgICAgW04sIFcsIE4sIE4sIFddLFxuICAgICAgICBbVywgVywgTiwgTiwgTl0sXG4gICAgICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICAgICAgW1csIE4sIFcsIE4sIE5dLFxuICAgICAgICBbTiwgVywgVywgTiwgTl0sXG4gICAgICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICAgICAgW1csIE4sIE4sIFcsIE5dLFxuICAgICAgICBbTiwgVywgTiwgVywgTl0sXG4gICAgXTtcbiAgICBNQVhfQ09SUkVDVElPTl9GQUNUT1IgPSA1O1xuICAgIEZPUk1BVCA9ICdpMm9mNSc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRzOiBCYXJjb2RlUmVhZGVyQ29uZmlnKSB7XG4gICAgICAgIHN1cGVyKG1lcmdlKHsgbm9ybWFsaXplQmFyU3BhY2VXaWR0aDogZmFsc2UgfSwgb3B0cykpO1xuICAgICAgICBpZiAob3B0cy5ub3JtYWxpemVCYXJTcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLlNJTkdMRV9DT0RFX0VSUk9SID0gMC4zODtcbiAgICAgICAgICAgIHRoaXMuQVZHX0NPREVfRVJST1IgPSAwLjA5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnID0gb3B0cztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFBhdHRlcm4oY291bnRlcjogQXJyYXk8bnVtYmVyPiwgY29kZTogUmVhZG9ubHlBcnJheTxudW1iZXI+KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm5vcm1hbGl6ZUJhclNwYWNlV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXJTdW0gPSBbMCwgMF07XG4gICAgICAgICAgICBjb25zdCBjb2RlU3VtID0gWzAsIDBdO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvbiA9IFswLCAwXTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3Rpb25SYXRpbyA9IHRoaXMuTUFYX0NPUlJFQ1RJT05fRkFDVE9SO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvblJhdGlvSW52ZXJzZSA9IDEgLyBjb3JyZWN0aW9uUmF0aW87XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJTdW1baSAlIDJdICs9IGNvdW50ZXJbaV07XG4gICAgICAgICAgICAgICAgY29kZVN1bVtpICUgMl0gKz0gY29kZVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMF0gPSBjb2RlU3VtWzBdIC8gY291bnRlclN1bVswXTtcbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMV0gPSBjb2RlU3VtWzFdIC8gY291bnRlclN1bVsxXTtcblxuICAgICAgICAgICAgY29ycmVjdGlvblswXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMF0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICAgICAgY29ycmVjdGlvblsxXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMV0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICAgICAgdGhpcy5iYXJTcGFjZVJhdGlvID0gY29ycmVjdGlvbjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbaV0gKj0gdGhpcy5iYXJTcGFjZVJhdGlvW2kgJSAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX21hdGNoUGF0dGVybihjb3VudGVyLCBjb2RlKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9maW5kUGF0dGVybihwYXR0ZXJuOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG9mZnNldD86IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbiA9IGZhbHNlLCB0cnlIYXJkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IEFycmF5PG51bWJlcj4ocGF0dGVybi5sZW5ndGgpLmZpbGwoMCk7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSB0aGlzLkFWR19DT0RFX0VSUk9SO1xuXG4gICAgICAgIGlzV2hpdGUgPSBpc1doaXRlIHx8IGZhbHNlO1xuICAgICAgICB0cnlIYXJkZXIgPSB0cnlIYXJkZXIgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSBjb3VudGVyLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBzdGFydEluZm86IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgbmFycm93QmFyV2lkdGggPSAxO1xuXG4gICAgICAgIHdoaWxlICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUQVJUX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gTWF0aC5mbG9vcigoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCkgLyA0KTtcbiAgICAgICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSBuYXJyb3dCYXJXaWR0aCAqIDEwO1xuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQoKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUT1BfUEFUVEVSTik7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHRtcCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgICAgIGVuZEluZm8uc3RhcnQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgICAgIGVuZEluZm8uZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHRtcDtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlUGFpcihjb3VudGVyUGFpcjogQXJyYXk8QXJyYXk8bnVtYmVyPj4pOiBBcnJheTxCYXJjb2RlSW5mbz4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29kZXM6IEFycmF5PEJhcmNvZGVJbmZvPiA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlclBhaXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvdW50ZXJQYWlyW2ldKTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZXM7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBBcnJheTxudW1iZXI+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZHX0NPREVfRVJST1I7XG5cbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IHRoaXMuQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCB0aGlzLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IhKSB7XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0TWF0Y2guZXJyb3IhIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8c3RyaW5nPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4pOiBBcnJheTxCYXJjb2RlSW5mbz4gfCBudWxsIHtcbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJMZW5ndGggPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJQYWlyID0gW1swLCAwLCAwLCAwLCAwXSwgWzAsIDAsIDAsIDAsIDBdXTtcbiAgICAgICAgbGV0IGNvZGVzOiBCYXJjb2RlSW5mb1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBhaXJbMF1baV0gPSBjb3VudGVyc1twb3NdICogdGhpcy5iYXJTcGFjZVJhdGlvWzBdO1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQYWlyWzFdW2ldID0gY291bnRlcnNbcG9zICsgMV0gKiB0aGlzLmJhclNwYWNlUmF0aW9bMV07XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlcyA9IHRoaXMuX2RlY29kZVBhaXIoY291bnRlclBhaXIpO1xuICAgICAgICAgICAgaWYgKCFjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGVzW2ldLmNvZGUgKyAnJyk7XG4gICAgICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2RlcztcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiAoY291bnRlcnMubGVuZ3RoICUgMTAgPT09IDApO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgdmFyIGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlUG9zaXRpb24+KCk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG4gICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kRW5kKCk7XG4gICAgICAgIGlmICghZW5kSW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3VudGVycyA9IHRoaXMuX2ZpbGxDb3VudGVycyhzdGFydEluZm8uZW5kLCBlbmRJbmZvLnN0YXJ0LCBmYWxzZSk7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5Q291bnRlckxlbmd0aChjb3VudGVycykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggJSAyICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCA8IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goZW5kSW5mbyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbzogc3RhcnRJbmZvLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEkyb2Y1UmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVQb3NpdGlvbiB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG4vKipcbiAqIFBoYXJtYWNvZGUgKFBoYXJtYWNldXRpY2FsIEJpbmFyeSBDb2RlKSBSZWFkZXJcbiAqXG4gKiBQaGFybWFjb2RlIGlzIGEgYmluYXJ5IGJhcmNvZGUgdXNlZCBpbiBwaGFybWFjZXV0aWNhbCBwYWNrYWdpbmcuXG4gKiBJdCBlbmNvZGVzIG51bWJlcnMgZnJvbSAzIHRvIDEzMTA3MCB1c2luZyBuYXJyb3cgYW5kIHdpZGUgYmFycy5cbiAqXG4gKiBFbmNvZGluZyBydWxlczpcbiAqIC0gUmVhZGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQgKGxlYXN0IHNpZ25pZmljYW50IGZpcnN0KVxuICogLSBOYXJyb3cgYmFyIGF0IHBvc2l0aW9uIGkgYWRkcyAyXmkgdG8gdGhlIHZhbHVlXG4gKiAtIFdpZGUgYmFyIGF0IHBvc2l0aW9uIGkgYWRkcyAyXihpKzEpIHRvIHRoZSB2YWx1ZVxuICogLSBCYXJzIGFyZSBzZXBhcmF0ZWQgYnkgdW5pZm9ybS13aWR0aCBzcGFjZXNcbiAqIC0gTWluaW11bSAyIGJhcnMsIG1heGltdW0gMTYgYmFyc1xuICogLSBWYWxpZCByYW5nZTogMyB0byAxMzEwNzBcbiAqXG4gKiBFeGFtcGxlOiBWYWx1ZSA3NTVcbiAqIEJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBiYXJzIChmcm9tIGxlZnQgdG8gcmlnaHQgaW4gYmFyY29kZSk6XG4gKiB3aWRlLCBuYXJyb3csIHdpZGUsIG5hcnJvdywgbmFycm93LCB3aWRlLCBuYXJyb3csIHdpZGUsIG5hcnJvd1xuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGhhcm1hY29kZVxuICovXG5cbi8vIE1pbmltdW0gbnVtYmVyIG9mIGJhcnMgaW4gYSB2YWxpZCBQaGFybWFjb2RlXG5jb25zdCBNSU5fQkFSX0NPVU5UID0gMjtcbi8vIE1heGltdW0gbnVtYmVyIG9mIGJhcnMgaW4gYSB2YWxpZCBQaGFybWFjb2RlXG5jb25zdCBNQVhfQkFSX0NPVU5UID0gMTY7XG4vLyBNaW5pbXVtIHZhbGlkIFBoYXJtYWNvZGUgdmFsdWVcbmNvbnN0IE1JTl9WQUxVRSA9IDM7XG4vLyBNYXhpbXVtIHZhbGlkIFBoYXJtYWNvZGUgdmFsdWVcbmNvbnN0IE1BWF9WQUxVRSA9IDEzMTA3MDtcblxuLy8gVGhyZXNob2xkIHJhdGlvIHRvIGRpc3Rpbmd1aXNoIG5hcnJvdyBmcm9tIHdpZGUgYmFyc1xuLy8gQSBiYXIgd2lkZXIgdGhhbiB0aGlzIHJhdGlvIG9mIHRoZSBuYXJyb3cgYmFyIHdpZHRoIGlzIGNvbnNpZGVyZWQgd2lkZVxuY29uc3QgV0lERV9CQVJfVEhSRVNIT0xEID0gMS42O1xuXG4vLyBNYXhpbXVtIGFsbG93ZWQgdmFyaWF0aW9uIGluIHNwYWNlIHdpZHRocyAoY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uKVxuLy8gUmVkdWNlZCBmcm9tIDAuNCB0byBoZWxwIHdpdGggZmFsc2UgcG9zaXRpdmVzLCBidXQgYWxsb3dpbmcgc29tZSB0b2xlcmFuY2VcbmNvbnN0IE1BWF9TUEFDRV9WQVJJQU5DRSA9IDAuMzU7XG5cbi8vIE1pbmltdW0gcXVpZXQgem9uZSByZXF1aXJlbWVudCBpbiBiYXJjb2RlIHdpZHRocyAocGhhcm1hY2V1dGljYWwgc3BlYzogNm1tIG1pbilcbi8vIFdlIHVzZSAxeCBuYXJyb3cgYmFyIHdpZHRoIGFzIGEgbWluaW11bSBxdWlldCB6b25lXG5jb25zdCBNSU5fUVVJRVRfWk9ORV9XSURUSFMgPSAxO1xuXG4vLyBBbGxvd2VkIG5hcnJvdy93aWRlIGJhciByYXRpb3MgKDE6MiwgMToyLjUsIDE6Mylcbi8vIFRoZXNlIGFyZSBtdWx0aXBsaWVycyBhcHBsaWVkIHRvIG5hcnJvdyBiYXIgd2lkdGhcbmNvbnN0IEFMTE9XRURfV0lERV9CQVJfUkFUSU9TID0gWzIuMCwgMi41LCAzLjBdO1xuY29uc3QgV0lERV9CQVJfUkFUSU9fVE9MRVJBTkNFID0gMC4wNTsgLy8gQWxsb3cgNSUgZGV2aWF0aW9uIGZyb20gdGhlIGRldGVjdGVkIHJhdGlvXG5cbmNsYXNzIFBoYXJtYWNvZGVSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAncGhhcm1hY29kZSc7XG5cbiAgICBzdGF0aWMgYWRqYWNlbnRMaW5lVmFsaWRhdGlvbk1hdGNoZXMgPSAxO1xuXG4gICAgU0lOR0xFX0NPREVfRVJST1IgPSAwLjc7XG5cbiAgICBBVkdfQ09ERV9FUlJPUiA9IDAuNDg7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBiYXJjb2RlIChmaXJzdCBibGFjayBiYXIgYWZ0ZXIgbGVhZGluZyB3aGl0ZXNwYWNlKVxuICAgICAqIFB1YmxpYyBzbyB0aGF0IGJhcmNvZGVfZGVjb2RlciBjYW4gdXNlIGl0IGZvciB0aWx0ZWQgYmFyY29kZSB2YWxpZGF0aW9uXG4gICAgICovXG4gICAgcHVibGljIF9maW5kU3RhcnQoKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIC8vIFN0cmF0ZWd5OiBzY2FuIGxlZnTihpJyaWdodDsgYWNjZXB0IHRoZSBmaXJzdCBiYXIgdGhhdDpcbiAgICAgICAgLy8gMS4gSGFzIGEgc3VmZmljaWVudCBsZWFkaW5nIHF1aWV0IHpvbmUgKOKJpSAyw5cgYmFyIHdpZHRoLCBtaW4gMjBweClcbiAgICAgICAgLy8gMi4gSXMgZm9sbG93ZWQgYnkgYW5vdGhlciBiYXIgYXQgYSByZWFzb25hYmxlIGRpc3RhbmNlICjiiaQgMTDDlyBiYXIgd2lkdGgpXG4gICAgICAgIC8vICAgIFRoaXMgcmVqZWN0cyBpc29sYXRlZCBub2lzZSBiYXJzIHN1cnJvdW5kZWQgYnkgbGFyZ2Ugd2hpdGUgc3BhY2VzLlxuXG4gICAgICAgIGNvbnN0IG1pblF1aWV0Wm9uZSA9IDIwO1xuICAgICAgICBsZXQgc2VhcmNoUG9zID0gMDtcblxuICAgICAgICB3aGlsZSAoc2VhcmNoUG9zIDwgdGhpcy5fcm93Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYmFyU3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdywgc2VhcmNoUG9zKTtcbiAgICAgICAgICAgIGlmIChiYXJTdGFydCA+PSB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vIG1vcmUgYmxhY2sgcGl4ZWxzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGlzIGJsYWNrIHJ1blxuICAgICAgICAgICAgbGV0IGJhckVuZCA9IGJhclN0YXJ0O1xuICAgICAgICAgICAgd2hpbGUgKGJhckVuZCA8IHRoaXMuX3Jvdy5sZW5ndGggJiYgdGhpcy5fcm93W2JhckVuZF0pIHtcbiAgICAgICAgICAgICAgICBiYXJFbmQrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYmFyV2lkdGggPSBiYXJFbmQgLSBiYXJTdGFydDtcblxuICAgICAgICAgICAgLy8gU2tpcCBuYXJyb3cgbm9pc2UgYmFyc1xuICAgICAgICAgICAgaWYgKGJhcldpZHRoIDwgNSkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBvcyA9IGJhckVuZCArIDE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGxlYWRpbmcgcXVpZXQgem9uZVxuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRRdWlldFpvbmUgPSBNYXRoLm1heChiYXJXaWR0aCAqIDIsIG1pblF1aWV0Wm9uZSk7XG4gICAgICAgICAgICBjb25zdCBxdWlldFpvbmVTdGFydCA9IGJhclN0YXJ0IC0gcmVxdWlyZWRRdWlldFpvbmU7XG4gICAgICAgICAgICBpZiAocXVpZXRab25lU3RhcnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoUG9zID0gYmFyRW5kICsgMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXRjaFJhbmdlKHF1aWV0Wm9uZVN0YXJ0LCBiYXJTdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQb3MgPSBiYXJFbmQgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3J3YXJkLWxvb2s6IENoZWNrIHRoYXQgdGhlIG5leHQgYmFyIGFwcGVhcnMgd2l0aGluIGEgcmVhc29uYWJsZSBkaXN0YW5jZS5cbiAgICAgICAgICAgIC8vIEEgcmVhbCBiYXJjb2RlIGhhcyBiYXJzIGZvbGxvd2VkIGJ5IG5hcnJvdyBzcGFjZXMgKDUtMTVweCksIG5vdCBodWdlIGdhcHMuXG4gICAgICAgICAgICAvLyBBbGxvdyB1cCB0byAxMMOXIGJhciB3aWR0aCBmb3IgdGhlIHNwYWNlIChiZWluZyBnZW5lcm91cyBmb3IgdmVyeSBuYXJyb3cgYmFycykuXG4gICAgICAgICAgICBjb25zdCBtYXhTcGFjZVRvTmV4dEJhciA9IE1hdGgubWF4KGJhcldpZHRoICogMTAsIDUwKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRCYXJTdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBiYXJFbmQpO1xuICAgICAgICAgICAgaWYgKG5leHRCYXJTdGFydCA+PSB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gbmV4dCBiYXI7IHRoaXMgaXMgYW4gaXNvbGF0ZWQgYmFyLCBsaWtlbHkgbm9pc2VcbiAgICAgICAgICAgICAgICBzZWFyY2hQb3MgPSBiYXJFbmQgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzcGFjZVRvTmV4dEJhciA9IG5leHRCYXJTdGFydCAtIGJhckVuZDtcbiAgICAgICAgICAgIGlmIChzcGFjZVRvTmV4dEJhciA+IG1heFNwYWNlVG9OZXh0QmFyKSB7XG4gICAgICAgICAgICAgICAgLy8gU3BhY2UgaXMgdG9vIGxhcmdlOyB0aGlzIGlzIGxpa2VseSBhbiBpc29sYXRlZCBiYXJcbiAgICAgICAgICAgICAgICBzZWFyY2hQb3MgPSBiYXJFbmQgKyAxO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogYmFyU3RhcnQsIGVuZDogYmFyRW5kIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTbW9vdGggYmFyIHdpZHRocyB0byByZWR1Y2UgZWRnZS1kZXRlY3Rpb24gaml0dGVyIGZyb20gY29sb3JlZCBiYXJjb2Rlcy5cbiAgICAgKiBBcHBsaWVzIG1lZGlhbiBmaWx0ZXIgdG8gYWRqYWNlbnQgYmFyczogaWYgYSBiYXIgaXMgMeKAkzNweCBkaWZmZXJlbnQgZnJvbSBuZWlnaGJvcnMsXG4gICAgICogc25hcCBpdCB0byB0aGUgbWVkaWFuIG9mIGxvY2FsIGJhcnMgdG8gc3RhYmlsaXplIG1lYXN1cmVtZW50cy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Ntb290aEJhcldpZHRocyhiYXJzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICAgICAgaWYgKGJhcnMubGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXJzOyAvLyBOb3QgZW5vdWdoIGJhcnMgdG8gc21vb3RoXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzbW9vdGhlZCA9IGJhcnMuc2xpY2UoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzbW9vdGhlZC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzbW9vdGhlZFtpIC0gMV07XG4gICAgICAgICAgICBjb25zdCBjdXJyID0gc21vb3RoZWRbaV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gc21vb3RoZWRbaSArIDFdO1xuXG4gICAgICAgICAgICAvLyBJZiBjdXJyZW50IGJhciBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIG5laWdoYm9ycywgc25hcCB0byBtZWRpYW5cbiAgICAgICAgICAgIGNvbnN0IG1lZGlhbiA9IFtwcmV2LCBjdXJyLCBuZXh0XS5zb3J0KChhLCBiKSA9PiBhIC0gYilbMV07XG4gICAgICAgICAgICBjb25zdCBkZXZpYXRpb24gPSBNYXRoLmFicyhjdXJyIC0gbWVkaWFuKTtcblxuICAgICAgICAgICAgLy8gSWYgZGV2aWF0aW9uIGlzIHNtYWxsICgx4oCTM3B4KSwgc25hcCB0byBtZWRpYW4gdG8gcmVkdWNlIG5vaXNlXG4gICAgICAgICAgICBpZiAoZGV2aWF0aW9uID4gMCAmJiBkZXZpYXRpb24gPD0gMykge1xuICAgICAgICAgICAgICAgIHNtb290aGVkW2ldID0gbWVkaWFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbW9vdGhlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IGFsbCBiYXIgYW5kIHNwYWNlIHdpZHRocyBmcm9tIHRoZSBwYXR0ZXJuLlxuICAgICAqIFVzZXMgcmVhbC10aW1lIHF1aWV0IHpvbmUgZGV0ZWN0aW9uIHRvIHN0b3AgZXh0cmFjdGlvbiBiZWZvcmUgcmVhY2hpbmcgaW1hZ2UgZWRnZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2V4dHJhY3RCYXJzQW5kU3BhY2VzKHN0YXJ0UG9zOiBudW1iZXIpOiB7IGJhcnM6IG51bWJlcltdLCBzcGFjZXM6IG51bWJlcltdLCBlbmQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGJhcnM6IG51bWJlcltdID0gW107XG4gICAgICAgIGNvbnN0IHNwYWNlczogbnVtYmVyW10gPSBbXTtcblxuICAgICAgICBsZXQgcG9zID0gc3RhcnRQb3M7XG4gICAgICAgIGxldCBjdXJyZW50V2lkdGggPSAwO1xuICAgICAgICBsZXQgZm91bmRUcmFpbGluZ1F1aWV0Wm9uZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgZmlyc3QgYmFyXG4gICAgICAgIHdoaWxlIChwb3MgPCB0aGlzLl9yb3cubGVuZ3RoICYmIHRoaXMuX3Jvd1twb3NdKSB7XG4gICAgICAgICAgICBjdXJyZW50V2lkdGgrKztcbiAgICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50V2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJhcnMucHVzaChjdXJyZW50V2lkdGgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgZmlyc3Qgc3BhY2UgKG5lZWRlZCB0byBlc3RhYmxpc2ggc3BhY2Ugd2lkdGggYW5kIGVzdGltYXRlIG5hcnJvdyBiYXIpXG4gICAgICAgIGN1cnJlbnRXaWR0aCA9IDA7XG4gICAgICAgIHdoaWxlIChwb3MgPCB0aGlzLl9yb3cubGVuZ3RoICYmICF0aGlzLl9yb3dbcG9zXSkge1xuICAgICAgICAgICAgY3VycmVudFdpZHRoKys7XG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VycmVudFdpZHRoID09PSAwIHx8IHBvcyA+PSB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gc3BhY2UgYWZ0ZXIgZmlyc3QgYmFyLCBvciBoaXQgZWRnZVxuICAgICAgICB9XG4gICAgICAgIHNwYWNlcy5wdXNoKGN1cnJlbnRXaWR0aCk7XG5cbiAgICAgICAgLy8gRXN0aW1hdGUgbmFycm93IGJhciB3aWR0aCBmb3IgcXVpZXQgem9uZSBkZXRlY3Rpb25cbiAgICAgICAgLy8gSWYgZmlyc3QgYmFyIDwgZmlyc3Qgc3BhY2UsIGFzc3VtZSBmaXJzdCBiYXIgaXMgbmFycm93XG4gICAgICAgIC8vIE90aGVyd2lzZSwgZXN0aW1hdGUgbmFycm93IGZyb20gc3BhY2UgKHNwYWNlIOKJiCAxLjI1ICogbmFycm93KVxuICAgICAgICBjb25zdCBlc3RpbWF0ZWROYXJyb3dXaWR0aCA9IGJhcnNbMF0gPCBzcGFjZXNbMF0gPyBiYXJzWzBdIDogc3BhY2VzWzBdICogMC44O1xuXG4gICAgICAgIC8vIFBoYXJtYWNldXRpY2FsIHNwZWM6IHF1aWV0IHpvbmUgbXVzdCBiZSA+PSA2bW0g4omIIDZ4IG5hcnJvdyBiYXIgKHN0cmljdClcbiAgICAgICAgY29uc3Qgc3RyaWN0UXVpZXRab25lID0gZXN0aW1hdGVkTmFycm93V2lkdGggKiA2O1xuICAgICAgICAvLyBBZGFwdGl2ZSBxdWlldCB6b25lOiAyLjV4IHRoZSB0eXBpY2FsIGludGVyLWJhciBzcGFjZSB3aWR0aFxuICAgICAgICAvLyBUaGlzIHNob3VsZCBjYXRjaCBsZWdpdGltYXRlIHF1aWV0IHpvbmVzIHdoaWxlIGF2b2lkaW5nIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgICBsZXQgYWRhcHRpdmVRdWlldFpvbmUgPSBzcGFjZXNbMF0gKiAyLjU7XG5cbiAgICAgICAgLy8gQ29udGludWUgZXh0cmFjdGluZyBhbHRlcm5hdGluZyBiYXJzIGFuZCBzcGFjZXNcbiAgICAgICAgLy8gU3RvcCBCRUZPUkUgcmVhY2hpbmcgTUFYX0JBUl9DT1VOVCsxIHRvIGF2b2lkIGV4dHJhY3RpbmcgdG9vIG1hbnkgYmFyc1xuICAgICAgICB3aGlsZSAocG9zIDwgdGhpcy5fcm93Lmxlbmd0aCAmJiBiYXJzLmxlbmd0aCA8IE1BWF9CQVJfQ09VTlQpIHtcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgYmFyXG4gICAgICAgICAgICBjdXJyZW50V2lkdGggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IHRoaXMuX3Jvdy5sZW5ndGggJiYgdGhpcy5fcm93W3Bvc10pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGgrKztcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50V2lkdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIGVuZCBvZiBiYXJjb2RlIChubyBtb3JlIGJhcnMpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiYXJzLnB1c2goY3VycmVudFdpZHRoKTtcblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBzcGFjZVxuICAgICAgICAgICAgY3VycmVudFdpZHRoID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlU3RhcnQgPSBwb3M7XG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgdGhpcy5fcm93Lmxlbmd0aCAmJiAhdGhpcy5fcm93W3Bvc10pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGgrKztcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIE5vIHNwYWNlIGFmdGVyIHRoaXMgYmFyIC0gYmFyY29kZSBlbmRlZFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHNwYWNlIGlzIGEgcXVpZXQgem9uZSAoc3RyaWN0IHBoYXJtYWNldXRpY2FsIHNwZWMpXG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoID49IHN0cmljdFF1aWV0Wm9uZSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIHN0cmljdCB0cmFpbGluZyBxdWlldCB6b25lIC0gc3RvcCBleHRyYWN0aW9uIGhlcmVcbiAgICAgICAgICAgICAgICBmb3VuZFRyYWlsaW5nUXVpZXRab25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3MgPSBzcGFjZVN0YXJ0OyAvLyBSZXNldCBwb3MgdG8gc3RhcnQgb2YgcXVpZXQgem9uZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGFwdGl2ZSBxdWlldCB6b25lOiBpZiB0aGlzIHNwYWNlIGlzIHNpZ25pZmljYW50bHkgbGFyZ2VyIHRoYW4gbm9ybWFsIGludGVyLWJhciBzcGFjZXNcbiAgICAgICAgICAgIC8vICgyeCBvciBtb3JlKSwgdHJlYXQgaXQgYXMgYSBxdWlldCB6b25lXG4gICAgICAgICAgICBpZiAoYmFycy5sZW5ndGggPj0gTUlOX0JBUl9DT1VOVCAmJiBjdXJyZW50V2lkdGggPj0gYWRhcHRpdmVRdWlldFpvbmUpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFRyYWlsaW5nUXVpZXRab25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3MgPSBzcGFjZVN0YXJ0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoaXQgdGhlIGltYWdlIGVkZ2Ugd2hpbGUgY291bnRpbmcgdGhpcyBzcGFjZVxuICAgICAgICAgICAgaWYgKHBvcyA+PSB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gSGl0IGltYWdlIGVkZ2Ugd2hpbGUgaW4gd2hpdGVzcGFjZSAtIHRyZWF0IGFzIGluZmluaXRlIHF1aWV0IHpvbmVcbiAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlLCB3aGljaCBjb3VudHMgYXMgYW4gaW1wbGljaXQgcXVpZXQgem9uZVxuICAgICAgICAgICAgICAgIGZvdW5kVHJhaWxpbmdRdWlldFpvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBvcyA9IHNwYWNlU3RhcnQ7IC8vIFJlc2V0IHRvIHN0YXJ0IG9mIHF1aWV0IHpvbmVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5vcm1hbCBpbnRlci1iYXIgc3BhY2VcbiAgICAgICAgICAgIHNwYWNlcy5wdXNoKGN1cnJlbnRXaWR0aCk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBhZGFwdGl2ZSBxdWlldCB6b25lIGJhc2VkIG9uIGF2ZXJhZ2Ugc3BhY2Ugd2lkdGhcbiAgICAgICAgICAgIC8vIEEgcXVpZXQgem9uZSBzaG91bGQgYmUgYXQgbGVhc3QgMnggdGhlIGF2ZXJhZ2UgaW50ZXItYmFyIHNwYWNlXG4gICAgICAgICAgICBpZiAoc3BhY2VzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXZnU3BhY2UgPSBzcGFjZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBzcGFjZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGFkYXB0aXZlUXVpZXRab25lID0gYXZnU3BhY2UgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgZXhpdGVkIHRoZSBsb29wIHdpdGhvdXQgZmluZGluZyBhIHRyYWlsaW5nIHF1aWV0IHpvbmUsIGJhcmNvZGUgaXMgaW52YWxpZFxuICAgICAgICAvLyAoVGhpcyBjYXRjaGVzIGJhcmNvZGVzIHRoYXQgZW5kIGV4YWN0bHkgYXQgdGhlIGltYWdlIGVkZ2UpXG4gICAgICAgIGlmICghZm91bmRUcmFpbGluZ1F1aWV0Wm9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBiYXIgY291bnRcbiAgICAgICAgaWYgKGJhcnMubGVuZ3RoIDwgTUlOX0JBUl9DT1VOVCB8fCBiYXJzLmxlbmd0aCA+IE1BWF9CQVJfQ09VTlQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgKG4tMSkgc3BhY2VzIGZvciBuIGJhcnNcbiAgICAgICAgaWYgKHNwYWNlcy5sZW5ndGggIT09IGJhcnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHNwYWNlcyBhcmUgdW5pZm9ybSAocGhhcm1hY29kZSByZXF1aXJlbWVudClcbiAgICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZVNwYWNlcyhzcGFjZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgYmFycyBoYXZlIGF0IG1vc3QgMiBkaXN0aW5jdCBzaXplcyAobmFycm93IGFuZC9vciB3aWRlKVxuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlQmFyU2l6ZUNvdW50KGJhcnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNtb290aGluZyB0byByZWR1Y2UgZWRnZS1kZXRlY3Rpb24gaml0dGVyIG9uIGNvbG9yZWQgYmFyY29kZXNcbiAgICAgICAgY29uc3Qgc21vb3RoZWRCYXJzID0gdGhpcy5fc21vb3RoQmFyV2lkdGhzKGJhcnMpO1xuXG4gICAgICAgIHJldHVybiB7IGJhcnM6IHNtb290aGVkQmFycywgc3BhY2VzLCBlbmQ6IHBvcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHRoYXQgYmFycyBoYXZlIGF0IG1vc3QgMiBkaXN0aW5jdCBzaXplcyAobmFycm93IGFuZC9vciB3aWRlKS5cbiAgICAgKiBQaGFybWFjb2RlIGJhcnMgbXVzdCBiZSBlaXRoZXIgYWxsIG9uZSBzaXplLCBvciB0d28gc2l6ZXMgKG5hcnJvdyArIHdpZGUpLlxuICAgICAqIElmIDMrIGRpc3RpbmN0IHNpemVzIGRldGVjdGVkLCB0aGlzIGlzIG5vdCBhIHZhbGlkIHBoYXJtYWNvZGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWxpZGF0ZUJhclNpemVDb3VudChiYXJzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoYmFycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsdXN0ZXIgYmFycyBpbnRvIHNpemUgZ3JvdXBzIHdpdGggMzUlIHRvbGVyYW5jZSB0byBoYW5kbGUgZWRnZS1kZXRlY3Rpb24gaml0dGVyXG4gICAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgdG9sZXJhbmNlIHVzZWQgZm9yIHNwYWNlIHZhbGlkYXRpb24gKENWIDw9IDAuMzUpXG4gICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IDAuMzU7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzOiBudW1iZXJbXVtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBiYXIgb2YgYmFycykge1xuICAgICAgICAgICAgbGV0IGZvdW5kQ2x1c3RlciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2x1c3RlckF2ZyA9IGNsdXN0ZXIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBjbHVzdGVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoYmFyIC0gY2x1c3RlckF2ZykgPD0gY2x1c3RlckF2ZyAqIHRvbGVyYW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnB1c2goYmFyKTtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRDbHVzdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmb3VuZENsdXN0ZXIpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKFtiYXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE11c3QgaGF2ZSBleGFjdGx5IDEgb3IgMiBjbHVzdGVycyAobm90IDMrKVxuICAgICAgICBpZiAoY2x1c3RlcnMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgc3BhY2Ugd2lkdGhzIGFyZSB1bmlmb3JtIGVub3VnaCBmb3IgYSB2YWxpZCBQaGFybWFjb2RlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWxpZGF0ZVNwYWNlcyhzcGFjZXM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gU2luZ2xlIGJhciAodGhvdWdoIGludmFsaWQgZm9yIFBoYXJtYWNvZGUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZWFuID0gc3BhY2VzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gc3BhY2VzLmxlbmd0aDtcbiAgICAgICAgaWYgKG1lYW4gPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBjb2VmZmljaWVudCBvZiB2YXJpYXRpb25cbiAgICAgICAgY29uc3QgdmFyaWFuY2UgPSBzcGFjZXMucmVkdWNlKChzdW0sIHMpID0+IHN1bSArIE1hdGgucG93KHMgLSBtZWFuLCAyKSwgMCkgLyBzcGFjZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBzdGREZXYgPSBNYXRoLnNxcnQodmFyaWFuY2UpO1xuICAgICAgICBjb25zdCBjdiA9IHN0ZERldiAvIG1lYW47XG5cbiAgICAgICAgcmV0dXJuIGN2IDw9IE1BWF9TUEFDRV9WQVJJQU5DRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSB0aGF0IG5hcnJvdyBhbmQgd2lkZSBiYXJzIGZvbGxvdyBhIGNvbnNpc3RlbnQgcmF0aW8gKDE6MiwgMToyLjUsIG9yIDE6MylcbiAgICAgKiBUaGlzIGlzIGEgc3BlYyByZXF1aXJlbWVudCBmb3IgcGhhcm1hY29kZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRlQmFyUmF0aW9zKGJhcnM6IG51bWJlcltdLCBzcGFjZXM6IG51bWJlcltdKTogeyBuYXJyb3dXaWR0aDogbnVtYmVyLCB3aWRlUmF0aW86IG51bWJlciB9IHwgbnVsbCB7XG4gICAgICAgIC8vIElmIGFsbCBiYXJzIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSB3aWR0aCAobG93IHZhcmlhbmNlKSwgbmVlZCB0byBkZXRlcm1pbmUgaWYgbmFycm93IG9yIHdpZGVcbiAgICAgICAgY29uc3QgYXZnQWxsID0gYmFycy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIGJhcnMubGVuZ3RoO1xuICAgICAgICBjb25zdCB2YXJBbGwgPSBiYXJzLnJlZHVjZSgoYSwgYikgPT4gYSArIE1hdGguYWJzKGIgLSBhdmdBbGwpLCAwKSAvIGJhcnMubGVuZ3RoO1xuICAgICAgICBjb25zdCBjdkFsbCA9IGF2Z0FsbCA9PT0gMCA/IDAgOiB2YXJBbGwgLyBhdmdBbGw7XG5cbiAgICAgICAgaWYgKGN2QWxsIDw9IDAuMSkge1xuICAgICAgICAgICAgLy8gTG93IHZhcmlhbmNlOiBjb3VsZCBiZSBhbGwtbmFycm93IG9yIGFsbC13aWRlXG4gICAgICAgICAgICAvLyBVc2Ugc3BhY2Ugd2lkdGhzIGFzIGEgaGludDogc3BhY2VzIHNob3VsZCBiZSB+MS4yNXggdGhlIG5hcnJvdyBiYXIgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NwYWNlID0gc3BhY2VzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgIChzcGFjZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBzcGFjZXMubGVuZ3RoKSA6XG4gICAgICAgICAgICAgICAgMDtcblxuICAgICAgICAgICAgaWYgKGF2Z1NwYWNlID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwYWNlVG9CYXJSYXRpbyA9IGF2Z1NwYWNlIC8gYXZnQWxsO1xuICAgICAgICAgICAgICAgIC8vIElmIHNwYWNlcyBhcmUgbXVjaCBzbWFsbGVyIHRoYW4gYmFycywgYmFycyBhcmUgbGlrZWx5IHdpZGUgKHJhdGlvIHNob3VsZCBiZSB+MC4zLTAuNSlcbiAgICAgICAgICAgICAgICAvLyBJZiBzcGFjZXMgYXJlIGNvbXBhcmFibGUgdG8gYmFycyBvciBsYXJnZXIsIGJhcnMgYXJlIGxpa2VseSBuYXJyb3cgKHJhdGlvIHNob3VsZCBiZSB+MS4wLTEuNSlcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2VUb0JhclJhdGlvIDwgMC43KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJhcnMgYXJlIGxpa2VseSB3aWRlOyBpbmZlciBuYXJyb3cgd2lkdGggZnJvbSB0aGVtXG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgY2xvc2VzdCBhbGxvd2VkIHJhdGlvXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZmVycmVkTmFycm93ID0gYXZnQWxsIC8gMi41OyAvLyBUcnkgbWlkZGxlIHJhdGlvIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hcnJvd1dpZHRoOiBpbmZlcnJlZE5hcnJvdywgd2lkZVJhdGlvOiAyLjUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQ6IHRyZWF0IGFzIGFsbC1uYXJyb3dcbiAgICAgICAgICAgIHJldHVybiB7IG5hcnJvd1dpZHRoOiBhdmdBbGwsIHdpZGVSYXRpbzogMi4wIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbG9yZSBtdWx0aXBsZSBwb3NzaWJsZSB0aHJlc2hvbGRzIChtaWRwb2ludHMgYmV0d2VlbiBzb3J0ZWQgdW5pcXVlIHdpZHRocylcbiAgICAgICAgLy8gYW5kIHBpY2sgdGhlIG9uZSB0aGF0IGJlc3QgbWF0Y2hlcyBhbiBhbGxvd2VkIHJhdGlvIHdpdGggbG93IHBlci1iYXIgZGV2aWF0aW9uLlxuICAgICAgICBjb25zdCBzb3J0ZWRVbmlxdWUgPSBBcnJheS5mcm9tKG5ldyBTZXQoYmFycy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSkpO1xuICAgICAgICBpZiAoc29ydGVkVW5pcXVlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIC8vIEFsbCBiYXJzIGlkZW50aWNhbDogdHJlYXQgYXMgc2luZ2xlLXdpZHRoICh2YWxpZCBwaGFybWFjb2RlIG9mIGFsbCBuYXJyb3cgb3IgYWxsIHdpZGUpXG4gICAgICAgICAgICBjb25zdCBhdmdXaWR0aCA9IGJhcnMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBiYXJzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB7IG5hcnJvd1dpZHRoOiBhdmdXaWR0aCwgd2lkZVJhdGlvOiAyLjAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgQ2FuZGlkYXRlID0ge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgICAgICAgICBuYXJyb3dCYXJzOiBudW1iZXJbXTtcbiAgICAgICAgICAgIHdpZGVCYXJzOiBudW1iZXJbXTtcbiAgICAgICAgICAgIGF2Z046IG51bWJlcjtcbiAgICAgICAgICAgIGF2Z1c6IG51bWJlcjtcbiAgICAgICAgICAgIHJhdGlvOiBudW1iZXI7XG4gICAgICAgICAgICByYXRpb0RpZmY6IG51bWJlcjtcbiAgICAgICAgICAgIG1hdGNoZWRSYXRpbzogbnVtYmVyO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXM6IENhbmRpZGF0ZVtdID0gW107XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgY2FuZGlkYXRlIHRocmVzaG9sZHMgYXQgbWlkcG9pbnRzIGJldHdlZW4gY29uc2VjdXRpdmUgdW5pcXVlIHdpZHRoc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZFVuaXF1ZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAoc29ydGVkVW5pcXVlW2ldICsgc29ydGVkVW5pcXVlW2kgKyAxXSkgLyAyO1xuICAgICAgICAgICAgY29uc3QgbjogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHc6IG51bWJlcltdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYmFycykge1xuICAgICAgICAgICAgICAgIGlmIChiIDwgdCkge1xuICAgICAgICAgICAgICAgICAgICBuLnB1c2goYik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdy5wdXNoKGIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAwIHx8IHcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5lZWQgYm90aCBncm91cHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXZnTiA9IG4ucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBuLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1cgPSB3LnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCByYXRpbyA9IGF2Z1cgLyBhdmdOO1xuXG4gICAgICAgICAgICAvLyBGaW5kIGNsb3Nlc3QgYWxsb3dlZCByYXRpb1xuICAgICAgICAgICAgbGV0IGJlc3RSYXRpbyA9IEFMTE9XRURfV0lERV9CQVJfUkFUSU9TWzBdO1xuICAgICAgICAgICAgbGV0IGJlc3REaWZmID0gTWF0aC5hYnMocmF0aW8gLSBiZXN0UmF0aW8pO1xuICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIEFMTE9XRURfV0lERV9CQVJfUkFUSU9TKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IE1hdGguYWJzKHJhdGlvIC0gcik7XG4gICAgICAgICAgICAgICAgaWYgKGQgPCBiZXN0RGlmZikge1xuICAgICAgICAgICAgICAgICAgICBiZXN0RGlmZiA9IGQ7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RSYXRpbyA9IHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogdCxcbiAgICAgICAgICAgICAgICBuYXJyb3dCYXJzOiBuLFxuICAgICAgICAgICAgICAgIHdpZGVCYXJzOiB3LFxuICAgICAgICAgICAgICAgIGF2Z04sXG4gICAgICAgICAgICAgICAgYXZnVyxcbiAgICAgICAgICAgICAgICByYXRpbyxcbiAgICAgICAgICAgICAgICByYXRpb0RpZmY6IGJlc3REaWZmLFxuICAgICAgICAgICAgICAgIG1hdGNoZWRSYXRpbzogYmVzdFJhdGlvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGNhbmRpZGF0ZXMgYnkgaG93IGNsb3NlIHRoZSByYXRpbyBpcyB0byBhbGxvd2VkIHJhdGlvc1xuICAgICAgICBjYW5kaWRhdGVzLnNvcnQoKGEsIGIpID0+IGEucmF0aW9EaWZmIC0gYi5yYXRpb0RpZmYpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayByYXRpbyB3aXRoaW4gdG9sZXJhbmNlXG4gICAgICAgICAgICBjb25zdCB0b2xlcmFuY2UgPSBjLm1hdGNoZWRSYXRpbyAqIFdJREVfQkFSX1JBVElPX1RPTEVSQU5DRTtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjLnJhdGlvIC0gYy5tYXRjaGVkUmF0aW8pID4gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFBlci1iYXIgY29uc2lzdGVuY3kgY2hlY2tzXG4gICAgICAgICAgICAvLyBVc2UgMTUlIHRvbGVyYW5jZSBpbnN0ZWFkIG9mIDMwJSB0byByZWplY3QgYmFycyB3aXRoIHRvbyBtdWNoIHdpZHRoIHZhcmlhdGlvblxuICAgICAgICAgICAgLy8gUmVhbCBwaGFybWFjb2RlcyBoYXZlIGNvbnNpc3RlbnQgYmFyIHdpZHRoczsgdGlsdGVkL2N1cnZlZCBvbmVzIHNob3cgdmFyaWF0aW9uXG4gICAgICAgICAgICBjb25zdCBuYXJyb3dUb2xlcmFuY2UgPSBjLmF2Z04gKiAwLjE1O1xuICAgICAgICAgICAgY29uc3Qgd2lkZVRvbGVyYW5jZSA9IGMuYXZnVyAqIDAuMTU7XG4gICAgICAgICAgICBsZXQgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBiIG9mIGMubmFycm93QmFycykge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhiIC0gYy5hdmdOKSA+IG5hcnJvd1RvbGVyYW5jZSkgeyBvayA9IGZhbHNlOyBicmVhazsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvaykgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYy53aWRlQmFycykge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhiIC0gYy5hdmdXKSA+IHdpZGVUb2xlcmFuY2UpIHsgb2sgPSBmYWxzZTsgYnJlYWs7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb2spIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBBY2NlcHQgZmlyc3QgdmlhYmxlIGNhbmRpZGF0ZSAoY2xvc2VzdCByYXRpbylcbiAgICAgICAgICAgIHJldHVybiB7IG5hcnJvd1dpZHRoOiBjLmF2Z04sIHdpZGVSYXRpbzogYy5tYXRjaGVkUmF0aW8gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIHBlcmlvZGljaXR5IG9mIGJhciBhbmQgc3BhY2Ugd2lkdGhzXG4gICAgICogUmVhbCBwaGFybWFjb2RlcyBoYXZlIGNvbnNpc3RlbnQgYmFyL3NwYWNlIHdpZHRocyB3aXRoIGxvdyB2YXJpYXRpb25cbiAgICAgKiBUaWx0ZWQgYmFyY29kZXMgY3JlYXRlIHZhcnlpbmcgd2lkdGhzIGR1ZSB0byBhbmdsZS1kZXBlbmRlbnQgY3Jvc3Mtc2VjdGlvbnNcbiAgICAgKiBVc2VzIGNvZWZmaWNpZW50IG9mIHZhcmlhdGlvbiAoQ1YgPSBzdGREZXYgLyBtZWFuKSB0byBkZXRlY3QgdGhpc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdGVQZXJpb2RpY2l0eShiYXJzOiBudW1iZXJbXSwgc3BhY2VzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBDYWxjdWxhdGUgY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uIGZvciBiYXJzXG4gICAgICAgIGlmIChiYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJhck1lYW4gPSBiYXJzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gYmFycy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBiYXJWYXJpYW5jZSA9IGJhcnMucmVkdWNlKChhLCBiKSA9PiBhICsgTWF0aC5wb3coYiAtIGJhck1lYW4sIDIpLCAwKSAvIGJhcnMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYmFyU3RkRGV2ID0gTWF0aC5zcXJ0KGJhclZhcmlhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGJhckNWID0gYmFyTWVhbiAhPT0gMCA/IGJhclN0ZERldiAvIGJhck1lYW4gOiAwO1xuXG4gICAgICAgICAgICAvLyBSZWplY3QgaWYgYmFyIENWIGlzIHRvbyBoaWdoIChpbmRpY2F0ZXMgdGlsdGVkL2N1cnZlZCBiYXJjb2RlIHdpdGggdmFyeWluZyBjcm9zcy1zZWN0aW9ucylcbiAgICAgICAgICAgIC8vIFRocmVzaG9sZCBvZiAwLjY1IGFsbG93cyBmb3IgcmVhc29uYWJsZSB2YXJpYXRpb24gaW4gdmFsaWQgY29kZXMgd2hpbGUgc3RpbGwgY2F0Y2hpbmcgc2V2ZXJlIG1pc2FsaWdubWVudHNcbiAgICAgICAgICAgIGlmIChiYXJDViA+IDAuNjUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uIGZvciBzcGFjZXNcbiAgICAgICAgaWYgKHNwYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzcGFjZU1lYW4gPSBzcGFjZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBzcGFjZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3Qgc3BhY2VWYXJpYW5jZSA9IHNwYWNlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBNYXRoLnBvdyhiIC0gc3BhY2VNZWFuLCAyKSwgMCkgLyBzcGFjZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3Qgc3BhY2VTdGREZXYgPSBNYXRoLnNxcnQoc3BhY2VWYXJpYW5jZSk7XG4gICAgICAgICAgICBjb25zdCBzcGFjZUNWID0gc3BhY2VNZWFuICE9PSAwID8gc3BhY2VTdGREZXYgLyBzcGFjZU1lYW4gOiAwO1xuXG4gICAgICAgICAgICAvLyBSZWplY3QgaWYgc3BhY2UgQ1YgaXMgdG9vIGhpZ2hcbiAgICAgICAgICAgIGlmIChzcGFjZUNWID4gMC41NSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmeSB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcXVpZXQgem9uZSBhdCBzdGFydCBhbmQgZW5kXG4gICAgICogV2hlbiBhcmVhIGNvbnN0cmFpbnRzIGFyZSB1c2VkLCB0aGUgcXVpZXQgem9uZSBtYXkgYmUgdHJ1bmNhdGVkLFxuICAgICAqIHNvIHdlIGNoZWNrIGlmIHdlIGhhdmUgYXQgbGVhc3QgU09NRSBxdWlldCB6b25lIG9yIGhpdCB0aGUgc2NhbiBib3VuZGFyeVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfdmFsaWRhdGVRdWlldFpvbmVzKHN0YXJ0SW5mbzogQmFyY29kZVBvc2l0aW9uLCBuYXJyb3dXaWR0aDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBtaW5RdWlldFpvbmUgPSBuYXJyb3dXaWR0aCAqIE1JTl9RVUlFVF9aT05FX1dJRFRIUztcblxuICAgICAgICAvLyBDaGVjayBsZWFkaW5nIHF1aWV0IHpvbmVcbiAgICAgICAgLy8gSWYgd2UncmUgdmVyeSBjbG9zZSB0byB0aGUgc3RhcnQgKHdpdGhpbiAyIHBpeGVscyksIHdlIGxpa2VseSBoaXQgdGhlIGFyZWEgYm91bmRhcnlcbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCBhY2NlcHQgaXQgYXMgd2UgY2FuJ3QgdmVyaWZ5IHRoZSBxdWlldCB6b25lXG4gICAgICAgIGlmIChzdGFydEluZm8uc3RhcnQgPj0gMiAmJiBzdGFydEluZm8uc3RhcnQgPCBtaW5RdWlldFpvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRyYWlsaW5nIHF1aWV0IHpvbmVcbiAgICAgICAgLy8gSWYgd2UncmUgYXQgb3IgdmVyeSBjbG9zZSB0byB0aGUgZW5kIG9mIHRoZSByb3csIHdlIGxpa2VseSBoaXQgdGhlIGFyZWEgYm91bmRhcnlcbiAgICAgICAgLy8gSW4gcmVhbCBleHRyYWN0ZWQgaW1hZ2VzLCBlc3BlY2lhbGx5IHdpdGggcmVzaXppbmcsIHdlIG1heSBub3QgaGF2ZSBwZXJmZWN0IHF1aWV0IHpvbmVzXG4gICAgICAgIC8vIFNvIHdlIGFjY2VwdCBpdCBpZiB3ZSdyZSB3aXRoaW4gNiBwaXhlbHMgb2YgdGhlIGVuZCAoc2NhbiBib3VuZGFyeSlcbiAgICAgICAgY29uc3QgcmVtYWluaW5nU3BhY2UgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kO1xuXG4gICAgICAgIC8vIElmIHdlJ3JlIHZlcnkgY2xvc2UgdG8gdGhlIGVkZ2UgKDwgNnB4KSwgd2UgaGl0IHRoZSBzY2FuIGJvdW5kYXJ5IC0gYWNjZXB0IGl0XG4gICAgICAgIGlmIChyZW1haW5pbmdTcGFjZSA8IDYpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCA2cHggb2YgdHJhaWxpbmcgc3BhY2UgLSBjaGVjayBpZiBpdCBtZWV0cyBtaW5pbXVtIHF1aWV0IHpvbmUgcmVxdWlyZW1lbnRcbiAgICAgICAgaWYgKHJlbWFpbmluZ1NwYWNlIDwgbWluUXVpZXRab25lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzc2lmeSBiYXJzIGFzIG5hcnJvdyBvciB3aWRlIGFuZCBkZWNvZGUgdGhlIHZhbHVlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVCYXJzKGJhcnM6IG51bWJlcltdLCBuYXJyb3dXaWR0aD86IG51bWJlcik6IHsgdmFsdWU6IG51bWJlciwgcGF0dGVybjogc3RyaW5nIH0gfCBudWxsIHtcbiAgICAgICAgLy8gVXNlIHByb3ZpZGVkIG5hcnJvd1dpZHRoIGlmIGF2YWlsYWJsZSAoZnJvbSBfdmFsaWRhdGVCYXJSYXRpb3MgaW5mZXJlbmNlKVxuICAgICAgICAvLyBPdGhlcndpc2UsIGZpbmQgdGhlIG1pbmltdW0gYmFyIHdpZHRoIChsaWtlbHkgbmFycm93IGJhcilcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSBuYXJyb3dXaWR0aCA/PyBNYXRoLm1pbiguLi5iYXJzKTtcblxuICAgICAgICAvLyBJZiBhbGwgYmFycyBhcmUgc2ltaWxhciB3aWR0aCwgaXQgbWlnaHQgYmUgYSB2YWxpZCBQaGFybWFjb2RlIHdpdGggYWxsIG5hcnJvdyBvciBhbGwgd2lkZSBiYXJzXG4gICAgICAgIC8vIEJ1dCB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgdGhyZXNob2xkXG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IG1pbldpZHRoICogV0lERV9CQVJfVEhSRVNIT0xEO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgUGhhcm1hY29kZSB2YWx1ZSB1c2luZyB0aGUgY29ycmVjdCBhbGdvcml0aG1cbiAgICAgICAgLy8gUG9zaXRpb24gbiBzdGFydHMgYXQgMCBvbiB0aGUgUklHSFQgKGxhc3QgYmFyIGluIGFycmF5KVxuICAgICAgICAvLyBOYXJyb3cgYmFyIGF0IHBvc2l0aW9uIG4gYWRkcyAyXm5cbiAgICAgICAgLy8gV2lkZSBiYXIgYXQgcG9zaXRpb24gbiBhZGRzIDJeKG4rMSlcbiAgICAgICAgbGV0IHZhbHVlID0gMDtcblxuICAgICAgICAvLyBSZXZlcnNlIGJhcnMgdG8gcHJvY2VzcyByaWdodC10by1sZWZ0XG4gICAgICAgIGNvbnN0IHJldmVyc2VkQmFycyA9IGJhcnMuc2xpY2UoKS5yZXZlcnNlKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXZlcnNlZEJhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlzV2lkZSA9IHJldmVyc2VkQmFyc1tpXSA+IHRocmVzaG9sZDtcbiAgICAgICAgICAgIGlmIChpc1dpZGUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSBNYXRoLnBvdygyLCBpICsgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IE1hdGgucG93KDIsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgaHVtYW4tcmVhZGFibGUgYmFyIHBhdHRlcm4gZm9yIGRlYnVnZ2luZ1xuICAgICAgICBsZXQgcGF0dGVybiA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gcmV2ZXJzZWRCYXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBwYXR0ZXJuICs9IHJldmVyc2VkQmFyc1tpXSA+IHRocmVzaG9sZCA/ICdXJyA6ICdOJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHZhbHVlLCBwYXR0ZXJuIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZ5IHRyYWlsaW5nIHdoaXRlc3BhY2UgKHF1aWV0IHpvbmUpXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kOiBudW1iZXIsIGJhcldpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kID0gTWF0aC5taW4oZW5kICsgYmFyV2lkdGggKiAyLCB0aGlzLl9yb3cubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hdGNoUmFuZ2UoZW5kLCB0cmFpbGluZ1doaXRlc3BhY2VFbmQsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIHBhdHRlcm4gY29uc2lzdGVuY3k6IGV4dHJhY3QgYmFycyBmcm9tIHNsaWdodGx5IHNoaWZ0ZWQgcG9zaXRpb25zLlxuICAgICAqIFJlYWwgYmFyY29kZXMgc2hvdWxkIHByb2R1Y2UgY29uc2lzdGVudCBiYXIgcGF0dGVybnMgZXZlbiB3aXRoIHNtYWxsIHNoaWZ0cy5cbiAgICAgKiBUZXh0IHBhdHRlcm5zIGFyZSB0eXBpY2FsbHkgZWRnZS1iYXNlZCBhbmQgd2lsbCBicmVhayB3aXRoIGEgc21hbGwgc2hpZnQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92YWxpZGF0ZVBhdHRlcm5Db25zaXN0ZW5jeShzdGFydEluZm86IEJhcmNvZGVQb3NpdGlvbiwgYmFyczogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IHN0YXJ0SW5mby5zdGFydDtcbiAgICAgICAgbGV0IGNvbnNpc3RlbnRPZmZzZXRzID0gMDtcbiAgICAgICAgbGV0IHRvdGFsQ2hlY2tzID0gMDtcblxuICAgICAgICAvLyBDaGVjayBwb3NpdGlvbnMgb2Zmc2V0IGJ5IMKxMSBhbmQgwrEyIHBpeGVscyAoc2ltdWxhdGUgc2Nhbm5pbmcgbGluZXMgbmVhcmJ5KVxuICAgICAgICBmb3IgKGNvbnN0IG9mZnNldCBvZiBbLTIsIC0xLCAxLCAyXSkge1xuICAgICAgICAgICAgY29uc3Qgc2hpZnRlZFN0YXJ0ID0gb3JpZ2luYWxTdGFydCArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChzaGlmdGVkU3RhcnQgPCAwIHx8IHNoaWZ0ZWRTdGFydCA+PSB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsQ2hlY2tzKys7XG5cbiAgICAgICAgICAgIC8vIFRyeSB0byBleHRyYWN0IGJhcnMgZnJvbSBzaGlmdGVkIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBzaGlmdGVkRXh0cmFjdGVkID0gdGhpcy5fZXh0cmFjdEJhcnNBbmRTcGFjZXMoc2hpZnRlZFN0YXJ0KTtcbiAgICAgICAgICAgIGlmICghc2hpZnRlZEV4dHJhY3RlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBnb3QgYmFycyBhbmQgdGhleSBtYXRjaCBpbiBjb3VudCwgaXQncyBtb3JlIGxpa2VseSBhIHJlYWwgYmFyY29kZVxuICAgICAgICAgICAgaWYgKHNoaWZ0ZWRFeHRyYWN0ZWQuYmFycy5sZW5ndGggPT09IGJhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmFyIHdpZHRocyBhcmUgcm91Z2hseSBzaW1pbGFyICh3aXRoaW4gMjUlKVxuICAgICAgICAgICAgICAgIGxldCBiYXJzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoc2hpZnRlZEV4dHJhY3RlZC5iYXJzW2ldIC0gYmFyc1tpXSkgLyBNYXRoLm1heChiYXJzW2ldLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwLjI1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXJzTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChiYXJzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc2lzdGVudE9mZnNldHMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWFsIGJhcmNvZGVzIHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtdWx0aXBsZSBzaGlmdGVkIHBvc2l0aW9uc1xuICAgICAgICAvLyBUZXh0IHBhdHRlcm5zIHR5cGljYWxseSBmYWlsIHRoaXMgdGVzdFxuICAgICAgICBpZiAodG90YWxDaGVja3MgPiAwICYmIGNvbnNpc3RlbnRPZmZzZXRzID49IHRvdGFsQ2hlY2tzICogMC41KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gQ29uc2lzdGVudCBhY3Jvc3MgYXQgbGVhc3QgNTAlIG9mIHBvc2l0aW9uc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBiYXJjb2RlXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuICAgICAgICBpZiAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSRUpFQ1QgaWYgYmFyY29kZSBzdGFydHMgdG9vIGxhdGUgaW4gdGhlIHNjYW4gKD41MCUgb2YgbGluZSBsZW5ndGgpXG4gICAgICAgIC8vIFZhbGlkIHBoYXJtYWNvZGVzIHNob3VsZCBiZSBmb3VuZCBuZWFyIHRoZSBpbWFnZSBlZGdlIG9yIGVhcmx5IGluIHRoZSBzY2FuLlxuICAgICAgICAvLyBTdGFydGluZyB0b28gZmFyIGludG8gdGhlIGltYWdlIGluZGljYXRlcyB3ZSdyZSBwaWNraW5nIHVwIG5vaXNlIG9yIGEgc2hpZnRlZCBwYXR0ZXJuXG4gICAgICAgIC8vIChpLmUuLCBzYW1wbGluZyBtaWQtYmFyLCB3aGljaCByZXZlcnNlcyB0aGUgZW5jb2RpbmcpLlxuICAgICAgICAvLyBUaGlzIGFsc28gcmVqZWN0cyB0aWx0ZWQgYmFyY29kZXMgdGhhdCBvbmx5IGFwcGVhciBzdHJhaWdodCBhdCBvbmUgc3BlY2lmaWMgYW5nbGUuXG4gICAgICAgIGlmIChzdGFydEluZm8uc3RhcnQgPiB0aGlzLl9yb3cubGVuZ3RoICogMC41MCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IGJhcnMgYW5kIHNwYWNlc1xuICAgICAgICBjb25zdCBleHRyYWN0ZWQgPSB0aGlzLl9leHRyYWN0QmFyc0FuZFNwYWNlcyhzdGFydEluZm8uc3RhcnQpO1xuICAgICAgICBpZiAoIWV4dHJhY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGJhcnMsIHNwYWNlcywgZW5kIH0gPSBleHRyYWN0ZWQ7XG5cbiAgICAgICAgLy8gUmVqZWN0IGV4dHJlbWVseSBzaG9ydCBwYXR0ZXJucyAodG90YWwgd2lkdGggPCAyMHB4KVxuICAgICAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIGJhcmNvZGUgd2lkdGggZnJvbSBzdW0gb2YgYmFycyBhbmQgc3BhY2VzXG4gICAgICAgIGNvbnN0IGJhcnNXaWR0aCA9IGJhcnMucmVkdWNlKChzdW0sIHcpID0+IHN1bSArIHcsIDApO1xuICAgICAgICBjb25zdCBzcGFjZXNXaWR0aCA9IHNwYWNlcy5yZWR1Y2UoKHN1bSwgdykgPT4gc3VtICsgdywgMCk7XG4gICAgICAgIGNvbnN0IHRvdGFsQmFyY29kZVdpZHRoID0gYmFyc1dpZHRoICsgc3BhY2VzV2lkdGg7XG4gICAgICAgIGlmICh0b3RhbEJhcmNvZGVXaWR0aCA8IDIwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVER0UtUkVBQ0ggUkVKRUNUSU9OOiBSZWplY3QgaWYgZXh0cmFjdGlvbiByZWFjaGVzIGltYWdlIGJvdW5kYXJ5XG4gICAgICAgIC8vIFZhbGlkIHBoYXJtYWNvZGVzIHJlcXVpcmUgcHJvcGVyIHF1aWV0IHpvbmVzIHBlciBwaGFybWFjZXV0aWNhbCBzcGVjIChtaW4gNm1tIOKJiCAxNnB4IGF0IHR5cGljYWwgRFBJKVxuICAgICAgICAvLyBFeHRyYWN0aW9ucyByZWFjaGluZyB0aGUgaW1hZ2UgZWRnZSAoZW5kID49IHJvdy5sZW5ndGggLSAyKSBpbmRpY2F0ZSBpbmNvbXBsZXRlL2ludmFsaWQgcGF0dGVybnNcbiAgICAgICAgLy8gVGhpcyBjYXRjaGVzIHRpbHRlZCBhbmQgY3VydmVkIGJhcmNvZGVzIHRoYXQgb25seSBhcHBlYXIgc3RyYWlnaHQgYXQgb25lIHNwZWNpZmljIGFuZ2xlXG4gICAgICAgIGNvbnN0IEVER0VfTUFSR0lOID0gMDsgLy8gTm8gbWFyZ2luOiBvbmx5IHJlamVjdCBpZiBleHRyYWN0aW9uIGdvZXMgUEFTVCB0aGUgcm93IGxlbmd0aCAoc2hvdWxkbid0IGhhcHBlbiBidXQgYmUgc2FmZSlcbiAgICAgICAgY29uc3QgcmVtYWluaW5nU3BhY2UgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kO1xuICAgICAgICBpZiAocmVtYWluaW5nU3BhY2UgPCBFREdFX01BUkdJTikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBzcGFjZSB1bmlmb3JtaXR5XG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVTcGFjZXMoc3BhY2VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBwZXJpb2RpY2l0eSBvZiBiYXIgYW5kIHNwYWNlIHdpZHRocyB0byByZWplY3QgdGlsdGVkL2N1cnZlZCBiYXJjb2Rlc1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlUGVyaW9kaWNpdHkoYmFycywgc3BhY2VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igc2hvcnQgcGF0dGVybnMsIHZhbGlkYXRlIGNvbnNpc3RlbmN5IGFjcm9zcyBzaGlmdGVkIHBvc2l0aW9uc1xuICAgICAgICAvLyB0byByZWplY3QgdGV4dC9ub2lzZSBwYXR0ZXJucyB0aGF0IGFwcGVhciBhcyBiYXJzIGR1ZSB0byBlZGdlIGRldGVjdGlvblxuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlUGF0dGVybkNvbnNpc3RlbmN5KHN0YXJ0SW5mbywgYmFycykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYmFyIHdpZHRoIHJhdGlvcyBhcmUgY29uc2lzdGVudCAoMToyLCAxOjIuNSwgb3IgMTozKVxuICAgICAgICBjb25zdCByYXRpb0luZm8gPSB0aGlzLl92YWxpZGF0ZUJhclJhdGlvcyhiYXJzLCBzcGFjZXMpO1xuICAgICAgICBpZiAoIXJhdGlvSW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBxdWlldCB6b25lcyBtZWV0IHBoYXJtYWNldXRpY2FsIHNwZWNcbiAgICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZVF1aWV0Wm9uZXMoc3RhcnRJbmZvLCByYXRpb0luZm8ubmFycm93V2lkdGgsIGVuZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjb2RlIHRoZSBiYXJzLCBwYXNzaW5nIHRoZSBpbmZlcnJlZCBuYXJyb3dXaWR0aCBmb3IgYWxsLXdpZGUvYWxsLW5hcnJvdyBwYXR0ZXJuc1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gdGhpcy5fZGVjb2RlQmFycyhiYXJzLCByYXRpb0luZm8ubmFycm93V2lkdGgpO1xuICAgICAgICBpZiAoIWRlY29kZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZGVjb2RlZDtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB2YWx1ZSByYW5nZVxuICAgICAgICBpZiAodmFsdWUgPCBNSU5fVkFMVUUgfHwgdmFsdWUgPiBNQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgY29uc3QgYXZnQmFyV2lkdGggPSBiYXJzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gYmFycy5sZW5ndGg7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZCwgYXZnQmFyV2lkdGgpKSB7XG4gICAgICAgICAgICAvLyBTb2Z0IGZhaWwgLSBhbGxvdyBidXQgbm90ZSBpdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIGRlY29kZWQgY29kZXMgYXJyYXkgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlczogQXJyYXk8QmFyY29kZUluZm8+ID0gYmFycy5tYXAoKHdpZHRoLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIGNvZGU6IHdpZHRoID4gKE1hdGgubWluKC4uLmJhcnMpICogV0lERV9CQVJfVEhSRVNIT0xEKSA/IDEgOiAwLFxuICAgICAgICAgICAgc3RhcnQ6IDAsIC8vIENvdWxkIGNhbGN1bGF0ZSBhY3R1YWwgcG9zaXRpb25zIGlmIG5lZWRlZFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICAgICAgZXJyb3I6IDAsXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbzogc3RhcnRJbmZvLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBwYXR0ZXJuOiBkZWNvZGVkLnBhdHRlcm4sXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGhhcm1hY29kZVJlYWRlcjtcbiIsImltcG9ydCBFQU5SZWFkZXIsIHsgQ09ERV9HX1NUQVJUIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgVVBDRVJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgQ09ERV9GUkVRVUVOQ1kgPSBbXG4gICAgICAgIFsgNTYsIDUyLCA1MCwgNDksIDQ0LCAzOCwgMzUsIDQyLCA0MSwgMzcgXSxcbiAgICAgICAgWzcsIDExLCAxMywgMTQsIDE5LCAyNSwgMjgsIDIxLCAyMiwgMjZdXTtcbiAgICBTVE9QX1BBVFRFUk4gPSBbMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogN107XG4gICAgRk9STUFUID0gJ3VwY19lJztcbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoaW5Db2RlOiBCYXJjb2RlUG9zaXRpb24sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlUG9zaXRpb24+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgbGV0IG91dENvZGU6IEJhcmNvZGVJbmZvIHwgQmFyY29kZVBvc2l0aW9uIHwgbnVsbCA9IHsgLi4uaW5Db2RlIH07XG4gICAgICAgIGxldCBjb2RlRnJlcXVlbmN5ID0gMHgwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICBvdXRDb2RlID0gdGhpcy5fZGVjb2RlQ29kZShvdXRDb2RlLmVuZCk7XG4gICAgICAgICAgICBpZiAoIW91dENvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgob3V0Q29kZSBhcyBCYXJjb2RlSW5mbykuY29kZSA+PSBDT0RFX0dfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICAob3V0Q29kZSBhcyBCYXJjb2RlSW5mbykuY29kZSA9IChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlIC0gQ09ERV9HX1NUQVJUO1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gKDEgPDwgKDUgLSBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgob3V0Q29kZSBhcyBCYXJjb2RlSW5mbykuY29kZSk7XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChvdXRDb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5LCByZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0Q29kZSBhcyBCYXJjb2RlSW5mbztcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZXRlcm1pbmVQYXJpdHkoY29kZUZyZXF1ZW5jeTogbnVtYmVyLCByZXN1bHQ6IEFycmF5PG51bWJlcj4pIHtcbiAgICAgICAgZm9yIChsZXQgbnJTeXN0ZW0gPSAwOyBuclN5c3RlbSA8IHRoaXMuQ09ERV9GUkVRVUVOQ1kubGVuZ3RoOyBuclN5c3RlbSsrKXtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5DT0RFX0ZSRVFVRU5DWVtuclN5c3RlbV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gdGhpcy5DT0RFX0ZSRVFVRU5DWVtuclN5c3RlbV1baV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQobnJTeXN0ZW0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9jb252ZXJ0VG9VUENBKHJlc3VsdDogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBsZXQgdXBjYSA9IFtyZXN1bHRbMF1dO1xuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDJdO1xuXG4gICAgICAgIGlmIChsYXN0RGlnaXQgPD0gMikge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCAzKSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFtsYXN0RGlnaXQsIDAsIDAsIDAsIDBdKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVzdWx0LnNsaWNlKDMsIDYpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDMpIHtcbiAgICAgICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNCkpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChbMCwgMCwgMCwgMCwgMF0pXG4gICAgICAgICAgICAgICAgLmNvbmNhdChyZXN1bHQuc2xpY2UoNCwgNikpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gNCkge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA1KSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFswLCAwLCAwLCAwLCAwLCByZXN1bHRbNV1dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwY2EgPSB1cGNhLmNvbmNhdChyZXN1bHQuc2xpY2UoMSwgNikpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChbMCwgMCwgMCwgMCwgbGFzdERpZ2l0XSk7XG4gICAgICAgIH1cblxuICAgICAgICB1cGNhLnB1c2gocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSk7XG4gICAgICAgIHJldHVybiB1cGNhO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2NoZWNrc3VtKHJlc3VsdDogQXJyYXk8bnVtYmVyPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3VwZXIuX2NoZWNrc3VtKHRoaXMuX2NvbnZlcnRUb1VQQ0EocmVzdWx0KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kRW5kKG9mZnNldDogbnVtYmVyLCBpc1doaXRlOiBib29sZWFuKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBzdXBlci5fZmluZEVuZChvZmZzZXQsIHRydWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVQb3NpdGlvbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArICgoZW5kSW5mby5lbmQgLSBlbmRJbmZvLnN0YXJ0KSAvIDIpO1xuICAgICAgICBpZiAodHJhaWxpbmdXaGl0ZXNwYWNlRW5kIDwgdGhpcy5fcm93Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2UoZW5kSW5mby5lbmQsIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kSW5mbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBVUENFUmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciBmcm9tICcuL2Vhbl9yZWFkZXInO1xuaW1wb3J0IHsgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmNsYXNzIFVQQ1JlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgRk9STUFUID0gJ3VwY19hJztcbiAgICBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBCYXJjb2RlUG9zaXRpb24gfCBudW1iZXIpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEVBTlJlYWRlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuY29kZSAmJiByZXN1bHQuY29kZS5sZW5ndGggPT09IDEzICYmIHJlc3VsdC5jb2RlLmNoYXJBdCgwKSA9PT0gJzAnKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IHJlc3VsdC5jb2RlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVUENSZWFkZXI7XG4iLCJjb25zdCBCcmVzZW5oYW0gPSB7fTtcblxuY29uc3QgU2xvcGUgPSB7XG4gICAgRElSOiB7XG4gICAgICAgIFVQOiAxLFxuICAgICAgICBET1dOOiAtMSxcbiAgICB9LFxufTtcbi8qKlxuICogU2NhbnMgYSBsaW5lIG9mIHRoZSBnaXZlbiBpbWFnZSBmcm9tIHBvaW50IHAxIHRvIHAyIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBjb250YWluaW5nXG4gKiBncmF5LXNjYWxlIHZhbHVlcyAoMC0yNTUpIG9mIHRoZSB1bmRlcmx5aW5nIHBpeGVscyBpbiBhZGRpdGlvbiB0byB0aGUgbWluXG4gKiBhbmQgbWF4IHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbWFnZVdyYXBwZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwMSBUaGUgc3RhcnQgcG9pbnQge3gseX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBwMiBUaGUgZW5kIHBvaW50IHt4LHl9XG4gKiBAcmV0dXJucyB7bGluZSwgbWluLCBtYXh9XG4gKi9cbkJyZXNlbmhhbS5nZXRCYXJjb2RlTGluZSA9IGZ1bmN0aW9uIChpbWFnZVdyYXBwZXIsIHAxLCBwMikge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgICBsZXQgeDAgPSBwMS54IHwgMDtcbiAgICBsZXQgeTAgPSBwMS55IHwgMDtcbiAgICBsZXQgeDEgPSBwMi54IHwgMDtcbiAgICBsZXQgeTEgPSBwMi55IHwgMDtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG4gICAgY29uc3Qgc3RlZXAgPSBNYXRoLmFicyh5MSAtIHkwKSA+IE1hdGguYWJzKHgxIC0geDApO1xuICAgIGxldCBlcnJvcjtcbiAgICBsZXQgeTtcbiAgICBsZXQgdG1wO1xuICAgIGxldCB4O1xuICAgIGNvbnN0IGxpbmUgPSBbXTtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgbGV0IHZhbDtcbiAgICBsZXQgbWluID0gMjU1O1xuICAgIGxldCBtYXggPSAwO1xuXG4gICAgZnVuY3Rpb24gcmVhZChhLCBiKSB7XG4gICAgICAgIHZhbCA9IGltYWdlRGF0YVtiICogd2lkdGggKyBhXTtcbiAgICAgICAgbWluID0gdmFsIDwgbWluID8gdmFsIDogbWluO1xuICAgICAgICBtYXggPSB2YWwgPiBtYXggPyB2YWwgOiBtYXg7XG4gICAgICAgIGxpbmUucHVzaCh2YWwpO1xuICAgIH1cblxuICAgIGlmIChzdGVlcCkge1xuICAgICAgICB0bXAgPSB4MDtcbiAgICAgICAgeDAgPSB5MDtcbiAgICAgICAgeTAgPSB0bXA7XG5cbiAgICAgICAgdG1wID0geDE7XG4gICAgICAgIHgxID0geTE7XG4gICAgICAgIHkxID0gdG1wO1xuICAgIH1cbiAgICBpZiAoeDAgPiB4MSkge1xuICAgICAgICB0bXAgPSB4MDtcbiAgICAgICAgeDAgPSB4MTtcbiAgICAgICAgeDEgPSB0bXA7XG5cbiAgICAgICAgdG1wID0geTA7XG4gICAgICAgIHkwID0geTE7XG4gICAgICAgIHkxID0gdG1wO1xuICAgIH1cbiAgICBjb25zdCBkZWx0YVggPSB4MSAtIHgwO1xuICAgIGNvbnN0IGRlbHRhWSA9IE1hdGguYWJzKHkxIC0geTApO1xuICAgIGVycm9yID0gKGRlbHRhWCAvIDIpIHwgMDtcbiAgICB5ID0geTA7XG4gICAgY29uc3QgeVN0ZXAgPSB5MCA8IHkxID8gMSA6IC0xO1xuICAgIGZvciAoeCA9IHgwOyB4IDwgeDE7IHgrKykge1xuICAgICAgICBpZiAoc3RlZXApIHtcbiAgICAgICAgICAgIHJlYWQoeSwgeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWFkKHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yIC09IGRlbHRhWTtcbiAgICAgICAgaWYgKGVycm9yIDwgMCkge1xuICAgICAgICAgICAgeSArPSB5U3RlcDtcbiAgICAgICAgICAgIGVycm9yICs9IGRlbHRhWDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGxpbmUsXG4gICAgICAgIG1pbixcbiAgICAgICAgbWF4LFxuICAgIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSByZXN1bHQgZnJvbSBnZXRCYXJjb2RlTGluZSBpbnRvIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uXG4gKiBhbHNvIGNvbnNpZGVyaW5nIHRoZSBmcmVxdWVuY3kgYW5kIHNsb3BlIG9mIHRoZSBzaWduYWwgZm9yIG1vcmUgcm9idXN0IHJlc3VsdHNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXN1bHQge2xpbmUsIG1pbiwgbWF4fVxuICovXG5CcmVzZW5oYW0udG9CaW5hcnlMaW5lID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgIGNvbnN0IHsgbWluIH0gPSByZXN1bHQ7XG4gICAgY29uc3QgeyBtYXggfSA9IHJlc3VsdDtcbiAgICBjb25zdCB7IGxpbmUgfSA9IHJlc3VsdDtcbiAgICBsZXQgc2xvcGU7XG4gICAgbGV0IHNsb3BlMjtcbiAgICBjb25zdCBjZW50ZXIgPSBtaW4gKyAobWF4IC0gbWluKSAvIDI7XG4gICAgY29uc3QgZXh0cmVtYSA9IFtdO1xuICAgIGxldCBjdXJyZW50RGlyO1xuICAgIGxldCBkaXI7XG4gICAgbGV0IHRocmVzaG9sZCA9IChtYXggLSBtaW4pIC8gMTI7XG4gICAgY29uc3QgclRocmVzaG9sZCA9IC10aHJlc2hvbGQ7XG4gICAgbGV0IGk7XG4gICAgbGV0IGo7XG5cbiAgICAvLyAxLiBmaW5kIGV4dHJlbWFcbiAgICBjdXJyZW50RGlyID0gbGluZVswXSA+IGNlbnRlciA/IFNsb3BlLkRJUi5VUCA6IFNsb3BlLkRJUi5ET1dOO1xuICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgIHBvczogMCxcbiAgICAgICAgdmFsOiBsaW5lWzBdLFxuICAgIH0pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICBzbG9wZSA9IChsaW5lW2kgKyAxXSAtIGxpbmVbaV0pO1xuICAgICAgICBzbG9wZTIgPSAobGluZVtpICsgMl0gLSBsaW5lW2kgKyAxXSk7XG4gICAgICAgIGlmICgoc2xvcGUgKyBzbG9wZTIpIDwgclRocmVzaG9sZCAmJiBsaW5lW2kgKyAxXSA8IChjZW50ZXIgKiAxLjUpKSB7XG4gICAgICAgICAgICBkaXIgPSBTbG9wZS5ESVIuRE9XTjtcbiAgICAgICAgfSBlbHNlIGlmICgoc2xvcGUgKyBzbG9wZTIpID4gdGhyZXNob2xkICYmIGxpbmVbaSArIDFdID4gKGNlbnRlciAqIDAuNSkpIHtcbiAgICAgICAgICAgIGRpciA9IFNsb3BlLkRJUi5VUDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpciA9IGN1cnJlbnREaXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudERpciAhPT0gZGlyKSB7XG4gICAgICAgICAgICBleHRyZW1hLnB1c2goe1xuICAgICAgICAgICAgICAgIHBvczogaSxcbiAgICAgICAgICAgICAgICB2YWw6IGxpbmVbaV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN1cnJlbnREaXIgPSBkaXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXh0cmVtYS5wdXNoKHtcbiAgICAgICAgcG9zOiBsaW5lLmxlbmd0aCxcbiAgICAgICAgdmFsOiBsaW5lW2xpbmUubGVuZ3RoIC0gMV0sXG4gICAgfSk7XG5cbiAgICBmb3IgKGogPSBleHRyZW1hWzBdLnBvczsgaiA8IGV4dHJlbWFbMV0ucG9zOyBqKyspIHtcbiAgICAgICAgbGluZVtqXSA9IGxpbmVbal0gPiBjZW50ZXIgPyAwIDogMTtcbiAgICB9XG5cbiAgICAvLyBpdGVyYXRlIG92ZXIgZXh0cmVtYSBhbmQgY29udmVydCB0byBiaW5hcnkgYmFzZWQgb24gYXZnIGJldHdlZW4gbWlubWF4XG4gICAgZm9yIChpID0gMTsgaSA8IGV4dHJlbWEubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGlmIChleHRyZW1hW2kgKyAxXS52YWwgPiBleHRyZW1hW2ldLnZhbCkge1xuICAgICAgICAgICAgdGhyZXNob2xkID0gKGV4dHJlbWFbaV0udmFsICsgKChleHRyZW1hW2kgKyAxXS52YWwgLSBleHRyZW1hW2ldLnZhbCkgLyAzKSAqIDIpIHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocmVzaG9sZCA9IChleHRyZW1hW2kgKyAxXS52YWwgKyAoKGV4dHJlbWFbaV0udmFsIC0gZXh0cmVtYVtpICsgMV0udmFsKSAvIDMpKSB8IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGogPSBleHRyZW1hW2ldLnBvczsgaiA8IGV4dHJlbWFbaSArIDFdLnBvczsgaisrKSB7XG4gICAgICAgICAgICBsaW5lW2pdID0gbGluZVtqXSA+IHRocmVzaG9sZCA/IDAgOiAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgdGhyZXNob2xkLFxuICAgIH07XG59O1xuXG4vKipcbiAqIFVzZWQgZm9yIGRldmVsb3BtZW50IG9ubHlcbiAqL1xuQnJlc2VuaGFtLmRlYnVnID0ge1xuICAgIHByaW50RnJlcXVlbmN5KGxpbmUsIGNhbnZhcykge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjYW52YXMud2lkdGggPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSAyNTY7XG5cbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjdHgubW92ZVRvKGksIDI1NSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKGksIDI1NSAtIGxpbmVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIH0sXG5cbiAgICBwcmludFBhdHRlcm4obGluZSwgY2FudmFzKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpOyBsZXRcbiAgICAgICAgICAgIGk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgICBjdHguZmlsbENvbG9yID0gJ2JsYWNrJztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lW2ldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGksIDAsIDEsIDEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQnJlc2VuaGFtO1xuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWN5Y2xlICovXG5cbi8qKlxuICogQmFyY29kZSBEZWNvZGVyIE1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIGRlY29kaW5nIG9mIGJhcmNvZGVzIHVzaW5nIGNvbmZpZ3VyZWQgcmVhZGVycy5cbiAqXG4gKiBSRUFERVIgT1JERVIgR1VBUkFOVEVFOlxuICogUmVhZGVycyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBleGFjdCBvcmRlciB0aGV5IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGByZWFkZXJzYFxuICogY29uZmlnIGFycmF5LiBUaGUgZmlyc3QgcmVhZGVyIHRvIHN1Y2Nlc3NmdWxseSBkZWNvZGUgdGhlIGJhcmNvZGUgd2lucy5cbiAqXG4gKiBFeGFtcGxlOlxuICogICByZWFkZXJzOiBbJ2Vhbl9yZWFkZXInLCAndXBjX2VfcmVhZGVyJywgJ2NvZGVfMTI4X3JlYWRlciddXG4gKlxuICogRGVjb2Rpbmcgb3JkZXI6XG4gKiAgIDEuIGVhbl9yZWFkZXIgYXR0ZW1wdHMgdG8gZGVjb2RlXG4gKiAgIDIuIElmIGVhbl9yZWFkZXIgcmV0dXJucyBudWxsLCB1cGNfZV9yZWFkZXIgYXR0ZW1wdHMgdG8gZGVjb2RlXG4gKiAgIDMuIElmIHVwY19lX3JlYWRlciByZXR1cm5zIG51bGwsIGNvZGVfMTI4X3JlYWRlciBhdHRlbXB0cyB0byBkZWNvZGVcbiAqICAgNC4gRmlyc3Qgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkXG4gKlxuICogRVhURVJOQUwgUkVBREVSUzpcbiAqIEV4dGVybmFsIHJlYWRlcnMgbXVzdCBiZSByZWdpc3RlcmVkIHZpYSByZWdpc3RlclJlYWRlcigpIGJlZm9yZSB1c2UuXG4gKiBPbmNlIHJlZ2lzdGVyZWQsIHRoZXkgZm9sbG93IHRoZSBzYW1lIG9yZGVyaW5nIHJ1bGVzIGFzIGJ1aWx0LWluIHJlYWRlcnMuXG4gKiBUaGVpciBwb3NpdGlvbiBpbiB0aGUgYHJlYWRlcnNgIGFycmF5IGRldGVybWluZXMgdGhlaXIgcHJpb3JpdHkuXG4gKlxuICogVG8gcHJpb3JpdGl6ZSBhbiBleHRlcm5hbCByZWFkZXI6XG4gKiAgIFF1YWdnYS5yZWdpc3RlclJlYWRlcignbXlfcmVhZGVyJywgTXlSZWFkZXIpO1xuICogICBjb25maWcuZGVjb2Rlci5yZWFkZXJzID0gWydteV9yZWFkZXInLCAnZWFuX3JlYWRlciddOyAvLyBteV9yZWFkZXIgdHJpZWQgZmlyc3RcbiAqL1xuXG5pbXBvcnQgSW1hZ2VEZWJ1ZyBmcm9tICcuLi9jb21tb24vaW1hZ2VfZGVidWcnO1xuaW1wb3J0IFR3b09mRml2ZVJlYWRlciBmcm9tICcuLi9yZWFkZXIvMm9mNV9yZWFkZXInO1xuaW1wb3J0IENvZGFiYXJSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGFiYXJfcmVhZGVyJztcbmltcG9ydCBDb2RlMTI4UmVhZGVyIGZyb20gJy4uL3JlYWRlci9jb2RlXzEyOF9yZWFkZXInO1xuaW1wb3J0IENvZGUzMlJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8zMl9yZWFkZXInO1xuaW1wb3J0IENvZGUzOVJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8zOV9yZWFkZXInO1xuaW1wb3J0IENvZGUzOVZJTlJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8zOV92aW5fcmVhZGVyJztcbmltcG9ydCBDb2RlOTNSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfOTNfcmVhZGVyJztcbmltcG9ydCBFQU4yUmVhZGVyIGZyb20gJy4uL3JlYWRlci9lYW5fMl9yZWFkZXInO1xuaW1wb3J0IEVBTjVSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2Vhbl81X3JlYWRlcic7XG5pbXBvcnQgRUFOOFJlYWRlciBmcm9tICcuLi9yZWFkZXIvZWFuXzhfcmVhZGVyJztcbmltcG9ydCBFQU5SZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2Vhbl9yZWFkZXInO1xuaW1wb3J0IEkyb2Y1UmVhZGVyIGZyb20gJy4uL3JlYWRlci9pMm9mNV9yZWFkZXInO1xuaW1wb3J0IFBoYXJtYWNvZGVSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL3BoYXJtYWNvZGVfcmVhZGVyJztcbmltcG9ydCBVUENFUmVhZGVyIGZyb20gJy4uL3JlYWRlci91cGNfZV9yZWFkZXInO1xuaW1wb3J0IFVQQ1JlYWRlciBmcm9tICcuLi9yZWFkZXIvdXBjX3JlYWRlcic7XG5pbXBvcnQgQnJlc2VuaGFtIGZyb20gJy4vYnJlc2VuaGFtJztcblxuY29uc3QgUkVBREVSUyA9IHtcbiAgICBjb2RlXzEyOF9yZWFkZXI6IENvZGUxMjhSZWFkZXIsXG4gICAgZWFuX3JlYWRlcjogRUFOUmVhZGVyLFxuICAgIGVhbl81X3JlYWRlcjogRUFONVJlYWRlcixcbiAgICBlYW5fMl9yZWFkZXI6IEVBTjJSZWFkZXIsXG4gICAgZWFuXzhfcmVhZGVyOiBFQU44UmVhZGVyLFxuICAgIGNvZGVfMzlfcmVhZGVyOiBDb2RlMzlSZWFkZXIsXG4gICAgY29kZV8zOV92aW5fcmVhZGVyOiBDb2RlMzlWSU5SZWFkZXIsXG4gICAgY29kYWJhcl9yZWFkZXI6IENvZGFiYXJSZWFkZXIsXG4gICAgdXBjX3JlYWRlcjogVVBDUmVhZGVyLFxuICAgIHVwY19lX3JlYWRlcjogVVBDRVJlYWRlcixcbiAgICBpMm9mNV9yZWFkZXI6IEkyb2Y1UmVhZGVyLFxuICAgICcyb2Y1X3JlYWRlcic6IFR3b09mRml2ZVJlYWRlcixcbiAgICBjb2RlXzkzX3JlYWRlcjogQ29kZTkzUmVhZGVyLFxuICAgIGNvZGVfMzJfcmVhZGVyOiBDb2RlMzJSZWFkZXIsXG4gICAgcGhhcm1hY29kZV9yZWFkZXI6IFBoYXJtYWNvZGVSZWFkZXIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGFuIGV4dGVybmFsL2N1c3RvbSBiYXJjb2RlIHJlYWRlci5cbiAgICAgKiBPbmNlIHJlZ2lzdGVyZWQsIHRoZSByZWFkZXIgY2FuIGJlIHVzZWQgaW4gY29uZmlnLnJlYWRlcnMgYXJyYXkuXG4gICAgICogVGhlIHJlYWRlcidzIHBvc2l0aW9uIGluIGNvbmZpZy5yZWFkZXJzIGRldGVybWluZXMgaXRzIGRlY29kaW5nIHByaW9yaXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgaWRlbnRpZmllciB0byB1c2UgaW4gY29uZmlnLnJlYWRlcnMgKGUuZy4sICdteV9jdXN0b21fcmVhZGVyJylcbiAgICAgKiBAcGFyYW0gcmVhZGVyIC0gVGhlIHJlYWRlciBjbGFzcyAobXVzdCBleHRlbmQgQmFyY29kZVJlYWRlcilcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUmVnaXN0ZXIgYSBjdXN0b20gcmVhZGVyXG4gICAgICogQmFyY29kZURlY29kZXIucmVnaXN0ZXJSZWFkZXIoJ215X3JlYWRlcicsIE15Q3VzdG9tUmVhZGVyKTtcbiAgICAgKlxuICAgICAqIC8vIFVzZSBpdCB3aXRoIGhpZ2ggcHJpb3JpdHkgKGZpcnN0IGluIGFycmF5KVxuICAgICAqIGNvbmZpZy5kZWNvZGVyLnJlYWRlcnMgPSBbJ215X3JlYWRlcicsICdlYW5fcmVhZGVyJywgJ2NvZGVfMTI4X3JlYWRlciddO1xuICAgICAqL1xuICAgIHJlZ2lzdGVyUmVhZGVyOiAobmFtZSwgcmVhZGVyKSA9PiB7XG4gICAgICAgIFJFQURFUlNbbmFtZV0gPSByZWFkZXI7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uZmlnLCBpbnB1dEltYWdlV3JhcHBlcikge1xuICAgICAgICBjb25zdCBfY2FudmFzID0ge1xuICAgICAgICAgICAgY3R4OiB7XG4gICAgICAgICAgICAgICAgZnJlcXVlbmN5OiBudWxsLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IG51bGwsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb206IHtcbiAgICAgICAgICAgICAgICBmcmVxdWVuY3k6IG51bGwsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogbnVsbCxcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgX2JhcmNvZGVSZWFkZXJzID0gW107XG5cbiAgICAgICAgaW5pdENhbnZhcygpO1xuICAgICAgICBpbml0UmVhZGVycygpO1xuICAgICAgICBpbml0Q29uZmlnKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdENhbnZhcygpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRkZWJ1ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWJ1Zy5kZXRlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5mcmVxdWVuY3kgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXMuZnJlcXVlbmN5Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2FudmFzLmRvbS5mcmVxdWVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5kb20uZnJlcXVlbmN5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLmZyZXF1ZW5jeS5jbGFzc05hbWUgPSAnZnJlcXVlbmN5JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRkZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnLmFwcGVuZENoaWxkKF9jYW52YXMuZG9tLmZyZXF1ZW5jeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWc/LnByaW50UmVhZGVySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJyogYmFyY29kZSBkZWNvZGVyIGluaXRDYW52YXMgZ2V0Y29udGV4dCAyZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfY2FudmFzLmN0eC5mcmVxdWVuY3kgPSBfY2FudmFzLmRvbS5mcmVxdWVuY3kuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLnBhdHRlcm4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXMucGF0dGVybkJ1ZmZlcicpO1xuICAgICAgICAgICAgICAgIGlmICghX2NhbnZhcy5kb20ucGF0dGVybikge1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5wYXR0ZXJuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLnBhdHRlcm4uY2xhc3NOYW1lID0gJ3BhdHRlcm5CdWZmZXInO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZGVidWcuYXBwZW5kQ2hpbGQoX2NhbnZhcy5kb20ucGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2NhbnZhcy5jdHgucGF0dGVybiA9IF9jYW52YXMuZG9tLnBhdHRlcm4uZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLm92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdjYW52YXMuZHJhd2luZ0J1ZmZlcicpO1xuICAgICAgICAgICAgICAgIGlmIChfY2FudmFzLmRvbS5vdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIF9jYW52YXMuY3R4Lm92ZXJsYXkgPSBfY2FudmFzLmRvbS5vdmVybGF5LmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluaXRpYWxpemVzIGJhcmNvZGUgcmVhZGVycyBmcm9tIGNvbmZpZy5yZWFkZXJzIGFycmF5LlxuICAgICAgICAgKiBSZWFkZXJzIGFyZSBpbnN0YW50aWF0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gY29uZmlnLFxuICAgICAgICAgKiB3aGljaCBkZXRlcm1pbmVzIHRoZWlyIGRlY29kaW5nIHByaW9yaXR5IChmaXJzdCBpbiBhcnJheSA9IGhpZ2hlc3QgcHJpb3JpdHkpLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaW5pdFJlYWRlcnMoKSB7XG4gICAgICAgICAgICBjb25maWcucmVhZGVycy5mb3JFYWNoKChyZWFkZXJDb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVhZGVyO1xuICAgICAgICAgICAgICAgIGxldCBjb25maWd1cmF0aW9uID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHN1cHBsZW1lbnRzID0gW107XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRlckNvbmZpZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyQ29uZmlnLmZvcm1hdDtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IHJlYWRlckNvbmZpZy5jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVhZGVyQ29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnLmRlYnVnPy5wcmludFJlYWRlckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0JlZm9yZSByZWdpc3RlcmluZyByZWFkZXI6ICcsIHJlYWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLnN1cHBsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cHBsZW1lbnRzID0gY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1cHBsZW1lbnRzLm1hcCgoc3VwcGxlbWVudCkgPT4gbmV3IFJFQURFUlNbc3VwcGxlbWVudF0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRlck9iaiA9IG5ldyBSRUFERVJTW3JlYWRlcl0oY29uZmlndXJhdGlvbiwgc3VwcGxlbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICBfYmFyY29kZVJlYWRlcnMucHVzaChyZWFkZXJPYmopO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCcqIEVycm9yIGNvbnN0cnVjdGluZyByZWFkZXIgJywgcmVhZGVyLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIGNvbmZpZy5kZWJ1Zz8ucHJpbnRSZWFkZXJJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlZ2lzdGVyZWQgUmVhZGVyczogJHtfYmFyY29kZVJlYWRlcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocmVhZGVyKSA9PiBKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogcmVhZGVyLkZPUk1BVCwgY29uZmlnOiByZWFkZXIuY29uZmlnIH0pKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluaXRDb25maWcoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aXMgPSBbe1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBfY2FudmFzLmRvbS5mcmVxdWVuY3ksXG4gICAgICAgICAgICAgICAgICAgIHByb3A6IGNvbmZpZy5kZWJ1Zy5zaG93RnJlcXVlbmN5LFxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogX2NhbnZhcy5kb20ucGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogY29uZmlnLmRlYnVnLnNob3dQYXR0ZXJuLFxuICAgICAgICAgICAgICAgIH1dO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHZpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlzW2ldLnByb3AgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc1tpXS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzW2ldLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBleHRlbmQgdGhlIGxpbmUgb24gYm90aCBlbmRzXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbmVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRFeHRlbmRlZExpbmUobGluZSwgYW5nbGUsIGV4dCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZXh0ZW5kTGluZShhbW91bnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHk6IGFtb3VudCAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICAgICAgeDogYW1vdW50ICogTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgICAgICAgICAgICAgICBsaW5lWzBdLnkgLT0gZXh0ZW5zaW9uLnk7XG4gICAgICAgICAgICAgICAgbGluZVswXS54IC09IGV4dGVuc2lvbi54O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueSArPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICBsaW5lWzFdLnggKz0gZXh0ZW5zaW9uLng7XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBpbnNpZGUgaW1hZ2VcbiAgICAgICAgICAgIGV4dGVuZExpbmUoZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChleHQgPiAxICYmICghaW5wdXRJbWFnZVdyYXBwZXIuaW5JbWFnZVdpdGhCb3JkZXIobGluZVswXSlcbiAgICAgICAgICAgICAgICAgICAgfHwgIWlucHV0SW1hZ2VXcmFwcGVyLmluSW1hZ2VXaXRoQm9yZGVyKGxpbmVbMV0pKSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGV4dCAtPSBNYXRoLmNlaWwoZXh0IC8gMik7XG4gICAgICAgICAgICAgICAgZXh0ZW5kTGluZSgtZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaW5lO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZShib3gpIHtcbiAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIHg6IChib3hbMV1bMF0gLSBib3hbMF1bMF0pIC8gMiArIGJveFswXVswXSxcbiAgICAgICAgICAgICAgICB5OiAoYm94WzFdWzFdIC0gYm94WzBdWzFdKSAvIDIgKyBib3hbMF1bMV0sXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgeDogKGJveFszXVswXSAtIGJveFsyXVswXSkgLyAyICsgYm94WzJdWzBdLFxuICAgICAgICAgICAgICAgIHk6IChib3hbM11bMV0gLSBib3hbMl1bMV0pIC8gMiArIGJveFsyXVsxXSxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFZhbGlkYXRlIHRoYXQgYmFyY29kZSBwb3NpdGlvbiBpcyBzdGFibGUgYWNyb3NzIGFkamFjZW50IFktc2NhbmxpbmVzLlxuICAgICAgICAgKiBSZWFsIGJhcmNvZGVzIGhhdmUgY29uc2lzdGVudCBzdGFydCBwb3NpdGlvbjsgdGlsdGVkIGJhcmNvZGVzIHNoaWZ0IGxlZnQvcmlnaHQgYXMgWSBjaGFuZ2VzLlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBsaW5lIFRoZSBvcmlnaW5hbCBzY2FuIGxpbmUgW3AxLCBwMl1cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCBUaGUgc3VjY2Vzc2Z1bCBkZWNvZGUgcmVzdWx0IHdpdGggLnN0YXJ0IHBvc2l0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWFkZXIgVGhlIHJlYWRlciBpbnN0YW5jZSB0aGF0IHN1Y2NlZWRlZFxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRJbWFnZVdyYXBwZXIgVGhlIGZ1bGwgaW1hZ2UgZGF0YVxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBiYXJjb2RlIHBvc2l0aW9uIGlzIHN0YWJsZSAo4omlMSBhZGphY2VudCBZLWxpbmUgbWF0Y2hlcylcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlQWRqYWNlbnRZTGluZXMobGluZSwgcmVzdWx0LCByZWFkZXIsIGlucHV0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IG9yaWdpbmFsIFkgcG9zaXRpb24gYW5kIFggc3RhcnQgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsWSA9IE1hdGgucm91bmQobGluZVsxXS55KTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsWFN0YXJ0ID0gcmVzdWx0LnN0YXJ0O1xuICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3JGbiA9IHJlYWRlci5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkTWF0Y2hlcyA9IChjb25zdHJ1Y3RvckZuICYmIGNvbnN0cnVjdG9yRm4uYWRqYWNlbnRMaW5lVmFsaWRhdGlvbk1hdGNoZXMpIHx8IDA7XG5cbiAgICAgICAgICAgIGlmIChyZXF1aXJlZE1hdGNoZXMgPD0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbWF0Y2hDb3VudCA9IDA7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBZwrExLCBZwrEyLCBZwrEzIHRvIHNlZSBpZiBiYXJjb2RlIGFwcGVhcnMgYXQgc2FtZSBYIHBvc2l0aW9uXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHlPZmZzZXQgb2YgWzEsIDIsIDNdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGlyZWN0aW9uIG9mIFstMSwgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1kgPSBvcmlnaW5hbFkgKyAoeU9mZnNldCAqIGRpcmVjdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQm91bmRzIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdZIDwgMCB8fCBuZXdZID49IGlucHV0SW1hZ2VXcmFwcGVyLnNpemUueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGxpbmUgYXQgYWRqdXN0ZWQgWSwga2VlcGluZyBzYW1lIFggcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UDEgPSB7IHg6IGxpbmVbMF0ueCwgeTogbmV3WSB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQMiA9IHsgeDogbGluZVsxXS54LCB5OiBuZXdZIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgZ3JheXNjYWxlIGF0IG5ldyBZXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdCYXJjb2RlTGluZSA9IEJyZXNlbmhhbS5nZXRCYXJjb2RlTGluZShpbnB1dEltYWdlV3JhcHBlciwgbmV3UDEsIG5ld1AyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmluYXJpemVcbiAgICAgICAgICAgICAgICAgICAgICAgIEJyZXNlbmhhbS50b0JpbmFyeUxpbmUobmV3QmFyY29kZUxpbmUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJvdyBmb3IgX2ZpbmRTdGFydCgpIHRvIHNlYXJjaCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLl9yb3cgPSBuZXdCYXJjb2RlTGluZS5saW5lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBiYXJjb2RlIHN0YXJ0IGF0IHRoaXMgWVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRGb3VuZCA9IHJlYWRlci5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEZvdW5kICE9PSBudWxsICYmIHN0YXJ0Rm91bmQuc3RhcnQgPT09IG9yaWdpbmFsWFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaENvdW50ID49IHJlcXVpcmVkTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzLCB0cmVhdCBmYWlsdXJlcyBhcyBcIm5vIG1hdGNoXCIgc28gd2UgY2FuIHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCBsaW5lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSBtYXRjaENvdW50ID49IHJlcXVpcmVkTWF0Y2hlcztcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF0dGVtcHRzIHRvIGRlY29kZSBhIGJhcmNvZGUgZnJvbSBhIHNjYW4gbGluZS5cbiAgICAgICAgICogUmVhZGVycyBhcmUgdHJpZWQgaW4gb3JkZXIgKGFzIHNwZWNpZmllZCBpbiBjb25maWcucmVhZGVycykuXG4gICAgICAgICAqIFRoZSBmaXJzdCByZWFkZXIgdG8gcmV0dXJuIGEgbm9uLW51bGwgcmVzdWx0IHdpbnMuXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbmUgVGhlIHNjYW4gbGluZSB0byBkZWNvZGVcbiAgICAgICAgICogQHJldHVybnMge09iamVjdHxudWxsfSBEZWNvZGVkIHJlc3VsdCBvciBudWxsIGlmIG5vIHJlYWRlciBzdWNjZWVkZWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHRyeURlY29kZShsaW5lKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgY29uc3QgYmFyY29kZUxpbmUgPSBCcmVzZW5oYW0uZ2V0QmFyY29kZUxpbmUoaW5wdXRJbWFnZVdyYXBwZXIsIGxpbmVbMF0sIGxpbmVbMV0pO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIGNvbmZpZy5kZWJ1Zy5zaG93RnJlcXVlbmN5KSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jYW52YXMuY3R4Lm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChsaW5lLCB7IHg6ICd4JywgeTogJ3knIH0sIF9jYW52YXMuY3R4Lm92ZXJsYXksIHsgY29sb3I6ICdyZWQnLCBsaW5lV2lkdGg6IDMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEJyZXNlbmhhbS5kZWJ1Zy5wcmludEZyZXF1ZW5jeShiYXJjb2RlTGluZS5saW5lLCBfY2FudmFzLmRvbS5mcmVxdWVuY3kpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCcmVzZW5oYW0udG9CaW5hcnlMaW5lKGJhcmNvZGVMaW5lKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWcuc2hvd1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBCcmVzZW5oYW0uZGVidWcucHJpbnRQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUsIF9jYW52YXMuZG9tLnBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIHJlYWRlcnMgaW4gb3JkZXIgLSBmaXJzdCBzdWNjZXNzZnVsIGRlY29kZSB3aW5zXG4gICAgICAgICAgICBsZXQgc3VjY2Vzc2Z1bFJlYWRlckluZGV4ID0gLTE7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX2JhcmNvZGVSZWFkZXJzLmxlbmd0aCAmJiByZXN1bHQgPT09IG51bGw7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFByb3ZpZGUgaW1hZ2UgY29udGV4dCB0byByZWFkZXJzIHRoYXQgd2FudCBpdCAoZS5nLiwgcGhhcm1hY29kZSBQR00gZHVtcHMpXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfYmFyY29kZVJlYWRlcnNbaV0uc2V0SW1hZ2VXcmFwcGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIF9iYXJjb2RlUmVhZGVyc1tpXS5zZXRJbWFnZVdyYXBwZXIoaW5wdXRJbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBfYmFyY29kZVJlYWRlcnNbaV0uZGVjb2RlUGF0dGVybihiYXJjb2RlTGluZS5saW5lKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxSZWFkZXJJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IGJhcmNvZGUgcG9zaXRpb24gaXMgc3RhYmxlIGFjcm9zcyBhZGphY2VudCBZLXNjYW5saW5lc1xuICAgICAgICAgICAgLy8gVGhpcyByZWplY3RzIHRpbHRlZCBiYXJjb2RlcyB0aGF0IG9ubHkgYXBwZWFyIHZhbGlkIGF0IG9uZSBzcGVjaWZpYyBhbmdsZVxuICAgICAgICAgICAgLy8gT25seSBhcHBseSB0byBQaGFybWFjb2RlUmVhZGVyICh3aGljaCBleHBsaWNpdGx5IG1hZGUgX2ZpbmRTdGFydCBwdWJsaWMgZm9yIHRoaXMgdmFsaWRhdGlvbilcbiAgICAgICAgICAgIGlmIChzdWNjZXNzZnVsUmVhZGVySW5kZXggPj0gMCAmJiBfYmFyY29kZVJlYWRlcnNbc3VjY2Vzc2Z1bFJlYWRlckluZGV4XSBpbnN0YW5jZW9mIFBoYXJtYWNvZGVSZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWRqYWNlbnRZTGluZXMobGluZSwgcmVzdWx0LCBfYmFyY29kZVJlYWRlcnNbc3VjY2Vzc2Z1bFJlYWRlckluZGV4XSwgaW5wdXRJbWFnZVdyYXBwZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlUmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICAgICAgYmFyY29kZUxpbmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHNsaWNlcyB0aGUgZ2l2ZW4gYXJlYSBhcGFydCBhbmQgdHJpZXMgdG8gZGV0ZWN0IGEgYmFyY29kZS1wYXR0ZXJuXG4gICAgICAgICAqIGZvciBlYWNoIHNsaWNlLiBJdCByZXR1cm5zIHRoZSBkZWNvZGVkIGJhcmNvZGUsIG9yIG51bGwgaWYgbm90aGluZyB3YXMgZm91bmRcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYm94XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbmVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpbmVBbmdsZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gdHJ5RGVjb2RlQnJ1dGVGb3JjZShib3gsIGxpbmUsIGxpbmVBbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2lkZUxlbmd0aCA9IE1hdGguc3FydChNYXRoLnBvdyhib3hbMV1bMF0gLSBib3hbMF1bMF0sIDIpICsgTWF0aC5wb3coKGJveFsxXVsxXSAtIGJveFswXVsxXSksIDIpKTtcbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gMTY7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBkaXI7XG4gICAgICAgICAgICBsZXQgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgY29uc3QgeGRpciA9IE1hdGguc2luKGxpbmVBbmdsZSk7XG4gICAgICAgICAgICBjb25zdCB5ZGlyID0gTWF0aC5jb3MobGluZUFuZ2xlKTtcblxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHNsaWNlcyAmJiByZXN1bHQgPT09IG51bGw7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIG1vdmUgbGluZSBwZXJwZW5kaWN1bGFyIHRvIGFuZ2xlXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1peGVkLW9wZXJhdG9yc1xuICAgICAgICAgICAgICAgIGRpciA9IHNpZGVMZW5ndGggLyBzbGljZXMgKiBpICogKGkgJSAyID09PSAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICBleHRlbnNpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHk6IGRpciAqIHhkaXIsXG4gICAgICAgICAgICAgICAgICAgIHg6IGRpciAqIHlkaXIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgICAgIGxpbmVbMF0ueSArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLnk7XG4gICAgICAgICAgICAgICAgbGluZVsxXS55ICs9IGV4dGVuc2lvbi54O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueCAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGUobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KFxuICAgICAgICAgICAgICAgIE1hdGgucG93KE1hdGguYWJzKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSksIDIpXG4gICAgICAgICAgICAgICAgKyBNYXRoLnBvdyhNYXRoLmFicyhsaW5lWzFdLnggLSBsaW5lWzBdLngpLCAyKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVjb2RlcyBmcm9tIGEgZnVsbCBpbWFnZSB1c2luZyByZWFkZXJzIHRoYXQgc3VwcG9ydCBpbWFnZS1iYXNlZCBkZWNvZGluZy5cbiAgICAgICAgICogUmVhZGVycyBhcmUgdHJpZWQgaW4gb3JkZXIgKGFzIHNwZWNpZmllZCBpbiBjb25maWcucmVhZGVycykuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbWFnZVdyYXBwZXIgVGhlIGltYWdlIHRvIGRlY29kZVxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IERlY29kZWQgcmVzdWx0IG9yIG51bGxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGRlY29kZUZyb21JbWFnZShpbWFnZVdyYXBwZXIpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgLy8gSXRlcmF0ZSByZWFkZXJzIGluIG9yZGVyIC0gZmlyc3Qgc3VjY2Vzc2Z1bCBkZWNvZGUgd2luc1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgX2JhcmNvZGVSZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5kZWNvZGVJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkZXIuZGVjb2RlSW1hZ2UoaW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaXRoIHRoZSBoZWxwIG9mIHRoZSBjb25maWd1cmVkIHJlYWRlcnMgKENvZGUxMjggb3IgRUFOKSB0aGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGRldGVjdCBhXG4gICAgICAgICAqIHZhbGlkIGJhcmNvZGUgcGF0dGVybiB3aXRoaW4gdGhlIGdpdmVuIGFyZWEuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBib3ggVGhlIGFyZWEgdG8gc2VhcmNoIGluXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSByZXN1bHQge2NvZGVSZXN1bHQsIGxpbmUsIGFuZ2xlLCBwYXR0ZXJuLCB0aHJlc2hvbGR9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KSB7XG4gICAgICAgICAgICBsZXQgbGluZTtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IF9jYW52YXMuY3R4Lm92ZXJsYXk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5kZWJ1Zy5kcmF3Qm91bmRpbmdCb3ggJiYgY3R4KSB7XG4gICAgICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgoYm94LCB7IHg6IDAsIHk6IDEgfSwgY3R4LCB7IGNvbG9yOiAnYmx1ZScsIGxpbmVXaWR0aDogMiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKGJveCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gZ2V0TGluZUxlbmd0aChsaW5lKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVBbmdsZSA9IE1hdGguYXRhbjIobGluZVsxXS55IC0gbGluZVswXS55LCBsaW5lWzFdLnggLSBsaW5lWzBdLngpO1xuICAgICAgICAgICAgbGluZSA9IGdldEV4dGVuZGVkTGluZShsaW5lLCBsaW5lQW5nbGUsIE1hdGguZmxvb3IobGluZUxlbmd0aCAqIDAuMSkpO1xuICAgICAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gdHJ5RGVjb2RlKGxpbmUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRyeURlY29kZUJydXRlRm9yY2UoYm94LCBsaW5lLCBsaW5lQW5nbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgcmVzdWx0ICYmIGNvbmZpZy5kZWJ1Zy5kcmF3U2NhbmxpbmUgJiYgY3R4KSB7XG4gICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChsaW5lLCB7IHg6ICd4JywgeTogJ3knIH0sIGN0eCwgeyBjb2xvcjogJ3JlZCcsIGxpbmVXaWR0aDogMyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlUmVzdWx0OiByZXN1bHQuY29kZVJlc3VsdCxcbiAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgIGFuZ2xlOiBsaW5lQW5nbGUsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogcmVzdWx0LmJhcmNvZGVMaW5lLmxpbmUsXG4gICAgICAgICAgICAgICAgdGhyZXNob2xkOiByZXN1bHQuYmFyY29kZUxpbmUudGhyZXNob2xkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZUZyb21Cb3VuZGluZ0JveChib3gpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlY29kZUZyb21Cb3VuZGluZ0JveGVzKGJveGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGk7IGxldCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFyY29kZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG11bHRpcGxlIH0gPSBjb25maWc7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm94ID0gYm94ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY29kZUZyb21Cb3VuZGluZ0JveChib3gpIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm94ID0gYm94O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFyY29kZXMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYmFyY29kZXMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyBkZWNvZGVGcm9tSW1hZ2UoaW1hZ2VXcmFwcGVySW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWNvZGVGcm9tSW1hZ2UoaW1hZ2VXcmFwcGVySW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVnaXN0ZXJSZWFkZXIobmFtZSwgcmVhZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFJFQURFUlNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgcmVnaXN0ZXIgZXhpc3RpbmcgcmVhZGVyJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFJFQURFUlNbbmFtZV0gPSByZWFkZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0UmVhZGVycyhyZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgY29uZmlnLnJlYWRlcnMgPSByZWFkZXJzO1xuICAgICAgICAgICAgICAgIF9iYXJjb2RlUmVhZGVycy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGluaXRSZWFkZXJzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIgZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgVHdvT2ZGaXZlUmVhZGVyIGZyb20gJy4vMm9mNV9yZWFkZXInO1xuaW1wb3J0IE5ld0NvZGFiYXJSZWFkZXIgZnJvbSAnLi9jb2RhYmFyX3JlYWRlcic7XG5pbXBvcnQgQ29kZTEyOFJlYWRlciBmcm9tICcuL2NvZGVfMTI4X3JlYWRlcic7XG5pbXBvcnQgQ29kZTMyUmVhZGVyIGZyb20gJy4vY29kZV8zMl9yZWFkZXInO1xuaW1wb3J0IENvZGUzOVJlYWRlciBmcm9tICcuL2NvZGVfMzlfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlWSU5SZWFkZXIgZnJvbSAnLi9jb2RlXzM5X3Zpbl9yZWFkZXInO1xuaW1wb3J0IENvZGU5M1JlYWRlciBmcm9tICcuL2NvZGVfOTNfcmVhZGVyJztcbmltcG9ydCBFQU4yUmVhZGVyIGZyb20gJy4vZWFuXzJfcmVhZGVyJztcbmltcG9ydCBFQU41UmVhZGVyIGZyb20gJy4vZWFuXzVfcmVhZGVyJztcbmltcG9ydCBFQU44UmVhZGVyIGZyb20gJy4vZWFuXzhfcmVhZGVyJztcbmltcG9ydCBFQU5SZWFkZXIgZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCBJMm9mNVJlYWRlciBmcm9tICcuL2kyb2Y1X3JlYWRlcic7XG5pbXBvcnQgUGhhcm1hY29kZVJlYWRlciBmcm9tICcuL3BoYXJtYWNvZGVfcmVhZGVyJztcbmltcG9ydCBVUENFUmVhZGVyIGZyb20gJy4vdXBjX2VfcmVhZGVyJztcbmltcG9ydCBVUENSZWFkZXIgZnJvbSAnLi91cGNfcmVhZGVyJztcblxuZXhwb3J0IHtcbiAgICBCYXJjb2RlUmVhZGVyLFxuICAgIFR3b09mRml2ZVJlYWRlcixcbiAgICBOZXdDb2RhYmFyUmVhZGVyLFxuICAgIENvZGUxMjhSZWFkZXIsXG4gICAgQ29kZTMyUmVhZGVyLFxuICAgIENvZGUzOVJlYWRlcixcbiAgICBDb2RlMzlWSU5SZWFkZXIsXG4gICAgQ29kZTkzUmVhZGVyLFxuICAgIEVBTjJSZWFkZXIsXG4gICAgRUFONVJlYWRlcixcbiAgICBFQU44UmVhZGVyLFxuICAgIEVBTlJlYWRlcixcbiAgICBJMm9mNVJlYWRlcixcbiAgICBQaGFybWFjb2RlUmVhZGVyLFxuICAgIFVQQ0VSZWFkZXIsXG4gICAgVVBDUmVhZGVyLCAgICBcbn1cbiIsInR5cGUgRXZlbnROYW1lID0gc3RyaW5nO1xuXG5pbnRlcmZhY2UgU3Vic2NyaXB0aW9uIHtcbiAgICBhc3luYz86IGJvb2xlYW47XG4gICAgY2FsbGJhY2s6IEZ1bmN0aW9uO1xuICAgIG9uY2U/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRXZlbnREYXRhIHtcbiAgICBzdWJzY3JpYmVyczogQXJyYXk8U3Vic2NyaXB0aW9uPjtcbn1cblxuaW50ZXJmYWNlIEV2ZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogRXZlbnREYXRhO1xufVxuXG5pbnRlcmZhY2UgRXZlbnRJbnRlcmZhY2Uge1xuICAgIHN1YnNjcmliZShldmVudDogRXZlbnROYW1lLCBjYWxsYmFjazogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24sIGFzeW5jPzogYm9vbGVhbik6IHZvaWQ7XG4gICAgcHVibGlzaChldmVudE5hbWU6IEV2ZW50TmFtZSwgZGF0YT86IG5ldmVyKTogdm9pZDtcbiAgICBvbmNlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZDtcbiAgICB1bnN1YnNjcmliZShldmVudE5hbWU/OiBFdmVudE5hbWUsIGNhbGxiYWNrPzogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gRXZlbnRJbnRlcmZhY2UoKTogRXZlbnRJbnRlcmZhY2Uge1xuICAgIGxldCBldmVudHM6IEV2ZW50cyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZ2V0RXZlbnQoZXZlbnROYW1lOiBFdmVudE5hbWUpOiBFdmVudERhdGEge1xuICAgICAgICBpZiAoIWV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICBldmVudHNbZXZlbnROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudHNbZXZlbnROYW1lXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRzID0ge307XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiwgZGF0YTogbmV2ZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5hc3luYykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfSwgNCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfc3Vic2NyaWJlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiB8IFN1YnNjcmlwdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGFzeW5jLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIHdhcyBub3Qgc3BlY2lmaWVkIG9uIG9wdGlvbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdldEV2ZW50KGV2ZW50KS5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3Vic2NyaWJlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiB8IFN1YnNjcmlwdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgICAgICByZXR1cm4gX3N1YnNjcmliZShldmVudCwgY2FsbGJhY2ssIGFzeW5jKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGlzaChldmVudE5hbWU6IEV2ZW50TmFtZSwgZGF0YT86IG5ldmVyKTogdm9pZCB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCB7IHN1YnNjcmliZXJzIH0gPSBldmVudDtcblxuICAgICAgICAgICAgLy8gUHVibGlzaCBvbmUtdGltZSBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICBzdWJzY3JpYmVycy5maWx0ZXIoKHN1YnNjcmliZXIpID0+ICEhc3Vic2NyaWJlci5vbmNlKS5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpYmVyLCBkYXRhIGFzIG5ldmVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlbSBmcm9tIHRoZSBzdWJzY3JpYmVyXG4gICAgICAgICAgICBldmVudC5zdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzLmZpbHRlcigoc3Vic2NyaWJlcikgPT4gIXN1YnNjcmliZXIub25jZSk7XG5cbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggdGhlIHJlc3RcbiAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoU3Vic2NyaXB0aW9uKHN1YnNjcmliZXIsIGRhdGEgYXMgbmV2ZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uY2UoZXZlbnQ6IEV2ZW50TmFtZSwgY2FsbGJhY2s6IEZ1bmN0aW9uLCBhc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgICAgICBfc3Vic2NyaWJlKGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgYXN5bmMsXG4gICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB1bnN1YnNjcmliZShldmVudE5hbWU/OiBFdmVudE5hbWUsIGNhbGxiYWNrPzogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzID0gZXZlbnQuc3Vic2NyaWJlcnMuZmlsdGVyKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3Vic2NyaWJlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsZWFyRXZlbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn0oKSk7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgY29kZT86IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG06IHN0cmluZywgY29kZT86IG51bWJlcikge1xuICAgICAgICBzdXBlcihtKTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBKU09OIHNlcmlhbGl6YXRpb24gdG8gZW5zdXJlIGVycm9yIG1lc3NhZ2UgaXMgaW5jbHVkZWQuXG4gICAgICogVGhlIEVycm9yIGNsYXNzJ3MgbWVzc2FnZSBwcm9wZXJ0eSBpcyBub24tZW51bWVyYWJsZSBieSBkZWZhdWx0LFxuICAgICAqIHNvIEpTT04uc3RyaW5naWZ5IHdvdWxkIG9ubHkgaW5jbHVkZSB7Y29kZTogLTF9IHdpdGhvdXQgdGhpcyBtZXRob2QuXG4gICAgICogVGhpcyBlbnN1cmVzIGNvbnN1bWVycyByZWNlaXZlIG1lYW5pbmdmdWwgZXJyb3IgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgdG9KU09OKCk6IHsgbWVzc2FnZTogc3RyaW5nOyBjb2RlPzogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9xdWFnZ2EvRXhjZXB0aW9uJztcblxuY29uc3QgRVJST1JfREVTQyA9ICdUaGlzIG1heSBtZWFuIHRoYXQgdGhlIHVzZXIgaGFzIGRlY2xpbmVkIGNhbWVyYSBhY2Nlc3MsIG9yIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgbWVkaWEgQVBJcy4gSWYgeW91IGFyZSBydW5uaW5nIGluIGlPUywgeW91IG11c3QgdXNlIFNhZmFyaS4nO1xuXG5leHBvcnQgZnVuY3Rpb24gZW51bWVyYXRlRGV2aWNlcygpOiBQcm9taXNlPEFycmF5PE1lZGlhRGV2aWNlSW5mbz4+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IG5ldyBFeGNlcHRpb24oYGVudW1lcmF0ZURldmljZXMgaXMgbm90IGRlZmluZWQuICR7RVJST1JfREVTQ31gLCAtMSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzOiBNZWRpYVN0cmVhbUNvbnN0cmFpbnRzKTogUHJvbWlzZTxNZWRpYVN0cmVhbT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IG5ldyBFeGNlcHRpb24oYGdldFVzZXJNZWRpYSBpcyBub3QgZGVmaW5lZC4gJHtFUlJPUl9ERVNDfWAsIC0xKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG59XG4iLCIvLyBUT0RPOiB3aGVuIHRoaXMgZmlsZSB3YXMgd3JpdHRlbiB5ZWFycyBhZ28sIEhUTUxNZWRpYUVsZW1lbnQucGxheSgpIGRpZCBub3QgcmV0dXJuIGEgdXNlZnVsIHZhbHVlXG4vLyB0byBsZXQgdXMga25vdyB3aGVuIHRoZSB2aWRlbyBzdGFydGVkIHBsYXlpbmcuICBOb3csIGl0IGRvZXMuICBTbywgd2Ugc2hvdWxkbid0IG5lZWQgdG8gcnVuIHRoaXNcbi8vIG9kZCB3YWl0Rm9yVmlkZW8oKSBmdW5jdGlvbiB0aGF0IHBvbGxzIHRvIHNlZSBpZiB0aGUgdmlkZW8gaGFzIHN0YXJ0ZWQuXG5pbXBvcnQgb21pdCBmcm9tICdsb2Rhc2gvb21pdCc7XG5pbXBvcnQgeyBnZXRVc2VyTWVkaWEsIGVudW1lcmF0ZURldmljZXMgfSBmcm9tICcuLi9jb21tb24vbWVkaWFEZXZpY2VzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vcXVhZ2dhL0V4Y2VwdGlvbic7XG5pbXBvcnQgdHlwZSB7XG4gICAgTWVkaWFUcmFja0NvbnN0cmFpbnRzV2l0aERlcHJlY2F0ZWQsXG4gICAgUXVhZ2dhSlNDYW1lcmFBY2Nlc3MgYXMgQ2FtZXJhQWNjZXNzVHlwZSxcbn0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmxldCBzdHJlYW1SZWY6IE1lZGlhU3RyZWFtIHwgbnVsbDtcblxuZnVuY3Rpb24gd2FpdEZvclZpZGVvKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IGF0dGVtcHRzID0gMTA7XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tWaWRlbygpOiB2b2lkIHtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0cyA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodmlkZW8udmlkZW9XaWR0aCA+IDEwICYmIHZpZGVvLnZpZGVvSGVpZ2h0ID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCogZGV2OiBjaGVja1ZpZGVvIGZvdW5kICR7dmlkZW8udmlkZW9XaWR0aH1weCB4ICR7dmlkZW8udmlkZW9IZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoY2hlY2tWaWRlbywgNTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXhjZXB0aW9uKCdVbmFibGUgdG8gcGxheSB2aWRlbyBzdHJlYW0uIElzIHdlYmNhbSB3b3JraW5nPycsIC0xKSk7IC8vIFRPRE86IGFkZCBlcnJvciBjb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRlbXB0cy0tO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrVmlkZW8oKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBUcmllcyB0byBhdHRhY2ggdGhlIGNhbWVyYS1zdHJlYW0gdG8gYSBnaXZlbiB2aWRlby1lbGVtZW50XG4gKiBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIGNvbnRlbnQgaXMgcmVhZHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25zdHJhaW50c1xuICogQHBhcmFtIHtPYmplY3R9IHZpZGVvXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRDYW1lcmEodmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsLCBjb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7XG4gICAgc3RyZWFtUmVmID0gc3RyZWFtO1xuICAgIGlmICh2aWRlbykge1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJ3RydWUnKTtcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdtdXRlZCcsICd0cnVlJyk7XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAndHJ1ZScpOyAvLyBub3QgbGlzdGVkIG9uIE1ETi4uLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdmlkZW8uc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsICgpID0+IHtcbiAgICAgICAgICAgIHZpZGVvLnBsYXkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCcqIEVycm9yIHdoaWxlIHRyeWluZyB0byBwbGF5IHZpZGVvIHN0cmVhbTonLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gd2FpdEZvclZpZGVvKHZpZGVvKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5mdW5jdGlvbiBkZXByZWNhdGVkQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50czogTWVkaWFUcmFja0NvbnN0cmFpbnRzV2l0aERlcHJlY2F0ZWQpOiBNZWRpYVRyYWNrQ29uc3RyYWludHMge1xuICAgIC8vIFJlbW92ZSBkZXByZWNhdGVkIHByb3BlcnRpZXMgKGZhY2luZywgbWluQXNwZWN0UmF0aW8sIG1heEFzcGVjdFJhdGlvKSB3aGlsZVxuICAgIC8vIHByZXNlcnZpbmcgYWxsIHZhbGlkIE1lZGlhVHJhY2tDb25zdHJhaW50cyBpbmNsdWRpbmcgYWR2YW5jZWQsIHpvb20sIHRvcmNoLCBldGMuXG4gICAgY29uc3Qgbm9ybWFsaXplZDogTWVkaWFUcmFja0NvbnN0cmFpbnRzID0gb21pdCh2aWRlb0NvbnN0cmFpbnRzLCBbJ2ZhY2luZycsICdtaW5Bc3BlY3RSYXRpbycsICdtYXhBc3BlY3RSYXRpbyddKTtcblxuICAgIGlmICh0eXBlb2YgdmlkZW9Db25zdHJhaW50cy5taW5Bc3BlY3RSYXRpbyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICYmIHZpZGVvQ29uc3RyYWludHMubWluQXNwZWN0UmF0aW8gPiAwKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuYXNwZWN0UmF0aW8gPSB2aWRlb0NvbnN0cmFpbnRzLm1pbkFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogQ29uc3RyYWludCBcXCdtaW5Bc3BlY3RSYXRpb1xcJyBpcyBkZXByZWNhdGVkOyBVc2UgXFwnYXNwZWN0UmF0aW9cXCcgaW5zdGVhZCcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZpZGVvQ29uc3RyYWludHMuZmFjaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBub3JtYWxpemVkLmZhY2luZ01vZGUgPSB2aWRlb0NvbnN0cmFpbnRzLmZhY2luZztcbiAgICAgICAgY29uc29sZS5sb2coJ1dBUk5JTkc6IENvbnN0cmFpbnQgXFwnZmFjaW5nXFwnIGlzIGRlcHJlY2F0ZWQuIFVzZSBcXCdmYWNpbmdNb2RlXFwnIGluc3RlYWRcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8vIFRPRE86ICMxOTIgSSBkb24ndCB0aGluayB0aGVyZSdzIGFueSBnb29kIHJlYXNvbiBwaWNrQ29uc3RyYWludHMgc2hvdWxkIHJldHVybiBhIFByb21pc2UsXG4vLyBJIHRoaW5rIGl0IHdhcyBqdXN0IHRoYXQgd2F5IHNvIGl0IGNvdWxkIGJlIGNoYWluZWQgdG8gb3RoZXIgZnVuY3Rpb25zIHRoYXQgZGlkIHJldHVybiBhIFByb21pc2UuXG4vLyBUaGF0J3Mgbm90IG5lY2Vzc2FyeSB3aXRoIGFzeW5jIGZ1bmN0aW9ucyBiZWluZyBhIHRoaW5nLCBzbyB0aGF0IHNob3VsZCBiZSBmaXhlZC5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50czogTWVkaWFUcmFja0NvbnN0cmFpbnRzV2l0aERlcHJlY2F0ZWQgPSB7fSk6IFByb21pc2U8TWVkaWFTdHJlYW1Db25zdHJhaW50cz4ge1xuICAgIGNvbnN0IHZpZGVvID0gZGVwcmVjYXRlZENvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpO1xuXG4gICAgaWYgKHZpZGVvICYmIHZpZGVvLmRldmljZUlkICYmIHZpZGVvLmZhY2luZ01vZGUpIHtcbiAgICAgICAgZGVsZXRlIHZpZGVvLmZhY2luZ01vZGU7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoeyBhdWRpbzogZmFsc2UsIHZpZGVvIH0pO1xufVxuXG4vKipcbiAqIEVudW1lcmF0ZXMgdmlkZW8gaW5wdXQgZGV2aWNlcywgb3B0aW9uYWxseSBmaWx0ZXJpbmcgYnkgY29uc3RyYWludHMuXG4gKiBAcGFyYW0gdmlkZW9Db25zdHJhaW50cyBPcHRpb25hbCBjb25zdHJhaW50cyB0byBmaWx0ZXIgZGV2aWNlcy5cbiAqIFdoZW4gcHJvdmlkZWQsIG9ubHkgZGV2aWNlcyB0aGF0IHNhdGlzZnkgdGhlIGdpdmVuIGNvbnN0cmFpbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBUaGlzIHdvcmtzIGJ5IGF0dGVtcHRpbmcgdG8gZ2V0IGEgbWVkaWEgc3RyZWFtIGZvciBlYWNoIGRldmljZSB3aXRoIHRoZSBjb25zdHJhaW50c1xuICogYW5kIHJldHVybmluZyBvbmx5IHRoZSBkZXZpY2VzIHRoYXQgc3VjY2VlZC5cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIGFycmF5IG9mIE1lZGlhRGV2aWNlSW5mbyBmb3IgdmlkZW8gaW5wdXQgZGV2aWNlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW51bWVyYXRlVmlkZW9EZXZpY2VzKFxuICAgIHZpZGVvQ29uc3RyYWludHM/OiBNZWRpYVRyYWNrQ29uc3RyYWludHNXaXRoRGVwcmVjYXRlZCxcbik6IFByb21pc2U8QXJyYXk8TWVkaWFEZXZpY2VJbmZvPj4ge1xuICAgIGNvbnN0IGRldmljZXMgPSBhd2FpdCBlbnVtZXJhdGVEZXZpY2VzKCk7XG4gICAgY29uc3QgdmlkZW9EZXZpY2VzID0gZGV2aWNlcy5maWx0ZXIoKGRldmljZTogTWVkaWFEZXZpY2VJbmZvKSA9PiBkZXZpY2Uua2luZCA9PT0gJ3ZpZGVvaW5wdXQnKTtcblxuICAgIC8vIElmIG5vIGNvbnN0cmFpbnRzIGFyZSBwcm92aWRlZCwgcmV0dXJuIGFsbCB2aWRlbyBkZXZpY2VzXG4gICAgaWYgKCF2aWRlb0NvbnN0cmFpbnRzKSB7XG4gICAgICAgIHJldHVybiB2aWRlb0RldmljZXM7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGRldmljZXMgYmFzZWQgb24gY29uc3RyYWludHMgYnkgdHJ5aW5nIHRvIGdldCBhIG1lZGlhIHN0cmVhbSBmb3IgZWFjaFxuICAgIGNvbnN0IGNvbnN0cmFpbmVkRGV2aWNlczogQXJyYXk8TWVkaWFEZXZpY2VJbmZvPiA9IFtdO1xuXG4gICAgLy8gUHJvY2VzcyBjb25zdHJhaW50cyBidXQgZXhjbHVkZSBkZXZpY2VJZCBzaW5jZSB3ZSdsbCBzZXQgaXQgb3Vyc2VsdmVzIGZvciBlYWNoIGRldmljZVxuICAgIGNvbnN0IHByb2Nlc3NlZENvbnN0cmFpbnRzID0gZGVwcmVjYXRlZENvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCB7IGRldmljZUlkOiBfLCAuLi5jb25zdHJhaW50c1dpdGhvdXREZXZpY2VJZCB9ID0gcHJvY2Vzc2VkQ29uc3RyYWludHM7XG5cbiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiB2aWRlb0RldmljZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBNZWRpYVN0cmVhbUNvbnN0cmFpbnRzID0ge1xuICAgICAgICAgICAgICAgIGF1ZGlvOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB2aWRlbzoge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb25zdHJhaW50c1dpdGhvdXREZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQ6IHsgZXhhY3Q6IGRldmljZS5kZXZpY2VJZCB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcbiAgICAgICAgICAgIC8vIFN0b3AgYWxsIHRyYWNrcyBpbW1lZGlhdGVseSBhZnRlciB0ZXN0aW5nXG4gICAgICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgICAgICAgICBjb25zdHJhaW5lZERldmljZXMucHVzaChkZXZpY2UpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIERldmljZSBkb2Vzbid0IHN1cHBvcnQgdGhlIGNvbnN0cmFpbnRzLCBza2lwIGl0LlxuICAgICAgICAgICAgLy8gVGhpcyBjYXRjaCBpcyBpbnRlbnRpb25hbGx5IGVtcHR5IGFzIHdlJ3JlIHVzaW5nIGdldFVzZXJNZWRpYSB0byB0ZXN0IGlmXG4gICAgICAgICAgICAvLyBlYWNoIGRldmljZSBzdXBwb3J0cyB0aGUgY29uc3RyYWludHMuIEVycm9ycyBoZXJlIGluZGljYXRlIHRoZSBkZXZpY2VcbiAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIChPdmVyY29uc3RyYWluZWRFcnJvcikgb3Igb3RoZXIgaXNzdWVzXG4gICAgICAgICAgICAvLyB0aGF0IG1lYW4gd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhpcyBkZXZpY2UgZnJvbSB0aGUgcmVzdWx0cy5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJhaW5lZERldmljZXM7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZVRyYWNrKCk6IE1lZGlhU3RyZWFtVHJhY2sgfCBudWxsIHtcbiAgICBpZiAoIXN0cmVhbVJlZikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdHJhY2tzID0gc3RyZWFtUmVmLmdldFZpZGVvVHJhY2tzKCk7XG4gICAgcmV0dXJuIHRyYWNrcyAmJiB0cmFja3M/Lmxlbmd0aCA/IHRyYWNrc1swXSA6IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWN0aXZlIE1lZGlhU3RyZWFtLCBvciBudWxsIGlmIG5vIHN0cmVhbSBpcyBhY3RpdmUuXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIGFjY2VzcyB0byB0aGUgZnVsbCBzdHJlYW0sIGZvciBleGFtcGxlIHRvIHBhc3MgdG8gV2ViUlRDXG4gKiBvciB0byBjbG9uZSB0aGUgc3RyZWFtLiBGb3IganVzdCB0aGUgdmlkZW8gdHJhY2ssIHVzZSBnZXRBY3RpdmVUcmFjaygpIGluc3RlYWQuXG4gKiBAcmV0dXJucyBUaGUgYWN0aXZlIE1lZGlhU3RyZWFtLCBvciBudWxsIGlmIG5vIGNhbWVyYSBpcyBjdXJyZW50bHkgYWN0aXZlLlxuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVTdHJlYW0oKTogTWVkaWFTdHJlYW0gfCBudWxsIHtcbiAgICByZXR1cm4gc3RyZWFtUmVmID8/IG51bGw7XG59XG5cbi8qKlxuICogVXNlZCBmb3IgYWNjZXNzaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY3RpdmUgc3RyZWFtIHRyYWNrIGFuZCBhdmFpbGFibGUgdmlkZW8gZGV2aWNlcy5cbiAqL1xuY29uc3QgUXVhZ2dhSlNDYW1lcmFBY2Nlc3M6IENhbWVyYUFjY2Vzc1R5cGUgPSB7XG4gICAgcmVxdWVzdGVkVmlkZW9FbGVtZW50OiBudWxsLFxuICAgIGFzeW5jIHJlcXVlc3QodmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsLCB2aWRlb0NvbnN0cmFpbnRzPzogTWVkaWFUcmFja0NvbnN0cmFpbnRzV2l0aERlcHJlY2F0ZWQpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBRdWFnZ2FKU0NhbWVyYUFjY2Vzcy5yZXF1ZXN0ZWRWaWRlb0VsZW1lbnQgPSB2aWRlbztcbiAgICAgICAgY29uc3QgbmV3Q29uc3RyYWludHMgPSBhd2FpdCBwaWNrQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50cyk7XG4gICAgICAgIHJldHVybiBpbml0Q2FtZXJhKHZpZGVvLCBuZXdDb25zdHJhaW50cyk7XG4gICAgfSxcbiAgICByZWxlYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0cmFja3MgPSBzdHJlYW1SZWYgJiYgc3RyZWFtUmVmLmdldFZpZGVvVHJhY2tzKCk7XG4gICAgICAgIGlmIChRdWFnZ2FKU0NhbWVyYUFjY2Vzcy5yZXF1ZXN0ZWRWaWRlb0VsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIFF1YWdnYUpTQ2FtZXJhQWNjZXNzLnJlcXVlc3RlZFZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNrcyAmJiB0cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrcy5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyZWFtUmVmID0gbnVsbDtcbiAgICAgICAgICAgICAgICBRdWFnZ2FKU0NhbWVyYUFjY2Vzcy5yZXF1ZXN0ZWRWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGVudW1lcmF0ZVZpZGVvRGV2aWNlcyxcbiAgICBnZXRBY3RpdmVTdHJlYW0sXG4gICAgZ2V0QWN0aXZlU3RyZWFtTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSBnZXRBY3RpdmVUcmFjaygpO1xuICAgICAgICByZXR1cm4gdHJhY2sgPyB0cmFjay5sYWJlbCA6ICcnO1xuICAgIH0sXG4gICAgZ2V0QWN0aXZlVHJhY2ssXG4gICAgYXN5bmMgZGlzYWJsZVRvcmNoKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IGdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhY3F1aXJlIGNhbWVyYSBhY2Nlc3MgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgY2FtZXJhIG9wZW4/XG4gICAgICAgIC8vIFRPRE86IHdoYXQgaGFwcGVucyBvbiBpT1Mgb3IgYW5vdGhlciBkZXZpY2Ugd2hlcmUgdG9yY2ggaXNuJ3Qgc3VwcG9ydGVkIGF0IGFsbD8gU2hvdWxkIHdlIHRocm93IGFuIGVycm9yP1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhY2suYXBwbHlDb25zdHJhaW50cyh7IGFkdmFuY2VkOiBbeyB0b3JjaDogZmFsc2UgfV0gfSBhcyBNZWRpYVRyYWNrQ29uc3RyYWludFNldCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgT3ZlcmNvbnN0cmFpbmVkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdxdWFnZ2EyL0NhbWVyYUFjY2VzczogVG9yY2ggbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGVuYWJsZVRvcmNoKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IGdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhY3F1aXJlIGNhbWVyYSBhY2Nlc3MgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgY2FtZXJhIG9wZW4/XG4gICAgICAgIC8vIFRPRE86IHdoYXQgaGFwcGVucyBvbiBpT1Mgb3IgYW5vdGhlciBkZXZpY2Ugd2hlcmUgdG9yY2ggaXNuJ3Qgc3VwcG9ydGVkIGF0IGFsbD8gU2hvdWxkIHdlIHRocm93IGFuIGVycm9yP1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhY2suYXBwbHlDb25zdHJhaW50cyh7IGFkdmFuY2VkOiBbeyB0b3JjaDogdHJ1ZSB9XSB9IGFzIE1lZGlhVHJhY2tDb25zdHJhaW50U2V0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBPdmVyY29uc3RyYWluZWRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3F1YWdnYTIvQ2FtZXJhQWNjZXNzOiBUb3JjaCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBRdWFnZ2FKU0NhbWVyYUFjY2VzcztcbiIsImltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4uL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgUXVhZ2dhSlNDb2RlUmVzdWx0LFxuICAgIFF1YWdnYUpTUmVzdWx0Q29sbGVjdG9yLFxuICAgIFF1YWdnYUpTUmVzdWx0Q29sbGVjdG9yRmlsdGVyRnVuY3Rpb24sXG4gICAgWFlTaXplLFxuICAgIFF1YWdnYUltYWdlRGF0YSxcbn0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGNvZGVSZXN1bHQ6IFF1YWdnYUpTQ29kZVJlc3VsdCwgbGlzdDogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsaXN0ICYmIGxpc3Quc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSkgYXMgQXJyYXk8a2V5b2YgUXVhZ2dhSlNDb2RlUmVzdWx0PjtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gaXRlbVtrZXldID09PSBjb2RlUmVzdWx0W2tleV0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwYXNzZXNGaWx0ZXIoXG4gICAgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0LFxuICAgIGZpbHRlcjogUXVhZ2dhSlNSZXN1bHRDb2xsZWN0b3JGaWx0ZXJGdW5jdGlvbiB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nID8gZmlsdGVyKGNvZGVSZXN1bHQpIDogdHJ1ZTtcbn1cblxuaW50ZXJmYWNlIFJlc3VsdENvbGxlY3RvciB7XG4gICAgYWRkUmVzdWx0OiAoZGF0YTogUXVhZ2dhSW1hZ2VEYXRhLCBpbWFnZVNpemU6IFhZU2l6ZSwgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KSA9PiB2b2lkO1xuICAgIGdldFJlc3VsdHM6ICgpID0+IEFycmF5PFF1YWdnYUpTQ29kZVJlc3VsdD47XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjcmVhdGUoY29uZmlnOiBRdWFnZ2FKU1Jlc3VsdENvbGxlY3Rvcik6IFJlc3VsdENvbGxlY3RvciB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogISFjb25maWcud2lsbFJlYWRGcmVxdWVudGx5IH0pIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICAgICAgY29uc3QgcmVzdWx0czogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0PiA9IFtdO1xuICAgICAgICBsZXQgY2FwYWNpdHkgPSBjb25maWcuY2FwYWNpdHkgPz8gMjA7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBjb25maWcuY2FwdHVyZSA9PT0gdHJ1ZTtcblxuICAgICAgICBmdW5jdGlvbiBtYXRjaGVzQ29uc3RyYWludHMoY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gISFjYXBhY2l0eVxuICAgICAgICAgICAgICAgICYmIGNvZGVSZXN1bHRcbiAgICAgICAgICAgICAgICAmJiAhY29udGFpbnMoY29kZVJlc3VsdCwgY29uZmlnLmJsYWNrbGlzdCBhcyBBcnJheTxRdWFnZ2FKU0NvZGVSZXN1bHQ+KVxuICAgICAgICAgICAgICAgICYmIHBhc3Nlc0ZpbHRlcihjb2RlUmVzdWx0LCBjb25maWcuZmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZGF0YTogUXVhZ2dhSW1hZ2VEYXRhLCBpbWFnZVNpemU6IFhZU2l6ZSwgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7IH07IC8vIHRoaXMgaXMgJ2FueScgdG8gYXZvaWQgaGF2aW5nIHRvIGNvbnN0cnVjdCBhIHdob2xlIFF1YWdnYUpTQ29kZVJlc3VsdCA6fFxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzQ29uc3RyYWludHMoY29kZVJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHktLTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvZGVSZXN1bHQgPSBjb2RlUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2VTaXplLng7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2VTaXplLnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdJbWFnZShkYXRhLCBpbWFnZVNpemUsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWUgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc3VsdHMoKTogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuY29uc3QgRGV2Q29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCA9IHtcbiAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICB0eXBlOiAnTGl2ZVN0cmVhbScsXG4gICAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiA0ODAsXG4gICAgICAgICAgICAvLyBhc3BlY3RSYXRpbzogNjQwLzQ4MCwgLy8gb3B0aW9uYWxcbiAgICAgICAgICAgIGZhY2luZ01vZGU6ICdlbnZpcm9ubWVudCcsIC8vIG9yIHVzZXJcbiAgICAgICAgICAgIC8vIGRldmljZUlkOiBcIjM4NzQ1OTgzNDU3Mzg3NTk4Mzc1OTgzNzU5ODM0XCJcbiAgICAgICAgfSxcbiAgICAgICAgYXJlYToge1xuICAgICAgICAgICAgdG9wOiAnMCUnLFxuICAgICAgICAgICAgcmlnaHQ6ICcwJScsXG4gICAgICAgICAgICBsZWZ0OiAnMCUnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICAgICAgLy8gYm9yZGVyQ29sb3I6ICdyZ2JhKDAsIDI1NSwgMCwgMC41KScsIC8vIHVuY29tbWVudCB0byBkcmF3IGFyZWEgYm9yZGVyXG4gICAgICAgICAgICAvLyBib3JkZXJXaWR0aDogMiwgLy8gdW5jb21tZW50IHRvIGRyYXcgYXJlYSBib3JkZXJcbiAgICAgICAgICAgIC8vIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMjU1LCAwLCAwLjEpJywgLy8gdW5jb21tZW50IHRvIHRpbnQgdGhlIHNjYW4gYXJlYVxuICAgICAgICB9LFxuICAgICAgICBzaW5nbGVDaGFubmVsOiBmYWxzZSwgLy8gdHJ1ZTogb25seSB0aGUgcmVkIGNvbG9yLWNoYW5uZWwgaXMgcmVhZFxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgc2hvd0ltYWdlRGV0YWlsczogZmFsc2UsIC8vIGxvZ3MgZnJhbWUgZ3JhYmJlciBpbmZvLCBjYW52YXMgc2l6ZSBhZGp1c3RtZW50c1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgbG9jYXRlOiB0cnVlLFxuICAgIGNhbnZhczoge1xuICAgICAgICBjcmVhdGVPdmVybGF5OiB0cnVlLCAvLyBzZXQgdG8gZmFsc2UgdG8gc2tpcCBjcmVhdGluZyBvdmVybGF5IGNhbnZhcyAoZHJhd2luZ0J1ZmZlcilcbiAgICB9LFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcicsXG4gICAgICAgIF0sXG4gICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgICBkcmF3Qm91bmRpbmdCb3g6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0ZyZXF1ZW5jeTogZmFsc2UsXG4gICAgICAgICAgICBkcmF3U2NhbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1BhdHRlcm46IGZhbHNlLFxuICAgICAgICAgICAgcHJpbnRSZWFkZXJJbmZvOiBmYWxzZSwgLy8gbG9ncyByZWFkZXIgcmVnaXN0cmF0aW9uIGFuZCBpbml0aWFsaXphdGlvblxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nLCAvLyB4LXNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeC1sYXJnZVxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgc2hvd0NhbnZhczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UGF0Y2hlczogZmFsc2UsXG4gICAgICAgICAgICBzaG93Rm91bmRQYXRjaGVzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dTa2VsZXRvbjogZmFsc2UsXG4gICAgICAgICAgICBzaG93TGFiZWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dQYXRjaExhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1BhdGNoU2l6ZTogZmFsc2UsIC8vIGxvZ3MgY2FsY3VsYXRlZCBwYXRjaCBzaXplXG4gICAgICAgICAgICBzaG93SW1hZ2VEZXRhaWxzOiBmYWxzZSwgLy8gbG9ncyBpbWFnZSB3cmFwcGVyIHNpemUsIGNhbnZhcyBkZXRhaWxzXG4gICAgICAgICAgICBib3hGcm9tUGF0Y2hlczoge1xuICAgICAgICAgICAgICAgIHNob3dUcmFuc2Zvcm1lZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd1RyYW5zZm9ybWVkQm94OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93QkI6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRGV2Q29uZmlnO1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuY29uc3QgTm9kZUNvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3QgPSB7XG4gICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgdHlwZTogJ0ltYWdlU3RyZWFtJyxcbiAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICBzaXplOiA4MDAsXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogJzAlJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICAgICAgbGVmdDogJzAlJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAlJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2luZ2xlQ2hhbm5lbDogZmFsc2UsIC8vIHRydWU6IG9ubHkgdGhlIHJlZCBjb2xvci1jaGFubmVsIGlzIHJlYWRcbiAgICB9LFxuICAgIGxvY2F0ZTogdHJ1ZSxcbiAgICBjYW52YXM6IHtcbiAgICAgICAgY3JlYXRlT3ZlcmxheTogdHJ1ZSwgLy8gc2V0IHRvIGZhbHNlIHRvIHNraXAgY3JlYXRpbmcgb3ZlcmxheSBjYW52YXMgKGRyYXdpbmdCdWZmZXIpXG4gICAgfSxcbiAgICBkZWNvZGVyOiB7XG4gICAgICAgIHJlYWRlcnM6IFtcbiAgICAgICAgICAgICdjb2RlXzEyOF9yZWFkZXInLFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nLCAvLyB4LXNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeC1sYXJnZVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBOb2RlQ29uZmlnO1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuY29uc3QgUHJvZENvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3QgPSB7XG4gICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgdHlwZTogJ0xpdmVTdHJlYW0nLFxuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgLy8gYXNwZWN0UmF0aW86IDY0MC80ODAsIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICBmYWNpbmdNb2RlOiAnZW52aXJvbm1lbnQnLCAvLyBvciB1c2VyXG4gICAgICAgICAgICAvLyBkZXZpY2VJZDogXCIzODc0NTk4MzQ1NzM4NzU5ODM3NTk4Mzc1OTgzNFwiXG4gICAgICAgIH0sXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogJzAlJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICAgICAgbGVmdDogJzAlJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAlJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2luZ2xlQ2hhbm5lbDogZmFsc2UsIC8vIHRydWU6IG9ubHkgdGhlIHJlZCBjb2xvci1jaGFubmVsIGlzIHJlYWRcbiAgICB9LFxuICAgIGxvY2F0ZTogdHJ1ZSxcbiAgICBjYW52YXM6IHtcbiAgICAgICAgY3JlYXRlT3ZlcmxheTogdHJ1ZSwgLy8gc2V0IHRvIGZhbHNlIHRvIHNraXAgY3JlYXRpbmcgb3ZlcmxheSBjYW52YXMgKGRyYXdpbmdCdWZmZXIpXG4gICAgfSxcbiAgICBkZWNvZGVyOiB7XG4gICAgICAgIHJlYWRlcnM6IFtcbiAgICAgICAgICAgICdjb2RlXzEyOF9yZWFkZXInLFxuICAgICAgICBdLFxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nLCAvLyB4LXNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeC1sYXJnZVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBQcm9kQ29uZmlnO1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcbmltcG9ydCBEZXZDb25maWcgZnJvbSAnLi9jb25maWcuZGV2JztcbmltcG9ydCBOb2RlQ29uZmlnIGZyb20gJy4vY29uZmlnLm5vZGUnO1xuaW1wb3J0IFByb2RDb25maWcgZnJvbSAnLi9jb25maWcucHJvZCc7XG5cbmNvbnN0IEV4cG9ydENvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3QgPSAoKCkgPT4ge1xuICAgIGxldCBRdWFnZ2FDb25maWc6IFF1YWdnYUpTQ29uZmlnT2JqZWN0O1xuICAgIGlmICh0eXBlb2YgRU5WID09PSAndW5kZWZpbmVkJyB8fCBFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgUXVhZ2dhQ29uZmlnID0gRGV2Q29uZmlnO1xuICAgIH0gZWxzZSBpZiAoRU5WLm5vZGUpIHtcbiAgICAgICAgUXVhZ2dhQ29uZmlnID0gTm9kZUNvbmZpZztcbiAgICB9IGVsc2Uge1xuICAgICAgICBRdWFnZ2FDb25maWcgPSBQcm9kQ29uZmlnO1xuICAgIH1cbiAgICByZXR1cm4gUXVhZ2dhQ29uZmlnO1xufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgRXhwb3J0Q29uZmlnO1xuIiwiLy8gTk9URSBGT1IgQU5ZT05FIElOIEhFUkUgSU4gVEhFIEZVVFVSRTpcbi8vIHdlYnBhY2suY29uZmlnLmpzIHJlcGxhY2VzIHRoZSBmcmFtZV9ncmFiYmVyIG1vZHVsZSB3aXRoIFRISVMgbW9kdWxlIHdoZW4gaXQgaXMgYnVpbGRpbmcgZm9yIGEgQnJvd3NlciBlbnZpcm9ubWVudC5cblxuaW1wb3J0IHtcbiAgICBpbWFnZVJlZixcbiAgICBncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhLFxuICAgIGNvbXB1dGVHcmF5LFxufSBmcm9tICcuLi9jb21tb24vY3ZfdXRpbHMnO1xuXG5jb25zdCBUT19SQURJQU5TID0gTWF0aC5QSSAvIDE4MDtcblxuZnVuY3Rpb24gYWRqdXN0Q2FudmFzU2l6ZShjYW52YXMsIHRhcmdldFNpemUsIGRlYnVnKSB7XG4gICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gdGFyZ2V0U2l6ZS54KSB7XG4gICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgZGVidWc/LnNob3dJbWFnZURldGFpbHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBjYW52YXMtc2l6ZSBuZWVkcyB0byBiZSBhZGp1c3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRhcmdldFNpemUueDtcbiAgICB9XG4gICAgaWYgKGNhbnZhcy5oZWlnaHQgIT09IHRhcmdldFNpemUueSkge1xuICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIGRlYnVnPy5zaG93SW1hZ2VEZXRhaWxzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogY2FudmFzLXNpemUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGFyZ2V0U2l6ZS55O1xuICAgIH1cbn1cblxuY29uc3QgRnJhbWVHcmFiYmVyID0ge307XG5cbkZyYW1lR3JhYmJlci5jcmVhdGUgPSBmdW5jdGlvbiAoaW5wdXRTdHJlYW0sIGNhbnZhcykge1xuICAgIC8vIGNvbnNvbGUud2FybignKioqIEZyYW1lR3JhYmJlckJyb3dzZXIgY3JlYXRlJyk7XG4gICAgY29uc3QgX3RoYXQgPSB7fTtcbiAgICBjb25zdCBfc3RyZWFtQ29uZmlnID0gaW5wdXRTdHJlYW0uZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgX3ZpZGVvU2l6ZSA9IGltYWdlUmVmKGlucHV0U3RyZWFtLmdldFJlYWxXaWR0aCgpLCBpbnB1dFN0cmVhbS5nZXRSZWFsSGVpZ2h0KCkpO1xuICAgIGNvbnN0IF9jYW52YXNTaXplID0gaW5wdXRTdHJlYW0uZ2V0Q2FudmFzU2l6ZSgpO1xuICAgIGNvbnN0IF9zaXplID0gaW1hZ2VSZWYoaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSwgaW5wdXRTdHJlYW0uZ2V0SGVpZ2h0KCkpO1xuICAgIGNvbnN0IHRvcFJpZ2h0ID0gaW5wdXRTdHJlYW0uZ2V0VG9wUmlnaHQoKTtcbiAgICBjb25zdCBfc3ggPSB0b3BSaWdodC54O1xuICAgIGNvbnN0IF9zeSA9IHRvcFJpZ2h0Lnk7XG4gICAgbGV0IF9jYW52YXM7XG4gICAgbGV0IF9jdHggPSBudWxsO1xuICAgIGxldCBfZGF0YSA9IG51bGw7XG4gICAgY29uc3QgeyB3aWxsUmVhZEZyZXF1ZW50bHkgfSA9IF9zdHJlYW1Db25maWc7XG5cbiAgICBfY2FudmFzID0gY2FudmFzIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIF9jYW52YXMud2lkdGggPSBfY2FudmFzU2l6ZS54O1xuICAgIF9jYW52YXMuaGVpZ2h0ID0gX2NhbnZhc1NpemUueTtcbiAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIF9zdHJlYW1Db25maWcuZGVidWc/LnNob3dJbWFnZURldGFpbHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCcqKiogZnJhbWVfZ3JhYmJlcl9icm93c2VyOiB3aWxsUmVhZEZyZXF1ZW50bHk9Jywgd2lsbFJlYWRGcmVxdWVudGx5LCAnY2FudmFzPScsIF9jYW52YXMpO1xuICAgIH1cbiAgICBfY3R4ID0gX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiAhIXdpbGxSZWFkRnJlcXVlbnRseSB9KTsgLy8gZG91YmxlIG5vdCBiZWNhdXNlIHdlIGhhdmUgYW4gb3B0aW9uYWwgYm9vbCB0aGF0IG5lZWRzIHRvIHBhc3MgYXMgYSBib29sXG4gICAgX2RhdGEgPSBuZXcgVWludDhBcnJheShfc2l6ZS54ICogX3NpemUueSk7XG4gICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfc3RyZWFtQ29uZmlnLmRlYnVnPy5zaG93SW1hZ2VEZXRhaWxzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdGcmFtZUdyYWJiZXInLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBzaXplOiBfc2l6ZSxcbiAgICAgICAgICAgIHRvcFJpZ2h0LFxuICAgICAgICAgICAgdmlkZW9TaXplOiBfdmlkZW9TaXplLFxuICAgICAgICAgICAgY2FudmFzU2l6ZTogX2NhbnZhc1NpemUsXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIHRoZSBnaXZlbiBhcnJheSBhcyBmcmFtZS1idWZmZXJcbiAgICAgKi9cbiAgICBfdGhhdC5hdHRhY2hEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgX2RhdGEgPSBkYXRhO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1c2VkIGZyYW1lLWJ1ZmZlclxuICAgICAqL1xuICAgIF90aGF0LmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfZGF0YTtcbiAgICB9O1xuXG4gICAgLy8gQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgZ3JheXNjYWxlIGRhdGEgKHRvIG1hdGNoIE5vZGUncyBiZWhhdmlvcilcbiAgICBmdW5jdGlvbiBiaWxpbmVhckludGVycG9sYXRlKGdyYXlEYXRhLCB3aWR0aCwgaGVpZ2h0LCB4LCB5KSB7XG4gICAgICAgIGNvbnN0IHgwID0gTWF0aC5mbG9vcih4KTtcbiAgICAgICAgY29uc3QgeTAgPSBNYXRoLmZsb29yKHkpO1xuICAgICAgICBjb25zdCB4MSA9IE1hdGgubWluKHgwICsgMSwgd2lkdGggLSAxKTtcbiAgICAgICAgY29uc3QgeTEgPSBNYXRoLm1pbih5MCArIDEsIGhlaWdodCAtIDEpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZnggPSB4IC0geDA7XG4gICAgICAgIGNvbnN0IGZ5ID0geSAtIHkwO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdjAwID0gZ3JheURhdGFbeTAgKiB3aWR0aCArIHgwXTtcbiAgICAgICAgY29uc3QgdjEwID0gZ3JheURhdGFbeTAgKiB3aWR0aCArIHgxXTtcbiAgICAgICAgY29uc3QgdjAxID0gZ3JheURhdGFbeTEgKiB3aWR0aCArIHgwXTtcbiAgICAgICAgY29uc3QgdjExID0gZ3JheURhdGFbeTEgKiB3aWR0aCArIHgxXTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHYwID0gdjAwICogKDEgLSBmeCkgKyB2MTAgKiBmeDtcbiAgICAgICAgY29uc3QgdjEgPSB2MDEgKiAoMSAtIGZ4KSArIHYxMSAqIGZ4O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHYwICogKDEgLSBmeSkgKyB2MSAqIGZ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYSBmcmFtZSBmcm9tIHRoZSBpbnB1dC1zdHJlYW0gYW5kIHB1dHMgaW50byB0aGUgZnJhbWUtYnVmZmVyLlxuICAgICAqIFRoZSBpbWFnZS1kYXRhIGlzIGNvbnZlcnRlZCB0byBncmF5LXNjYWxlIGFuZCB0aGVuIGhhbGYtc2FtcGxlZCBpZiBjb25maWd1cmVkLlxuICAgICAqIFxuICAgICAqIEZvciBpbXByb3ZlZCBhY2N1cmFjeSAobWF0Y2hpbmcgTm9kZSdzIHByb2Nlc3NpbmcpLCBub24taGFsZi1zYW1wbGVkIGltYWdlc1xuICAgICAqIHVzZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG9uIGdyYXlzY2FsZSBkYXRhIGluc3RlYWQgb2Ygc2NhbGluZyBSR0IgdGhlbiBjb252ZXJ0aW5nLlxuICAgICAqIFxuICAgICAqIElNUE9SVEFOVDogVGhlIGltYWdlIGlzIEFMV0FZUyBkcmF3biB0byB0aGUgdmlzaWJsZSBjYW52YXMgZm9yIG92ZXJsYXlzIGFuZCBkaXNwbGF5LlxuICAgICAqL1xuICAgIF90aGF0LmdyYWIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRvSGFsZlNhbXBsZSA9IF9zdHJlYW1Db25maWcuaGFsZlNhbXBsZTtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBpbnB1dFN0cmVhbS5nZXRGcmFtZSgpO1xuICAgICAgICBsZXQgZHJhd2FibGUgPSBmcmFtZTtcbiAgICAgICAgbGV0IGRyYXdBbmdsZSA9IDA7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHJhd2FibGUpIHtcbiAgICAgICAgICAgIGFkanVzdENhbnZhc1NpemUoX2NhbnZhcywgX2NhbnZhc1NpemUsIF9zdHJlYW1Db25maWcuZGVidWcpO1xuICAgICAgICAgICAgaWYgKF9zdHJlYW1Db25maWcudHlwZSA9PT0gJ0ltYWdlU3RyZWFtJykge1xuICAgICAgICAgICAgICAgIGRyYXdhYmxlID0gZnJhbWUuaW1nO1xuICAgICAgICAgICAgICAgIGlmIChmcmFtZS50YWdzICYmIGZyYW1lLnRhZ3Mub3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmcmFtZS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0FuZ2xlID0gOTAgKiBUT19SQURJQU5TO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdBbmdsZSA9IC05MCAqIFRPX1JBRElBTlM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFMV0FZUyBkcmF3IHRvIHZpc2libGUgY2FudmFzIChmb3Igb3ZlcmxheXMsIGRpc3BsYXksIGFuZCB0b0RhdGFVUkwpXG4gICAgICAgICAgICBpZiAoZHJhd0FuZ2xlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgX2N0eC50cmFuc2xhdGUoX2NhbnZhc1NpemUueCAvIDIsIF9jYW52YXNTaXplLnkgLyAyKTtcbiAgICAgICAgICAgICAgICBfY3R4LnJvdGF0ZShkcmF3QW5nbGUpO1xuICAgICAgICAgICAgICAgIF9jdHguZHJhd0ltYWdlKGRyYXdhYmxlLCAtX2NhbnZhc1NpemUueSAvIDIsIC1fY2FudmFzU2l6ZS54IC8gMiwgX2NhbnZhc1NpemUueSwgX2NhbnZhc1NpemUueCk7XG4gICAgICAgICAgICAgICAgX2N0eC5yb3RhdGUoLWRyYXdBbmdsZSk7XG4gICAgICAgICAgICAgICAgX2N0eC50cmFuc2xhdGUoLV9jYW52YXNTaXplLnggLyAyLCAtX2NhbnZhc1NpemUueSAvIDIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBfY3R4LmRyYXdJbWFnZShkcmF3YWJsZSwgMCwgMCwgX2NhbnZhc1NpemUueCwgX2NhbnZhc1NpemUueSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkb0hhbGZTYW1wbGUpIHtcbiAgICAgICAgICAgICAgICAvLyBIYWxmLXNhbXBsZSBwYXRoOiB1c2UgZXhpc3Rpbmcgb3B0aW1pemVkIGFwcHJvYWNoXG4gICAgICAgICAgICAgICAgY29uc3QgY3R4RGF0YSA9IF9jdHguZ2V0SW1hZ2VEYXRhKF9zeCwgX3N5LCBfc2l6ZS54LCBfc2l6ZS55KS5kYXRhO1xuICAgICAgICAgICAgICAgIGdyYXlBbmRIYWxmU2FtcGxlRnJvbUNhbnZhc0RhdGEoY3R4RGF0YSwgX3NpemUsIF9kYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm9uLWhhbGYtc2FtcGxlOiB1c2UgaW1wcm92ZWQgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgYmV0dGVyIGFjY3VyYWN5XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhdCBvcmlnaW5hbCBzaXplLCB0aGVuIHNjYWxlIGdyYXlzY2FsZSBkYXRhXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIHRlbXBDYW52YXMud2lkdGggPSBfdmlkZW9TaXplLng7XG4gICAgICAgICAgICAgICAgdGVtcENhbnZhcy5oZWlnaHQgPSBfdmlkZW9TaXplLnk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcEN0eCA9IHRlbXBDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoZHJhd0FuZ2xlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBDdHgudHJhbnNsYXRlKF92aWRlb1NpemUueCAvIDIsIF92aWRlb1NpemUueSAvIDIpO1xuICAgICAgICAgICAgICAgICAgICB0ZW1wQ3R4LnJvdGF0ZShkcmF3QW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICB0ZW1wQ3R4LmRyYXdJbWFnZShkcmF3YWJsZSwgLV92aWRlb1NpemUueSAvIDIsIC1fdmlkZW9TaXplLnggLyAyLCBfdmlkZW9TaXplLnksIF92aWRlb1NpemUueCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEN0eC5kcmF3SW1hZ2UoZHJhd2FibGUsIDAsIDAsIF92aWRlb1NpemUueCwgX3ZpZGVvU2l6ZS55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGdyYXlzY2FsZSBhdCBvcmlnaW5hbCBzaXplXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxJbWFnZURhdGEgPSB0ZW1wQ3R4LmdldEltYWdlRGF0YSgwLCAwLCBfdmlkZW9TaXplLngsIF92aWRlb1NpemUueSkuZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zdCBncmF5RGF0YSA9IG5ldyBVaW50OEFycmF5KF92aWRlb1NpemUueCAqIF92aWRlb1NpemUueSk7XG4gICAgICAgICAgICAgICAgY29tcHV0ZUdyYXkob3JpZ2luYWxJbWFnZURhdGEsIGdyYXlEYXRhLCBfc3RyZWFtQ29uZmlnKTtcblxuICAgICAgICAgICAgICAgIC8vIFNjYWxlIGdyYXlzY2FsZSBkYXRhIHVzaW5nIGJpbGluZWFyIGludGVycG9sYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCBzY2FsZWRHcmF5RGF0YSA9IG5ldyBVaW50OEFycmF5KF9jYW52YXNTaXplLnggKiBfY2FudmFzU2l6ZS55KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGVwU2l6ZVggPSBfdmlkZW9TaXplLnggLyBfY2FudmFzU2l6ZS54O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBTaXplWSA9IF92aWRlb1NpemUueSAvIF9jYW52YXNTaXplLnk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBfY2FudmFzU2l6ZS55OyB5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBfY2FudmFzU2l6ZS54OyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNyY1ggPSB4ICogc3RlcFNpemVYO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjWSA9IHkgKiBzdGVwU2l6ZVk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRHcmF5RGF0YVt5ICogX2NhbnZhc1NpemUueCArIHhdID0gYmlsaW5lYXJJbnRlcnBvbGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5RGF0YSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZpZGVvU2l6ZS54LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmlkZW9TaXplLnksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1gsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lcbiAgICAgICAgICAgICAgICAgICAgICAgICkgfCAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENyb3AgdG8gdGFyZ2V0IHJlZ2lvblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgX3NpemUueTsgeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgX3NpemUueDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmNJZHggPSAoeSArIF9zeSkgKiBfY2FudmFzU2l6ZS54ICsgKHggKyBfc3gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2RhdGFbeSAqIF9zaXplLnggKyB4XSA9IHNjYWxlZEdyYXlEYXRhW3NyY0lkeF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3RoYXQuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9zaXplO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoYXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGcmFtZUdyYWJiZXI7XG4iLCIvLyBOT1RFOiAoU09NRSBPRikgVEhJUyBJUyBCUk9XU0VSIE9OTFkgQ09ERS4gIE5vZGUgZG9lcyBub3QgaGF2ZSAnYXRvYicgYnVpbHQgaW4sIG5vciBYTUxIdHRwUmVxdWVzdC5cbi8vIEhvdyBleGFjdGx5IGlzIHRoaXMgc2V0IG9mIGZ1bmN0aW9ucyB1c2VkIGluIFF1YWdnYT8gRG8gd2UgbmVlZCB0aGUgYnJvd3NlciBzcGVjaWZpYyBjb2RlPyBEbyB3ZVxuLy8gbmVlZCB0byBwb3J0IGFueSBwYXJ0IG9mIHRoaXMgdGhhdCBkb2Vzbid0IHdvcmsgaW4gTm9kZSB0byBub2RlP1xuXG4vLyBUYWdzIHNjcmFwZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXhpZi1qcy9leGlmLWpzXG5jb25zdCBFeGlmVGFncyA9IHsgMHgwMTEyOiAnb3JpZW50YXRpb24nIH07XG5leHBvcnQgY29uc3QgQXZhaWxhYmxlVGFncyA9IE9iamVjdC5rZXlzKEV4aWZUYWdzKS5tYXAoKGtleSkgPT4gRXhpZlRhZ3Nba2V5XSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVGFnc0luT2JqZWN0VVJMKHNyYywgdGFncyA9IEF2YWlsYWJsZVRhZ3MpIHtcbiAgICBpZiAoL15ibG9iOi9pLnRlc3Qoc3JjKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0VVJMVG9CbG9iKHNyYylcbiAgICAgICAgICAgIC50aGVuKHJlYWRUb0J1ZmZlcilcbiAgICAgICAgICAgIC50aGVuKChidWZmZXIpID0+IGZpbmRUYWdzSW5CdWZmZXIoYnVmZmVyLCB0YWdzKSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGRhdGFVcmwpIHtcbiAgICBjb25zdCBiYXNlNjQgPSBkYXRhVXJsLnJlcGxhY2UoL15kYXRhOihbXjtdKyk7YmFzZTY0LC9nbWksICcnKTtcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgY29uc3QgbGVuID0gYmluYXJ5Lmxlbmd0aDtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobGVuKTtcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmlld1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xufVxuXG5mdW5jdGlvbiByZWFkVG9CdWZmZXIoYmxvYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0VVJMVG9CbG9iKHVybCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgaHR0cC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgICAgICBodHRwLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICAgICAgaHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoaHR0cC5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FICYmIChodHRwLnN0YXR1cyA9PT0gMjAwIHx8IGh0dHAuc3RhdHVzID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGh0dHAub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgaHR0cC5zZW5kKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVGFnc0luQnVmZmVyKGZpbGUsIHNlbGVjdGVkVGFncyA9IEF2YWlsYWJsZVRhZ3MpIHtcbiAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhmaWxlKTtcbiAgICBjb25zdCBsZW5ndGggPSBmaWxlLmJ5dGVMZW5ndGg7XG4gICAgY29uc3QgZXhpZlRhZ3MgPSBzZWxlY3RlZFRhZ3MucmVkdWNlKChyZXN1bHQsIHNlbGVjdGVkVGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aWZUYWcgPSBPYmplY3Qua2V5cyhFeGlmVGFncykuZmlsdGVyKCh0YWcpID0+IEV4aWZUYWdzW3RhZ10gPT09IHNlbGVjdGVkVGFnKVswXTtcbiAgICAgICAgaWYgKGV4aWZUYWcpIHtcbiAgICAgICAgICAgIHJlc3VsdFtleGlmVGFnXSA9IHNlbGVjdGVkVGFnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwge30pO1xuICAgIGxldCBvZmZzZXQgPSAyO1xuICAgIGxldCBtYXJrZXI7XG5cbiAgICBpZiAoKGRhdGFWaWV3LmdldFVpbnQ4KDApICE9PSAweEZGKSB8fCAoZGF0YVZpZXcuZ2V0VWludDgoMSkgIT09IDB4RDgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmIChkYXRhVmlldy5nZXRVaW50OChvZmZzZXQpICE9PSAweEZGKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrZXIgPSBkYXRhVmlldy5nZXRVaW50OChvZmZzZXQgKyAxKTtcbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHhFMSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRFWElGRGF0YShkYXRhVmlldywgb2Zmc2V0ICsgNCwgZXhpZlRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSAyICsgZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCArIDIpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZEVYSUZEYXRhKGZpbGUsIHN0YXJ0LCBleGlmVGFncykge1xuICAgIGlmIChnZXRTdHJpbmdGcm9tQnVmZmVyKGZpbGUsIHN0YXJ0LCA0KSAhPT0gJ0V4aWYnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0aWZmT2Zmc2V0ID0gc3RhcnQgKyA2O1xuICAgIGxldCBiaWdFbmQ7XG5cbiAgICBpZiAoZmlsZS5nZXRVaW50MTYodGlmZk9mZnNldCkgPT09IDB4NDk0OSkge1xuICAgICAgICBiaWdFbmQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGZpbGUuZ2V0VWludDE2KHRpZmZPZmZzZXQpID09PSAweDRENEQpIHtcbiAgICAgICAgYmlnRW5kID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZ2V0VWludDE2KHRpZmZPZmZzZXQgKyAyLCAhYmlnRW5kKSAhPT0gMHgwMDJBKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdElGRE9mZnNldCA9IGZpbGUuZ2V0VWludDMyKHRpZmZPZmZzZXQgKyA0LCAhYmlnRW5kKTtcbiAgICBpZiAoZmlyc3RJRkRPZmZzZXQgPCAweDAwMDAwMDA4KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWdzID0gcmVhZFRhZ3MoZmlsZSwgdGlmZk9mZnNldCwgdGlmZk9mZnNldCArIGZpcnN0SUZET2Zmc2V0LCBleGlmVGFncywgYmlnRW5kKTtcbiAgICByZXR1cm4gdGFncztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ3MoZmlsZSwgdGlmZlN0YXJ0LCBkaXJTdGFydCwgc3RyaW5ncywgYmlnRW5kKSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZpbGUuZ2V0VWludDE2KGRpclN0YXJ0LCAhYmlnRW5kKTtcbiAgICBjb25zdCB0YWdzID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXM7IGkrKykge1xuICAgICAgICBjb25zdCBlbnRyeU9mZnNldCA9IGRpclN0YXJ0ICsgaSAqIDEyICsgMjtcbiAgICAgICAgY29uc3QgdGFnID0gc3RyaW5nc1tmaWxlLmdldFVpbnQxNihlbnRyeU9mZnNldCwgIWJpZ0VuZCldO1xuICAgICAgICBpZiAodGFnKSB7XG4gICAgICAgICAgICB0YWdzW3RhZ10gPSByZWFkVGFnVmFsdWUoZmlsZSwgZW50cnlPZmZzZXQsIHRpZmZTdGFydCwgZGlyU3RhcnQsIGJpZ0VuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZ3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdWYWx1ZShmaWxlLCBlbnRyeU9mZnNldCwgdGlmZlN0YXJ0LCBkaXJTdGFydCwgYmlnRW5kKSB7XG4gICAgY29uc3QgdHlwZSA9IGZpbGUuZ2V0VWludDE2KGVudHJ5T2Zmc2V0ICsgMiwgIWJpZ0VuZCk7XG4gICAgY29uc3QgbnVtVmFsdWVzID0gZmlsZS5nZXRVaW50MzIoZW50cnlPZmZzZXQgKyA0LCAhYmlnRW5kKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBpZiAobnVtVmFsdWVzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0VWludDE2KGVudHJ5T2Zmc2V0ICsgOCwgIWJpZ0VuZCk7XG4gICAgICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmluZ0Zyb21CdWZmZXIoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgbGV0IG91dHN0ciA9ICcnO1xuICAgIGZvciAobGV0IG4gPSBzdGFydDsgbiA8IHN0YXJ0ICsgbGVuZ3RoOyBuKyspIHtcbiAgICAgICAgb3V0c3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmZmVyLmdldFVpbnQ4KG4pKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHN0cjtcbn1cbiIsImltcG9ydCB7IGZpbmRUYWdzSW5PYmplY3RVUkwgfSBmcm9tICcuL2V4aWZfaGVscGVyJztcblxuLy8gRXhwb3J0ZWQgaGVscGVyIGZvciBmaWxlbmFtZSBnZW5lcmF0aW9uXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbWFnZUZpbGVuYW1lKGRpcmVjdG9yeSwgbnVtKSB7XG4gICAgcmV0dXJuIGAke2RpcmVjdG9yeX1pbWFnZS0ke251bS50b1N0cmluZygpLnBhZFN0YXJ0KDMsICcwJyl9LmpwZ2A7XG59XG5cbmNvbnN0IEltYWdlTG9hZGVyID0ge307XG5JbWFnZUxvYWRlci5sb2FkID0gZnVuY3Rpb24gKGRpcmVjdG9yeSwgY2FsbGJhY2ssIG9mZnNldCwgc2l6ZSwgc2VxdWVuY2UsIGNvbmZpZykge1xuICAgIGNvbnN0IGh0bWxJbWFnZXNTcmNBcnJheSA9IG5ldyBBcnJheShzaXplKTtcbiAgICBjb25zdCBodG1sSW1hZ2VzQXJyYXkgPSBuZXcgQXJyYXkoaHRtbEltYWdlc1NyY0FycmF5Lmxlbmd0aCk7XG4gICAgbGV0IGk7XG4gICAgbGV0IGltZztcbiAgICBsZXQgbnVtO1xuXG4gICAgaWYgKHNlcXVlbmNlID09PSBmYWxzZSkge1xuICAgICAgICBodG1sSW1hZ2VzU3JjQXJyYXlbMF0gPSBkaXJlY3Rvcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGh0bWxJbWFnZXNTcmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbnVtID0gKG9mZnNldCArIGkpO1xuICAgICAgICAgICAgaHRtbEltYWdlc1NyY0FycmF5W2ldID0gZ2VuZXJhdGVJbWFnZUZpbGVuYW1lKGRpcmVjdG9yeSwgbnVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBodG1sSW1hZ2VzQXJyYXkubm90TG9hZGVkID0gW107XG4gICAgaHRtbEltYWdlc0FycmF5LmFkZEltYWdlID0gZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICAgIGh0bWxJbWFnZXNBcnJheS5ub3RMb2FkZWQucHVzaChpbWFnZSk7XG4gICAgfTtcbiAgICBodG1sSW1hZ2VzQXJyYXkubG9hZGVkID0gZnVuY3Rpb24gKGxvYWRlZEltZykge1xuICAgICAgICBjb25zdCBub3Rsb2FkZWRJbWdzID0gaHRtbEltYWdlc0FycmF5Lm5vdExvYWRlZDtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBub3Rsb2FkZWRJbWdzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBpZiAobm90bG9hZGVkSW1nc1t4XSA9PT0gbG9hZGVkSW1nKSB7XG4gICAgICAgICAgICAgICAgbm90bG9hZGVkSW1ncy5zcGxpY2UoeCwgMSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBodG1sSW1hZ2VzU3JjQXJyYXkubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGVuY29kZVVSSSBmb3IgbWF0Y2hpbmcgZmlsZW5hbWVzIHdpdGggc3BhY2VzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nTmFtZSA9IGVuY29kZVVSSShodG1sSW1hZ2VzU3JjQXJyYXlbeV0uc3Vic3RyKGh0bWxJbWFnZXNTcmNBcnJheVt5XS5sYXN0SW5kZXhPZignLycpKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWcuc3JjLmxhc3RJbmRleE9mKGltZ05hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEltYWdlc0FycmF5W3ldID0geyBpbWc6IGxvYWRlZEltZyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdGxvYWRlZEltZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIGNvbmZpZz8uZGVidWc/LnNob3dJbWFnZURldGFpbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSW1hZ2VzIGxvYWRlZDogJHtodG1sSW1hZ2VzQXJyYXkubGVuZ3RofSBpbWFnZSR7aHRtbEltYWdlc0FycmF5Lmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBmcm9tICR7c2VxdWVuY2UgPT09IGZhbHNlID8gZGlyZWN0b3J5IDogZGlyZWN0b3J5ICsgJyAoc2VxdWVuY2UpJ31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXF1ZW5jZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBmaW5kVGFnc0luT2JqZWN0VVJMKGRpcmVjdG9yeSwgWydvcmllbnRhdGlvbiddKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigodGFncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEltYWdlc0FycmF5WzBdLnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaHRtbEltYWdlc0FycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soaHRtbEltYWdlc0FycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGh0bWxJbWFnZXNBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGh0bWxJbWFnZXNTcmNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaHRtbEltYWdlc0FycmF5LmFkZEltYWdlKGltZyk7XG4gICAgICAgIGFkZE9ubG9hZEhhbmRsZXIoaW1nLCBodG1sSW1hZ2VzQXJyYXkpO1xuICAgICAgICBpbWcuc3JjID0gaHRtbEltYWdlc1NyY0FycmF5W2ldO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGFkZE9ubG9hZEhhbmRsZXIoaW1nLCBodG1sSW1hZ2VzQXJyYXkpIHtcbiAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sSW1hZ2VzQXJyYXkubG9hZGVkKHRoaXMpO1xuICAgIH07XG4gICAgaW1nLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWxJbWFnZXNBcnJheS5sb2FkZWQodGhpcyk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKEltYWdlTG9hZGVyKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IEltYWdlTG9hZGVyIGZyb20gJy4uL2ltYWdlX2xvYWRlcic7XG5pbXBvcnQgeyBYWVNpemUsIFBvaW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUZhY3RvcnksIElucHV0U3RyZWFtLCBFdmVudEhhbmRsZXJMaXN0IH0gZnJvbSAnLi9pbnB1dF9zdHJlYW0uZCc7XG5cbmNvbnN0IGlucHV0U3RyZWFtRmFjdG9yeTogSW5wdXRTdHJlYW1GYWN0b3J5ID0ge1xuICAgIGNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTogSW5wdXRTdHJlYW0ge1xuICAgICAgICBjb25zb2xlLndhcm4oJyoqKiogSW5wdXRTdHJlYW1Ccm93c2VyIGNyZWF0ZVZpZGVvU3RyZWFtJyk7XG4gICAgICAgIGxldCBfY29uZmlnOiB7IHNpemU6IG51bWJlcjsgdHlwZTogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICBjb25zdCBfZXZlbnRIYW5kbGVyczogRXZlbnRIYW5kbGVyTGlzdCA9IHt9O1xuICAgICAgICBsZXQgX2NhbGN1bGF0ZWRXaWR0aDogbnVtYmVyO1xuICAgICAgICBsZXQgX2NhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgY29uc3QgX3RvcFJpZ2h0OiBQb2ludCA9IHsgeDogMCwgeTogMCwgdHlwZTogJ1BvaW50JyB9O1xuICAgICAgICBjb25zdCBfY2FudmFzU2l6ZTogWFlTaXplID0geyB4OiAwLCB5OiAwLCB0eXBlOiAnWFlTaXplJyB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXRTaXplKCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgX2NhbGN1bGF0ZWRXaWR0aCA9IF9jb25maWc/LnNpemUgPyB3aWR0aCAvIGhlaWdodCA+IDEgPyBfY29uZmlnLnNpemUgOiBNYXRoLmZsb29yKCh3aWR0aCAvIGhlaWdodCkgKiBfY29uZmlnLnNpemUpIDogd2lkdGg7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIF9jYWxjdWxhdGVkSGVpZ2h0ID0gX2NvbmZpZz8uc2l6ZSA/IHdpZHRoIC8gaGVpZ2h0ID4gMSA/IE1hdGguZmxvb3IoKGhlaWdodCAvIHdpZHRoKSAqIF9jb25maWcuc2l6ZSkgOiBfY29uZmlnLnNpemUgOiBoZWlnaHQ7XG5cbiAgICAgICAgICAgIF9jYW52YXNTaXplLnggPSBfY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICAgICAgX2NhbnZhc1NpemUueSA9IF9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSA9IHtcbiAgICAgICAgICAgIGdldFJlYWxXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW8udmlkZW9XaWR0aDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFJlYWxIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvLnZpZGVvSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0V2lkdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0V2lkdGgod2lkdGgpIHtcbiAgICAgICAgICAgICAgICBfY2FsY3VsYXRlZFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgX2NhbGN1bGF0ZWRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRJbnB1dFN0cmVhbShjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3NyYycsICh0eXBlb2YgY29uZmlnLnNyYyAhPT0gJ3VuZGVmaW5lZCcpID8gY29uZmlnLnNyYyA6ICcnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlbmRlZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW8uZW5kZWQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRDb25maWcoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb25maWc7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlkZW8pIHtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGxheSgpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0Q3VycmVudFRpbWUodGltZSkge1xuICAgICAgICAgICAgICAgIGlmIChfY29uZmlnPy50eXBlICE9PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2N1cnJlbnRUaW1lJywgdGltZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmLCBib29sKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9ldmVudE5hbWVzLmluZGV4T2YoZXZlbnQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9ldmVudEhhbmRsZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdLnB1c2goZik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZiwgYm9vbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2xlYXJFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICAgICAgICAgIF9ldmVudE5hbWVzLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IF9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHRyaWdnZXIoZXZlbnROYW1lLCBhcmdzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGo7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXTtcblxuICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdjYW5yZWNvcmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRTaXplKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYW5kbGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbal0uYXBwbHkoaW5wdXRTdHJlYW0sIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0VG9wUmlnaHQodG9wUmlnaHQpIHtcbiAgICAgICAgICAgICAgICBfdG9wUmlnaHQueCA9IHRvcFJpZ2h0Lng7XG4gICAgICAgICAgICAgICAgX3RvcFJpZ2h0LnkgPSB0b3BSaWdodC55O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0VG9wUmlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90b3BSaWdodDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldENhbnZhc1NpemUoc2l6ZSkge1xuICAgICAgICAgICAgICAgIF9jYW52YXNTaXplLnggPSBzaXplLng7XG4gICAgICAgICAgICAgICAgX2NhbnZhc1NpemUueSA9IHNpemUueTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldENhbnZhc1NpemUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYW52YXNTaXplO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0RnJhbWUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlucHV0U3RyZWFtO1xuICAgIH0sXG4gICAgY3JlYXRlTGl2ZVN0cmVhbSh2aWRlbyk6IElucHV0U3RyZWFtIHtcbiAgICAgICAgY29uc29sZS53YXJuKCcqKioqIElucHV0U3RyZWFtQnJvd3NlciBjcmVhdGVMaXZlU3RyZWFtJyk7XG4gICAgICAgIGlmICh2aWRlbykge1xuICAgICAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICd0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhhdCA9IGlucHV0U3RyZWFtRmFjdG9yeS5jcmVhdGVWaWRlb1N0cmVhbSh2aWRlbyk7XG4gICAgICAgIHRoYXQuZW5kZWQgPSBmdW5jdGlvbiBlbmRlZCgpOiBmYWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgIH0sXG4gICAgY3JlYXRlSW1hZ2VTdHJlYW0oKTogSW5wdXRTdHJlYW0ge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyoqKiogSW5wdXRTdHJlYW1Ccm93c2VyIGNyZWF0ZUltYWdlU3RyZWFtJyk7XG4gICAgICAgIGxldCBfY29uZmlnOiB7IHNpemU6IG51bWJlcjsgc2VxdWVuY2U6IGFueSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgbGV0IHdpZHRoID0gMDtcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7XG4gICAgICAgIGxldCBmcmFtZUlkeCA9IDA7XG4gICAgICAgIGxldCBwYXVzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBpbWdBcnJheTogYW55W10gfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAxO1xuICAgICAgICBsZXQgYmFzZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBlbmRlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgY2FsY3VsYXRlZFdpZHRoOiBudW1iZXI7XG4gICAgICAgIGxldCBjYWxjdWxhdGVkSGVpZ2h0OiBudW1iZXI7XG4gICAgICAgIGNvbnN0IF9ldmVudE5hbWVzID0gWydjYW5yZWNvcmQnLCAnZW5kZWQnXTtcbiAgICAgICAgY29uc3QgX2V2ZW50SGFuZGxlcnM6IEV2ZW50SGFuZGxlckxpc3QgPSB7fTtcbiAgICAgICAgY29uc3QgX3RvcFJpZ2h0OiBQb2ludCA9IHsgeDogMCwgeTogMCwgdHlwZTogJ1BvaW50JyB9O1xuICAgICAgICBjb25zdCBfY2FudmFzU2l6ZTogWFlTaXplID0geyB4OiAwLCB5OiAwLCB0eXBlOiAnWFlTaXplJyB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBsb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdJbWFnZSBzb3VyY2UgKHNyYykgaXMgcmVxdWlyZWQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgSW1hZ2VMb2FkZXIubG9hZChiYXNlVXJsLCAoaW1nczogQXJyYXk8eyB0YWdzOiBhbnk7IGltZzogSFRNTEltYWdlRWxlbWVudH0+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW1ncyB8fCBpbWdzLmxlbmd0aCA9PT0gMCB8fCAhaW1nc1swXSB8fCAhaW1nc1swXS5pbWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignSW1hZ2UgbG9hZCBmYWlsZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nQXJyYXkgPSBpbWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1nc1swXS50YWdzICYmIGltZ3NbMF0udGFncy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW1nc1swXS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gaW1nc1swXS5pbWcud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVkV2lkdGggPSBfY29uZmlnPy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gX2NvbmZpZy5zaXplIDogTWF0aC5mbG9vcigod2lkdGggLyBoZWlnaHQpICogX2NvbmZpZy5zaXplKSA6IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBfY29uZmlnPy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gTWF0aC5mbG9vcigoaGVpZ2h0IC8gd2lkdGgpICogX2NvbmZpZy5zaXplKSA6IF9jb25maWcuc2l6ZSA6IGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS54ID0gY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYW52YXNTaXplLnkgPSBjYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJZHggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hFdmVudCgnY2FucmVjb3JkJywgW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIG9mZnNldCwgc2l6ZSwgX2NvbmZpZz8uc2VxdWVuY2UsIF9jb25maWcpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwdWJsaXNoRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgICAgIGxldCBqO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBfZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYW5kbGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmFwcGx5KGlucHV0U3RyZWFtLCBhcmdzIGFzIGFueSk7IC8vIFRPRE86IHR5cGVzY3JpcHQgY29tcGxhaW5zIHRoYXQgYW55W10gaXMgbm90IHZhbGlkIGZvciBhIHNlY29uZCBhcmcgZm9yIGFwcGx5PyFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhbnkgY29kZSBzaGFyZWQgd2l0aCB0aGUgZmlyc3QgSW5wdXRTdHJlYW0gYWJvdmUgc2hvdWxkIGJlIHNoYXJlZCBub3QgY29waWVkXG4gICAgICAgIC8vIFRPRE86IHB1Ymxpc2hFdmVudCBuZWVkcyBhY2Nlc3MgdG8gaW5wdXRTdHJlYW0sIGJ1dCBpbnB1dFN0cmVhbSBuZWVkcyBhY2Nlc3MgdG8gcHVibGlzaEV2ZW50XG4gICAgICAgIC8vIFRPRE86IFRoaXMgaXMgd2h5IGl0J3MgYSAndmFyJywgc28gaXQgaG9pc3RzIGJhY2suICBUaGlzIGlzIHVnbHksIGFuZCBzaG91bGQgYmUgY2hhbmdlZC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhcix2YXJzLW9uLXRvcFxuICAgICAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtID0ge1xuXG4gICAgICAgICAgICB0cmlnZ2VyOiBwdWJsaXNoRXZlbnQsXG5cbiAgICAgICAgICAgIGdldFdpZHRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRIZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRXaWR0aChuZXdXaWR0aCkge1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SGVpZ2h0KG5ld0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRSZWFsV2lkdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0UmVhbEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SW5wdXRTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgICAgICAgIF9jb25maWcgPSBzdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uc2VxdWVuY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwgPSBzdHJlYW0uc3JjO1xuICAgICAgICAgICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgICAgICBiYXNlVXJsID0gc3RyZWFtLnNyYztcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0cmVhbS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkSW1hZ2VzKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlbmRlZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kZWQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRBdHRyaWJ1dGUoKSB7fSxcblxuICAgICAgICAgICAgZ2V0Q29uZmlnKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29uZmlnO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGF1c2UoKSB7XG4gICAgICAgICAgICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBsYXkoKSB7XG4gICAgICAgICAgICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRDdXJyZW50VGltZSh0aW1lKSB7XG4gICAgICAgICAgICAgICAgZnJhbWVJZHggPSB0aW1lO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZikge1xuICAgICAgICAgICAgICAgIGlmIChfZXZlbnROYW1lcy5pbmRleE9mKGV2ZW50KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfZXZlbnRIYW5kbGVyc1tldmVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudEhhbmRsZXJzW2V2ZW50XSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9ldmVudEhhbmRsZXJzW2V2ZW50XS5wdXNoKGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNsZWFyRXZlbnRIYW5kbGVycygpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfZXZlbnRIYW5kbGVycykuZm9yRWFjaCgoaW5kKSA9PiBkZWxldGUgX2V2ZW50SGFuZGxlcnNbaW5kXSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRUb3BSaWdodCh0b3BSaWdodCkge1xuICAgICAgICAgICAgICAgIF90b3BSaWdodC54ID0gdG9wUmlnaHQueDtcbiAgICAgICAgICAgICAgICBfdG9wUmlnaHQueSA9IHRvcFJpZ2h0Lnk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRUb3BSaWdodCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RvcFJpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0Q2FudmFzU2l6ZShjYW52YXNTaXplKSB7XG4gICAgICAgICAgICAgICAgX2NhbnZhc1NpemUueCA9IGNhbnZhc1NpemUueDtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS55ID0gY2FudmFzU2l6ZS55O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0Q2FudmFzU2l6ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NhbnZhc1NpemU7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRGcmFtZSgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJhbWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXVzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IGltZ0FycmF5Py5bZnJhbWVJZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVJZHggPCAoc2l6ZSAtIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUlkeCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hFdmVudCgnZW5kZWQnLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07XG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlucHV0U3RyZWFtRmFjdG9yeTtcbiIsIi8qKlxuICogaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vVGlwcy80MDcxNzIvQ29ubmVjdGVkLUNvbXBvbmVudC1MYWJlbGluZy1hbmQtVmVjdG9yaXphdGlvblxuICovXG5jb25zdCBUcmFjZXIgPSB7XG4gICAgc2VhcmNoRGlyZWN0aW9uczogW1swLCAxXSwgWzEsIDFdLCBbMSwgMF0sIFsxLCAtMV0sIFswLCAtMV0sIFstMSwgLTFdLCBbLTEsIDBdLCBbLTEsIDFdXSxcbiAgICBjcmVhdGUoaW1hZ2VXcmFwcGVyLCBsYWJlbFdyYXBwZXIpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgICAgIGNvbnN0IGxhYmVsRGF0YSA9IGxhYmVsV3JhcHBlci5kYXRhO1xuICAgICAgICBjb25zdCB7IHNlYXJjaERpcmVjdGlvbnMgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICAgICAgbGV0IHBvcztcblxuICAgICAgICBmdW5jdGlvbiB0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgbGV0IGk7XG4gICAgICAgICAgICBsZXQgeTtcbiAgICAgICAgICAgIGxldCB4O1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VhcmNoRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHkgPSBjdXJyZW50LmN5ICsgc2VhcmNoRGlyZWN0aW9uc1tjdXJyZW50LmRpcl1bMF07XG4gICAgICAgICAgICAgICAgeCA9IGN1cnJlbnQuY3ggKyBzZWFyY2hEaXJlY3Rpb25zW2N1cnJlbnQuZGlyXVsxXTtcbiAgICAgICAgICAgICAgICBwb3MgPSB5ICogd2lkdGggKyB4O1xuICAgICAgICAgICAgICAgIGlmICgoaW1hZ2VEYXRhW3Bvc10gPT09IGNvbG9yKSAmJiAoKGxhYmVsRGF0YVtwb3NdID09PSAwKSB8fCAobGFiZWxEYXRhW3Bvc10gPT09IGxhYmVsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxEYXRhW3Bvc10gPSBsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5jeSA9IHk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuY3ggPSB4O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsRGF0YVtwb3NdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRGF0YVtwb3NdID0gZWRnZWxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50LmRpciA9IChjdXJyZW50LmRpciArIDEpICUgODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHZlcnRleDJEKHgsIHksIGRpcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkaXIsXG4gICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgcHJldjogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjb250b3VyVHJhY2luZyhzeSwgc3gsIGxhYmVsLCBjb2xvciwgZWRnZWxhYmVsKSB7XG4gICAgICAgICAgICBsZXQgRnYgPSBudWxsO1xuICAgICAgICAgICAgbGV0IEN2O1xuICAgICAgICAgICAgbGV0IFA7XG4gICAgICAgICAgICBsZXQgbGRpcjtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgICAgICAgICAgICAgY3g6IHN4LFxuICAgICAgICAgICAgICAgIGN5OiBzeSxcbiAgICAgICAgICAgICAgICBkaXI6IDAsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlbGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgRnYgPSB2ZXJ0ZXgyRChzeCwgc3ksIGN1cnJlbnQuZGlyKTtcbiAgICAgICAgICAgICAgICBDdiA9IEZ2O1xuICAgICAgICAgICAgICAgIGxkaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgICAgICBQID0gdmVydGV4MkQoY3VycmVudC5jeCwgY3VycmVudC5jeSwgMCk7XG4gICAgICAgICAgICAgICAgUC5wcmV2ID0gQ3Y7XG4gICAgICAgICAgICAgICAgQ3YubmV4dCA9IFA7XG4gICAgICAgICAgICAgICAgUC5uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBDdiA9IFA7XG5cbiAgICAgICAgICAgICAgICBsZXQgdG90YWxQaXhlbENvdW50ID0gaW1hZ2VXcmFwcGVyLnNpemUueCAqIGltYWdlV3JhcHBlci5zaXplLnk7XG4gICAgICAgICAgICAgICAgbGV0IHBpeGVsQ291bnRlciA9IDA7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmRpciA9IChjdXJyZW50LmRpciArIDYpICUgODtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlbGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGRpciAhPT0gY3VycmVudC5kaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2LmRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgICAgICAgICAgICAgUCA9IHZlcnRleDJEKGN1cnJlbnQuY3gsIGN1cnJlbnQuY3ksIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgUC5wcmV2ID0gQ3Y7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdi5uZXh0ID0gUDtcbiAgICAgICAgICAgICAgICAgICAgICAgIFAubmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdiA9IFA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdi5kaXIgPSBsZGlyO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YueCA9IGN1cnJlbnQuY3g7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdi55ID0gY3VycmVudC5jeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZGlyID0gY3VycmVudC5kaXI7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoKGN1cnJlbnQuY3ggIT09IHN4IHx8IGN1cnJlbnQuY3kgIT09IHN5KSAmJiArK3BpeGVsQ291bnRlciA8IHRvdGFsUGl4ZWxDb3VudCk7XG4gICAgICAgICAgICAgICAgRnYucHJldiA9IEN2LnByZXY7XG4gICAgICAgICAgICAgICAgQ3YucHJldi5uZXh0ID0gRnY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRnY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoY3VycmVudCwgY29sb3IsIGxhYmVsLCBlZGdlbGFiZWwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRvdXJUcmFjaW5nKHN5LCBzeCwgbGFiZWwsIGNvbG9yLCBlZGdlbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udG91clRyYWNpbmcoc3ksIHN4LCBsYWJlbCwgY29sb3IsIGVkZ2VsYWJlbCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCAoVHJhY2VyKTtcbiIsImltcG9ydCBUcmFjZXIgZnJvbSAnLi90cmFjZXInO1xuXG4vKipcbiAqIGh0dHA6Ly93d3cuY29kZXByb2plY3QuY29tL1RpcHMvNDA3MTcyL0Nvbm5lY3RlZC1Db21wb25lbnQtTGFiZWxpbmctYW5kLVZlY3Rvcml6YXRpb25cbiAqL1xuY29uc3QgUmFzdGVyaXplciA9IHtcbiAgICBjcmVhdGVDb250b3VyMkQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXI6IG51bGwsXG4gICAgICAgICAgICBpbmRleDogbnVsbCxcbiAgICAgICAgICAgIGZpcnN0VmVydGV4OiBudWxsLFxuICAgICAgICAgICAgaW5zaWRlQ29udG91cnM6IG51bGwsXG4gICAgICAgICAgICBuZXh0cGVlcjogbnVsbCxcbiAgICAgICAgICAgIHByZXZwZWVyOiBudWxsLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgQ09OVE9VUl9ESVI6IHtcbiAgICAgICAgQ1dfRElSOiAwLFxuICAgICAgICBDQ1dfRElSOiAxLFxuICAgICAgICBVTktOT1dOX0RJUjogMixcbiAgICB9LFxuICAgIERJUjoge1xuICAgICAgICBPVVRTSURFX0VER0U6IC0zMjc2NyxcbiAgICAgICAgSU5TSURFX0VER0U6IC0zMjc2NixcbiAgICB9LFxuICAgIGNyZWF0ZShpbWFnZVdyYXBwZXIsIGxhYmVsV3JhcHBlcikge1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICAgICAgY29uc3QgbGFiZWxEYXRhID0gbGFiZWxXcmFwcGVyLmRhdGE7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICAgICAgY29uc3QgdHJhY2VyID0gVHJhY2VyLmNyZWF0ZShpbWFnZVdyYXBwZXIsIGxhYmVsV3JhcHBlcik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhc3Rlcml6ZShkZXB0aGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbG9yO1xuICAgICAgICAgICAgICAgIGxldCBiYztcbiAgICAgICAgICAgICAgICBsZXQgbGM7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsaW5kZXg7XG4gICAgICAgICAgICAgICAgbGV0IGN4O1xuICAgICAgICAgICAgICAgIGxldCBjeTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvck1hcCA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB2ZXJ0ZXg7XG4gICAgICAgICAgICAgICAgbGV0IHA7XG4gICAgICAgICAgICAgICAgbGV0IGNjO1xuICAgICAgICAgICAgICAgIGxldCBzYztcbiAgICAgICAgICAgICAgICBsZXQgcG9zO1xuICAgICAgICAgICAgICAgIGxldCBjb25uZWN0ZWRDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDAwOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBbaV0gPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbG9yTWFwWzBdID0gaW1hZ2VEYXRhWzBdO1xuICAgICAgICAgICAgICAgIGNjID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKGN5ID0gMTsgY3kgPCBoZWlnaHQgLSAxOyBjeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yTWFwWzBdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGN4ID0gMTsgY3ggPCB3aWR0aCAtIDE7IGN4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGN5ICogd2lkdGggKyBjeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbERhdGFbcG9zXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaW1hZ2VEYXRhW3Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yICE9PSBiYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSBjb25uZWN0ZWRDb3VudCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtsY10gPSBjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXggPSB0cmFjZXIuY29udG91clRyYWNpbmcoY3ksIGN4LCBsYywgY29sb3IsIFJhc3Rlcml6ZXIuRElSLk9VVFNJREVfRURHRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGluZGV4ID0gbGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IFJhc3Rlcml6ZXIuY3JlYXRlQ29udG91cjJEKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXIgPSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNXX0RJUjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmluZGV4ID0gbGFiZWxpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmZpcnN0VmVydGV4ID0gdmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubmV4dHBlZXIgPSBjYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmluc2lkZUNvbnRvdXJzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MucHJldnBlZXIgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYyA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXggPSB0cmFjZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udG91clRyYWNpbmcoY3ksIGN4LCBSYXN0ZXJpemVyLkRJUi5JTlNJREVfRURHRSwgY29sb3IsIGxhYmVsaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBSYXN0ZXJpemVyLmNyZWF0ZUNvbnRvdXIyRCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZmlyc3RWZXJ0ZXggPSB2ZXJ0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbnNpZGVDb250b3VycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHRobGFiZWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXIgPSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNDV19ESVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5kaXIgPSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNXX0RJUjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbmRleCA9IGRlcHRobGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MgPSBjYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHNjICE9PSBudWxsKSAmJiBzYy5pbmRleCAhPT0gbGFiZWxpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IHNjLm5leHRwZWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uZXh0cGVlciA9IHNjLmluc2lkZUNvbnRvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2MuaW5zaWRlQ29udG91cnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLmluc2lkZUNvbnRvdXJzLnByZXZwZWVyID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy5pbnNpZGVDb250b3VycyA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxEYXRhW3Bvc10gPSBsYWJlbGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxEYXRhW3Bvc10gPT09IFJhc3Rlcml6ZXIuRElSLk9VVFNJREVfRURHRVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYWJlbERhdGFbcG9zXSA9PT0gUmFzdGVyaXplci5ESVIuSU5TSURFX0VER0UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxEYXRhW3Bvc10gPT09IFJhc3Rlcml6ZXIuRElSLklOU0lERV9FREdFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gaW1hZ2VEYXRhW3Bvc107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMgPSBjb2xvck1hcFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsaW5kZXggPSBsYWJlbERhdGFbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yTWFwW2xhYmVsaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjID0gY2M7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHNjICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjLmluZGV4ID0gZGVwdGhsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgc2MgPSBzYy5uZXh0cGVlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY2MsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBjb25uZWN0ZWRDb3VudCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgICAgICAgZHJhd0NvbnRvdXIoY2FudmFzLCBmaXJzdENvbnRvdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcSA9IGZpcnN0Q29udG91cjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHA7XG5cbiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBxICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpcSA9IHBxLmluc2lkZUNvbnRvdXJzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBxICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gaXE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXEgPSBpcS5uZXh0cGVlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHBxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBxID0gcHEubmV4dHBlZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBxICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlxID0gcHEuaW5zaWRlQ29udG91cnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChxLmRpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmFzdGVyaXplci5DT05UT1VSX0RJUi5DV19ESVI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ0NXX0RJUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuVU5LTk9XTl9ESVI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwID0gcS5maXJzdFZlcnRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8ocC54LCBwLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhwLngsIHAueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChwICE9PSBxLmZpcnN0VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJpemVyO1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIGVxZXFlcSAqL1xuLyogQHByZXNlcnZlIEFTTSBCRUdJTiAqL1xuLyoqXG4gKiBNb3JwaG9sb2dpY2FsIHNrZWxldG9uaXphdGlvbiB1c2luZyBpdGVyYXRpdmUgdGhpbm5pbmcgYWxnb3JpdGhtLlxuICogUmVkdWNlcyBiaW5hcnkgaW1hZ2VzIHRvIHNpbmdsZS1waXhlbC13aWRlIHNrZWxldG9ucyB3aGlsZSBwcmVzZXJ2aW5nIHRvcG9sb2d5LlxuICpcbiAqIE1lbW9yeSBsYXlvdXQgaW4gc2hhcmVkIEFycmF5QnVmZmVyICg0IHJlZ2lvbnMgb2Ygc2l6ZcKyKTpcbiAqIC0gUmVnaW9uIDA6IFdvcmtpbmcgaW1hZ2UgKHN1YkltYWdlUHRyID0gMClcbiAqIC0gUmVnaW9uIDE6IEVyb2RlZCByZXN1bHQgKGVyb2RlZEltYWdlUHRyID0gc2l6ZcKyKVxuICogLSBSZWdpb24gMjogVGVtcC9zY3JhdGNoIHNwYWNlICh0ZW1wSW1hZ2VQdHIgPSAyKnNpemXCsilcbiAqIC0gUmVnaW9uIDM6IEZpbmFsIHNrZWxldG9uIG91dHB1dCAoc2tlbEltYWdlUHRyID0gMypzaXplwrIpXG4gKi9cbmZ1bmN0aW9uIFNrZWxldG9uaXplcihzdGRsaWIsIGZvcmVpZ24sIGJ1ZmZlcikge1xuICAgICd1c2UgYXNtJztcblxuICAgIHZhciBpbWFnZXMgPSBuZXcgc3RkbGliLlVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICB2YXIgc2l6ZSA9IGZvcmVpZ24uc2l6ZSB8IDA7XG4gICAgdmFyIGltdWwgPSBzdGRsaWIuTWF0aC5pbXVsO1xuXG4gICAgLyoqXG4gICAgICogTW9ycGhvbG9naWNhbCBlcm9zaW9uIHdpdGggNS1waXhlbCBjcm9zcyBzdHJ1Y3R1cmluZyBlbGVtZW50LlxuICAgICAqIEEgcGl4ZWwgc3Vydml2ZXMgb25seSBpZiBhbGwgNSBwaXhlbHMgaW4gdGhlIGNyb3NzIHBhdHRlcm4gYXJlIHNldDpcbiAgICAgKiB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBjZW50ZXIsIGJvdHRvbS1sZWZ0LCBib3R0b20tcmlnaHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXJvZGUoaW5JbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgaW5JbWFnZVB0ciA9IGluSW1hZ2VQdHIgfCAwO1xuICAgICAgICBvdXRJbWFnZVB0ciA9IG91dEltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgdiA9IDA7XG4gICAgICAgIHZhciB1ID0gMDtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIHZhciB5U3RhcnQxID0gMDtcbiAgICAgICAgdmFyIHlTdGFydDIgPSAwO1xuICAgICAgICB2YXIgeFN0YXJ0MSA9IDA7XG4gICAgICAgIHZhciB4U3RhcnQyID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG5cbiAgICAgICAgZm9yICh2ID0gMTsgKHYgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHYgPSAodiArIDEpIHwgMCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCArIHNpemUpIHwgMDtcbiAgICAgICAgICAgIGZvciAodSA9IDE7ICh1IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB1ID0gKHUgKyAxKSB8IDApIHtcbiAgICAgICAgICAgICAgICB5U3RhcnQxID0gKG9mZnNldCAtIHNpemUpIHwgMDtcbiAgICAgICAgICAgICAgICB5U3RhcnQyID0gKG9mZnNldCArIHNpemUpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQxID0gKHUgLSAxKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MiA9ICh1ICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgIHN1bSA9ICgoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MikgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQyKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgICAgICAgICAvLyBQaXhlbCBzdXJ2aXZlcyBlcm9zaW9uIG9ubHkgaWYgYWxsIDUgY3Jvc3MgbmVpZ2hib3JzIGFyZSBzZXRcbiAgICAgICAgICAgICAgICBpZiAoKHN1bSB8IDApID09ICg1IHwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaXhlbC13aXNlIHN1YnRyYWN0aW9uOiBvdXQgPSBhIC0gYiAoY2FwdHVyZXMgdGhlIFwicGVlbGVkXCIgbGF5ZXIpXG4gICAgZnVuY3Rpb24gc3VidHJhY3QoYUltYWdlUHRyLCBiSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGFJbWFnZVB0ciA9IGFJbWFnZVB0ciB8IDA7XG4gICAgICAgIGJJbWFnZVB0ciA9IGJJbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9ICgoaW1hZ2VzWyhhSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSAtIChpbWFnZXNbKGJJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaXhlbC13aXNlIE9SOiBvdXQgPSBhIHwgYiAoYWNjdW11bGF0ZXMgc2tlbGV0b24gbGF5ZXJzKVxuICAgIGZ1bmN0aW9uIGJpdHdpc2VPcihhSW1hZ2VQdHIsIGJJbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgYUltYWdlUHRyID0gYUltYWdlUHRyIHwgMDtcbiAgICAgICAgYkltYWdlUHRyID0gYkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID0gKChpbWFnZXNbKGFJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApIHwgKGltYWdlc1soYkltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvdW50cyBub24temVybyBwaXhlbHMgdG8gZGV0ZWN0IHdoZW4gZXJvc2lvbiBpcyBjb21wbGV0ZVxuICAgIGZ1bmN0aW9uIGNvdW50Tm9uWmVybyhpbWFnZVB0cikge1xuICAgICAgICBpbWFnZVB0ciA9IGltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBzdW0gPSAoKHN1bSB8IDApICsgKGltYWdlc1soaW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChzdW0gfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGaWxscyBpbWFnZSByZWdpb24gd2l0aCBhIGNvbnN0YW50IHZhbHVlXG4gICAgZnVuY3Rpb24gaW5pdChpbWFnZVB0ciwgdmFsdWUpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG4gICAgICAgIHZhbHVlID0gdmFsdWUgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW9ycGhvbG9naWNhbCBkaWxhdGlvbiB3aXRoIDUtcGl4ZWwgY3Jvc3MgLSBwaXhlbCBpcyBzZXQgaWYgYW55IG5laWdoYm9yIGlzIHNldFxuICAgIGZ1bmN0aW9uIGRpbGF0ZShpbkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBpbkltYWdlUHRyID0gaW5JbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciB2ID0gMDtcbiAgICAgICAgdmFyIHUgPSAwO1xuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgdmFyIHlTdGFydDEgPSAwO1xuICAgICAgICB2YXIgeVN0YXJ0MiA9IDA7XG4gICAgICAgIHZhciB4U3RhcnQxID0gMDtcbiAgICAgICAgdmFyIHhTdGFydDIgPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcblxuICAgICAgICBmb3IgKHYgPSAxOyAodiB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdiA9ICh2ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgZm9yICh1ID0gMTsgKHUgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHUgPSAodSArIDEpIHwgMCkge1xuICAgICAgICAgICAgICAgIHlTdGFydDEgPSAob2Zmc2V0IC0gc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHlTdGFydDIgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDEgPSAodSAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQyID0gKHUgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgc3VtID0gKChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQyKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDIpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICAgICAgICAgIGlmICgoc3VtIHwgMCkgPiAoMCB8IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29waWVzIGltYWdlIGRhdGEgZnJvbSBzcmMgdG8gZHN0IHJlZ2lvblxuICAgIGZ1bmN0aW9uIG1lbWNweShzcmNJbWFnZVB0ciwgZHN0SW1hZ2VQdHIpIHtcbiAgICAgICAgc3JjSW1hZ2VQdHIgPSBzcmNJbWFnZVB0ciB8IDA7XG4gICAgICAgIGRzdEltYWdlUHRyID0gZHN0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSAwO1xuXG4gICAgICAgIGxlbmd0aCA9IGltdWwoc2l6ZSwgc2l6ZSkgfCAwO1xuXG4gICAgICAgIHdoaWxlICgobGVuZ3RoIHwgMCkgPiAwKSB7XG4gICAgICAgICAgICBsZW5ndGggPSAobGVuZ3RoIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhkc3RJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSA9IChpbWFnZXNbKHNyY0ltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBaZXJvcyBvdXQgdGhlIGJvcmRlciBwaXhlbHMgb2YgdGhlIGltYWdlLlxuICAgICAqIEZpcnN0IGxvb3A6IGhhbmRsZXMgdG9wLCBsZWZ0LCBhbmQgcmlnaHQgZWRnZXMgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiBTZWNvbmQgbG9vcDogaGFuZGxlcyBib3R0b20gZWRnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHplcm9Cb3JkZXIoaW1hZ2VQdHIpIHtcbiAgICAgICAgaW1hZ2VQdHIgPSBpbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHggPSAwO1xuICAgICAgICB2YXIgeSA9IDA7XG5cbiAgICAgICAgZm9yICh4ID0gMDsgKHggfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHggPSAoeCArIDEpIHwgMCkge1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHgpIHwgMF0gPSAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHkpIHwgMF0gPSAwO1xuICAgICAgICAgICAgeSA9ICgoeSArIHNpemUpIC0gMSkgfCAwO1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHkpIHwgMF0gPSAwO1xuICAgICAgICAgICAgeSA9ICh5ICsgMSkgfCAwO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoeCA9IDA7ICh4IHwgMCkgPCAoc2l6ZSB8IDApOyB4ID0gKHggKyAxKSB8IDApIHtcbiAgICAgICAgICAgIGltYWdlc1soaW1hZ2VQdHIgKyB5KSB8IDBdID0gMDtcbiAgICAgICAgICAgIHkgPSAoeSArIDEpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1haW4gc2tlbGV0b25pemF0aW9uIGFsZ29yaXRobSB1c2luZyBpdGVyYXRpdmUgdGhpbm5pbmc6XG4gICAgICogMS4gRXJvZGUgdGhlIHdvcmtpbmcgaW1hZ2VcbiAgICAgKiAyLiBEaWxhdGUgdGhlIGVyb2RlZCB2ZXJzaW9uXG4gICAgICogMy4gU3VidHJhY3QgZGlsYXRlZCBmcm9tIG9yaWdpbmFsIChleHRyYWN0cyBcInBlZWxlZFwiIGxheWVyKVxuICAgICAqIDQuIE9SIHRoZSBwZWVsZWQgbGF5ZXIgaW50byBza2VsZXRvbiBhY2N1bXVsYXRvclxuICAgICAqIDUuIENvcHkgZXJvZGVkIGltYWdlIGJhY2sgdG8gd29ya2luZyBpbWFnZVxuICAgICAqIDYuIFJlcGVhdCB1bnRpbCB3b3JraW5nIGltYWdlIGlzIGVtcHR5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlIC0gb3BlcmF0ZXMgZGlyZWN0bHkgb24gc2hhcmVkIGJ1ZmZlci5cbiAgICAgKiAgIElucHV0IGltYWdlIGlzIHJlYWQgZnJvbSBidWZmZXIgb2Zmc2V0IDAgKHN1YkltYWdlUHRyKS5cbiAgICAgKiAgIE91dHB1dCBza2VsZXRvbiBpcyB3cml0dGVuIHRvIGJ1ZmZlciBvZmZzZXQgMypzaXplwrIgKHNrZWxJbWFnZVB0cikuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2tlbGV0b25pemUoKSB7XG4gICAgICAgIHZhciBzdWJJbWFnZVB0ciA9IDA7ICAgICAgICAvLyBSZWdpb24gMDogV29ya2luZyBpbWFnZSAoaW5wdXQsIG9mZnNldCA9IDApXG4gICAgICAgIHZhciBlcm9kZWRJbWFnZVB0ciA9IDA7ICAgICAvLyBSZWdpb24gMTogRXJvZGVkIHJlc3VsdCAob2Zmc2V0ID0gc2l6ZcKyKVxuICAgICAgICB2YXIgdGVtcEltYWdlUHRyID0gMDsgICAgICAgLy8gUmVnaW9uIDI6IFNjcmF0Y2ggc3BhY2UgKG9mZnNldCA9IDIqc2l6ZcKyKVxuICAgICAgICB2YXIgc2tlbEltYWdlUHRyID0gMDsgICAgICAgLy8gUmVnaW9uIDM6IEZpbmFsIHNrZWxldG9uIChvdXRwdXQsIG9mZnNldCA9IDMqc2l6ZcKyKVxuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgdmFyIGRvbmUgPSAwO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBieXRlIG9mZnNldHMgZm9yIGVhY2ggcmVnaW9uIGluIHRoZSBzaGFyZWQgYnVmZmVyXG4gICAgICAgIGVyb2RlZEltYWdlUHRyID0gaW11bChzaXplLCBzaXplKSB8IDA7ICAgICAgICAgICAgICAgICAgLy8gUmVnaW9uIDE6IHNpemXCsiBieXRlcyBpblxuICAgICAgICB0ZW1wSW1hZ2VQdHIgPSAoZXJvZGVkSW1hZ2VQdHIgKyBlcm9kZWRJbWFnZVB0cikgfCAwOyAgLy8gUmVnaW9uIDI6IDIqc2l6ZcKyIGJ5dGVzIGluXG4gICAgICAgIHNrZWxJbWFnZVB0ciA9ICh0ZW1wSW1hZ2VQdHIgKyBlcm9kZWRJbWFnZVB0cikgfCAwOyAgICAvLyBSZWdpb24gMzogMypzaXplwrIgYnl0ZXMgaW5cblxuICAgICAgICAvLyBJbml0aWFsaXplIHNrZWxldG9uIGFjY3VtdWxhdG9yIHRvIHplcm9cbiAgICAgICAgaW5pdChza2VsSW1hZ2VQdHIsIDApO1xuICAgICAgICB6ZXJvQm9yZGVyKHN1YkltYWdlUHRyKTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBlcm9kZShzdWJJbWFnZVB0ciwgZXJvZGVkSW1hZ2VQdHIpO1xuICAgICAgICAgICAgZGlsYXRlKGVyb2RlZEltYWdlUHRyLCB0ZW1wSW1hZ2VQdHIpO1xuICAgICAgICAgICAgc3VidHJhY3Qoc3ViSW1hZ2VQdHIsIHRlbXBJbWFnZVB0ciwgdGVtcEltYWdlUHRyKTtcbiAgICAgICAgICAgIGJpdHdpc2VPcihza2VsSW1hZ2VQdHIsIHRlbXBJbWFnZVB0ciwgc2tlbEltYWdlUHRyKTtcbiAgICAgICAgICAgIG1lbWNweShlcm9kZWRJbWFnZVB0ciwgc3ViSW1hZ2VQdHIpO1xuICAgICAgICAgICAgc3VtID0gY291bnROb25aZXJvKHN1YkltYWdlUHRyKSB8IDA7XG4gICAgICAgICAgICBkb25lID0gKChzdW0gfCAwKSA9PSAwIHwgMCk7XG4gICAgICAgIH0gd2hpbGUgKCFkb25lKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2tlbGV0b25pemU6IHNrZWxldG9uaXplIH07XG59XG4vKiBAcHJlc2VydmUgQVNNIEVORCAqL1xuXG5leHBvcnQgZGVmYXVsdCBTa2VsZXRvbml6ZXI7XG4vKiBlc2xpbnQtZW5hYmxlIGVxZXFlcSAqL1xuIiwiaW1wb3J0IHsgdmVjMiwgbWF0MiB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgSW1hZ2VXcmFwcGVyIGZyb20gJy4uL2NvbW1vbi9pbWFnZV93cmFwcGVyJztcbmltcG9ydCB7XG4gICAgY2FsY3VsYXRlUGF0Y2hTaXplLFxuICAgIG90c3VUaHJlc2hvbGQsXG4gICAgaHN2MnJnYixcbiAgICBjbHVzdGVyLFxuICAgIHRvcEdlbmVyaWMsXG4gICAgaW1hZ2VSZWYsXG4gICAgaGFsZlNhbXBsZSxcbiAgICBjb21wdXRlSW1hZ2VBcmVhLFxufSBmcm9tICcuLi9jb21tb24vY3ZfdXRpbHMnO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4uL2NvbW1vbi9hcnJheV9oZWxwZXInO1xuaW1wb3J0IEltYWdlRGVidWcgZnJvbSAnLi4vY29tbW9uL2ltYWdlX2RlYnVnJztcbmltcG9ydCBSYXN0ZXJpemVyIGZyb20gJy4vcmFzdGVyaXplcic7XG5pbXBvcnQgVHJhY2VyIGZyb20gJy4vdHJhY2VyJztcbmltcG9ydCBza2VsZXRvbml6ZXIgZnJvbSAnLi9za2VsZXRvbml6ZXInO1xuXG5cblxubGV0IF9jb25maWc7XG5sZXQgX2N1cnJlbnRJbWFnZVdyYXBwZXI7XG5sZXQgX3NrZWxJbWFnZVdyYXBwZXI7XG5sZXQgX3N1YkltYWdlV3JhcHBlcjtcbmxldCBfbGFiZWxJbWFnZVdyYXBwZXI7XG5sZXQgX3BhdGNoR3JpZDtcbmxldCBfcGF0Y2hMYWJlbEdyaWQ7XG5sZXQgX2ltYWdlVG9QYXRjaEdyaWQ7XG5sZXQgX2JpbmFyeUltYWdlV3JhcHBlcjtcbmxldCBfcGF0Y2hTaXplO1xuY29uc3QgX2NhbnZhc0NvbnRhaW5lciA9IHtcbiAgICBjdHg6IHtcbiAgICAgICAgYmluYXJ5OiBudWxsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGJpbmFyeTogbnVsbCxcbiAgICB9LFxufTtcbmNvbnN0IF9udW1QYXRjaGVzID0geyB4OiAwLCB5OiAwIH07XG5sZXQgX2lucHV0SW1hZ2VXcmFwcGVyO1xubGV0IF9za2VsZXRvbml6ZXI7XG5cbmZ1bmN0aW9uIGluaXRCdWZmZXJzKCkge1xuICAgIGlmIChfY29uZmlnLmhhbGZTYW1wbGUpIHtcbiAgICAgICAgX2N1cnJlbnRJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICB4OiBfaW5wdXRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gMiB8IDAsXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgICAgeTogX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUueSAvIDIgfCAwLFxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfY3VycmVudEltYWdlV3JhcHBlciA9IF9pbnB1dEltYWdlV3JhcHBlcjtcbiAgICB9XG5cbiAgICBfcGF0Y2hTaXplID0gY2FsY3VsYXRlUGF0Y2hTaXplKF9jb25maWcucGF0Y2hTaXplLCBfY3VycmVudEltYWdlV3JhcHBlci5zaXplKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgX251bVBhdGNoZXMueCA9IF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUueCAvIF9wYXRjaFNpemUueCB8IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBfbnVtUGF0Y2hlcy55ID0gX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gX3BhdGNoU2l6ZS55IHwgMDtcblxuICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUsIHVuZGVmaW5lZCwgVWludDhBcnJheSwgZmFsc2UpO1xuXG4gICAgX2xhYmVsSW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfcGF0Y2hTaXplLCB1bmRlZmluZWQsIEFycmF5LCB0cnVlKTtcblxuICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBidWZmZXIgc2l6ZSAoNCByZWdpb25zIGZvciBhc20uanMgc2tlbGV0b25pemVyKVxuICAgIGNvbnN0IHNrZWxldG9uSW1hZ2VEYXRhU2l6ZSA9IF9wYXRjaFNpemUueCAqIF9wYXRjaFNpemUueSAqIDQ7XG4gICAgLy8gUm91bmQgdXAgdG8gbmV4dCBwb3dlciBvZiAyIGZvciBhc20uanMgaGVhcCByZXF1aXJlbWVudFxuICAgIC8vIFVzZSBtaW5pbXVtIDY0S0IgZm9yIG9wdGltYWwgYXNtLmpzIHBlcmZvcm1hbmNlIChhdm9pZHMgVjggd2FybmluZ3MpXG4gICAgY29uc3QgYnVmZmVyU2l6ZSA9IE1hdGgubWF4KDY1NTM2LCBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2cyKHNrZWxldG9uSW1hZ2VEYXRhU2l6ZSkpKSk7XG4gICAgY29uc3Qgc2tlbGV0b25JbWFnZURhdGEgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyU2l6ZSk7XG4gICAgX3N1YkltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIoX3BhdGNoU2l6ZSxcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIDAsIF9wYXRjaFNpemUueCAqIF9wYXRjaFNpemUueSkpO1xuICAgIF9za2VsSW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfcGF0Y2hTaXplLFxuICAgICAgICBuZXcgVWludDhBcnJheShza2VsZXRvbkltYWdlRGF0YSwgX3BhdGNoU2l6ZS54ICogX3BhdGNoU2l6ZS55ICogMywgX3BhdGNoU2l6ZS54ICogX3BhdGNoU2l6ZS55KSxcbiAgICAgICAgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICBfc2tlbGV0b25pemVyID0gc2tlbGV0b25pemVyKFxuICAgICAgICB7IE1hdGgsIFVpbnQ4QXJyYXkgfSxcbiAgICAgICAgeyBzaXplOiBfcGF0Y2hTaXplLnggfSxcbiAgICAgICAgc2tlbGV0b25JbWFnZURhdGEsXG4gICAgKTtcblxuICAgIF9pbWFnZVRvUGF0Y2hHcmlkID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgIHg6IChfY3VycmVudEltYWdlV3JhcHBlci5zaXplLnggLyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueCkgfCAwLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICB5OiAoX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS55IC8gX3N1YkltYWdlV3JhcHBlci5zaXplLnkpIHwgMCxcbiAgICB9LCB1bmRlZmluZWQsIEFycmF5LCB0cnVlKTtcbiAgICBfcGF0Y2hHcmlkID0gbmV3IEltYWdlV3JhcHBlcihfaW1hZ2VUb1BhdGNoR3JpZC5zaXplLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgX3BhdGNoTGFiZWxHcmlkID0gbmV3IEltYWdlV3JhcHBlcihfaW1hZ2VUb1BhdGNoR3JpZC5zaXplLCB1bmRlZmluZWQsIEludDMyQXJyYXksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBpbml0Q2FudmFzKCkge1xuICAgIGlmIChfY29uZmlnLnVzZVdvcmtlciB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LmNsYXNzTmFtZSA9ICdiaW5hcnlCdWZmZXInO1xuICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93Q2FudmFzID09PSB0cnVlKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWJ1ZycpLmFwcGVuZENoaWxkKF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeSk7XG4gICAgfVxuICAgIGNvbnN0IHdpbGxSZWFkRnJlcXVlbnRseSA9ICEhX2NvbmZpZy53aWxsUmVhZEZyZXF1ZW50bHk7XG4gICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnPy5zaG93Q2FudmFzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignKiBpbml0Q2FudmFzIHdpbGxSZWFkRnJlcXVlbnRseScsIHdpbGxSZWFkRnJlcXVlbnRseSwgX2NvbmZpZyk7XG4gICAgfVxuICAgIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSA9IF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5IH0pO1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS53aWR0aCA9IF9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS5oZWlnaHQgPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYm91bmRpbmcgYm94IHdoaWNoIGVuY2xvc2VzIGFsbCB0aGUgZ2l2ZW4gcGF0Y2hlc1xuICogQHJldHVybnMge0FycmF5fSBUaGUgbWluaW1hbCBib3VuZGluZyBib3hcbiAqL1xuZnVuY3Rpb24gYm94RnJvbVBhdGNoZXMocGF0Y2hlcykge1xuICAgIGxldCBvdmVyQXZnO1xuICAgIGxldCBpO1xuICAgIGxldCBqO1xuICAgIGxldCBwYXRjaDtcbiAgICBsZXQgdHJhbnNNYXQ7XG4gICAgbGV0IG1pbnggPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBsZXQgbWlueSA9IF9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGxldCBtYXh4ID0gLV9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGxldCBtYXh5ID0gLV9iaW5hcnlJbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGxldCBib3g7XG4gICAgbGV0IHNjYWxlO1xuXG4gICAgLy8gZHJhdyBhbGwgcGF0Y2hlcyB3aGljaCBhcmUgdG8gYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAgb3ZlckF2ZyA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHBhdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgICBvdmVyQXZnICs9IHBhdGNoLnJhZDtcbiAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dQYXRjaGVzKSB7XG4gICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdSZWN0KHBhdGNoLnBvcywgX3N1YkltYWdlV3JhcHBlci5zaXplLCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICdyZWQnIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3ZlckF2ZyAvPSBwYXRjaGVzLmxlbmd0aDtcbiAgICBvdmVyQXZnID0gKG92ZXJBdmcgKiAxODAgLyBNYXRoLlBJICsgOTApICUgMTgwIC0gOTA7XG4gICAgaWYgKG92ZXJBdmcgPCAwKSB7XG4gICAgICAgIG92ZXJBdmcgKz0gMTgwO1xuICAgIH1cblxuICAgIG92ZXJBdmcgPSAoMTgwIC0gb3ZlckF2ZykgKiBNYXRoLlBJIC8gMTgwO1xuICAgIHRyYW5zTWF0ID0gbWF0Mi5jb3B5KG1hdDIuY3JlYXRlKCksIFtNYXRoLmNvcyhvdmVyQXZnKSwgTWF0aC5zaW4ob3ZlckF2ZyksIC1NYXRoLnNpbihvdmVyQXZnKSwgTWF0aC5jb3Mob3ZlckF2ZyldKTtcblxuICAgIC8vIGl0ZXJhdGUgb3ZlciBwYXRjaGVzIGFuZCByb3RhdGUgYnkgYW5nbGVcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIHZlYzIudHJhbnNmb3JtTWF0MihwYXRjaC5ib3hbal0sIHBhdGNoLmJveFtqXSwgdHJhbnNNYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLmJveEZyb21QYXRjaGVzLnNob3dUcmFuc2Zvcm1lZCkge1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChwYXRjaC5ib3gsIHsgeDogMCwgeTogMSB9LCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICcjOTlmZjAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmluZCBib3VuZGluZyBib3hcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMF0gPCBtaW54KSB7XG4gICAgICAgICAgICAgICAgbWlueCA9IHBhdGNoLmJveFtqXVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMF0gPiBtYXh4KSB7XG4gICAgICAgICAgICAgICAgbWF4eCA9IHBhdGNoLmJveFtqXVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMV0gPCBtaW55KSB7XG4gICAgICAgICAgICAgICAgbWlueSA9IHBhdGNoLmJveFtqXVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRjaC5ib3hbal1bMV0gPiBtYXh5KSB7XG4gICAgICAgICAgICAgICAgbWF4eSA9IHBhdGNoLmJveFtqXVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJveCA9IFtbbWlueCwgbWlueV0sIFttYXh4LCBtaW55XSwgW21heHgsIG1heHldLCBbbWlueCwgbWF4eV1dO1xuXG4gICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLmJveEZyb21QYXRjaGVzLnNob3dUcmFuc2Zvcm1lZEJveCkge1xuICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKGJveCwgeyB4OiAwLCB5OiAxIH0sIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSwgeyBjb2xvcjogJyNmZjAwMDAnLCBsaW5lV2lkdGg6IDIgfSk7XG4gICAgfVxuXG4gICAgc2NhbGUgPSBfY29uZmlnLmhhbGZTYW1wbGUgPyAyIDogMTtcbiAgICAvLyByZXZlcnNlIHJvdGF0aW9uO1xuICAgIHRyYW5zTWF0ID0gbWF0Mi5pbnZlcnQodHJhbnNNYXQsIHRyYW5zTWF0KTtcbiAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgIHZlYzIudHJhbnNmb3JtTWF0Mihib3hbal0sIGJveFtqXSwgdHJhbnNNYXQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93QkIpIHtcbiAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChib3gsIHsgeDogMCwgeTogMSB9LCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICcjZmYwMDAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgIH1cblxuICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgdmVjMi5zY2FsZShib3hbal0sIGJveFtqXSwgc2NhbGUpO1xuICAgIH1cblxuICAgIHJldHVybiBib3g7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpbmFyeSBpbWFnZSBvZiB0aGUgY3VycmVudCBpbWFnZVxuICovXG5mdW5jdGlvbiBiaW5hcml6ZUltYWdlKCkge1xuICAgIG90c3VUaHJlc2hvbGQoX2N1cnJlbnRJbWFnZVdyYXBwZXIsIF9iaW5hcnlJbWFnZVdyYXBwZXIpO1xuICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIuemVyb0JvcmRlcigpO1xuICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93Q2FudmFzKSB7XG4gICAgICAgIF9iaW5hcnlJbWFnZVdyYXBwZXIuc2hvdyhfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnksIDI1NSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGltYWdlXG4gKiBleHRyYWN0IHBhdGNoZXNcbiAqL1xuZnVuY3Rpb24gZmluZFBhdGNoZXMoKSB7XG4gICAgbGV0IGk7XG4gICAgbGV0IGo7XG4gICAgbGV0IHg7XG4gICAgbGV0IHk7XG4gICAgbGV0IG1vbWVudHM7XG4gICAgbGV0IHBhdGNoZXNGb3VuZCA9IFtdO1xuICAgIGxldCByYXN0ZXJpemVyO1xuICAgIGxldCByYXN0ZXJSZXN1bHQ7XG4gICAgbGV0IHBhdGNoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBfbnVtUGF0Y2hlcy54OyBpKyspIHtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IF9udW1QYXRjaGVzLnk7IGorKykge1xuICAgICAgICAgICAgeCA9IF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54ICogaTtcbiAgICAgICAgICAgIHkgPSBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueSAqIGo7XG5cbiAgICAgICAgICAgIC8vIHNlcGVyYXRlIHBhcnRzXG4gICAgICAgICAgICBza2VsZXRvbml6ZSh4LCB5KTtcblxuICAgICAgICAgICAgLy8gUmFzdGVyaXplLCBmaW5kIGluZGl2aWR1YWwgYmFyc1xuICAgICAgICAgICAgX3NrZWxJbWFnZVdyYXBwZXIuemVyb0JvcmRlcigpO1xuICAgICAgICAgICAgQXJyYXlIZWxwZXIuaW5pdChfbGFiZWxJbWFnZVdyYXBwZXIuZGF0YSwgMCk7XG4gICAgICAgICAgICByYXN0ZXJpemVyID0gUmFzdGVyaXplci5jcmVhdGUoX3NrZWxJbWFnZVdyYXBwZXIsIF9sYWJlbEltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICByYXN0ZXJSZXN1bHQgPSByYXN0ZXJpemVyLnJhc3Rlcml6ZSgwKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBfbGFiZWxJbWFnZVdyYXBwZXIub3ZlcmxheShfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnksIE1hdGguZmxvb3IoMzYwIC8gcmFzdGVyUmVzdWx0LmNvdW50KSxcbiAgICAgICAgICAgICAgICAgICAgeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgbW9tZW50cyBmcm9tIHRoZSBza2VsZXRvbml6ZWQgcGF0Y2hcbiAgICAgICAgICAgIG1vbWVudHMgPSBfbGFiZWxJbWFnZVdyYXBwZXIubW9tZW50cyhyYXN0ZXJSZXN1bHQuY291bnQpO1xuXG4gICAgICAgICAgICAvLyBleHRyYWN0IGVsaWdpYmxlIHBhdGNoZXNcbiAgICAgICAgICAgIHBhdGNoZXNGb3VuZCA9IHBhdGNoZXNGb3VuZC5jb25jYXQoZGVzY3JpYmVQYXRjaChtb21lbnRzLCBbaSwgal0sIHgsIHkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93Rm91bmRQYXRjaGVzKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXRjaGVzRm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhdGNoID0gcGF0Y2hlc0ZvdW5kW2ldO1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LFxuICAgICAgICAgICAgICAgIHsgY29sb3I6ICcjOTlmZjAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGNoZXNGb3VuZDtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aG9zZSBjb25uZWN0ZWQgYXJlYXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCA2IHBhdGNoZXNcbiAqIGFuZCByZXR1cm5zIHRoZW0gb3JkZXJlZCBERVNDIGJ5IHRoZSBudW1iZXIgb2YgY29udGFpbmVkIHBhdGNoZXNcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMYWJlbFxuICovXG5mdW5jdGlvbiBmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKSB7XG4gICAgbGV0IGk7XG4gICAgbGV0IHN1bTtcbiAgICBsZXQgbGFiZWxIaXN0ID0gW107XG4gICAgbGV0IHRvcExhYmVscyA9IFtdO1xuXG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbWF4TGFiZWw7IGkrKykge1xuICAgICAgICBsYWJlbEhpc3QucHVzaCgwKTtcbiAgICB9XG4gICAgc3VtID0gX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoO1xuICAgIHdoaWxlIChzdW0tLSkge1xuICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbc3VtXSA+IDApIHtcbiAgICAgICAgICAgIGxhYmVsSGlzdFtfcGF0Y2hMYWJlbEdyaWQuZGF0YVtzdW1dIC0gMV0rKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxhYmVsSGlzdCA9IGxhYmVsSGlzdC5tYXAoKHZhbCwgaWR4KSA9PiAoe1xuICAgICAgICB2YWwsXG4gICAgICAgIGxhYmVsOiBpZHggKyAxLFxuICAgIH0pKTtcblxuICAgIGxhYmVsSGlzdC5zb3J0KChhLCBiKSA9PiBiLnZhbCAtIGEudmFsKTtcblxuICAgIC8vIGV4dHJhY3QgdG9wIGFyZWFzIHdpdGggYXQgbGVhc3QgNSBwYXRjaGVzIHByZXNlbnRcbiAgICB0b3BMYWJlbHMgPSBsYWJlbEhpc3QuZmlsdGVyKChlbCkgPT4gZWwudmFsID49IDUpO1xuXG4gICAgcmV0dXJuIHRvcExhYmVscztcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBmaW5kQm94ZXModG9wTGFiZWxzLCBtYXhMYWJlbCkge1xuICAgIGxldCBpO1xuICAgIGxldCBqO1xuICAgIGxldCBzdW07XG4gICAgY29uc3QgcGF0Y2hlcyA9IFtdO1xuICAgIGxldCBwYXRjaDtcbiAgICBsZXQgYm94O1xuICAgIGNvbnN0IGJveGVzID0gW107XG4gICAgY29uc3QgaHN2ID0gWzAsIDEsIDFdO1xuICAgIGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0b3BMYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3VtID0gX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoO1xuICAgICAgICBwYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHdoaWxlIChzdW0tLSkge1xuICAgICAgICAgICAgaWYgKF9wYXRjaExhYmVsR3JpZC5kYXRhW3N1bV0gPT09IHRvcExhYmVsc1tpXS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIHBhdGNoID0gX2ltYWdlVG9QYXRjaEdyaWQuZGF0YVtzdW1dO1xuICAgICAgICAgICAgICAgIHBhdGNoZXMucHVzaChwYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYm94ID0gYm94RnJvbVBhdGNoZXMocGF0Y2hlcyk7XG4gICAgICAgIGlmIChib3gpIHtcbiAgICAgICAgICAgIGJveGVzLnB1c2goYm94KTtcblxuICAgICAgICAgICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgICAgICAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd1JlbWFpbmluZ1BhdGNoTGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdGNoZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0Y2ggPSBwYXRjaGVzW2pdO1xuICAgICAgICAgICAgICAgICAgICBoc3ZbMF0gPSAodG9wTGFiZWxzW2ldLmxhYmVsIC8gKG1heExhYmVsICsgMSkpICogMzYwO1xuICAgICAgICAgICAgICAgICAgICBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2xvcjogYHJnYigke3JnYi5qb2luKCcsJyl9KWAsIGxpbmVXaWR0aDogMiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJveGVzO1xufVxuXG4vKipcbiAqIEZpbmQgc2ltaWxhciBtb21lbnRzICh2aWEgY2x1c3RlcilcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb21lbnRzXG4gKi9cbmZ1bmN0aW9uIHNpbWlsYXJNb21lbnRzKG1vbWVudHMpIHtcbiAgICBjb25zdCBjbHVzdGVycyA9IGNsdXN0ZXIobW9tZW50cywgMC45MCk7XG4gICAgY29uc3QgdG9wQ2x1c3RlciA9IHRvcEdlbmVyaWMoY2x1c3RlcnMsIDEsIChlKSA9PiBlLmdldFBvaW50cygpLmxlbmd0aCk7XG4gICAgbGV0IHBvaW50cyA9IFtdOyBjb25zdFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICBpZiAodG9wQ2x1c3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcG9pbnRzID0gdG9wQ2x1c3RlclswXS5pdGVtLmdldFBvaW50cygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9pbnRzW2ldLnBvaW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBza2VsZXRvbml6ZSh4LCB5KSB7XG4gICAgX2JpbmFyeUltYWdlV3JhcHBlci5zdWJJbWFnZUFzQ29weShfc3ViSW1hZ2VXcmFwcGVyLCBpbWFnZVJlZih4LCB5KSk7XG4gICAgX3NrZWxldG9uaXplci5za2VsZXRvbml6ZSgpO1xuXG4gICAgLy8gU2hvdyBza2VsZXRvbiBpZiByZXF1ZXN0ZWRcbiAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd1NrZWxldG9uKSB7XG4gICAgICAgIF9za2VsSW1hZ2VXcmFwcGVyLm92ZXJsYXkoX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LCAzNjAsIGltYWdlUmVmKHgsIHkpKTtcbiAgICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYW5kIGRlc2NyaWJlcyB0aG9zZSBwYXRjaGVzIHdoaWNoIHNlZW0gdG8gY29udGFpbiBhIGJhcmNvZGUgcGF0dGVyblxuICogQHBhcmFtIHtBcnJheX0gbW9tZW50c1xuICogQHBhcmFtIHtPYmplY3R9IHBhdGNoUG9zLFxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJucyB7QXJyYXl9IGxpc3Qgb2YgcGF0Y2hlc1xuICovXG5mdW5jdGlvbiBkZXNjcmliZVBhdGNoKG1vbWVudHMsIHBhdGNoUG9zLCB4LCB5KSB7XG4gICAgbGV0IGs7XG4gICAgbGV0IGF2ZztcbiAgICBjb25zdCBlbGlnaWJsZU1vbWVudHMgPSBbXTtcbiAgICBsZXQgbWF0Y2hpbmdNb21lbnRzO1xuICAgIGxldCBwYXRjaDtcbiAgICBjb25zdCBwYXRjaGVzRm91bmQgPSBbXTtcbiAgICBjb25zdCBtaW5Db21wb25lbnRXZWlnaHQgPSBNYXRoLmNlaWwoX3BhdGNoU2l6ZS54IC8gMyk7XG5cbiAgICBpZiAobW9tZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAvLyBvbmx5IGNvbGxlY3QgbW9tZW50cyB3aGljaCdzIGFyZWEgY292ZXJzIGF0IGxlYXN0IG1pbkNvbXBvbmVudFdlaWdodCBwaXhlbHMuXG4gICAgICAgIGZvciAoayA9IDA7IGsgPCBtb21lbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBpZiAobW9tZW50c1trXS5tMDAgPiBtaW5Db21wb25lbnRXZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBlbGlnaWJsZU1vbWVudHMucHVzaChtb21lbnRzW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGF0IGxlYXN0IDIgbW9tZW50cyBhcmUgZm91bmQgd2hpY2ggaGF2ZSBhdCBsZWFzdCBtaW5Db21wb25lbnRXZWlnaHRzIGNvdmVyZWRcbiAgICAgICAgaWYgKGVsaWdpYmxlTW9tZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgbWF0Y2hpbmdNb21lbnRzID0gc2ltaWxhck1vbWVudHMoZWxpZ2libGVNb21lbnRzKTtcbiAgICAgICAgICAgIGF2ZyA9IDA7XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIHNpbWlsYXJpdHkgb2YgdGhlIG1vbWVudHNcbiAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBtYXRjaGluZ01vbWVudHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBhdmcgKz0gbWF0Y2hpbmdNb21lbnRzW2tdPy5yYWQgPz8gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSB0d28gb2YgdGhlIG1vbWVudHMgYXJlIGFsbG93ZWQgbm90IHRvIGZpdCBpbnRvIHRoZSBlcXVhdGlvblxuICAgICAgICAgICAgLy8gYWRkIHRoZSBwYXRjaCB0byB0aGUgc2V0XG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdNb21lbnRzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgJiYgbWF0Y2hpbmdNb21lbnRzLmxlbmd0aCA+PSAoZWxpZ2libGVNb21lbnRzLmxlbmd0aCAvIDQpICogM1xuICAgICAgICAgICAgICAgICAgICAmJiBtYXRjaGluZ01vbWVudHMubGVuZ3RoID4gbW9tZW50cy5sZW5ndGggLyA0KSB7XG4gICAgICAgICAgICAgICAgYXZnIC89IG1hdGNoaW5nTW9tZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcGF0Y2ggPSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBwYXRjaFBvc1sxXSAqIF9udW1QYXRjaGVzLnggKyBwYXRjaFBvc1swXSxcbiAgICAgICAgICAgICAgICAgICAgcG9zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYm94OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKFt4LCB5XSksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKFt4ICsgX3N1YkltYWdlV3JhcHBlci5zaXplLngsIHldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUoW3ggKyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueCwgeSArIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS55XSksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKFt4LCB5ICsgX3N1YkltYWdlV3JhcHBlci5zaXplLnldKSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgbW9tZW50czogbWF0Y2hpbmdNb21lbnRzLFxuICAgICAgICAgICAgICAgICAgICByYWQ6IGF2ZyxcbiAgICAgICAgICAgICAgICAgICAgdmVjOiB2ZWMyLmNsb25lKFtNYXRoLmNvcyhhdmcpLCBNYXRoLnNpbihhdmcpXSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwYXRjaGVzRm91bmQucHVzaChwYXRjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhdGNoZXNGb3VuZDtcbn1cblxuLyoqXG4gKiBmaW5kcyBwYXRjaGVzIHdoaWNoIGFyZSBjb25uZWN0ZWQgYW5kIHNoYXJlIHRoZSBzYW1lIG9yaWVudGF0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gcGF0Y2hlc0ZvdW5kXG4gKi9cbmZ1bmN0aW9uIHJhc3Rlcml6ZUFuZ3VsYXJTaW1pbGFyaXR5KHBhdGNoZXNGb3VuZCkge1xuICAgIGxldCBsYWJlbCA9IDA7XG4gICAgY29uc3QgdGhyZXNob2xkID0gMC45NTtcbiAgICBsZXQgY3VycklkeCA9IDA7XG4gICAgbGV0IGo7XG4gICAgbGV0IHBhdGNoO1xuICAgIGNvbnN0IGhzdiA9IFswLCAxLCAxXTtcbiAgICBjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cbiAgICBmdW5jdGlvbiBub3RZZXRQcm9jZXNzZWQoKSB7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtpXSA9PT0gMCAmJiBfcGF0Y2hHcmlkLmRhdGFbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYWNlKGN1cnJlbnRJZHgpIHtcbiAgICAgICAgbGV0IHg7XG4gICAgICAgIGxldCB5O1xuICAgICAgICBsZXQgY3VycmVudFBhdGNoO1xuICAgICAgICBsZXQgaWR4O1xuICAgICAgICBsZXQgZGlyO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0ge1xuICAgICAgICAgICAgeDogY3VycmVudElkeCAlIF9wYXRjaExhYmVsR3JpZC5zaXplLngsXG4gICAgICAgICAgICB5OiAoY3VycmVudElkeCAvIF9wYXRjaExhYmVsR3JpZC5zaXplLngpIHwgMCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHNpbWlsYXJpdHk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJZHggPCBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXRjaCA9IF9pbWFnZVRvUGF0Y2hHcmlkLmRhdGFbY3VycmVudElkeF07XG4gICAgICAgICAgICAvLyBhc3NpZ24gbGFiZWxcbiAgICAgICAgICAgIF9wYXRjaExhYmVsR3JpZC5kYXRhW2N1cnJlbnRJZHhdID0gbGFiZWw7XG4gICAgICAgICAgICBmb3IgKGRpciA9IDA7IGRpciA8IFRyYWNlci5zZWFyY2hEaXJlY3Rpb25zLmxlbmd0aDsgZGlyKyspIHtcbiAgICAgICAgICAgICAgICB5ID0gY3VycmVudC55ICsgVHJhY2VyLnNlYXJjaERpcmVjdGlvbnNbZGlyXVswXTtcbiAgICAgICAgICAgICAgICB4ID0gY3VycmVudC54ICsgVHJhY2VyLnNlYXJjaERpcmVjdGlvbnNbZGlyXVsxXTtcbiAgICAgICAgICAgICAgICBpZHggPSB5ICogX3BhdGNoTGFiZWxHcmlkLnNpemUueCArIHg7XG5cbiAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBpZiBwYXRjaCBlbXB0eVxuICAgICAgICAgICAgICAgIGlmIChfcGF0Y2hHcmlkLmRhdGFbaWR4XSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBfcGF0Y2hMYWJlbEdyaWQuZGF0YVtpZHhdID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtpZHhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbWlsYXJpdHkgPSBNYXRoLmFicyh2ZWMyLmRvdChfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW2lkeF0udmVjLCBjdXJyZW50UGF0Y2gudmVjKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaW1pbGFyaXR5ID4gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFjZShpZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcHJlcGFyZSBmb3IgZmluZGluZyB0aGUgcmlnaHQgcGF0Y2hlc1xuICAgIEFycmF5SGVscGVyLmluaXQoX3BhdGNoR3JpZC5kYXRhLCAwKTtcbiAgICBBcnJheUhlbHBlci5pbml0KF9wYXRjaExhYmVsR3JpZC5kYXRhLCAwKTtcbiAgICBBcnJheUhlbHBlci5pbml0KF9pbWFnZVRvUGF0Y2hHcmlkLmRhdGEsIG51bGwpO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IHBhdGNoZXNGb3VuZC5sZW5ndGg7IGorKykge1xuICAgICAgICBwYXRjaCA9IHBhdGNoZXNGb3VuZFtqXTtcbiAgICAgICAgX2ltYWdlVG9QYXRjaEdyaWQuZGF0YVtwYXRjaC5pbmRleF0gPSBwYXRjaDtcbiAgICAgICAgX3BhdGNoR3JpZC5kYXRhW3BhdGNoLmluZGV4XSA9IDE7XG4gICAgfVxuXG4gICAgLy8gcmFzdGVyaXplIHRoZSBwYXRjaGVzIGZvdW5kIHRvIGRldGVybWluZSBhcmVhXG4gICAgX3BhdGNoR3JpZC56ZXJvQm9yZGVyKCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICB3aGlsZSAoKGN1cnJJZHggPSBub3RZZXRQcm9jZXNzZWQoKSkgPCBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgbGFiZWwrKztcbiAgICAgICAgdHJhY2UoY3VycklkeCk7XG4gICAgfVxuXG4gICAgLy8gZHJhdyBwYXRjaC1sYWJlbHMgaWYgcmVxdWVzdGVkXG4gICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCAmJiBfY29uZmlnLmRlYnVnLnNob3dQYXRjaExhYmVscykge1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgX3BhdGNoTGFiZWxHcmlkLmRhdGEubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSA+IDAgJiYgX3BhdGNoTGFiZWxHcmlkLmRhdGFbal0gPD0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICBwYXRjaCA9IF9pbWFnZVRvUGF0Y2hHcmlkLmRhdGFbal07XG4gICAgICAgICAgICAgICAgaHN2WzBdID0gKF9wYXRjaExhYmVsR3JpZC5kYXRhW2pdIC8gKGxhYmVsICsgMSkpICogMzYwO1xuICAgICAgICAgICAgICAgIGhzdjJyZ2IoaHN2LCByZ2IpO1xuICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1JlY3QocGF0Y2gucG9zLCBfc3ViSW1hZ2VXcmFwcGVyLnNpemUsIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgeyBjb2xvcjogYHJnYigke3JnYi5qb2luKCcsJyl9KWAsIGxpbmVXaWR0aDogMiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYWJlbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGluaXQoaW5wdXRJbWFnZVdyYXBwZXIsIGNvbmZpZykge1xuICAgICAgICBfY29uZmlnID0gY29uZmlnO1xuICAgICAgICBfaW5wdXRJbWFnZVdyYXBwZXIgPSBpbnB1dEltYWdlV3JhcHBlcjtcblxuICAgICAgICBpbml0QnVmZmVycygpO1xuICAgICAgICBpbml0Q2FudmFzKCk7XG4gICAgfSxcblxuICAgIGxvY2F0ZSgpIHtcbiAgICAgICAgaWYgKF9jb25maWcuaGFsZlNhbXBsZSkge1xuICAgICAgICAgICAgaGFsZlNhbXBsZShfaW5wdXRJbWFnZVdyYXBwZXIsIF9jdXJyZW50SW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpbmFyaXplSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgcGF0Y2hlc0ZvdW5kID0gZmluZFBhdGNoZXMoKTtcbiAgICAgICAgLy8gcmV0dXJuIHVubGVzcyA1JSBvciBtb3JlIHBhdGNoZXMgYXJlIGZvdW5kXG4gICAgICAgIGlmIChwYXRjaGVzRm91bmQubGVuZ3RoIDwgX251bVBhdGNoZXMueCAqIF9udW1QYXRjaGVzLnkgKiAwLjA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJhc3RlcnJpemUgYXJlYSBieSBjb21wYXJpbmcgYW5ndWxhciBzaW1pbGFyaXR5O1xuICAgICAgICBjb25zdCBtYXhMYWJlbCA9IHJhc3Rlcml6ZUFuZ3VsYXJTaW1pbGFyaXR5KHBhdGNoZXNGb3VuZCk7XG4gICAgICAgIGlmIChtYXhMYWJlbCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VhcmNoIGZvciBhcmVhIHdpdGggdGhlIG1vc3QgcGF0Y2hlcyAoYmlnZ2VzdCBjb25uZWN0ZWQgYXJlYSlcbiAgICAgICAgY29uc3QgdG9wTGFiZWxzID0gZmluZEJpZ2dlc3RDb25uZWN0ZWRBcmVhcyhtYXhMYWJlbCk7XG4gICAgICAgIGlmICh0b3BMYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJveGVzID0gZmluZEJveGVzKHRvcExhYmVscywgbWF4TGFiZWwpO1xuICAgICAgICByZXR1cm4gYm94ZXM7XG4gICAgfSxcblxuICAgIGNoZWNrSW1hZ2VDb25zdHJhaW50cyhpbnB1dFN0cmVhbSwgY29uZmlnKSB7XG4gICAgICAgIGxldCBwYXRjaFNpemU7XG4gICAgICAgIGxldCB3aWR0aCA9IGlucHV0U3RyZWFtLmdldFdpZHRoKCk7XG4gICAgICAgIGxldCBoZWlnaHQgPSBpbnB1dFN0cmVhbS5nZXRIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgdGhpc0hhbGZTYW1wbGUgPSBjb25maWcuaGFsZlNhbXBsZSA/IDAuNSA6IDE7XG4gICAgICAgIGxldCBhcmVhO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IGJhc2VkIG9uIGFyZWFcbiAgICAgICAgaWYgKGlucHV0U3RyZWFtLmdldENvbmZpZygpLmFyZWEpIHtcbiAgICAgICAgICAgIGFyZWEgPSBjb21wdXRlSW1hZ2VBcmVhKHdpZHRoLCBoZWlnaHQsIGlucHV0U3RyZWFtLmdldENvbmZpZygpLmFyZWEpO1xuICAgICAgICAgICAgaW5wdXRTdHJlYW0uc2V0VG9wUmlnaHQoeyB4OiBhcmVhLnN4LCB5OiBhcmVhLnN5IH0pO1xuICAgICAgICAgICAgaW5wdXRTdHJlYW0uc2V0Q2FudmFzU2l6ZSh7IHg6IHdpZHRoLCB5OiBoZWlnaHQgfSk7XG4gICAgICAgICAgICB3aWR0aCA9IGFyZWEuc3c7XG4gICAgICAgICAgICBoZWlnaHQgPSBhcmVhLnNoO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IHtcbiAgICAgICAgICAgIHg6IE1hdGguZmxvb3Iod2lkdGggKiB0aGlzSGFsZlNhbXBsZSksXG4gICAgICAgICAgICB5OiBNYXRoLmZsb29yKGhlaWdodCAqIHRoaXNIYWxmU2FtcGxlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBwYXRjaFNpemUgPSBjYWxjdWxhdGVQYXRjaFNpemUoY29uZmlnLnBhdGNoU2l6ZSwgc2l6ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnLmRlYnVnPy5zaG93UGF0Y2hTaXplKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGF0Y2gtU2l6ZTogJHtKU09OLnN0cmluZ2lmeShwYXRjaFNpemUpfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRTdHJlYW0uc2V0V2lkdGgoTWF0aC5tYXgoTWF0aC5mbG9vcihNYXRoLmZsb29yKHNpemUueCAvIHBhdGNoU2l6ZS54KSAqICgxIC8gdGhpc0hhbGZTYW1wbGUpICogcGF0Y2hTaXplLngpLCBwYXRjaFNpemUueCkpO1xuICAgICAgICBpbnB1dFN0cmVhbS5zZXRIZWlnaHQoTWF0aC5tYXgoTWF0aC5mbG9vcihNYXRoLmZsb29yKHNpemUueSAvIHBhdGNoU2l6ZS55KSAqICgxIC8gdGhpc0hhbGZTYW1wbGUpICogcGF0Y2hTaXplLnkpLCBwYXRjaFNpemUueSkpO1xuXG4gICAgICAgIGlmICgoaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSAlIHBhdGNoU2l6ZS54KSA9PT0gMCAmJiAoaW5wdXRTdHJlYW0uZ2V0SGVpZ2h0KCkgJSBwYXRjaFNpemUueSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZSBkaW1lbnNpb25zIGRvIG5vdCBjb21wbHkgd2l0aCB0aGUgY3VycmVudCBzZXR0aW5nczogV2lkdGggKCR7XG4gICAgICAgICAgICB3aWR0aH0gKWFuZCBoZWlnaHQgKCR7aGVpZ2h0XG4gICAgICAgIH0pIG11c3QgYSBtdWx0aXBsZSBvZiAke3BhdGNoU2l6ZS54fWApO1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tIFwiLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2FcIjtcbmltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSBcImNvbW1vbi9pbWFnZV93cmFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWFnZ2FDb250ZXh0IHtcbiAgICBwdWJsaWMgY29uZmlnPzogUXVhZ2dhSlNDb25maWdPYmplY3Q7XG5cbiAgICBwdWJsaWMgaW5wdXRTdHJlYW06IGFueTtcblxuICAgIHB1YmxpYyBmcmFtZWdyYWJiZXI6IGFueTtcblxuICAgIHB1YmxpYyBpbnB1dEltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcjtcblxuICAgIHB1YmxpYyBzdG9wcGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCBzdG9wKCkgd2FzIGNhbGxlZCB3aGlsZSBpbml0KCkgd2FzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBoYW5kbGUgcmFjZSBjb25kaXRpb25zIGluIFJlYWN0IFN0cmljdE1vZGUgd2hlcmUgY29tcG9uZW50c1xuICAgICAqIGFyZSBtb3VudGVkL3VubW91bnRlZCByYXBpZGx5LCBjYXVzaW5nIGluaXQoKSB0byBiZSBjYWxsZWQsIHRoZW4gc3RvcCgpLFxuICAgICAqIHRoZW4gaW5pdCgpIGFnYWluIGJlZm9yZSB0aGUgZmlyc3QgaW5pdCgpIGNvbXBsZXRlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdEFib3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBib3hTaXplOiBhbnk7XG5cbiAgICBwdWJsaWMgcmVzdWx0Q29sbGVjdG9yOiBhbnk7XG5cbiAgICBwdWJsaWMgZGVjb2RlcjogYW55O1xuXG4gICAgcHVibGljIHdvcmtlclBvb2w6IGFueVtdID0gW107XG5cbiAgICBwdWJsaWMgb25VSVRocmVhZCA9IHRydWU7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2FudmFzQ29udGFpbmVyID0gbmV3IENhbnZhc0NvbnRhaW5lcigpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2FudmFzSW5mbyB7XG4gICAgaW1hZ2U6IGFueTtcbiAgICBvdmVybGF5OiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBDYW52YXNDb250YWluZXIge1xuICAgIHB1YmxpYyByZWFkb25seSBjdHg6IENhbnZhc0luZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGRvbTogQ2FudmFzSW5mbztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmN0eCA9IG5ldyBDYW52YXNJbmZvKCk7XG4gICAgICAgIHRoaXMuZG9tID0gbmV3IENhbnZhc0luZm8oKTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3UG9ydCh0YXJnZXQ/OiBFbGVtZW50IHwgc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyBhbHJlYWR5IGEgRE9NIGVsZW1lbnRcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0Lm5vZGVOYW1lICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICAvLyBVc2UgJyNpbnRlcmFjdGl2ZS52aWV3cG9ydCcgYXMgYSBmYWxsYmFjayBzZWxlY3RvciAoYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyA/IHRhcmdldCA6ICcjaW50ZXJhY3RpdmUudmlld3BvcnQnO1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbn1cbiIsImltcG9ydCB7IHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEltYWdlV3JhcHBlciBmcm9tICcuLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgdHlwZSB7IElucHV0U3RyZWFtIH0gZnJvbSAnLi4vaW5wdXQvaW5wdXRfc3RyZWFtL2lucHV0X3N0cmVhbS5kJztcbmltcG9ydCBCYXJjb2RlTG9jYXRvciBmcm9tICcuLi9sb2NhdG9yL2JhcmNvZGVfbG9jYXRvcic7XG5cbi8vIFRPRE86IG5lZWQgdHlwZXNjcmlwdCBkZWYgZm9yIEJhcmNvZGVMb2NhdG9yXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0QnVmZmVycyhcbiAgICBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0sXG4gICAgaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIgfCB1bmRlZmluZWQsXG4gICAgbG9jYXRvcjogYW55LFxuKSB7XG4gICAgY29uc3QgaW5wdXRJbWFnZVdyYXBwZXIgPSBpbWFnZVdyYXBwZXIgfHwgbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgIHg6IGlucHV0U3RyZWFtLmdldFdpZHRoKCksXG4gICAgICAgIHk6IGlucHV0U3RyZWFtLmdldEhlaWdodCgpLFxuICAgICAgICB0eXBlOiAnWFlTaXplJyxcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQgJiYgKGxvY2F0b3IgYXMgYW55KS5jb25maWc/LmRlYnVnPy5zaG93SW1hZ2VEZXRhaWxzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBpbWFnZSB3cmFwcGVyIHNpemUgJHtpbnB1dEltYWdlV3JhcHBlci5zaXplfWApO1xuICAgIH1cbiAgICBjb25zdCBib3hTaXplID0gW1xuICAgICAgICB2ZWMyLmNsb25lKFswLCAwXSksXG4gICAgICAgIHZlYzIuY2xvbmUoWzAsIGlucHV0SW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICB2ZWMyLmNsb25lKFtpbnB1dEltYWdlV3JhcHBlci5zaXplLngsIGlucHV0SW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICB2ZWMyLmNsb25lKFtpbnB1dEltYWdlV3JhcHBlci5zaXplLngsIDBdKSxcbiAgICBdO1xuICAgIEJhcmNvZGVMb2NhdG9yLmluaXQoaW5wdXRJbWFnZVdyYXBwZXIsIGxvY2F0b3IpO1xuICAgIHJldHVybiB7IGlucHV0SW1hZ2VXcmFwcGVyLCBib3hTaXplIH07XG59XG4iLCJpbXBvcnQgeyBRdWFnZ2FDb250ZXh0LCBDYW52YXNDb250YWluZXIgfSBmcm9tICdRdWFnZ2FDb250ZXh0JztcbmltcG9ydCBnZXRWaWV3UG9ydCBmcm9tICcuL2dldFZpZXdQb3J0JztcbmltcG9ydCB0eXBlIHsgWFlTaXplIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmZ1bmN0aW9uIGZpbmRPckNyZWF0ZUNhbnZhcyhzZWxlY3Rvcjogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzO1xufVxuXG5mdW5jdGlvbiBnZXRDYW52YXNBbmRDb250ZXh0KHNlbGVjdG9yOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IHdpbGxSZWFkRnJlcXVlbnRseTogYm9vbGVhbjsgZGVidWc/OiBhbnkgfSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGZpbmRPckNyZWF0ZUNhbnZhcyhzZWxlY3RvciwgY2xhc3NOYW1lKTtcbiAgICBpZiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIG9wdGlvbnMuZGVidWc/LnNob3dJbWFnZURldGFpbHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCcqIGluaXRDYW52YXMgZ2V0Q2FudmFzQW5kQ29udGV4dCcpO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IG9wdGlvbnMud2lsbFJlYWRGcmVxdWVudGx5IH0pO1xuICAgIHJldHVybiB7IGNhbnZhcywgY29udGV4dCB9O1xufVxuXG5pbnRlcmZhY2UgSW5pdENhbnZhc2VzT3B0aW9ucyB7XG4gICAgd2lsbFJlYWRGcmVxdWVudGx5OiBib29sZWFuO1xuICAgIGNyZWF0ZU92ZXJsYXk6IGJvb2xlYW47XG4gICAgZGVidWc/OiBhbnk7XG59XG5cbmZ1bmN0aW9uIGluaXRDYW52YXNlcyhjYW52YXNTaXplOiBYWVNpemUsIHsgd2lsbFJlYWRGcmVxdWVudGx5LCBjcmVhdGVPdmVybGF5LCBkZWJ1ZyB9OiBJbml0Q2FudmFzZXNPcHRpb25zKTogQ2FudmFzQ29udGFpbmVyIHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBnZXRDYW52YXNBbmRDb250ZXh0KCdjYW52YXMuaW1nQnVmZmVyJywgJ2ltZ0J1ZmZlcicsIHsgd2lsbFJlYWRGcmVxdWVudGx5LCBkZWJ1ZyB9KTtcbiAgICAgICAgaW1hZ2UuY2FudmFzLndpZHRoID0gY2FudmFzU2l6ZS54O1xuICAgICAgICBpbWFnZS5jYW52YXMuaGVpZ2h0ID0gY2FudmFzU2l6ZS55O1xuXG4gICAgICAgIC8vIE9ubHkgY3JlYXRlIG92ZXJsYXkgY2FudmFzIGlmIGNyZWF0ZU92ZXJsYXkgaXMgdHJ1ZSAoZGVmYXVsdCBiZWhhdmlvcilcbiAgICAgICAgbGV0IG92ZXJsYXk6IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGw7IGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwgfSA9IHtcbiAgICAgICAgICAgIGNhbnZhczogbnVsbCxcbiAgICAgICAgICAgIGNvbnRleHQ6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjcmVhdGVPdmVybGF5KSB7XG4gICAgICAgICAgICBjb25zdCBvdmVybGF5UmVzdWx0ID0gZ2V0Q2FudmFzQW5kQ29udGV4dCgnY2FudmFzLmRyYXdpbmdCdWZmZXInLCAnZHJhd2luZ0J1ZmZlcicsIHsgd2lsbFJlYWRGcmVxdWVudGx5LCBkZWJ1ZyB9KTtcbiAgICAgICAgICAgIG92ZXJsYXlSZXN1bHQuY2FudmFzLndpZHRoID0gY2FudmFzU2l6ZS54O1xuICAgICAgICAgICAgb3ZlcmxheVJlc3VsdC5jYW52YXMuaGVpZ2h0ID0gY2FudmFzU2l6ZS55O1xuICAgICAgICAgICAgb3ZlcmxheSA9IG92ZXJsYXlSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9tOiB7XG4gICAgICAgICAgICAgICAgaW1hZ2U6IGltYWdlLmNhbnZhcyxcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBvdmVybGF5LmNhbnZhcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBpbWFnZTogaW1hZ2UuY29udGV4dCxcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBvdmVybGF5LmNvbnRleHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdENhbnZhcyhjb250ZXh0OiBRdWFnZ2FDb250ZXh0KTogQ2FudmFzQ29udGFpbmVyIHwgbnVsbCB7XG4gICAgY29uc3Qgdmlld3BvcnQgPSBnZXRWaWV3UG9ydChjb250ZXh0Py5jb25maWc/LmlucHV0U3RyZWFtPy50YXJnZXQpO1xuICAgIGNvbnN0IHR5cGUgPSBjb250ZXh0Py5jb25maWc/LmlucHV0U3RyZWFtPy50eXBlO1xuICAgIGlmICghdHlwZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZWZhdWx0IHRvIHRydWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgY3JlYXRlT3ZlcmxheSA9IGNvbnRleHQ/LmNvbmZpZz8uY2FudmFzPy5jcmVhdGVPdmVybGF5ICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGluaXRDYW52YXNlcyhcbiAgICAgICAgY29udGV4dC5pbnB1dFN0cmVhbS5nZXRDYW52YXNTaXplKCksXG4gICAgICAgIHtcbiAgICAgICAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogISFjb250ZXh0Py5jb25maWc/LmlucHV0U3RyZWFtPy53aWxsUmVhZEZyZXF1ZW50bHksXG4gICAgICAgICAgICBjcmVhdGVPdmVybGF5LFxuICAgICAgICAgICAgZGVidWc6IGNvbnRleHQ/LmNvbmZpZz8ubG9jYXRvcj8uZGVidWdcbiAgICAgICAgfVxuICAgICk7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybiB7IGRvbTogeyBpbWFnZTogbnVsbCwgb3ZlcmxheTogbnVsbCB9LCBjdHg6IHsgaW1hZ2U6IG51bGwsIG92ZXJsYXk6IG51bGwgfSB9O1xuXG4gICAgY29uc3QgeyBkb20gfSA9IGNvbnRhaW5lcjtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnSW1hZ2VTdHJlYW0nICYmICF2aWV3cG9ydC5jb250YWlucyhkb20uaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQuYXBwZW5kQ2hpbGQoZG9tLmltYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkb20ub3ZlcmxheSAmJiAhdmlld3BvcnQuY29udGFpbnMoZG9tLm92ZXJsYXkpKSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnQuYXBwZW5kQ2hpbGQoZG9tLm92ZXJsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXI7XG59XG4iLCIvKiBXb3JrZXIgZnVuY3Rpb25zLiBUaGVzZSBhcmUgc3RyYWlnaHQgZnJvbSB0aGUgb3JpZ2luYWwgcXVhZ2dhLmpzIGZpbGUuXG4gKiBOb3QgcHJlc2VudGx5IHVzZWQsIGFzIHdvcmtlciBzdXBwb3J0IGlzIG5vbi1mdW5jdGlvbmFsLiAgS2VlcGluZyB0aGVtIGFyb3VuZCB0ZW1wb3JhcmlseVxuICogdG8gcmVmZXIgdG8gdW50aWwgaXQgaXMgcmUtaW1wbGVtZW50ZWQuIFdlIG1heSBiZSBhYmxlIHRvIGZpeC91c2Ugc29tZSBvZiB0aGlzLlxuICovXG5cbmltcG9ydCB7IFF1YWdnYUpTQ29uZmlnT2JqZWN0LCBRdWFnZ2FKU1JlYWRlckNvbmZpZywgQmFyY29kZVJlYWRlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhXCI7XG5cbi8vIFRPRE86IG5lZWQgYSB0eXBlc2NyaXB0IGludGVyZmFjZSBmb3IgRnJhbWVHcmFiYmVyXG5cbmludGVyZmFjZSBRV29ya2VyVGhyZWFkIHtcbiAgICBpbWFnZURhdGE6IFVpbnQ4QXJyYXk7XG4gICAgYnVzeTogYm9vbGVhbjtcbiAgICB3b3JrZXI6IFdvcmtlcjtcbn1cblxubGV0IHdvcmtlclBvb2w6IEFycmF5PFFXb3JrZXJUaHJlYWQ+ID0gW107XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVXb3JrZXJzKGZyYW1lR3JhYmJlcjogYW55KSB7XG4gICAgbGV0IGF2YWlsYWJsZVdvcmtlcjogUVdvcmtlclRocmVhZDtcbiAgICBpZiAod29ya2VyUG9vbC5sZW5ndGgpIHtcbiAgICAgICAgYXZhaWxhYmxlV29ya2VyID0gd29ya2VyUG9vbC5maWx0ZXIoKHdvcmtlclRocmVhZCkgPT4gIXdvcmtlclRocmVhZC5idXN5KVswXTtcbiAgICAgICAgaWYgKGF2YWlsYWJsZVdvcmtlcikge1xuICAgICAgICAgICAgZnJhbWVHcmFiYmVyLmF0dGFjaERhdGEoYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YSk7XG4gICAgICAgICAgICBpZiAoZnJhbWVHcmFiYmVyLmdyYWIoKSkge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdvcmtlci5idXN5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXb3JrZXIud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgY21kOiAncHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YTogYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YSxcbiAgICAgICAgICAgICAgICB9LCBbYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YS5idWZmZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb25maWdGb3JXb3JrZXIoY29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgICAgIC4uLmNvbmZpZy5pbnB1dFN0cmVhbSxcbiAgICAgICAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyBAdHMtaWdub3JlXG5mdW5jdGlvbiB3b3JrZXJJbnRlcmZhY2UoZmFjdG9yeSkge1xuICAgIGlmIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciBRdWFnZ2EgPSBmYWN0b3J5KCkuZGVmYXVsdDtcbiAgICAgICAgaWYgKCFRdWFnZ2EpIHtcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyAnZXZlbnQnOiAnZXJyb3InLCBtZXNzYWdlOiAnUXVhZ2dhIGNvdWxkIG5vdCBiZSBjcmVhdGVkJyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbi8vIEB0cy1pZ25vcmVcbiAgICB2YXIgaW1hZ2VXcmFwcGVyO1xuXG4vLyBAdHMtaWdub3JlXG4gICAgZnVuY3Rpb24gb25Qcm9jZXNzZWQocmVzdWx0KSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgJ2V2ZW50JzogJ3Byb2Nlc3NlZCcsXG4vLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpbWFnZURhdGE6IGltYWdlV3JhcHBlci5kYXRhLFxuICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQsXG4vLyBAdHMtaWdub3JlXG4gICAgICAgIH0sIFtpbWFnZVdyYXBwZXIuZGF0YS5idWZmZXJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3b3JrZXJJbnRlcmZhY2VSZWFkeSgpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAnZXZlbnQnOiAnaW5pdGlhbGl6ZWQnLFxuLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaW1hZ2VEYXRhOiBpbWFnZVdyYXBwZXIuZGF0YSxcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgfSwgW2ltYWdlV3JhcHBlci5kYXRhLmJ1ZmZlcl0pO1xuICAgIH1cblxuLy8gQHRzLWlnbm9yZVxuICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGUuZGF0YS5jbWQgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGUuZGF0YS5jb25maWc7XG4gICAgICAgICAgICBjb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgICAgIGltYWdlV3JhcHBlciA9IG5ldyBRdWFnZ2EuSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgICAgICAgICB4OiBlLmRhdGEuc2l6ZS54LFxuICAgICAgICAgICAgICAgIHk6IGUuZGF0YS5zaXplLnksXG4gICAgICAgICAgICB9LCBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKSk7XG4gICAgICAgICAgICBRdWFnZ2EuaW5pdChjb25maWcsIHdvcmtlckludGVyZmFjZVJlYWR5LCBpbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgUXVhZ2dhLm9uUHJvY2Vzc2VkKG9uUHJvY2Vzc2VkKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuY21kID09PSAncHJvY2VzcycpIHtcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGltYWdlV3JhcHBlci5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLmltYWdlRGF0YSk7XG4gICAgICAgICAgICBRdWFnZ2Euc3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuY21kID09PSAnc2V0UmVhZGVycycpIHtcbiAgICAgICAgICAgIFF1YWdnYS5zZXRSZWFkZXJzKGUuZGF0YS5yZWFkZXJzKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuY21kID09PSAncmVnaXN0ZXJSZWFkZXInKSB7XG4gICAgICAgICAgICBRdWFnZ2EucmVnaXN0ZXJSZWFkZXIoZS5kYXRhLm5hbWUsIGUuZGF0YS5yZWFkZXIpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZXJCbG9iKCkge1xuICAgIHZhciBibG9iLFxuICAgICAgICBmYWN0b3J5U291cmNlO1xuXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIF9fZmFjdG9yeVNvdXJjZV9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGZhY3RvcnlTb3VyY2UgPSBfX2ZhY3RvcnlTb3VyY2VfXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gICAgYmxvYiA9IG5ldyBCbG9iKFsnKCcgKyB3b3JrZXJJbnRlcmZhY2UudG9TdHJpbmcoKSArICcpKCcgKyBmYWN0b3J5U291cmNlICsgJyk7J10sXG4gICAgICAgIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG5cbiAgICByZXR1cm4gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0V29ya2VyKGNvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3QsIGlucHV0U3RyZWFtOiBhbnksIGNiOiBGdW5jdGlvbikge1xuICAgIGNvbnN0IGJsb2JVUkwgPSBnZW5lcmF0ZVdvcmtlckJsb2IoKTtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKGJsb2JVUkwpO1xuXG4gICAgY29uc3Qgd29ya2VyVGhyZWFkOiBRV29ya2VyVGhyZWFkID0ge1xuICAgICAgICB3b3JrZXIsXG4gICAgICAgIGltYWdlRGF0YTogbmV3IFVpbnQ4QXJyYXkoaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSAqIGlucHV0U3RyZWFtLmdldEhlaWdodCgpKSxcbiAgICAgICAgYnVzeTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgd29ya2VyVGhyZWFkLndvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5kYXRhLmV2ZW50ID09PSAnaW5pdGlhbGl6ZWQnKSB7XG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVUkwpO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV29ya2VyIGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYih3b3JrZXJUaHJlYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ3Byb2Nlc3NlZCcpIHtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBUT0RPOiBob3cgdG8gdGhyZWFkIHB1Ymxpc2hSZXN1bHQgaW50byBoZXJlPyBUeXBlU2NyaXB0IHNheXMgaXQncyBub3QgaGVyZS4gaHR0cHM6Ly9naXRodWIuY29tL2VyaWNibGFkZS9xdWFnZ2EyL2lzc3Vlcy80NjYjaXNzdWVjb21tZW50LTE3MjQyNDgwODAgc2F5cyBpdCdzIG5lY2Vzc2FyeT9cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHVibGlzaFJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcHVibGlzaFJlc3VsdChlLmRhdGEucmVzdWx0LCB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgRU5WICE9PSAndW5kZWZpbmVkJyAmJiBFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV29ya2VyIGVycm9yOiAnICsgZS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHdvcmtlclRocmVhZC53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBjbWQ6ICdpbml0JyxcbiAgICAgICAgc2l6ZTogeyB4OiBpbnB1dFN0cmVhbS5nZXRXaWR0aCgpLCB5OiBpbnB1dFN0cmVhbS5nZXRIZWlnaHQoKSB9LFxuICAgICAgICBpbWFnZURhdGE6IHdvcmtlclRocmVhZC5pbWFnZURhdGEsXG4gICAgICAgIGNvbmZpZzogY29uZmlnRm9yV29ya2VyKGNvbmZpZyksXG4gICAgfSwgW3dvcmtlclRocmVhZC5pbWFnZURhdGEuYnVmZmVyXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGp1c3RXb3JrZXJQb29sKGNhcGFjaXR5OiBudW1iZXIsIGNvbmZpZz86IFF1YWdnYUpTQ29uZmlnT2JqZWN0LCBpbnB1dFN0cmVhbT86IGFueSwgY2I/OiBGdW5jdGlvbikge1xuICAgIGNvbnN0IGluY3JlYXNlQnkgPSBjYXBhY2l0eSAtIHdvcmtlclBvb2wubGVuZ3RoO1xuICAgIGlmIChpbmNyZWFzZUJ5ID09PSAwICYmIGNiKSB7XG4gICAgICAgIGNiKCk7XG4gICAgfSBlbHNlIGlmIChpbmNyZWFzZUJ5IDwgMCkge1xuICAgICAgICBjb25zdCB3b3JrZXJzVG9UZXJtaW5hdGUgPSB3b3JrZXJQb29sLnNsaWNlKGluY3JlYXNlQnkpO1xuICAgICAgICB3b3JrZXJzVG9UZXJtaW5hdGUuZm9yRWFjaChmdW5jdGlvbiAod29ya2VyVGhyZWFkKSB7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQud29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBFTlYgIT09ICd1bmRlZmluZWQnICYmIEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgdGVybWluYXRlZCEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHdvcmtlclBvb2wgPSB3b3JrZXJQb29sLnNsaWNlKDAsIGluY3JlYXNlQnkpO1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3b3JrZXJJbml0aWFsaXplZCA9ICh3b3JrZXJUaHJlYWQ6IFFXb3JrZXJUaHJlYWQpID0+IHtcbiAgICAgICAgICAgIHdvcmtlclBvb2wucHVzaCh3b3JrZXJUaHJlYWQpO1xuICAgICAgICAgICAgaWYgKHdvcmtlclBvb2wubGVuZ3RoID49IGNhcGFjaXR5ICYmIGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluY3JlYXNlQnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGluaXRXb3JrZXIoY29uZmlnLCBpbnB1dFN0cmVhbSwgd29ya2VySW5pdGlhbGl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZGVycyhyZWFkZXJzOiBBcnJheTxRdWFnZ2FKU1JlYWRlckNvbmZpZz4pIHtcbiAgICB3b3JrZXJQb29sLmZvckVhY2goKHdvcmtlclRocmVhZCkgPT4gd29ya2VyVGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7IGNtZDogJ3NldFJlYWRlcnMnLCByZWFkZXJzIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVhZGVyKG5hbWU6IHN0cmluZywgcmVhZGVyOiBCYXJjb2RlUmVhZGVyQ29uc3RydWN0b3IpIHtcbiAgICB3b3JrZXJQb29sLmZvckVhY2goKHdvcmtlclRocmVhZCkgPT4gd29ya2VyVGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7IGNtZDogJ3JlZ2lzdGVyUmVhZGVyJywgbmFtZSwgcmVhZGVyIH0pKTtcbn1cbiIsImltcG9ydCB7IElucHV0U3RyZWFtRmFjdG9yeSB9IGZyb20gJ2lucHV0L2lucHV0X3N0cmVhbS9pbnB1dF9zdHJlYW0uZCc7XG5pbXBvcnQgdHlwZSB7IElucHV0U3RyZWFtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG4vLyBUT0RPOiBuZWVkIHRvIGNyZWF0ZSBhbiBJbnB1dFN0cmVhbSB0eXBlc2NyaXB0IGludGVyZmFjZSwgc28gd2UgZG9uJ3QgaGF2ZSBhbiBcImFueVwiIGluIHRoZSBuZXh0IGxpbmVcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldHVwSW5wdXRTdHJlYW0odHlwZTogSW5wdXRTdHJlYW1UeXBlID0gJ0xpdmVTdHJlYW0nLCB2aWV3cG9ydDogRWxlbWVudCB8IG51bGwsIGlucHV0U3RyZWFtRmFjdG9yeTogSW5wdXRTdHJlYW1GYWN0b3J5KSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ1ZpZGVvU3RyZWFtJzoge1xuICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2aWRlbyxcbiAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW1GYWN0b3J5LmNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW1hZ2VTdHJlYW0nOlxuICAgICAgICAgICAgcmV0dXJuIHsgaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtRmFjdG9yeS5jcmVhdGVJbWFnZVN0cmVhbSgpIH07XG4gICAgICAgIGNhc2UgJ0xpdmVTdHJlYW0nOiB7XG4gICAgICAgICAgICBsZXQgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgIHZpZGVvID0gdmlld3BvcnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZpZGVvKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmlkZW8sXG4gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtRmFjdG9yeS5jcmVhdGVMaXZlU3RyZWFtKHZpZGVvIGFzIEhUTUxWaWRlb0VsZW1lbnQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgKiBzZXR1cElucHV0U3RyZWFtIGludmFsaWQgdHlwZSAke3R5cGV9YCk7XG4gICAgICAgICAgICByZXR1cm4geyB2aWRlbzogbnVsbCwgaW5wdXRTdHJlYW06IG51bGwgfTtcbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuaW1wb3J0IHR5cGUgeyBQb2ludCB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG5leHBvcnQgdHlwZSBCb3ggPSBBcnJheTxbIG51bWJlciwgbnVtYmVyIF0+O1xuXG5leHBvcnQgdHlwZSBMaW5lID0gWyBQb2ludCwgUG9pbnQgXTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVCb3goYm94OiBCb3gsIHhPZmZzZXQ6IG51bWJlciwgeU9mZnNldDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGNvcm5lciA9IGJveC5sZW5ndGg7XG4gICAgd2hpbGUgKGNvcm5lci0tKSB7XG4gICAgICAgIGJveFtjb3JuZXJdWzBdICs9IHhPZmZzZXQ7XG4gICAgICAgIGJveFtjb3JuZXJdWzFdICs9IHlPZmZzZXQ7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW92ZUxpbmUobGluZTogTGluZSwgeE9mZnNldDogbnVtYmVyLCB5T2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsaW5lWzBdLnggKz0geE9mZnNldDtcbiAgICBsaW5lWzBdLnkgKz0geU9mZnNldDtcbiAgICBsaW5lWzFdLnggKz0geE9mZnNldDtcbiAgICBsaW5lWzFdLnkgKz0geU9mZnNldDtcbn1cbiIsImltcG9ydCB7IHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHsgUXVhZ2dhSlNSZXN1bHRPYmplY3QsIFF1YWdnYUpTUmVhZGVyQ29uZmlnLCBCYXJjb2RlUmVhZGVyQ29uc3RydWN0b3IgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcbmltcG9ydCBFdmVudHMgZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgSW1hZ2VXcmFwcGVyIGZyb20gJy4uL2NvbW1vbi9pbWFnZV93cmFwcGVyJztcbmltcG9ydCBCYXJjb2RlRGVjb2RlciBmcm9tICcuLi9kZWNvZGVyL2JhcmNvZGVfZGVjb2Rlcic7XG5pbXBvcnQgQ2FtZXJhQWNjZXNzIGZyb20gJy4uL2lucHV0L2NhbWVyYV9hY2Nlc3MnO1xuaW1wb3J0IEZyYW1lR3JhYmJlciBmcm9tICcuLi9pbnB1dC9mcmFtZV9ncmFiYmVyLmpzJztcbmltcG9ydCBJbnB1dFN0cmVhbSBmcm9tICcuLi9pbnB1dC9pbnB1dF9zdHJlYW0vaW5wdXRfc3RyZWFtJztcbmltcG9ydCBCYXJjb2RlTG9jYXRvciBmcm9tICcuLi9sb2NhdG9yL2JhcmNvZGVfbG9jYXRvcic7XG5pbXBvcnQgeyBRdWFnZ2FDb250ZXh0IH0gZnJvbSAnLi4vUXVhZ2dhQ29udGV4dCc7XG5pbXBvcnQgeyBCYXJjb2RlSW5mbyB9IGZyb20gJy4uL3JlYWRlci9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgX2dldFZpZXdQb3J0IGZyb20gJy4vZ2V0Vmlld1BvcnQnO1xuaW1wb3J0IF9pbml0QnVmZmVycyBmcm9tICcuL2luaXRCdWZmZXJzJztcbmltcG9ydCBfaW5pdENhbnZhcyBmcm9tICcuL2luaXRDYW52YXMnO1xuaW1wb3J0ICogYXMgUVdvcmtlcnMgZnJvbSAnLi9xd29ya2VyJztcbmltcG9ydCBzZXR1cElucHV0U3RyZWFtIGZyb20gJy4vc2V0dXBJbnB1dFN0cmVhbSc7XG5pbXBvcnQgeyBtb3ZlTGluZSwgbW92ZUJveCB9IGZyb20gJy4vdHJhbnNmb3JtJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVhZ2dhIHtcbiAgICBjb250ZXh0OiBRdWFnZ2FDb250ZXh0ID0gbmV3IFF1YWdnYUNvbnRleHQoKTtcblxuICAgIGluaXRCdWZmZXJzKGltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGlucHV0SW1hZ2VXcmFwcGVyLCBib3hTaXplIH0gPSBfaW5pdEJ1ZmZlcnMoXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0sXG4gICAgICAgICAgICBpbWFnZVdyYXBwZXIsXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY29uZmlnLmxvY2F0b3IsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udGV4dC5pbnB1dEltYWdlV3JhcHBlciA9IGlucHV0SW1hZ2VXcmFwcGVyO1xuICAgICAgICB0aGlzLmNvbnRleHQuYm94U2l6ZSA9IGJveFNpemU7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZURhdGEoaW1hZ2VXcmFwcGVyPzogSW1hZ2VXcmFwcGVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LmNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdEJ1ZmZlcnMoaW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmRlY29kZXIgPSBCYXJjb2RlRGVjb2Rlci5jcmVhdGUodGhpcy5jb250ZXh0LmNvbmZpZy5kZWNvZGVyLCB0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXIpO1xuICAgIH1cblxuICAgIGdldFZpZXdQb3J0KCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY29uZmlnIHx8ICF0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHRhcmdldCB9ID0gdGhpcy5jb250ZXh0LmNvbmZpZy5pbnB1dFN0cmVhbTtcbiAgICAgICAgcmV0dXJuIF9nZXRWaWV3UG9ydCh0YXJnZXQpO1xuICAgIH1cblxuICAgIHJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGV4dC5pbnB1dFN0cmVhbS5wbGF5KCk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgaW5pdENhbnZhcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gX2luaXRDYW52YXModGhpcy5jb250ZXh0KTtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGN0eCwgZG9tIH0gPSBjb250YWluZXI7XG4gICAgICAgIHRoaXMuY29udGV4dC5jYW52YXNDb250YWluZXIuZG9tLmltYWdlID0gZG9tLmltYWdlO1xuICAgICAgICB0aGlzLmNvbnRleHQuY2FudmFzQ29udGFpbmVyLmRvbS5vdmVybGF5ID0gZG9tLm92ZXJsYXk7XG4gICAgICAgIHRoaXMuY29udGV4dC5jYW52YXNDb250YWluZXIuY3R4LmltYWdlID0gY3R4LmltYWdlO1xuICAgICAgICB0aGlzLmNvbnRleHQuY2FudmFzQ29udGFpbmVyLmN0eC5vdmVybGF5ID0gY3R4Lm92ZXJsYXk7XG4gICAgfVxuXG4gICAgY2FuUmVjb3JkID0gKGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaW5pdCB3YXMgYWJvcnRlZCAoZS5nLiwgYnkgY2FsbGluZyBzdG9wKCkgZHVyaW5nIGluaXRpYWxpemF0aW9uKVxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gUmVhY3QgU3RyaWN0TW9kZSB3aGVyZSBjb21wb25lbnRzIGFyZSBtb3VudGVkL3VubW91bnRlZCByYXBpZGx5XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5pdEFib3J0ZWQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignSW5pdGlhbGl6YXRpb24gd2FzIGFib3J0ZWQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY29uZmlnKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ0NvbmZpZ3VyYXRpb24gbm90IGluaXRpYWxpemVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIGlucHV0U3RyZWFtIGlzIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ0lucHV0IHN0cmVhbSBub3QgaW5pdGlhbGl6ZWQnKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQmFyY29kZUxvY2F0b3IuY2hlY2tJbWFnZUNvbnN0cmFpbnRzKHRoaXMuY29udGV4dC5pbnB1dFN0cmVhbSwgdGhpcy5jb250ZXh0LmNvbmZpZz8ubG9jYXRvcik7XG4gICAgICAgIHRoaXMuaW5pdENhbnZhcygpO1xuICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyID0gRnJhbWVHcmFiYmVyLmNyZWF0ZShcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbnB1dFN0cmVhbSxcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jYW52YXNDb250YWluZXIuZG9tLmltYWdlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBRV29ya2Vycy5hZGp1c3RXb3JrZXJQb29sKFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmNvbmZpZy5udW1PZldvcmtlcnMsXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY29uZmlnLFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuY29uZmlnPy5udW1PZldvcmtlcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplRGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5KGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIGluaXRJbnB1dFN0cmVhbShjYWxsYmFjazogKGVycj86IEVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LmNvbmZpZyB8fCAhdGhpcy5jb250ZXh0LmNvbmZpZy5pbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdHlwZTogaW5wdXRUeXBlLCBjb25zdHJhaW50cyB9ID0gdGhpcy5jb250ZXh0LmNvbmZpZy5pbnB1dFN0cmVhbTtcbiAgICAgICAgY29uc3QgeyB2aWRlbywgaW5wdXRTdHJlYW0gfSA9IHNldHVwSW5wdXRTdHJlYW0oaW5wdXRUeXBlLCB0aGlzLmdldFZpZXdQb3J0KCksIElucHV0U3RyZWFtKTtcblxuICAgICAgICBpZiAoaW5wdXRUeXBlID09PSAnTGl2ZVN0cmVhbScgJiYgdmlkZW8pIHtcbiAgICAgICAgICAgIENhbWVyYUFjY2Vzcy5yZXF1ZXN0KHZpZGVvLCBjb25zdHJhaW50cylcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBpbnB1dFN0cmVhbS50cmlnZ2VyKCdjYW5yZWNvcmQnKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gY2FsbGJhY2soZXJyKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXRTdHJlYW0pIHtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldEF0dHJpYnV0ZSgncHJlbG9hZCcsICdhdXRvJyk7XG4gICAgICAgICAgICBjb25zdCBzZXRJbnB1dFN0cmVhbVByb21pc2UgPSBpbnB1dFN0cmVhbS5zZXRJbnB1dFN0cmVhbSh0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtKTtcbiAgICAgICAgICAgIGlmIChzZXRJbnB1dFN0cmVhbVByb21pc2UgJiYgdHlwZW9mIHNldElucHV0U3RyZWFtUHJvbWlzZS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHNldElucHV0U3RyZWFtUHJvbWlzZS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVyclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcoKGVyciBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnB1dFN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdjYW5yZWNvcmQnLCB0aGlzLmNhblJlY29yZC5iaW5kKHVuZGVmaW5lZCwgY2FsbGJhY2spKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGV4dC5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtO1xuICAgIH1cblxuICAgIGdldEJvdW5kaW5nQm94ZXMoKTogQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uZmlnPy5sb2NhdGUgPyBCYXJjb2RlTG9jYXRvci5sb2NhdGUoKVxuICAgICAgICAgICAgOiBbW1xuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbMF0pLFxuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbMV0pLFxuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbMl0pLFxuICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUodGhpcy5jb250ZXh0LmJveFNpemVbM10pLFxuICAgICAgICAgICAgXV0gYXMgdW5rbm93biBhcyBBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj47XG4gICAgfVxuXG4gICAgLy8gVE9ETzogbmVlZCBhIHR5cGVzY3JpcHQgdHlwZSBmb3IgcmVzdWx0IGhlcmUuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgICB0cmFuc2Zvcm1SZXN1bHQocmVzdWx0OiBhbnksIHRyYW5zZm9ybWVkQm94ZXM6IFNldDxhbnk+ID0gbmV3IFNldCgpKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvcFJpZ2h0ID0gdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQgPSB0b3BSaWdodC54O1xuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gdG9wUmlnaHQueTtcblxuICAgICAgICBpZiAoeE9mZnNldCA9PT0gMCAmJiB5T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmJhcmNvZGVzKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBCYXJjb2RlSW5mbyBtYXkgbm90IGJlIHRoZSByaWdodCB0eXBlIGhlcmUuXG4gICAgICAgICAgICByZXN1bHQuYmFyY29kZXMuZm9yRWFjaCgoYmFyY29kZTogQmFyY29kZUluZm8pID0+IHRoaXMudHJhbnNmb3JtUmVzdWx0KGJhcmNvZGUsIHRyYW5zZm9ybWVkQm94ZXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGluZSAmJiByZXN1bHQubGluZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIG1vdmVMaW5lKHJlc3VsdC5saW5lLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuYm94ICYmICF0cmFuc2Zvcm1lZEJveGVzLmhhcyhyZXN1bHQuYm94KSkge1xuICAgICAgICAgICAgbW92ZUJveChyZXN1bHQuYm94LCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkQm94ZXMuYWRkKHJlc3VsdC5ib3gpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5ib3hlcyAmJiByZXN1bHQuYm94ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQuYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHRoaXMgYm94IGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNmb3JtZWQgKGVpdGhlciBhcyByZXN1bHQuYm94IG9yIHRocm91Z2ggYmFyY29kZXMpXG4gICAgICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1lZEJveGVzLmhhcyhyZXN1bHQuYm94ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVCb3gocmVzdWx0LmJveGVzW2ldLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRCb3hlcy5hZGQocmVzdWx0LmJveGVzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRSZXN1bHQocmVzdWx0OiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCwgaW1hZ2VEYXRhOiBBcnJheTxudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIGlmICghaW1hZ2VEYXRhIHx8ICF0aGlzLmNvbnRleHQucmVzdWx0Q29sbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgYSBcImJhcmNvZGVzXCIgcmVzdWx0LCBpZiBhbnkuLi5cbiAgICAgICAgaWYgKHJlc3VsdC5iYXJjb2Rlcykge1xuICAgICAgICAgICAgcmVzdWx0LmJhcmNvZGVzLmZpbHRlcigoYmFyY29kZTogUXVhZ2dhSlNSZXN1bHRPYmplY3QpID0+IGJhcmNvZGUuY29kZVJlc3VsdClcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoYmFyY29kZTogUXVhZ2dhSlNSZXN1bHRPYmplY3QpID0+IHRoaXMuYWRkUmVzdWx0KGJhcmNvZGUsIGltYWdlRGF0YSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdWx0Q29sbGVjdG9yLmFkZFJlc3VsdChcbiAgICAgICAgICAgICAgICBpbWFnZURhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKSxcbiAgICAgICAgICAgICAgICByZXN1bHQuY29kZVJlc3VsdCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIGhhc0NvZGVSZXN1bHQocmVzdWx0OiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEocmVzdWx0ICYmIChyZXN1bHQuYmFyY29kZXNcbiAgICAgICAgICAgID8gcmVzdWx0LmJhcmNvZGVzLnNvbWUoKGJhcmNvZGUpID0+IGJhcmNvZGUuY29kZVJlc3VsdClcbiAgICAgICAgICAgIDogcmVzdWx0LmNvZGVSZXN1bHQpKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICAgIHB1Ymxpc2hSZXN1bHQocmVzdWx0OiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCB8IG51bGwgPSBudWxsLCBpbWFnZURhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJlc3VsdFRvUHVibGlzaDogQXJyYXk8UXVhZ2dhSlNSZXN1bHRPYmplY3Q+IHwgUXVhZ2dhSlNSZXN1bHRPYmplY3QgfCBudWxsID0gcmVzdWx0O1xuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgdGhpcy5jb250ZXh0Lm9uVUlUaHJlYWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJlc3VsdChyZXN1bHQsIGltYWdlRGF0YSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXN1bHRUb1B1Ymxpc2ggPSByZXN1bHQ/LmJhcmNvZGVzPy5sZW5ndGggPiAwID8gcmVzdWx0LmJhcmNvZGVzIDogcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgRXZlbnRzLnB1Ymxpc2goJ3Byb2Nlc3NlZCcsIHJlc3VsdFRvUHVibGlzaCBhcyBuZXZlcik7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvZGVSZXN1bHQocmVzdWx0IGFzIFF1YWdnYUpTUmVzdWx0T2JqZWN0KSkge1xuICAgICAgICAgICAgRXZlbnRzLnB1Ymxpc2goJ2RldGVjdGVkJywgcmVzdWx0VG9QdWJsaXNoIGFzIG5ldmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZHJhdyBzY2FubmVyIGFyZWEgZWFjaCBmcmFtZSB3aGVuIGxvY2F0ZSBpcyBmYWxzZSB2aWEgcHVibGljIEFQSS5cbiAgICAgICAgY29uc3QgY2ZnID0gdGhpcy5jb250ZXh0LmNvbmZpZztcbiAgICAgICAgaWYgKGNmZyAmJiBjZmcubG9jYXRlID09PSBmYWxzZSAmJiBjZmcuaW5wdXRTdHJlYW0/LmFyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd1NjYW5uZXJBcmVhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBsb2NhdGVBbmREZWNvZGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJveGVzID0gdGhpcy5nZXRCb3VuZGluZ0JveGVzKCk7XG4gICAgICAgIGlmIChib3hlcykge1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlUmVzdWx0ID0gKGF3YWl0IHRoaXMuY29udGV4dC5kZWNvZGVyLmRlY29kZUZyb21Cb3VuZGluZ0JveGVzKGJveGVzKSkgfHwge307XG4gICAgICAgICAgICBkZWNvZGVSZXN1bHQuYm94ZXMgPSBib3hlcztcbiAgICAgICAgICAgIHRoaXMucHVibGlzaFJlc3VsdChkZWNvZGVSZXN1bHQsIHRoaXMuY29udGV4dC5pbnB1dEltYWdlV3JhcHBlcj8uZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZVJlc3VsdCA9IGF3YWl0IHRoaXMuY29udGV4dC5kZWNvZGVyLmRlY29kZUZyb21JbWFnZSh0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgaWYgKGltYWdlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoUmVzdWx0KGltYWdlUmVzdWx0LCB0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXI/LmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hSZXN1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5vblVJVGhyZWFkKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJzVXBkYXRlZCA9IFFXb3JrZXJzLnVwZGF0ZVdvcmtlcnModGhpcy5jb250ZXh0LmZyYW1lZ3JhYmJlcik7XG4gICAgICAgICAgICBpZiAoIXdvcmtlcnNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZyYW1lZ3JhYmJlci5hdHRhY2hEYXRhKHRoaXMuY29udGV4dC5pbnB1dEltYWdlV3JhcHBlcj8uZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIuZ3JhYigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd29ya2Vyc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRlQW5kRGVjb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyLmF0dGFjaERhdGEodGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyPy5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIuZ3JhYigpO1xuICAgICAgICAgICAgdGhpcy5sb2NhdGVBbmREZWNvZGUoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzdGFydENvbnRpbnVvdXNVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXh0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgLy8gZnJlcXVlbmN5IHNwZWNpZmllcyBhIG1heGltdW0gcmF0ZSwgbm90IGFuIGFic29sdXRlLiBJZiB0aGUgc3lzdGVtIGNhbm5vdFxuICAgICAgICAvLyBhY2hpZXZlIHRoZSByZXF1ZXN0ZWQgZnJlcXVlbmN5LCBzY2FucyB3aWxsIG9jY3VyIGFzIGZhc3QgYXMgcG9zc2libGUuXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gMTAwMCAvICh0aGlzLmNvbnRleHQuY29uZmlnPy5mcmVxdWVuY3kgfHwgNjApO1xuXG4gICAgICAgIHRoaXMuY29udGV4dC5zdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHsgY29udGV4dCB9ID0gdGhpcztcblxuICAgICAgICBjb25zdCBuZXdGcmFtZSA9ICh0aW1lc3RhbXA6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgfHwgdGltZXN0YW1wO1xuICAgICAgICAgICAgaWYgKCFjb250ZXh0LnN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wID49IG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCArPSBkZWxheTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShuZXdGcmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3RnJhbWUocGVyZm9ybWFuY2Uubm93KCkpO1xuICAgIH1cblxuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0Lm9uVUlUaHJlYWQgJiYgdGhpcy5jb250ZXh0LmNvbmZpZz8uaW5wdXRTdHJlYW0/LnR5cGUgPT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbnRpbnVvdXNVcGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRleHQuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIC8vIFNldCBpbml0QWJvcnRlZCBmbGFnIGlmIHN0b3AoKSBpcyBjYWxsZWQgd2hpbGUgaW5pdCgpIGlzIHN0aWxsIGluIHByb2dyZXNzXG4gICAgICAgIC8vIChpLmUuLCBiZWZvcmUgZnJhbWVncmFiYmVyIGlzIGluaXRpYWxpemVkKS4gVGhpcyBwcmV2ZW50cyB0aGUgY2FuUmVjb3JkXG4gICAgICAgIC8vIGNhbGxiYWNrIGZyb20gY29udGludWluZyBhZnRlciBzdG9wKCkgd2FzIGNhbGxlZC5cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5pdEFib3J0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFFXb3JrZXJzLmFkanVzdFdvcmtlclBvb2woMCk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuY29uZmlnPy5pbnB1dFN0cmVhbSAmJiB0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtLnR5cGUgPT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgYXdhaXQgQ2FtZXJhQWNjZXNzLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbnB1dFN0cmVhbT8uY2xlYXJFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRSZWFkZXJzKHJlYWRlcnM6IEFycmF5PFF1YWdnYUpTUmVhZGVyQ29uZmlnPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmRlY29kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kZWNvZGVyLnNldFJlYWRlcnMocmVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgUVdvcmtlcnMuc2V0UmVhZGVycyhyZWFkZXJzKTtcbiAgICB9XG5cbiAgICByZWdpc3RlclJlYWRlcihuYW1lOiBzdHJpbmcsIHJlYWRlcjogQmFyY29kZVJlYWRlckNvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgICAgIEJhcmNvZGVEZWNvZGVyLnJlZ2lzdGVyUmVhZGVyKG5hbWUsIHJlYWRlcik7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuZGVjb2Rlcikge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmRlY29kZXIucmVnaXN0ZXJSZWFkZXIobmFtZSwgcmVhZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBRV29ya2Vycy5yZWdpc3RlclJlYWRlcihuYW1lLCByZWFkZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gZHJhdyBhIHNjYW5uZXIgYXJlYSBvdmVybGF5IHVzaW5nIHRoZSBjdXJyZW50IFF1YWdnYSBpbnN0YW5jZSdzIG92ZXJsYXkgY2FudmFzLlxuICAgICAqIERyYXdzIGJhc2VkIG9uIHRoZSBpbnN0YW5jZSdzIGNvbmZpZ3VyZWQgaW5wdXRTdHJlYW0uYXJlYSwgdXNpbmcgdGhlIGFjdHVhbCBhZGp1c3RlZCBib3hTaXplXG4gICAgICogdG8gbWF0Y2ggdGhlIHJlYWwgc2Nhbm5pbmcgYXJlYSBhZnRlciBwYXRjaCBhbGlnbm1lbnQuXG4gICAgICogT25seSBkcmF3cyB3aGVuIGxvY2F0ZSBpcyBmYWxzZSBhbmQgYW4gYXJlYSBpcyBjb25maWd1cmVkIHdpdGggc3R5bGluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWNoZWRTdHlsZVZhbHVlcz86IHsgYm9yZGVyQ29sb3I/OiBzdHJpbmc7IGJvcmRlcldpZHRoPzogbnVtYmVyOyBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmcgfTtcbiAgICBwcml2YXRlIF9yZXNvbHZlZFN0eWxlPzogeyBjb2xvcjogc3RyaW5nOyB3aWR0aDogbnVtYmVyOyBiZz86IHN0cmluZyB9O1xuICAgIGRyYXdTY2FubmVyQXJlYSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuY29udGV4dC5jb25maWc/LmlucHV0U3RyZWFtPy5hcmVhO1xuICAgICAgICBpZiAoIWFyZWEpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3ZlcmxheUN0eCA9IHRoaXMuY29udGV4dC5jYW52YXNDb250YWluZXIuY3R4Lm92ZXJsYXk7XG4gICAgICAgIGlmICghb3ZlcmxheUN0eCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE9ubHkgZHJhdyB3aGVuIGxvY2F0ZSBpcyBmYWxzZVxuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNvbmZpZz8ubG9jYXRlICE9PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFF1aWNrIGNoZWNrcyBmb3IgdmlzdWFsaXphdGlvbiBwcmVzZW5jZVxuICAgICAgICBjb25zdCBoYXNBbnlTdHlsZSA9IChhcmVhLmJvcmRlckNvbG9yICE9PSB1bmRlZmluZWQgJiYgYXJlYS5ib3JkZXJDb2xvciAhPT0gJycpXG4gICAgICAgICAgICB8fCAoYXJlYS5ib3JkZXJXaWR0aCAhPT0gdW5kZWZpbmVkICYmIGFyZWEuYm9yZGVyV2lkdGggPiAwKVxuICAgICAgICAgICAgfHwgKGFyZWEuYmFja2dyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgJiYgYXJlYS5iYWNrZ3JvdW5kQ29sb3IgIT09ICcnKTtcbiAgICAgICAgaWYgKCFoYXNBbnlTdHlsZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFdoZW4gbG9jYXRlIGlzIGZhbHNlLCB1c2UgdGhlIGFjdHVhbCBhZGp1c3RlZCBib3hTaXplIHRoYXQgbWF0Y2hlcyB0aGUgc2Nhbm5pbmcgYXJlYVxuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5ib3hTaXplKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2V0IHRoZSBvZmZzZXQgZm9yIHRoZSBjb25zdHJhaW5lZCBhcmVhXG4gICAgICAgIGNvbnN0IHRvcFJpZ2h0T2Zmc2V0ID0gdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCk7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSB0b3BSaWdodE9mZnNldC54O1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gdG9wUmlnaHRPZmZzZXQueTtcblxuICAgICAgICBjb25zdCBib3ggPSB0aGlzLmNvbnRleHQuYm94U2l6ZTtcbiAgICAgICAgY29uc3QgdG9wTGVmdCA9IGJveFswXTtcbiAgICAgICAgY29uc3QgYm90dG9tTGVmdCA9IGJveFsxXTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHQgPSBib3hbM107XG5cbiAgICAgICAgLy8gQWRkIHRoZSBvZmZzZXQgdG8gcG9zaXRpb24gY29ycmVjdGx5IG9uIGNhbnZhc1xuICAgICAgICBjb25zdCB4ID0gdG9wTGVmdFswXSArIG9mZnNldFg7XG4gICAgICAgIGNvbnN0IHkgPSB0b3BMZWZ0WzFdICsgb2Zmc2V0WTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0b3BSaWdodFswXSAtIHRvcExlZnRbMF07XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbUxlZnRbMV0gLSB0b3BMZWZ0WzFdO1xuICAgICAgICBjb25zdCBzdHlsZUNoYW5nZWQgPSAhdGhpcy5fY2FjaGVkU3R5bGVWYWx1ZXNcbiAgICAgICAgICAgIHx8IHRoaXMuX2NhY2hlZFN0eWxlVmFsdWVzLmJvcmRlckNvbG9yICE9PSBhcmVhLmJvcmRlckNvbG9yXG4gICAgICAgICAgICB8fCB0aGlzLl9jYWNoZWRTdHlsZVZhbHVlcy5ib3JkZXJXaWR0aCAhPT0gYXJlYS5ib3JkZXJXaWR0aFxuICAgICAgICAgICAgfHwgdGhpcy5fY2FjaGVkU3R5bGVWYWx1ZXMuYmFja2dyb3VuZENvbG9yICE9PSBhcmVhLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgaWYgKHN0eWxlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGVkU3R5bGVWYWx1ZXMgPSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGFyZWEuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGFyZWEuYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBhcmVhLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzaG91bGREcmF3Qm9yZGVyID0gYXJlYS5ib3JkZXJDb2xvciAhPT0gdW5kZWZpbmVkIHx8IGFyZWEuYm9yZGVyV2lkdGggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gYXJlYS5ib3JkZXJDb2xvciA/PyAncmdiYSgwLCAyNTUsIDAsIDAuNSknO1xuICAgICAgICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSBzaG91bGREcmF3Qm9yZGVyID8gKGFyZWEuYm9yZGVyV2lkdGggPz8gMikgOiAwO1xuICAgICAgICAgICAgY29uc3QgYmcgPSBhcmVhLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVkU3R5bGUgPSB7IGNvbG9yLCB3aWR0aDogYm9yZGVyV2lkdGgsIGJnIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMuX3Jlc29sdmVkU3R5bGUhO1xuICAgICAgICBpZiAoc3R5bGUuYmcpIHtcbiAgICAgICAgICAgIG92ZXJsYXlDdHguZmlsbFN0eWxlID0gc3R5bGUuYmc7XG4gICAgICAgICAgICBvdmVybGF5Q3R4LmZpbGxSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHlsZS53aWR0aCA+IDApIHtcbiAgICAgICAgICAgIG92ZXJsYXlDdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgICAgICAgIG92ZXJsYXlDdHgubGluZVdpZHRoID0gc3R5bGUud2lkdGg7XG4gICAgICAgICAgICBvdmVybGF5Q3R4LnN0cm9rZVJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL21lcmdlJztcbmltcG9ydCBUeXBlRGVmcyBmcm9tICcuL2NvbW1vbi90eXBlZGVmcyc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbmltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSAnLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgQmFyY29kZURlY29kZXIgZnJvbSAnLi9kZWNvZGVyL2JhcmNvZGVfZGVjb2Rlcic7XG5pbXBvcnQgKiBhcyBSZWFkZXJzIGZyb20gJy4vcmVhZGVyL2luZGV4JztcbmltcG9ydCBFdmVudHMgZnJvbSAnLi9jb21tb24vZXZlbnRzJztcbmltcG9ydCBDYW1lcmFBY2Nlc3MgZnJvbSAnLi9pbnB1dC9jYW1lcmFfYWNjZXNzJztcbmltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4vY29tbW9uL2ltYWdlX2RlYnVnJztcbmltcG9ydCBSZXN1bHRDb2xsZWN0b3IgZnJvbSAnLi9hbmFseXRpY3MvcmVzdWx0X2NvbGxlY3Rvcic7XG5pbXBvcnQgQ29uZmlnIGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XG5cbmltcG9ydCBRdWFnZ2EgZnJvbSAnLi9xdWFnZ2EvcXVhZ2dhJztcblxuY29uc3QgaW5zdGFuY2UgPSBuZXcgUXVhZ2dhKCk7XG5jb25zdCBfY29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG5cbmNvbnN0IFF1YWdnYUpTU3RhdGljSW50ZXJmYWNlID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChjb25maWcsIGNiLCBpbWFnZVdyYXBwZXIsIHF1YWdnYUluc3RhbmNlID0gaW5zdGFuY2UpIHtcbiAgICAgICAgbGV0IHByb21pc2U7XG4gICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2IgPSAoZXJyKSA9PiB7IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpOyB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzZXQgdGhlIGluaXRBYm9ydGVkIGZsYWcgd2hlbiBzdGFydGluZyBhIG5ldyBpbml0XG4gICAgICAgIHF1YWdnYUluc3RhbmNlLmNvbnRleHQuaW5pdEFib3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgcXVhZ2dhSW5zdGFuY2UuY29udGV4dC5jb25maWcgPSBtZXJnZSh7fSwgQ29uZmlnLCBjb25maWcpO1xuICAgICAgICAvLyBUT0RPICMxNzk6IHBlbmRpbmcgcmVzdHJ1Y3R1cmUgaW4gSXNzdWUgIzE3OSwgd2UgYXJlIHRlbXAgZGlzYWJsaW5nIHdvcmtlcnNcbiAgICAgICAgaWYgKHF1YWdnYUluc3RhbmNlLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyA+IDApIHtcbiAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGltYWdlV3JhcHBlcikge1xuICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2UuY29udGV4dC5vblVJVGhyZWFkID0gZmFsc2U7XG4gICAgICAgICAgICBxdWFnZ2FJbnN0YW5jZS5pbml0aWFsaXplRGF0YShpbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLmluaXRJbnB1dFN0cmVhbShjYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24gKGNvbmZpZywgY2IpIHtcbiAgICAgICAgLy8gSWYgY29uZmlnIGlzIHByb3ZpZGVkLCBjYWxsIGluaXQoKSB0aGVuIHN0YXJ0KClcbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgbGV0IHByb21pc2U7XG4gICAgICAgICAgICBpZiAoIWNiKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2IgPSAoZXJyKSA9PiB7IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpOyB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbml0KGNvbmZpZywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5zdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0YXJ0RXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKHN0YXJ0RXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGluaXQoKSBoYXNuJ3QgYmVlbiBjb21wbGV0ZWQsIHRocm93IGFuIGVycm9yXG4gICAgICAgIGlmICghX2NvbnRleHQuZnJhbWVncmFiYmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0KCkgd2FzIGNhbGxlZCBiZWZvcmUgaW5pdCgpIGNvbXBsZXRlZC4gJ1xuICAgICAgICAgICAgICAgICsgJ0NhbGwgaW5pdCgpIGZpcnN0LCBvciBjYWxsIHN0YXJ0KGNvbmZpZykgdG8gY29tYmluZSBpbml0IGFuZCBzdGFydC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc3RhcnQoKTtcbiAgICB9LFxuICAgIHN0b3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnN0b3AoKTtcbiAgICB9LFxuICAgIHBhdXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9jb250ZXh0LnN0b3BwZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgb25EZXRlY3RlZDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghY2FsbGJhY2sgfHwgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJyAmJiAodHlwZW9mIGNhbGxiYWNrICE9PSAnb2JqZWN0JyB8fCAhY2FsbGJhY2suY2FsbGJhY2spKSkge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgnKiB3YXJuaW5nOiBRdWFnZ2Eub25EZXRlY3RlZCBjYWxsZWQgd2l0aCBpbnZhbGlkIGNhbGxiYWNrLCBpZ25vcmluZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEV2ZW50cy5zdWJzY3JpYmUoJ2RldGVjdGVkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb2ZmRGV0ZWN0ZWQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBFdmVudHMudW5zdWJzY3JpYmUoJ2RldGVjdGVkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb25Qcm9jZXNzZWQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNhbGxiYWNrIHx8ICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ29iamVjdCcgfHwgIWNhbGxiYWNrLmNhbGxiYWNrKSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJyogd2FybmluZzogUXVhZ2dhLm9uUHJvY2Vzc2VkIGNhbGxlZCB3aXRoIGludmFsaWQgY2FsbGJhY2ssIGlnbm9yaW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgRXZlbnRzLnN1YnNjcmliZSgncHJvY2Vzc2VkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb2ZmUHJvY2Vzc2VkOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgRXZlbnRzLnVuc3Vic2NyaWJlKCdwcm9jZXNzZWQnLCBjYWxsYmFjayk7XG4gICAgfSxcbiAgICBzZXRSZWFkZXJzOiBmdW5jdGlvbiAocmVhZGVycykge1xuICAgICAgICBpZiAoIXJlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJyogd2FybmluZzogUXVhZ2dhLnNldFJlYWRlcnMgY2FsbGVkIHdpdGggbm8gcmVhZGVycywgaWdub3JpbmcnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5zZXRSZWFkZXJzKHJlYWRlcnMpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJSZWFkZXI6IGZ1bmN0aW9uIChuYW1lLCByZWFkZXIpIHtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCcqIHdhcm5pbmc6IFF1YWdnYS5yZWdpc3RlclJlYWRlciBjYWxsZWQgd2l0aCBubyBuYW1lLCBpZ25vcmluZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZGVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCcqIHdhcm5pbmc6IFF1YWdnYS5yZWdpc3RlclJlYWRlciBjYWxsZWQgd2l0aCBubyByZWFkZXIsIGlnbm9yaW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UucmVnaXN0ZXJSZWFkZXIobmFtZSwgcmVhZGVyKTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyUmVzdWx0Q29sbGVjdG9yOiBmdW5jdGlvbiAocmVzdWx0Q29sbGVjdG9yKSB7XG4gICAgICAgIGlmIChyZXN1bHRDb2xsZWN0b3IgJiYgdHlwZW9mIHJlc3VsdENvbGxlY3Rvci5hZGRSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9jb250ZXh0LnJlc3VsdENvbGxlY3RvciA9IHJlc3VsdENvbGxlY3RvcjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZ2V0IGNhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIF9jb250ZXh0LmNhbnZhc0NvbnRhaW5lcjtcbiAgICB9LFxuICAgIGRyYXdTY2FubmVyQXJlYTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UuZHJhd1NjYW5uZXJBcmVhKCk7XG4gICAgfSxcbiAgICBkZWNvZGVTaW5nbGU6IGZ1bmN0aW9uIChjb25maWcsIHJlc3VsdENhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHF1YWdnYUluc3RhbmNlID0gbmV3IFF1YWdnYSgpO1xuICAgICAgICBjb25maWcgPSBtZXJnZSh7XG4gICAgICAgICAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdJbWFnZVN0cmVhbScsXG4gICAgICAgICAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNpemU6IDgwMCxcbiAgICAgICAgICAgICAgICBzcmM6IGNvbmZpZy5zcmMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVtT2ZXb3JrZXJzOiAodHlwZW9mIEVOViAhPT0gJ3VuZGVmaW5lZCcgJiYgRU5WLmRldmVsb3BtZW50ICYmIGNvbmZpZy5kZWJ1ZykgPyAwIDogMSxcbiAgICAgICAgICAgIGxvY2F0b3I6IHtcbiAgICAgICAgICAgICAgICBoYWxmU2FtcGxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sIGNvbmZpZyk7XG4gICAgICAgIC8vIFRPRE8gIzE3NTogcmVzdHJ1Y3R1cmUgd29ya2VyIHN1cHBvcnQgc28gdGhhdCBpdCB3aWxsIHdvcmsgd2l0aCB0eXBlc2NyaXB0IHVzaW5nIHdvcmtlci1sb2FkZXJcbiAgICAgICAgLy8gaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9sb2FkZXJzL3dvcmtlci1sb2FkZXIvXG4gICAgICAgIGlmIChjb25maWcubnVtT2ZXb3JrZXJzID4gMCkge1xuICAgICAgICAgICAgY29uZmlnLm51bU9mV29ya2VycyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd29ya2VycyByZXF1aXJlIFdvcmtlciBhbmQgQmxvYiBzdXBwb3J0IHByZXNlbnRseSwgc28gaWYgbm8gQmxvYiBvciBXb3JrZXIgdGhlbiBzZXRcbiAgICAgICAgLy8gd29ya2VycyB0byAwLlxuICAgICAgICBpZiAoY29uZmlnLm51bU9mV29ya2VycyA+IDAgJiYgKHR5cGVvZiBCbG9iID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgV29ya2VyID09PSAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBubyBXb3JrZXIgYW5kL29yIEJsb2Igc3VwcG9ydCAtIGZvcmNpbmcgbnVtT2ZXb3JrZXJzIHRvIDAnKTtcbiAgICAgICAgICAgIGNvbmZpZy5udW1PZldvcmtlcnMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdChjb25maWcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3luYyB0aGUgZGVjb2RlU2luZ2xlIGluc3RhbmNlJ3MgY2FudmFzIHRvIHRoZSBnbG9iYWwgX2NvbnRleHQgc28gUXVhZ2dhLmNhbnZhcyB3b3Jrc1xuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5jYW52YXNDb250YWluZXIgPSBxdWFnZ2FJbnN0YW5jZS5jb250ZXh0LmNhbnZhc0NvbnRhaW5lcjtcblxuICAgICAgICAgICAgICAgICAgICBFdmVudHMub25jZSgncHJvY2Vzc2VkJywgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2Uuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2suY2FsbChudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2Uuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9LCBudWxsLCBxdWFnZ2FJbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBhZGQgdGhlIHVzdWFsbHkgZXhwZWN0ZWQgXCJkZWZhdWx0XCIgZm9yIHVzZSB3aXRoIHJlcXVpcmUsIGJ1aWxkIHN0ZXAgd29uJ3QgYWxsb3cgdXMgdG9cbiAgICAvLyB3cml0ZSB0byBtb2R1bGUuZXhwb3J0cyBzbyBkbyBpdCBoZXJlLlxuICAgIGdldCBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gUXVhZ2dhSlNTdGF0aWNJbnRlcmZhY2U7XG4gICAgfSxcbiAgICBSZWFkZXJzLFxuICAgIENhbWVyYUFjY2VzcyxcbiAgICBJbWFnZURlYnVnLFxuICAgIEltYWdlV3JhcHBlcixcbiAgICBSZXN1bHRDb2xsZWN0b3IsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBRdWFnZ2FKU1N0YXRpY0ludGVyZmFjZTtcbi8vIGV4cG9ydCBCYXJjb2RlUmVhZGVyIGFuZCBvdGhlciB1dGlsaXRpZXMgZm9yIGV4dGVybmFsIHBsdWdpbnNcbmV4cG9ydCB7XG4gICAgQmFyY29kZURlY29kZXIsXG4gICAgUmVhZGVycyxcbiAgICBDYW1lcmFBY2Nlc3MsXG4gICAgSW1hZ2VEZWJ1ZyxcbiAgICBJbWFnZVdyYXBwZXIsXG4gICAgUmVzdWx0Q29sbGVjdG9yLFxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=