(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 = 67); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var toPropertyKey = __webpack_require__(52); 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__(52); 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__(140); 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__(32); 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__(136)(); 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) { /** * 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; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { var superPropBase = __webpack_require__(141); 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; /***/ }), /* 11 */ /***/ (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; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { var baseMerge = __webpack_require__(68), createAssigner = __webpack_require__(124); /** * 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; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { var freeGlobal = __webpack_require__(36); /** 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; /***/ }), /* 14 */ /***/ (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; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19), getRawTag = __webpack_require__(82), objectToString = __webpack_require__(83); /** `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; /***/ }), /* 16 */ /***/ (function(module, exports, __webpack_require__) { var listCacheClear = __webpack_require__(70), listCacheDelete = __webpack_require__(71), listCacheGet = __webpack_require__(72), listCacheHas = __webpack_require__(73), listCacheSet = __webpack_require__(74); /** * 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; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { var eq = __webpack_require__(18); /** * 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; /***/ }), /* 18 */ /***/ (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; /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(13); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; /***/ }), /* 20 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(26); /* Built-in method references that are verified to be native. */ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; /***/ }), /* 21 */ /***/ (function(module, exports, __webpack_require__) { var isKeyable = __webpack_require__(96); /** * 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; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { var baseIsArguments = __webpack_require__(111), isObjectLike = __webpack_require__(14); /** 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; /***/ }), /* 23 */ /***/ (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; /***/ }), /* 24 */ /***/ (function(module, exports, __webpack_require__) { var isArray = __webpack_require__(11), isKey = __webpack_require__(148), stringToPath = __webpack_require__(149), toString = __webpack_require__(152); /** * 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; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { var arrayWithoutHoles = __webpack_require__(142); var iterableToArray = __webpack_require__(143); var unsupportedIterableToArray = __webpack_require__(50); var nonIterableSpread = __webpack_require__(144); function _toConsumableArray(r) { return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread(); } module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 26 */ /***/ (function(module, exports, __webpack_require__) { var baseIsNative = __webpack_require__(80), getValue = __webpack_require__(87); /** * 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; /***/ }), /* 27 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(15), isObject = __webpack_require__(9); /** `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; /***/ }), /* 28 */ /***/ (function(module, exports, __webpack_require__) { var defineProperty = __webpack_require__(39); /** * 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; /***/ }), /* 29 */ /***/ (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; }; /***/ }), /* 30 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(27), isLength = __webpack_require__(31); /** * 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; /***/ }), /* 31 */ /***/ (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; /***/ }), /* 32 */ /***/ (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; /***/ }), /* 33 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(15), isObjectLike = __webpack_require__(14); /** `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; /***/ }), /* 34 */ /***/ (function(module, exports, __webpack_require__) { var isSymbol = __webpack_require__(33); /** 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; /***/ }), /* 35 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(26), root = __webpack_require__(13); /* Built-in method references that are verified to be native. */ var Map = getNative(root, 'Map'); module.exports = Map; /***/ }), /* 36 */ /***/ (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__(81))) /***/ }), /* 37 */ /***/ (function(module, exports, __webpack_require__) { var mapCacheClear = __webpack_require__(88), mapCacheDelete = __webpack_require__(95), mapCacheGet = __webpack_require__(97), mapCacheHas = __webpack_require__(98), mapCacheSet = __webpack_require__(99); /** * 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; /***/ }), /* 38 */ /***/ (function(module, exports, __webpack_require__) { var baseAssignValue = __webpack_require__(28), eq = __webpack_require__(18); /** * 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; /***/ }), /* 39 */ /***/ (function(module, exports, __webpack_require__) { var getNative = __webpack_require__(26); var defineProperty = (function() { try { var func = getNative(Object, 'defineProperty'); func({}, '', {}); return func; } catch (e) {} }()); module.exports = defineProperty; /***/ }), /* 40 */ /***/ (function(module, exports, __webpack_require__) { var overArg = __webpack_require__(110); /** Built-in value references. */ var getPrototype = overArg(Object.getPrototypeOf, Object); module.exports = getPrototype; /***/ }), /* 41 */ /***/ (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; /***/ }), /* 42 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(13), stubFalse = __webpack_require__(113); /** 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__(29)(module))) /***/ }), /* 43 */ /***/ (function(module, exports, __webpack_require__) { var baseIsTypedArray = __webpack_require__(115), baseUnary = __webpack_require__(116), nodeUtil = __webpack_require__(117); /* 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; /***/ }), /* 44 */ /***/ (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; /***/ }), /* 45 */ /***/ (function(module, exports, __webpack_require__) { var baseAssignValue = __webpack_require__(28), eq = __webpack_require__(18); /** 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; /***/ }), /* 46 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeKeys = __webpack_require__(120), baseKeysIn = __webpack_require__(122), isArrayLike = __webpack_require__(30); /** * 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; /***/ }), /* 47 */ /***/ (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; /***/ }), /* 48 */ /***/ (function(module, exports, __webpack_require__) { var apply = __webpack_require__(126); /* 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; /***/ }), /* 49 */ /***/ (function(module, exports, __webpack_require__) { var baseSetToString = __webpack_require__(127), shortOut = __webpack_require__(129); /** * 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; /***/ }), /* 50 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeToArray = __webpack_require__(51); 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; /***/ }), /* 51 */ /***/ (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; /***/ }), /* 52 */ /***/ (function(module, exports, __webpack_require__) { var _typeof = __webpack_require__(8)["default"]; var toPrimitive = __webpack_require__(135); 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; /***/ }), /* 53 */ /***/ (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; /***/ }), /* 54 */ /***/ (function(module, exports, __webpack_require__) { var regeneratorDefine = __webpack_require__(55); 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; /***/ }), /* 55 */ /***/ (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; /***/ }), /* 56 */ /***/ (function(module, exports, __webpack_require__) { var regenerator = __webpack_require__(54); var regeneratorAsyncIterator = __webpack_require__(57); 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; /***/ }), /* 57 */ /***/ (function(module, exports, __webpack_require__) { var OverloadYield = __webpack_require__(53); var regeneratorDefine = __webpack_require__(55); 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; /***/ }), /* 58 */ /***/ (function(module, exports, __webpack_require__) { var arrayWithHoles = __webpack_require__(132); var iterableToArrayLimit = __webpack_require__(133); var unsupportedIterableToArray = __webpack_require__(50); var nonIterableRest = __webpack_require__(134); 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; /***/ }), /* 59 */ /***/ (function(module, exports, __webpack_require__) { var basePick = __webpack_require__(145), flatRest = __webpack_require__(159); /** * Creates an object composed of the picked `object` properties. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The source object. * @param {...(string|string[])} [paths] The property paths to pick. * @returns {Object} Returns the new object. * @example * * var object = { 'a': 1, 'b': '2', 'c': 3 }; * * _.pick(object, ['a', 'c']); * // => { 'a': 1, 'c': 3 } */ var pick = flatRest(function(object, paths) { return object == null ? {} : basePick(object, paths); }); module.exports = pick; /***/ }), /* 60 */ /***/ (function(module, exports, __webpack_require__) { var getPrototypeOf = __webpack_require__(1); var setPrototypeOf = __webpack_require__(32); var isNativeFunction = __webpack_require__(164); var construct = __webpack_require__(165); 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; /***/ }), /* 61 */, /* 62 */, /* 63 */, /* 64 */, /* 65 */, /* 66 */, /* 67 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(167); /***/ }), /* 68 */ /***/ (function(module, exports, __webpack_require__) { var Stack = __webpack_require__(69), assignMergeValue = __webpack_require__(38), baseFor = __webpack_require__(100), baseMergeDeep = __webpack_require__(102), isObject = __webpack_require__(9), keysIn = __webpack_require__(46), safeGet = __webpack_require__(44); /** * 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; /***/ }), /* 69 */ /***/ (function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(16), stackClear = __webpack_require__(75), stackDelete = __webpack_require__(76), stackGet = __webpack_require__(77), stackHas = __webpack_require__(78), stackSet = __webpack_require__(79); /** * 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; /***/ }), /* 70 */ /***/ (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; /***/ }), /* 71 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(17); /** 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; /***/ }), /* 72 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(17); /** * 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; /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(17); /** * 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; /***/ }), /* 74 */ /***/ (function(module, exports, __webpack_require__) { var assocIndexOf = __webpack_require__(17); /** * 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; /***/ }), /* 75 */ /***/ (function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(16); /** * 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; /***/ }), /* 76 */ /***/ (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; /***/ }), /* 77 */ /***/ (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; /***/ }), /* 78 */ /***/ (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; /***/ }), /* 79 */ /***/ (function(module, exports, __webpack_require__) { var ListCache = __webpack_require__(16), Map = __webpack_require__(35), MapCache = __webpack_require__(37); /** 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; /***/ }), /* 80 */ /***/ (function(module, exports, __webpack_require__) { var isFunction = __webpack_require__(27), isMasked = __webpack_require__(84), isObject = __webpack_require__(9), toSource = __webpack_require__(86); /** * 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; /***/ }), /* 81 */ /***/ (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; /***/ }), /* 82 */ /***/ (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; /***/ }), /* 83 */ /***/ (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; /***/ }), /* 84 */ /***/ (function(module, exports, __webpack_require__) { var coreJsData = __webpack_require__(85); /** 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; /***/ }), /* 85 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(13); /** Used to detect overreaching core-js shims. */ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; /***/ }), /* 86 */ /***/ (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; /***/ }), /* 87 */ /***/ (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; /***/ }), /* 88 */ /***/ (function(module, exports, __webpack_require__) { var Hash = __webpack_require__(89), ListCache = __webpack_require__(16), Map = __webpack_require__(35); /** * 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; /***/ }), /* 89 */ /***/ (function(module, exports, __webpack_require__) { var hashClear = __webpack_require__(90), hashDelete = __webpack_require__(91), hashGet = __webpack_require__(92), hashHas = __webpack_require__(93), hashSet = __webpack_require__(94); /** * 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; /***/ }), /* 90 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(20); /** * 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; /***/ }), /* 91 */ /***/ (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; /***/ }), /* 92 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(20); /** 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; /***/ }), /* 93 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(20); /** 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; /***/ }), /* 94 */ /***/ (function(module, exports, __webpack_require__) { var nativeCreate = __webpack_require__(20); /** 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; /***/ }), /* 95 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(21); /** * 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; /***/ }), /* 96 */ /***/ (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; /***/ }), /* 97 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(21); /** * 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; /***/ }), /* 98 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(21); /** * 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; /***/ }), /* 99 */ /***/ (function(module, exports, __webpack_require__) { var getMapData = __webpack_require__(21); /** * 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; /***/ }), /* 100 */ /***/ (function(module, exports, __webpack_require__) { var createBaseFor = __webpack_require__(101); /** * 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; /***/ }), /* 101 */ /***/ (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; /***/ }), /* 102 */ /***/ (function(module, exports, __webpack_require__) { var assignMergeValue = __webpack_require__(38), cloneBuffer = __webpack_require__(103), cloneTypedArray = __webpack_require__(104), copyArray = __webpack_require__(107), initCloneObject = __webpack_require__(108), isArguments = __webpack_require__(22), isArray = __webpack_require__(11), isArrayLikeObject = __webpack_require__(112), isBuffer = __webpack_require__(42), isFunction = __webpack_require__(27), isObject = __webpack_require__(9), isPlainObject = __webpack_require__(114), isTypedArray = __webpack_require__(43), safeGet = __webpack_require__(44), toPlainObject = __webpack_require__(118); /** * 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; /***/ }), /* 103 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(13); /** 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__(29)(module))) /***/ }), /* 104 */ /***/ (function(module, exports, __webpack_require__) { var cloneArrayBuffer = __webpack_require__(105); /** * 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; /***/ }), /* 105 */ /***/ (function(module, exports, __webpack_require__) { var Uint8Array = __webpack_require__(106); /** * 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; /***/ }), /* 106 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(13); /** Built-in value references. */ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; /***/ }), /* 107 */ /***/ (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; /***/ }), /* 108 */ /***/ (function(module, exports, __webpack_require__) { var baseCreate = __webpack_require__(109), getPrototype = __webpack_require__(40), isPrototype = __webpack_require__(41); /** * 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; /***/ }), /* 109 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(9); /** 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; /***/ }), /* 110 */ /***/ (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; /***/ }), /* 111 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(15), isObjectLike = __webpack_require__(14); /** `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; /***/ }), /* 112 */ /***/ (function(module, exports, __webpack_require__) { var isArrayLike = __webpack_require__(30), isObjectLike = __webpack_require__(14); /** * 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; /***/ }), /* 113 */ /***/ (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; /***/ }), /* 114 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(15), getPrototype = __webpack_require__(40), isObjectLike = __webpack_require__(14); /** `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; /***/ }), /* 115 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(15), isLength = __webpack_require__(31), isObjectLike = __webpack_require__(14); /** `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; /***/ }), /* 116 */ /***/ (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; /***/ }), /* 117 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(36); /** 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__(29)(module))) /***/ }), /* 118 */ /***/ (function(module, exports, __webpack_require__) { var copyObject = __webpack_require__(119), keysIn = __webpack_require__(46); /** * 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; /***/ }), /* 119 */ /***/ (function(module, exports, __webpack_require__) { var assignValue = __webpack_require__(45), baseAssignValue = __webpack_require__(28); /** * 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; /***/ }), /* 120 */ /***/ (function(module, exports, __webpack_require__) { var baseTimes = __webpack_require__(121), isArguments = __webpack_require__(22), isArray = __webpack_require__(11), isBuffer = __webpack_require__(42), isIndex = __webpack_require__(23), isTypedArray = __webpack_require__(43); /** 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; /***/ }), /* 121 */ /***/ (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; /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(9), isPrototype = __webpack_require__(41), nativeKeysIn = __webpack_require__(123); /** 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; /***/ }), /* 123 */ /***/ (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; /***/ }), /* 124 */ /***/ (function(module, exports, __webpack_require__) { var baseRest = __webpack_require__(125), isIterateeCall = __webpack_require__(130); /** * 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; /***/ }), /* 125 */ /***/ (function(module, exports, __webpack_require__) { var identity = __webpack_require__(47), overRest = __webpack_require__(48), setToString = __webpack_require__(49); /** * 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; /***/ }), /* 126 */ /***/ (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; /***/ }), /* 127 */ /***/ (function(module, exports, __webpack_require__) { var constant = __webpack_require__(128), defineProperty = __webpack_require__(39), identity = __webpack_require__(47); /** * 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; /***/ }), /* 128 */ /***/ (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; /***/ }), /* 129 */ /***/ (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; /***/ }), /* 130 */ /***/ (function(module, exports, __webpack_require__) { var eq = __webpack_require__(18), isArrayLike = __webpack_require__(30), isIndex = __webpack_require__(23), isObject = __webpack_require__(9); /** * 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; /***/ }), /* 131 */ /***/ (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; }; } /***/ }), /* 132 */ /***/ (function(module, exports) { function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 133 */ /***/ (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; /***/ }), /* 134 */ /***/ (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; /***/ }), /* 135 */ /***/ (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; /***/ }), /* 136 */ /***/ (function(module, exports, __webpack_require__) { var OverloadYield = __webpack_require__(53); var regenerator = __webpack_require__(54); var regeneratorAsync = __webpack_require__(137); var regeneratorAsyncGen = __webpack_require__(56); var regeneratorAsyncIterator = __webpack_require__(57); var regeneratorKeys = __webpack_require__(138); var regeneratorValues = __webpack_require__(139); 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; /***/ }), /* 137 */ /***/ (function(module, exports, __webpack_require__) { var regeneratorAsyncGen = __webpack_require__(56); 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; /***/ }), /* 138 */ /***/ (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; /***/ }), /* 139 */ /***/ (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; /***/ }), /* 140 */ /***/ (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; /***/ }), /* 141 */ /***/ (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; /***/ }), /* 142 */ /***/ (function(module, exports, __webpack_require__) { var arrayLikeToArray = __webpack_require__(51); function _arrayWithoutHoles(r) { if (Array.isArray(r)) return arrayLikeToArray(r); } module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports; /***/ }), /* 143 */ /***/ (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; /***/ }), /* 144 */ /***/ (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; /***/ }), /* 145 */ /***/ (function(module, exports, __webpack_require__) { var basePickBy = __webpack_require__(146), hasIn = __webpack_require__(156); /** * The base implementation of `_.pick` without support for individual * property identifiers. * * @private * @param {Object} object The source object. * @param {string[]} paths The property paths to pick. * @returns {Object} Returns the new object. */ function basePick(object, paths) { return basePickBy(object, paths, function(value, path) { return hasIn(object, path); }); } module.exports = basePick; /***/ }), /* 146 */ /***/ (function(module, exports, __webpack_require__) { var baseGet = __webpack_require__(147), baseSet = __webpack_require__(155), castPath = __webpack_require__(24); /** * The base implementation of `_.pickBy` without support for iteratee shorthands. * * @private * @param {Object} object The source object. * @param {string[]} paths The property paths to pick. * @param {Function} predicate The function invoked per property. * @returns {Object} Returns the new object. */ function basePickBy(object, paths, predicate) { var index = -1, length = paths.length, result = {}; while (++index < length) { var path = paths[index], value = baseGet(object, path); if (predicate(value, path)) { baseSet(result, castPath(path, object), value); } } return result; } module.exports = basePickBy; /***/ }), /* 147 */ /***/ (function(module, exports, __webpack_require__) { var castPath = __webpack_require__(24), toKey = __webpack_require__(34); /** * 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; /***/ }), /* 148 */ /***/ (function(module, exports, __webpack_require__) { var isArray = __webpack_require__(11), isSymbol = __webpack_require__(33); /** 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; /***/ }), /* 149 */ /***/ (function(module, exports, __webpack_require__) { var memoizeCapped = __webpack_require__(150); /** 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; /***/ }), /* 150 */ /***/ (function(module, exports, __webpack_require__) { var memoize = __webpack_require__(151); /** 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; /***/ }), /* 151 */ /***/ (function(module, exports, __webpack_require__) { var MapCache = __webpack_require__(37); /** 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; /***/ }), /* 152 */ /***/ (function(module, exports, __webpack_require__) { var baseToString = __webpack_require__(153); /** * 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; /***/ }), /* 153 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19), arrayMap = __webpack_require__(154), isArray = __webpack_require__(11), isSymbol = __webpack_require__(33); /** 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; /***/ }), /* 154 */ /***/ (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; /***/ }), /* 155 */ /***/ (function(module, exports, __webpack_require__) { var assignValue = __webpack_require__(45), castPath = __webpack_require__(24), isIndex = __webpack_require__(23), isObject = __webpack_require__(9), toKey = __webpack_require__(34); /** * The base implementation of `_.set`. * * @private * @param {Object} object The object to modify. * @param {Array|string} path The path of the property to set. * @param {*} value The value to set. * @param {Function} [customizer] The function to customize path creation. * @returns {Object} Returns `object`. */ function baseSet(object, path, value, customizer) { if (!isObject(object)) { return object; } path = castPath(path, object); var index = -1, length = path.length, lastIndex = length - 1, nested = object; while (nested != null && ++index < length) { var key = toKey(path[index]), newValue = value; if (key === '__proto__' || key === 'constructor' || key === 'prototype') { return object; } if (index != lastIndex) { var objValue = nested[key]; newValue = customizer ? customizer(objValue, key, nested) : undefined; if (newValue === undefined) { newValue = isObject(objValue) ? objValue : (isIndex(path[index + 1]) ? [] : {}); } } assignValue(nested, key, newValue); nested = nested[key]; } return object; } module.exports = baseSet; /***/ }), /* 156 */ /***/ (function(module, exports, __webpack_require__) { var baseHasIn = __webpack_require__(157), hasPath = __webpack_require__(158); /** * Checks if `path` is a direct or inherited property of `object`. * * @static * @memberOf _ * @since 4.0.0 * @category Object * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @returns {boolean} Returns `true` if `path` exists, else `false`. * @example * * var object = _.create({ 'a': _.create({ 'b': 2 }) }); * * _.hasIn(object, 'a'); * // => true * * _.hasIn(object, 'a.b'); * // => true * * _.hasIn(object, ['a', 'b']); * // => true * * _.hasIn(object, 'b'); * // => false */ function hasIn(object, path) { return object != null && hasPath(object, path, baseHasIn); } module.exports = hasIn; /***/ }), /* 157 */ /***/ (function(module, exports) { /** * The base implementation of `_.hasIn` without support for deep paths. * * @private * @param {Object} [object] The object to query. * @param {Array|string} key The key to check. * @returns {boolean} Returns `true` if `key` exists, else `false`. */ function baseHasIn(object, key) { return object != null && key in Object(object); } module.exports = baseHasIn; /***/ }), /* 158 */ /***/ (function(module, exports, __webpack_require__) { var castPath = __webpack_require__(24), isArguments = __webpack_require__(22), isArray = __webpack_require__(11), isIndex = __webpack_require__(23), isLength = __webpack_require__(31), toKey = __webpack_require__(34); /** * Checks if `path` exists on `object`. * * @private * @param {Object} object The object to query. * @param {Array|string} path The path to check. * @param {Function} hasFunc The function to check properties. * @returns {boolean} Returns `true` if `path` exists, else `false`. */ function hasPath(object, path, hasFunc) { path = castPath(path, object); var index = -1, length = path.length, result = false; while (++index < length) { var key = toKey(path[index]); if (!(result = object != null && hasFunc(object, key))) { break; } object = object[key]; } if (result || ++index != length) { return result; } length = object == null ? 0 : object.length; return !!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)); } module.exports = hasPath; /***/ }), /* 159 */ /***/ (function(module, exports, __webpack_require__) { var flatten = __webpack_require__(160), overRest = __webpack_require__(48), setToString = __webpack_require__(49); /** * 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; /***/ }), /* 160 */ /***/ (function(module, exports, __webpack_require__) { var baseFlatten = __webpack_require__(161); /** * 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; /***/ }), /* 161 */ /***/ (function(module, exports, __webpack_require__) { var arrayPush = __webpack_require__(162), isFlattenable = __webpack_require__(163); /** * 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; /***/ }), /* 162 */ /***/ (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; /***/ }), /* 163 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(19), isArguments = __webpack_require__(22), isArray = __webpack_require__(11); /** 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; /***/ }), /* 164 */ /***/ (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; /***/ }), /* 165 */ /***/ (function(module, exports, __webpack_require__) { var isNativeReflectConstruct = __webpack_require__(166); var setPrototypeOf = __webpack_require__(32); 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; /***/ }), /* 166 */ /***/ (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; /***/ }), /* 167 */ /***/ (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, "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__(12); var merge_default = /*#__PURE__*/__webpack_require__.n(merge); // EXTERNAL MODULE: ./src/common/typedefs.js var typedefs = __webpack_require__(131); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/slicedToArray.js var slicedToArray = __webpack_require__(58); 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++) { // eslint-disable-next-line no-param-reassign outArray[i] = imageData[i * 4 + 0]; } } else { for (var _i = 0; _i < l; _i++) { // 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) { var largeDivisors = []; var divisors = []; for (var i = 1; i < Math.sqrt(n) + 1; i++) { if (n % i === 0) { divisors.push(i); 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)); } } 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) { 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!' }; } }]); }(); /* 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, "START_CODE_A", 103); defineProperty_default()(_this, "START_CODE_B", 104); defineProperty_default()(_this, "START_CODE_C", 105); defineProperty_default()(_this, "STOP_CODE", 106); 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.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.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.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__(10); var get_default = /*#__PURE__*/__webpack_require__.n(get); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/toConsumableArray.js var toConsumableArray = __webpack_require__(25); 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; } // TODO (this was todo in original repo, no text was there. sorry.) }, { key: "_checkChecksum", value: function _checkChecksum(code) { return !!code; } }, { 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, ''); if (!this._checkChecksum(code)) { return null; } var code32 = this._decodeCode32(code); if (!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); } var found = false; 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) { found = true; 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; } } if (found) { // console.warn('* return bestMatch', JSON.stringify(bestMatch)); } else { // console.warn('* return null'); } return found ? bestMatch : 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'); } var found = 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) { 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 found ? bestMatch : 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/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 _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; } /* eslint-disable import/no-cycle */ 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 }; /* harmony default export */ var barcode_decoder = ({ 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'); } } } 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] }]; } function tryDecode(line) { var result = null; var i; var barcodeLine = bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]); if ( true && config.debug.showFrequency) { 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); } for (i = 0; i < _barcodeReaders.length && result === null; i++) { result = _barcodeReaders[i].decodePattern(barcodeLine.line); } if (result === null) { 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)); } 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; _iterator = _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/lodash/pick.js var pick = __webpack_require__(59); var pick_default = /*#__PURE__*/__webpack_require__.n(pick); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/wrapNativeSuper.js var wrapNativeSuper = __webpack_require__(60); 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; } inherits_default()(Exception, _Error); return createClass_default()(Exception); }(/*#__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 // 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) { var normalized = pick_default()(videoConstraints, ['width', 'height', 'facingMode', 'aspectRatio', 'deviceId']); 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 }); } function enumerateVideoDevices() { return _enumerateVideoDevices.apply(this, arguments); } function _enumerateVideoDevices() { _enumerateVideoDevices = asyncToGenerator_default()(/*#__PURE__*/regenerator_default.a.mark(function _callee5() { var devices; 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; return _context5.abrupt("return", devices.filter(function (device) { return device.kind === 'videoinput'; })); case 2: case "end": return _context5.stop(); } }, _callee5); })); 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; } /** * 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, 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: { name: 'Live', 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 debug: { showImageDetails: false // logs frame grabber info, canvas size adjustments } }, locate: true, numOfWorkers: 0, 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, numOfWorkers: 0, 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: { name: 'Live', 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, numOfWorkers: 4, 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; }; /** * 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. */ _that.grab = function () { var doHalfSample = _streamConfig.halfSample; var frame = inputStream.getFrame(); var drawable = frame; var drawAngle = 0; var ctxData; 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; } } } 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); } ctxData = _ctx.getImageData(_sx, _sy, _size.x, _size.y).data; if (doHalfSample) { grayAndHalfSampleFromCanvasData(ctxData, _size, _data); } else { computeGray(ctxData, _data, _streamConfig); } 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 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] = "".concat(directory, "image-").concat("00".concat(num).slice(-3), ".jpg"); } } 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++) { var imgName = 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); }; } /* 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 : ''); }, 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() { var _config7; loaded = false; image_loader.load(baseUrl, function (imgs) { var _config5, _config6; 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', []); }, 0); }, offset, size, (_config7 = _config) === null || _config7 === void 0 ? void 0 : _config7.sequence, _config); } 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; } 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); var skeletonImageData = new ArrayBuffer(64 * 1024); _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 6 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); 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, debug = _ref.debug; if (typeof document !== 'undefined') { var image = getCanvasAndContext('canvas.imgBuffer', 'imgBuffer', { willReadFrequently: willReadFrequently, debug: debug }); var overlay = getCanvasAndContext('canvas.drawingBuffer', 'drawingBuffer', { willReadFrequently: willReadFrequently, debug: debug }); // eslint-disable-next-line no-multi-assign image.canvas.width = overlay.canvas.width = canvasSize.x; // eslint-disable-next-line no-multi-assign image.canvas.height = overlay.canvas.height = canvasSize.y; 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$inpu, _context$config4, _context$config4$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; var container = initCanvases(context.inputStream.getCanvasSize(), { willReadFrequently: !!(context !== null && context !== void 0 && (_context$config3 = context.config) !== null && _context$config3 !== void 0 && (_context$config3$inpu = _context$config3.inputStream) !== null && _context$config3$inpu !== void 0 && _context$config3$inpu.willReadFrequently), debug: context === null || context === void 0 ? void 0 : (_context$config4 = context.config) === null || _context$config4 === void 0 ? void 0 : (_context$config4$loca = _context$config4.locator) === null || _context$config4$loca === void 0 ? void 0 : _context$config4$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 (!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; if (!_this.context.config) { 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(); } }); } 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'); inputStream.setInputStream(this.context.config.inputStream); 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 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); }); } if (result.line && result.line.length === 2) { moveLine(result.line, xOffset, yOffset); } if (result.box) { moveBox(result.box, xOffset, yOffset); } if (result.boxes && result.boxes.length > 0) { for (var i = 0; i < result.boxes.length; i++) { moveBox(result.boxes[i], xOffset, yOffset); } } } }, { 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 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); } } }, { 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; 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; return regenerator_default.a.wrap(function (_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: this.context.stopped = 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.inputStream.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); } }]); }(); // 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(); }; }); } 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() { 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; }, 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 () { 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9RdWFnZ2Evd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1F1YWdnYS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZXJnZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc29jSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TWFwRGF0YS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSW5kZXguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFBhdGguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZnJlZUdsb2JhbC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25NZXJnZVZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvT3ZlcmxvYWRZaWVsZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvckRlZmluZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9yZWdlbmVyYXRvckFzeW5jR2VuLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvcGljay5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy93cmFwTmF0aXZlU3VwZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlSGFzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrRGVsZXRlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrU2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hdGl2ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleWFibGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRm9yLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQXJyYXlCdWZmZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbm9kZVV0aWwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC90b1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQXNzaWduZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldFRvU3RyaW5nLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi90eXBlZGVmcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhIb2xlcy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvcmVnZW5lcmF0b3JSdW50aW1lLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yQXN5bmMuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvcmVnZW5lcmF0b3JLZXlzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yVmFsdWVzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zdXBlclByb3BCYXNlLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGljay5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNLZXkuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RyaW5nVG9QYXRoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21lbW9pemVDYXBwZWQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9tZW1vaXplLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TWFwLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXQuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9oYXNJbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzUGF0aC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mbGF0UmVzdC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZsYXR0ZW4uanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXNOYXRpdmVGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jb25zdHJ1Y3QuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2FycmF5X2hlbHBlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2NsdXN0ZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9jdl91dGlscy5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2ltYWdlX3dyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbW1vbi9pbWFnZV9kZWJ1Zy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2JhcmNvZGVfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvMm9mNV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RhYmFyX3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGVfMTI4X3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2NvZGVfMzlfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9yZWFkZXIvY29kZV8zMl9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlXzM5X3Zpbl9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9jb2RlXzkzX3JlYWRlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcmVhZGVyL2Vhbl9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW5fMl9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW5fNV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9lYW5fOF9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9pMm9mNV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGNfZV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci91cGNfcmVhZGVyLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9kZWNvZGVyL2JyZXNlbmhhbS5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvZGVjb2Rlci9iYXJjb2RlX2RlY29kZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3JlYWRlci9pbmRleC50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL2V2ZW50cy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL0V4Y2VwdGlvbi50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29tbW9uL21lZGlhRGV2aWNlcy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvY2FtZXJhX2FjY2Vzcy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvYW5hbHl0aWNzL3Jlc3VsdF9jb2xsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbmZpZy9jb25maWcuZGV2LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9jb25maWcvY29uZmlnLm5vZGUudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2NvbmZpZy9jb25maWcucHJvZC50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvY29uZmlnL2NvbmZpZy50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvZnJhbWVfZ3JhYmJlcl9icm93c2VyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9leGlmX2hlbHBlci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvaW5wdXQvaW1hZ2VfbG9hZGVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9pbnB1dC9pbnB1dF9zdHJlYW0vaW5wdXRfc3RyZWFtX2Jyb3dzZXIudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3IvdHJhY2VyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL3Jhc3Rlcml6ZXIuanMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL2xvY2F0b3Ivc2tlbGV0b25pemVyLmpzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9sb2NhdG9yL2JhcmNvZGVfbG9jYXRvci5qcyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvUXVhZ2dhQ29udGV4dC50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL2dldFZpZXdQb3J0LnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2EvaW5pdEJ1ZmZlcnMudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9pbml0Q2FudmFzLnRzIiwid2VicGFjazovL1F1YWdnYS8uL3NyYy9xdWFnZ2EvcXdvcmtlci50cyIsIndlYnBhY2s6Ly9RdWFnZ2EvLi9zcmMvcXVhZ2dhL3NldHVwSW5wdXRTdHJlYW0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS90cmFuc2Zvcm0udHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS9xdWFnZ2EudHMiLCJ3ZWJwYWNrOi8vUXVhZ2dhLy4vc3JjL3F1YWdnYS5qcyJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJvUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYWxsYmFjayIsInNldFRpbWVvdXQiLCJNYXRoIiwiaW11bCIsImEiLCJiIiwiYWgiLCJhbCIsImJoIiwiYmwiLCJPYmplY3QiLCJhc3NpZ24iLCJ0YXJnZXQiLCJUeXBlRXJyb3IiLCJ0byIsImluZGV4IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibmV4dFNvdXJjZSIsIm5leHRLZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpbml0IiwiYXJyIiwidmFsIiwiZmlsbCIsInNodWZmbGUiLCJpIiwiaiIsImZsb29yIiwicmFuZG9tIiwiX3JlZiIsInRvUG9pbnRMaXN0Iiwicm93cyIsInJlZHVjZSIsInAiLCJuIiwicm93IiwiY29uY2F0Iiwiam9pbiIsInB1c2giLCJ0aHJlc2hvbGQiLCJzY29yZUZ1bmMiLCJxdWV1ZSIsInByZXYiLCJuZXh0IiwiYXBwbHkiLCJtYXhJbmRleCIsIm1heCIsInN1bSIsImNyZWF0ZSIsInBvaW50IiwicG9pbnRzIiwiY2VudGVyIiwicmFkIiwidmVjIiwidmVjMiIsImNsb25lIiwicG9pbnRNYXAiLCJhZGQiLCJwb2ludFRvQWRkIiwiaWQiLCJ1cGRhdGVDZW50ZXIiLCJjb3MiLCJzaW4iLCJmaXRzIiwib3RoZXJQb2ludCIsInNpbWlsYXJpdHkiLCJhYnMiLCJkb3QiLCJnZXRQb2ludHMiLCJnZXRDZW50ZXIiLCJjcmVhdGVQb2ludCIsIm5ld1BvaW50IiwicHJvcGVydHkiLCJpbWFnZVJlZiIsIngiLCJ5IiwidGhhdCIsInRvVmVjMiIsInRvVmVjMyIsInZlYzMiLCJyb3VuZCIsImNvbXB1dGVJbnRlZ3JhbEltYWdlMiIsImltYWdlV3JhcHBlciIsImludGVncmFsV3JhcHBlciIsImltYWdlRGF0YSIsImRhdGEiLCJ3aWR0aCIsInNpemUiLCJoZWlnaHQiLCJpbnRlZ3JhbEltYWdlRGF0YSIsInBvc0EiLCJwb3NCIiwicG9zQyIsInBvc0QiLCJjb21wdXRlSW50ZWdyYWxJbWFnZSIsInYiLCJ1IiwidGhyZXNob2xkSW1hZ2UiLCJ0YXJnZXRXcmFwcGVyIiwidGFyZ2V0RGF0YSIsImNvbXB1dGVIaXN0b2dyYW0iLCJiaXRzUGVyUGl4ZWwiLCJiaXRTaGlmdCIsImJ1Y2tldENudCIsImhpc3QiLCJJbnQzMkFycmF5Iiwic2hhcnBlbkxpbmUiLCJsaW5lIiwibGVmdCIsInJpZ2h0IiwiZGV0ZXJtaW5lT3RzdVRocmVzaG9sZCIsInVuZGVmaW5lZCIsInB4IiwiZW5kIiwibXgiLCJkZXRlcm1pbmVUaHJlc2hvbGQiLCJ2ZXQiLCJwMSIsInAyIiwicDEyIiwibTEiLCJtMiIsIm0xMiIsImsiLCJBcnJheUhlbHBlciIsIm90c3VUaHJlc2hvbGQiLCJjb21wdXRlQmluYXJ5SW1hZ2UiLCJrZXJuZWwiLCJBIiwiQiIsIkMiLCJEIiwiYXZnIiwiY2x1c3RlciIsInRoaXNDbHVzdGVyIiwiY2x1c3RlcnMiLCJhZGRUb0NsdXN0ZXIiLCJmb3VuZCIsIkNsdXN0ZXIyIiwiVHJhY2VyIiwidHJhY2UiLCJpdGVyYXRpb24iLCJtYXhJdGVyYXRpb25zIiwidG9wIiwicmVzdWx0IiwiY2VudGVyUG9zIiwiY3VycmVudFBvcyIsImlkeCIsImZvcndhcmQiLCJ0b0lkeCIsInByZWRpY3RlZFBvcyIsInRocmVzaG9sZFgiLCJ0aHJlc2hvbGRZIiwibWF0Y2giLCJwb3MiLCJwcmVkaWN0ZWQiLCJmcm9tIiwiRElMQVRFIiwiRVJPREUiLCJkaWxhdGUiLCJpbkltYWdlV3JhcHBlciIsIm91dEltYWdlV3JhcHBlciIsImluSW1hZ2VEYXRhIiwib3V0SW1hZ2VEYXRhIiwieVN0YXJ0MSIsInlTdGFydDIiLCJ4U3RhcnQxIiwieFN0YXJ0MiIsImVyb2RlIiwic3VidHJhY3QiLCJhSW1hZ2VXcmFwcGVyIiwiYkltYWdlV3JhcHBlciIsInJlc3VsdEltYWdlV3JhcHBlciIsImFJbWFnZURhdGEiLCJiSW1hZ2VEYXRhIiwiY0ltYWdlRGF0YSIsImJpdHdpc2VPciIsImNvdW50Tm9uWmVybyIsInRvcEdlbmVyaWMiLCJsaXN0IiwibWluSWR4IiwibWluIiwic2NvcmUiLCJoaXQiLCJpdGVtIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwiZ3JheUFycmF5RnJvbUltYWdlIiwiaHRtbEltYWdlIiwib2Zmc2V0WCIsImN0eCIsImFycmF5IiwiZHJhd0ltYWdlIiwiY3R4RGF0YSIsImdldEltYWdlRGF0YSIsImNvbXB1dGVHcmF5IiwiZ3JheUFycmF5RnJvbUNvbnRleHQiLCJvZmZzZXQiLCJncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhIiwiY2FudmFzRGF0YSIsIm91dEFycmF5IiwidG9wUm93SWR4IiwiYm90dG9tUm93SWR4IiwiZW5kSWR4Iiwib3V0V2lkdGgiLCJvdXRJbWdJZHgiLCJpbldpZHRoIiwiY29uZmlnIiwibCIsInNpbmdsZUNoYW5uZWwiLCJsb2FkSW1hZ2VBcnJheSIsInNyYyIsImNhbnZhcyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImltZyIsIkltYWdlIiwib25sb2FkIiwiY29uc29sZSIsIndhcm4iLCJnZXRDb250ZXh0IiwiVWludDhBcnJheSIsIl9jdHgkZ2V0SW1hZ2VEYXRhIiwiaGFsZlNhbXBsZSIsImluSW1nV3JhcHBlciIsIm91dEltZ1dyYXBwZXIiLCJpbkltZyIsIm91dEltZyIsImhzdjJyZ2IiLCJoc3YiLCJyZ2IiLCJoIiwicyIsImMiLCJtIiwiciIsImciLCJfY29tcHV0ZURpdmlzb3JzIiwibGFyZ2VEaXZpc29ycyIsImRpdmlzb3JzIiwic3FydCIsInVuc2hpZnQiLCJfY29tcHV0ZUludGVyc2VjdGlvbiIsImFycjEiLCJhcnIyIiwiY2FsY3VsYXRlUGF0Y2hTaXplIiwicGF0Y2hTaXplIiwiaW1nU2l6ZSIsImRpdmlzb3JzWCIsImRpdmlzb3JzWSIsIndpZGVTaWRlIiwiY29tbW9uIiwibnJPZlBhdGNoZXNMaXN0IiwibnJPZlBhdGNoZXNNYXAiLCJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwibnJPZlBhdGNoZXNJZHgiLCJuck9mUGF0Y2hlcyIsImRlc2lyZWRQYXRjaFNpemUiLCJvcHRpbWFsUGF0Y2hTaXplIiwiZmluZFBhdGNoU2l6ZUZvckRpdmlzb3JzIiwiX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzIiwidmFsdWUiLCJkaW1lbnNpb24iLCJwYXJzZUZsb2F0IiwidW5pdCIsImluZGV4T2YiLCJfZGltZW5zaW9uc0NvbnZlcnRlcnMiLCJjb250ZXh0IiwiYm90dG9tIiwiY29tcHV0ZUltYWdlQXJlYSIsImlucHV0V2lkdGgiLCJpbnB1dEhlaWdodCIsImFyZWEiLCJwYXJzZWRBcmVhIiwia2V5cyIsImtleSIsInBhcnNlZCIsImNhbGN1bGF0ZWQiLCJzeCIsInN5Iiwic3ciLCJzaCIsImFzc2VydE51bWJlclBvc2l0aXZlIiwiRXJyb3IiLCJJbWFnZVdyYXBwZXIiLCJBcnJheVR5cGUiLCJpbml0aWFsaXplIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2RlZmluZVByb3BlcnR5IiwiX2NyZWF0ZUNsYXNzIiwiaW5JbWFnZVdpdGhCb3JkZXIiLCJpbWdSZWYiLCJib3JkZXIiLCJzdWJJbWFnZUFzQ29weSIsIl9pbWFnZVdyYXBwZXIkc2l6ZSIsInNpemVYIiwic2l6ZVkiLCJnZXQiLCJnZXRTYWZlIiwiaW5kZXhNYXBwaW5nIiwic2V0IiwiemVyb0JvcmRlciIsIl90aGlzJHNpemUiLCJtb21lbnRzIiwibGFiZWxDb3VudCIsInlzcSIsImxhYmVsU3VtIiwibGFiZWwiLCJtdTExIiwibXUwMiIsIm11MjAiLCJ4XyIsInlfIiwidG1wIiwiUEkiLCJQSV80IiwibTAwIiwibTAxIiwibTEwIiwibTExIiwibTAyIiwibTIwIiwidGhldGEiLCJpc05hTiIsImF0YW4iLCJnZXRBc1JHQkEiLCJzY2FsZSIsInJldCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwicGl4ZWwiLCJjdXJyZW50Iiwic2hvdyIsImZyYW1lIiwibmV3RnJhbWUiLCJJbWFnZURhdGEiLCJwdXRJbWFnZURhdGEiLCJvdmVybGF5IiwiaW5TY2FsZSIsImFkanVzdGVkU2NhbGUiLCJ3aGl0ZVJnYiIsImJsYWNrUmdiIiwiX3Jlc3VsdCIsIl9yZXN1bHQyIiwiX3NsaWNlZFRvQXJyYXkiLCJkcmF3UmVjdCIsInN0eWxlIiwic3Ryb2tlU3R5bGUiLCJjb2xvciIsImZpbGxTdHlsZSIsImxpbmVXaWR0aCIsImJlZ2luUGF0aCIsInN0cm9rZVJlY3QiLCJkcmF3UGF0aCIsInBhdGgiLCJkZWYiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJzdHJva2UiLCJjYW52YXNEYXRhUG9zIiwiaW1hZ2VEYXRhUG9zIiwiQmFyY29kZURpcmVjdGlvbiIsIkJhcmNvZGVSZWFkZXIiLCJzdXBwbGVtZW50cyIsIl9yb3ciLCJfbmV4dFVuc2V0Iiwic3RhcnQiLCJfbWF0Y2hQYXR0ZXJuIiwiY291bnRlciIsImNvZGUiLCJtYXhTaW5nbGVFcnJvciIsIlNJTkdMRV9DT0RFX0VSUk9SIiwiZXJyb3IiLCJzaW5nbGVFcnJvciIsIm1vZHVsbyIsImJhcldpZHRoIiwiY291bnQiLCJzY2FsZWQiLCJfbmV4dFNldCIsIl9jb3JyZWN0QmFycyIsImNvcnJlY3Rpb24iLCJpbmRpY2VzIiwiZGVjb2RlUGF0dGVybiIsInBhdHRlcm4iLCJkZWNvZGUiLCJyZXZlcnNlIiwiZGlyZWN0aW9uIiwiUmV2ZXJzZSIsIkZvcndhcmQiLCJmb3JtYXQiLCJGT1JNQVQiLCJfbWF0Y2hSYW5nZSIsIl9maWxsQ291bnRlcnMiLCJpc1doaXRlIiwiY291bnRlcnMiLCJjb3VudGVyUG9zIiwiX3RvQ291bnRlcnMiLCJudW1Db3VudGVycyIsImRlY29kZUltYWdlIiwiU3RhcnROb3RGb3VuZEV4Y2VwdGlvbiIsIkNvZGVOb3RGb3VuZEV4Y2VwdGlvbiIsIlBhdHRlcm5Ob3RGb3VuZEV4Y2VwdGlvbiIsIk4iLCJXIiwiU1RBUlRfUEFUVEVSTiIsIlNUT1BfUEFUVEVSTiIsIkNPREVfUEFUVEVSTiIsIlNUQVJUX1BBVFRFUk5fTEVOR1RIIiwiVHdvT2ZGaXZlUmVhZGVyIiwiX0JhcmNvZGVSZWFkZXIiLCJfdGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiX2NhbGxTdXBlciIsIl9pbmhlcml0cyIsIl9maW5kUGF0dGVybiIsInRyeUhhcmRlciIsImJlc3RNYXRjaCIsImVwc2lsb24iLCJBVkdfQ09ERV9FUlJPUiIsIl9maW5kU3RhcnQiLCJzdGFydEluZm8iLCJuYXJyb3dCYXJXaWR0aCIsImxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQiLCJfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlIiwiZW5kSW5mbyIsInRyYWlsaW5nV2hpdGVzcGFjZUVuZCIsIl9maW5kRW5kIiwiX3ZlcmlmeUNvdW50ZXJMZW5ndGgiLCJfZGVjb2RlQ29kZSIsIl9kZWNvZGVQYXlsb2FkIiwiZGVjb2RlZENvZGVzIiwiY291bnRlckxlbmd0aCIsImJhclNwYWNlUmF0aW8iLCJBTFBIQUJFVCIsIkNIQVJBQ1RFUl9FTkNPRElOR1MiLCJTVEFSVF9FTkQiLCJNSU5fRU5DT0RFRF9DSEFSUyIsIk1BWF9BQ0NFUFRBQkxFIiwiUEFERElORyIsIk5ld0NvZGFiYXJSZWFkZXIiLCJfY29tcHV0ZUFsdGVybmF0aW5nVGhyZXNob2xkIiwiX2NvdW50ZXJzIiwiX3RvUGF0dGVybiIsImJhclRocmVzaG9sZCIsInNwYWNlVGhyZXNob2xkIiwiYml0bWFzayIsIl9pc1N0YXJ0RW5kIiwiX3N1bUNvdW50ZXJzIiwic3RhcnRDb3VudGVyIiwiZW5kQ291bnRlciIsIl9wYXR0ZXJuVG9DaGFyIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgiLCJfdmVyaWZ5V2hpdGVzcGFjZSIsIl9jaGFyVG9QYXR0ZXJuIiwiY2hhciIsImNoYXJDb2RlIiwiY2hhckNvZGVBdCIsIl90aHJlc2hvbGRSZXN1bHRQYXR0ZXJuIiwiY2F0ZWdvcml6YXRpb24iLCJzcGFjZSIsIm5hcnJvdyIsImNvdW50cyIsIndpZGUiLCJiYXIiLCJraW5kIiwiY2F0IiwiZm9yRWFjaCIsIm5ld2tpbmQiLCJjZWlsIiwiX3ZhbGlkYXRlUmVzdWx0IiwidGhyZXNob2xkcyIsIm5leHRTdGFydCIsImRlY29kZWRDaGFyIiwiQ29kZTEyOFJlYWRlciIsIl9jb3JyZWN0IiwiY2FsY3VsYXRlQ29ycmVjdGlvbiIsIk1PRFVMRV9JTkRJQ0VTIiwiU1RBUlRfQ09ERV9BIiwiU1RBUlRfQ09ERV9DIiwiX3RoaXMyIiwiY2hlY2tzdW0iLCJjb2Rlc2V0IiwiQ09ERV9BIiwiU1RBUlRfQ09ERV9CIiwiQ09ERV9CIiwiQ09ERV9DIiwiZG9uZSIsInNoaWZ0TmV4dCIsInJlbW92ZUxhc3RDaGFyYWN0ZXIiLCJtdWx0aXBsaWVyIiwicmF3UmVzdWx0IiwiU1RPUF9DT0RFIiwiQ09ERV9TSElGVCIsInNwbGljZSIsInNlbGYiLCJleHBlY3RlZCIsIm5vcm1hbGl6ZWQiLCJzdW1Ob3JtYWxpemVkIiwic3VtRXhwZWN0ZWQiLCJBTFBIQUJFVEhfU1RSSU5HIiwiVWludDE2QXJyYXkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJtYXAiLCJBU1RFUklTSyIsIkNvZGUzOVJlYWRlciIsInBhdHRlcm5TdGFydCIsIndoaXRlU3BhY2VNdXN0U3RhcnQiLCJtYXhOYXJyb3dXaWR0aCIsIm51bVdpZGVCYXJzIiwid2lkZUJhcldpZHRoIiwiX2ZpbmROZXh0V2lkdGgiLCJtaW5XaWR0aCIsImxhc3RTdGFydCIsInBhdHRlcm5TaXplIiwicG9wIiwicGF0dGVybnMiLCJBRUlPIiwiQVowOSIsImNvZGUzMnNldCIsIkNvZGUzMlJlYWRlciIsIl9Db2RlMzlSZWFkZXIiLCJfZGVjb2RlQ29kZTMyIiwidGVzdCIsInJlcyIsImNvZGUzMiIsInNsaWNlIiwiX2NoZWNrQ2hlY2tzdW0iLCJfc3VwZXJQcm9wR2V0IiwicmVwbGFjZSIsIklPUSIsIkNvZGUzOVZJTlJlYWRlciIsIkVOViIsImxvZyIsIkNvZGU5M1JlYWRlciIsIl92ZXJpZnlFbmQiLCJfZGVjb2RlRXh0ZW5kZWQiLCJjaGFyQXJyYXkiLCJuZXh0Q2hhciIsIm5leHRDaGFyQ29kZSIsIl9tYXRjaENoZWNrQ2hhciIsIm1heFdlaWdodCIsImFycmF5VG9DaGVjayIsIndlaWdodGVkU3VtcyIsIndlaWdodCIsImNoZWNrQ2hhciIsIl92ZXJpZnlDaGVja3N1bXMiLCJDT0RFX0dfU1RBUlQiLCJNSURETEVfUEFUVEVSTiIsIkVYVEVOU0lPTl9TVEFSVF9QQVRURVJOIiwiQ09ERV9GUkVRVUVOQ1kiLCJFQU5SZWFkZXIiLCJtZXJnZSIsImNvZGVyYW5nZSIsIl9jYWxjdWxhdGVGaXJzdERpZ2l0IiwiY29kZUZyZXF1ZW5jeSIsImluQ29kZSIsIm91dENvZGUiLCJfb2JqZWN0U3ByZWFkIiwiZmlyc3REaWdpdCIsIm1pZGRsZVBhdHRlcm4iLCJfY2hlY2tzdW0iLCJfZGVjb2RlRXh0ZW5zaW9ucyIsImVyciIsInJlc3VsdEluZm8iLCJzdXBwbGVtZW50IiwibGFzdENvZGUiLCJFQU4yUmVhZGVyIiwiX0VBTlJlYWRlciIsInBhcnNlSW50IiwiQ0hFQ0tfRElHSVRfRU5DT0RJTkdTIiwiZGV0ZXJtaW5lQ2hlY2tEaWdpdCIsImV4dGVuc2lvbkNoZWNrc3VtIiwiRUFONVJlYWRlciIsIkVBTjhSZWFkZXIiLCJJMm9mNVJlYWRlciIsIm9wdHMiLCJub3JtYWxpemVCYXJTcGFjZVdpZHRoIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJjb3VudGVyU3VtIiwiY29kZVN1bSIsImNvcnJlY3Rpb25SYXRpbyIsIk1BWF9DT1JSRUNUSU9OX0ZBQ1RPUiIsImNvcnJlY3Rpb25SYXRpb0ludmVyc2UiLCJfZGVjb2RlUGFpciIsImNvdW50ZXJQYWlyIiwiY29kZXMiLCJVUENFUmVhZGVyIiwiX2RldGVybWluZVBhcml0eSIsIm5yU3lzdGVtIiwiX2NvbnZlcnRUb1VQQ0EiLCJ1cGNhIiwibGFzdERpZ2l0IiwiVVBDUmVhZGVyIiwiY2hhckF0Iiwic3Vic3RyaW5nIiwiQnJlc2VuaGFtIiwiU2xvcGUiLCJESVIiLCJVUCIsIkRPV04iLCJnZXRCYXJjb2RlTGluZSIsIngwIiwieTAiLCJ4MSIsInkxIiwic3RlZXAiLCJyZWFkIiwiZGVsdGFYIiwiZGVsdGFZIiwieVN0ZXAiLCJ0b0JpbmFyeUxpbmUiLCJzbG9wZSIsInNsb3BlMiIsImV4dHJlbWEiLCJjdXJyZW50RGlyIiwiZGlyIiwiclRocmVzaG9sZCIsImRlYnVnIiwicHJpbnRGcmVxdWVuY3kiLCJwcmludFBhdHRlcm4iLCJmaWxsQ29sb3IiLCJmaWxsUmVjdCIsIlJFQURFUlMiLCJjb2RlXzEyOF9yZWFkZXIiLCJlYW5fcmVhZGVyIiwiZWFuXzVfcmVhZGVyIiwiZWFuXzJfcmVhZGVyIiwiZWFuXzhfcmVhZGVyIiwiY29kZV8zOV9yZWFkZXIiLCJjb2RlXzM5X3Zpbl9yZWFkZXIiLCJjb2RhYmFyX3JlYWRlciIsIkNvZGFiYXJSZWFkZXIiLCJ1cGNfcmVhZGVyIiwidXBjX2VfcmVhZGVyIiwiaTJvZjVfcmVhZGVyIiwiY29kZV85M19yZWFkZXIiLCJjb2RlXzMyX3JlYWRlciIsInJlZ2lzdGVyUmVhZGVyIiwibmFtZSIsInJlYWRlciIsImlucHV0SW1hZ2VXcmFwcGVyIiwiX2NhbnZhcyIsImZyZXF1ZW5jeSIsImRvbSIsIl9iYXJjb2RlUmVhZGVycyIsImluaXRDYW52YXMiLCJpbml0UmVhZGVycyIsImluaXRDb25maWciLCJfY29uZmlnJGRlYnVnIiwiJGRlYnVnIiwicXVlcnlTZWxlY3RvciIsImNsYXNzTmFtZSIsImFwcGVuZENoaWxkIiwicHJpbnRSZWFkZXJJbmZvIiwiX2NvbmZpZyRkZWJ1ZzMiLCJyZWFkZXJzIiwicmVhZGVyQ29uZmlnIiwiX2NvbmZpZyRkZWJ1ZzIiLCJjb25maWd1cmF0aW9uIiwiX3R5cGVvZiIsInJlYWRlck9iaiIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2aXMiLCJub2RlIiwicHJvcCIsInNob3dGcmVxdWVuY3kiLCJzaG93UGF0dGVybiIsImRpc3BsYXkiLCJnZXRFeHRlbmRlZExpbmUiLCJhbmdsZSIsImV4dCIsImV4dGVuZExpbmUiLCJhbW91bnQiLCJleHRlbnNpb24iLCJnZXRMaW5lIiwiYm94IiwidHJ5RGVjb2RlIiwiYmFyY29kZUxpbmUiLCJJbWFnZURlYnVnIiwiY29kZVJlc3VsdCIsInRyeURlY29kZUJydXRlRm9yY2UiLCJsaW5lQW5nbGUiLCJzaWRlTGVuZ3RoIiwicG93Iiwic2xpY2VzIiwieGRpciIsInlkaXIiLCJnZXRMaW5lTGVuZ3RoIiwiZGVjb2RlRnJvbUltYWdlIiwiX3giLCJfZGVjb2RlRnJvbUltYWdlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUyIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJfdCIsIndyYXAiLCJfY29udGV4dDIiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInNlbnQiLCJhYnJ1cHQiLCJlIiwiZiIsImZpbmlzaCIsInN0b3AiLCJkZWNvZGVGcm9tQm91bmRpbmdCb3giLCJkcmF3Qm91bmRpbmdCb3giLCJsaW5lTGVuZ3RoIiwiYXRhbjIiLCJkcmF3U2NhbmxpbmUiLCJkZWNvZGVGcm9tQm91bmRpbmdCb3hlcyIsImJveGVzIiwiYmFyY29kZXMiLCJtdWx0aXBsZSIsImltYWdlV3JhcHBlckluIiwiX2NhbGxlZSIsIl9jb250ZXh0Iiwic2V0UmVhZGVycyIsIkV2ZW50SW50ZXJmYWNlIiwiZXZlbnRzIiwiZ2V0RXZlbnQiLCJldmVudE5hbWUiLCJzdWJzY3JpYmVycyIsImNsZWFyRXZlbnRzIiwicHVibGlzaFN1YnNjcmlwdGlvbiIsInN1YnNjcmlwdGlvbiIsImFzeW5jIiwiX3N1YnNjcmliZSIsImV2ZW50Iiwic3Vic2NyaWJlIiwicHVibGlzaCIsImZpbHRlciIsInN1YnNjcmliZXIiLCJvbmNlIiwidW5zdWJzY3JpYmUiLCJFeGNlcHRpb24iLCJfRXJyb3IiLCJzZXRQcm90b3R5cGVPZiIsIl93cmFwTmF0aXZlU3VwZXIiLCJFUlJPUl9ERVNDIiwiZW51bWVyYXRlRGV2aWNlcyIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsIlByb21pc2UiLCJyZWplY3QiLCJnZXRVc2VyTWVkaWEiLCJjb25zdHJhaW50cyIsInN0cmVhbVJlZiIsIndhaXRGb3JWaWRlbyIsInZpZGVvIiwicmVzb2x2ZSIsImF0dGVtcHRzIiwiY2hlY2tWaWRlbyIsInZpZGVvV2lkdGgiLCJ2aWRlb0hlaWdodCIsImluaXRDYW1lcmEiLCJfeDIiLCJfaW5pdENhbWVyYSIsIl9jYWxsZWU0Iiwic3RyZWFtIiwiX2NvbnRleHQ0Iiwic2V0QXR0cmlidXRlIiwic3JjT2JqZWN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInBsYXkiLCJkZXByZWNhdGVkQ29uc3RyYWludHMiLCJ2aWRlb0NvbnN0cmFpbnRzIiwicGljayIsIm1pbkFzcGVjdFJhdGlvIiwiYXNwZWN0UmF0aW8iLCJmYWNpbmciLCJmYWNpbmdNb2RlIiwicGlja0NvbnN0cmFpbnRzIiwiZGV2aWNlSWQiLCJhdWRpbyIsImVudW1lcmF0ZVZpZGVvRGV2aWNlcyIsIl9lbnVtZXJhdGVWaWRlb0RldmljZXMiLCJfY2FsbGVlNSIsImRldmljZXMiLCJfY29udGV4dDUiLCJkZXZpY2UiLCJnZXRBY3RpdmVUcmFjayIsInRyYWNrcyIsImdldFZpZGVvVHJhY2tzIiwiUXVhZ2dhSlNDYW1lcmFBY2Nlc3MiLCJyZXF1ZXN0ZWRWaWRlb0VsZW1lbnQiLCJyZXF1ZXN0IiwibmV3Q29uc3RyYWludHMiLCJyZWxlYXNlIiwicGF1c2UiLCJ0cmFjayIsImdldEFjdGl2ZVN0cmVhbUxhYmVsIiwiZGlzYWJsZVRvcmNoIiwiYXBwbHlDb25zdHJhaW50cyIsImFkdmFuY2VkIiwidG9yY2giLCJPdmVyY29uc3RyYWluZWRFcnJvciIsImVuYWJsZVRvcmNoIiwiX2NhbGxlZTMiLCJfdDIiLCJfY29udGV4dDMiLCJjb250YWlucyIsInNvbWUiLCJldmVyeSIsInBhc3Nlc0ZpbHRlciIsIl9jb25maWckY2FwYWNpdHkiLCJ3aWxsUmVhZEZyZXF1ZW50bHkiLCJyZXN1bHRzIiwiY2FwYWNpdHkiLCJjYXB0dXJlIiwibWF0Y2hlc0NvbnN0cmFpbnRzIiwiYmxhY2tsaXN0IiwiYWRkUmVzdWx0IiwiaW1hZ2VTaXplIiwidG9EYXRhVVJMIiwiZ2V0UmVzdWx0cyIsIkRldkNvbmZpZyIsImlucHV0U3RyZWFtIiwidHlwZSIsInNob3dJbWFnZURldGFpbHMiLCJsb2NhdGUiLCJudW1PZldvcmtlcnMiLCJkZWNvZGVyIiwibG9jYXRvciIsInNob3dDYW52YXMiLCJzaG93UGF0Y2hlcyIsInNob3dGb3VuZFBhdGNoZXMiLCJzaG93U2tlbGV0b24iLCJzaG93TGFiZWxzIiwic2hvd1BhdGNoTGFiZWxzIiwic2hvd1JlbWFpbmluZ1BhdGNoTGFiZWxzIiwic2hvd1BhdGNoU2l6ZSIsImJveEZyb21QYXRjaGVzIiwic2hvd1RyYW5zZm9ybWVkIiwic2hvd1RyYW5zZm9ybWVkQm94Iiwic2hvd0JCIiwiTm9kZUNvbmZpZyIsInNlcXVlbmNlIiwiUHJvZENvbmZpZyIsIkV4cG9ydENvbmZpZyIsIlF1YWdnYUNvbmZpZyIsIlRPX1JBRElBTlMiLCJhZGp1c3RDYW52YXNTaXplIiwidGFyZ2V0U2l6ZSIsIkZyYW1lR3JhYmJlciIsIl9zdHJlYW1Db25maWckZGVidWciLCJfc3RyZWFtQ29uZmlnJGRlYnVnMiIsIl90aGF0IiwiX3N0cmVhbUNvbmZpZyIsImdldENvbmZpZyIsIl92aWRlb1NpemUiLCJnZXRSZWFsV2lkdGgiLCJnZXRSZWFsSGVpZ2h0IiwiX2NhbnZhc1NpemUiLCJnZXRDYW52YXNTaXplIiwiX3NpemUiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsInRvcFJpZ2h0IiwiZ2V0VG9wUmlnaHQiLCJfc3giLCJfc3kiLCJfY3R4IiwiX2RhdGEiLCJ2aWRlb1NpemUiLCJjYW52YXNTaXplIiwiYXR0YWNoRGF0YSIsImdldERhdGEiLCJncmFiIiwiZG9IYWxmU2FtcGxlIiwiZ2V0RnJhbWUiLCJkcmF3YWJsZSIsImRyYXdBbmdsZSIsInRhZ3MiLCJvcmllbnRhdGlvbiIsInRyYW5zbGF0ZSIsInJvdGF0ZSIsImdldFNpemUiLCJFeGlmVGFncyIsIkF2YWlsYWJsZVRhZ3MiLCJmaW5kVGFnc0luT2JqZWN0VVJMIiwib2JqZWN0VVJMVG9CbG9iIiwidGhlbiIsInJlYWRUb0J1ZmZlciIsImJ1ZmZlciIsImZpbmRUYWdzSW5CdWZmZXIiLCJiYXNlNjRUb0FycmF5QnVmZmVyIiwiZGF0YVVybCIsImJhc2U2NCIsImJpbmFyeSIsImF0b2IiLCJsZW4iLCJBcnJheUJ1ZmZlciIsInZpZXciLCJibG9iIiwiZmlsZVJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNBcnJheUJ1ZmZlciIsInVybCIsImh0dHAiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJyZXNwb25zZVR5cGUiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInN0YXR1cyIsInJlc3BvbnNlIiwib25lcnJvciIsInNlbmQiLCJmaWxlIiwic2VsZWN0ZWRUYWdzIiwiZGF0YVZpZXciLCJEYXRhVmlldyIsImJ5dGVMZW5ndGgiLCJleGlmVGFncyIsInNlbGVjdGVkVGFnIiwiZXhpZlRhZyIsInRhZyIsIm1hcmtlciIsImdldFVpbnQ4IiwicmVhZEVYSUZEYXRhIiwiZ2V0VWludDE2IiwiZ2V0U3RyaW5nRnJvbUJ1ZmZlciIsInRpZmZPZmZzZXQiLCJiaWdFbmQiLCJmaXJzdElGRE9mZnNldCIsImdldFVpbnQzMiIsInJlYWRUYWdzIiwidGlmZlN0YXJ0IiwiZGlyU3RhcnQiLCJzdHJpbmdzIiwiZW50cmllcyIsImVudHJ5T2Zmc2V0IiwicmVhZFRhZ1ZhbHVlIiwibnVtVmFsdWVzIiwib3V0c3RyIiwiSW1hZ2VMb2FkZXIiLCJsb2FkIiwiZGlyZWN0b3J5IiwiaHRtbEltYWdlc1NyY0FycmF5IiwiaHRtbEltYWdlc0FycmF5IiwibnVtIiwibm90TG9hZGVkIiwiYWRkSW1hZ2UiLCJpbWFnZSIsImxvYWRlZCIsImxvYWRlZEltZyIsIm5vdGxvYWRlZEltZ3MiLCJpbWdOYW1lIiwic3Vic3RyIiwibGFzdEluZGV4T2YiLCJhZGRPbmxvYWRIYW5kbGVyIiwiaW5wdXRTdHJlYW1GYWN0b3J5IiwiY3JlYXRlVmlkZW9TdHJlYW0iLCJfY29uZmlnIiwiX2V2ZW50TmFtZXMiLCJfZXZlbnRIYW5kbGVycyIsIl9jYWxjdWxhdGVkV2lkdGgiLCJfY2FsY3VsYXRlZEhlaWdodCIsIl90b3BSaWdodCIsImluaXRTaXplIiwiX2NvbmZpZzIiLCJfY29uZmlnMyIsInNldFdpZHRoIiwic2V0SGVpZ2h0Iiwic2V0SW5wdXRTdHJlYW0iLCJlbmRlZCIsInNldEN1cnJlbnRUaW1lIiwidGltZSIsIl9jb25maWc0IiwidG9TdHJpbmciLCJib29sIiwiY2xlYXJFdmVudEhhbmRsZXJzIiwiaGFuZGxlcnMiLCJoYW5kbGVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRyaWdnZXIiLCJzZXRUb3BSaWdodCIsInNldENhbnZhc1NpemUiLCJjcmVhdGVMaXZlU3RyZWFtIiwiY3JlYXRlSW1hZ2VTdHJlYW0iLCJmcmFtZUlkeCIsInBhdXNlZCIsImltZ0FycmF5IiwiYmFzZVVybCIsImNhbGN1bGF0ZWRXaWR0aCIsImNhbGN1bGF0ZWRIZWlnaHQiLCJsb2FkSW1hZ2VzIiwiX2NvbmZpZzciLCJpbWdzIiwiX2NvbmZpZzUiLCJfY29uZmlnNiIsInB1Ymxpc2hFdmVudCIsIm5ld1dpZHRoIiwibmV3SGVpZ2h0IiwiaW5kIiwiX2ltZ0FycmF5Iiwic2VhcmNoRGlyZWN0aW9ucyIsImxhYmVsV3JhcHBlciIsImxhYmVsRGF0YSIsImVkZ2VsYWJlbCIsImN5IiwiY3giLCJ2ZXJ0ZXgyRCIsImNvbnRvdXJUcmFjaW5nIiwiRnYiLCJDdiIsIlAiLCJsZGlyIiwidG90YWxQaXhlbENvdW50IiwicGl4ZWxDb3VudGVyIiwiUmFzdGVyaXplciIsImNyZWF0ZUNvbnRvdXIyRCIsImZpcnN0VmVydGV4IiwiaW5zaWRlQ29udG91cnMiLCJuZXh0cGVlciIsInByZXZwZWVyIiwiQ09OVE9VUl9ESVIiLCJDV19ESVIiLCJDQ1dfRElSIiwiVU5LTk9XTl9ESVIiLCJPVVRTSURFX0VER0UiLCJJTlNJREVfRURHRSIsInRyYWNlciIsInJhc3Rlcml6ZSIsImRlcHRobGFiZWwiLCJiYyIsImxjIiwibGFiZWxpbmRleCIsImNvbG9yTWFwIiwidmVydGV4IiwiY2MiLCJzYyIsImNvbm5lY3RlZENvdW50IiwiZHJhd0NvbnRvdXIiLCJmaXJzdENvbnRvdXIiLCJwcSIsImlxIiwicSIsIlNrZWxldG9uaXplciIsInN0ZGxpYiIsImZvcmVpZ24iLCJpbWFnZXMiLCJpbkltYWdlUHRyIiwib3V0SW1hZ2VQdHIiLCJhSW1hZ2VQdHIiLCJiSW1hZ2VQdHIiLCJpbWFnZVB0ciIsIm1lbWNweSIsInNyY0ltYWdlUHRyIiwiZHN0SW1hZ2VQdHIiLCJza2VsZXRvbml6ZSIsInN1YkltYWdlUHRyIiwiZXJvZGVkSW1hZ2VQdHIiLCJ0ZW1wSW1hZ2VQdHIiLCJza2VsSW1hZ2VQdHIiLCJfY3VycmVudEltYWdlV3JhcHBlciIsIl9za2VsSW1hZ2VXcmFwcGVyIiwiX3N1YkltYWdlV3JhcHBlciIsIl9sYWJlbEltYWdlV3JhcHBlciIsIl9wYXRjaEdyaWQiLCJfcGF0Y2hMYWJlbEdyaWQiLCJfaW1hZ2VUb1BhdGNoR3JpZCIsIl9iaW5hcnlJbWFnZVdyYXBwZXIiLCJfcGF0Y2hTaXplIiwiX2NhbnZhc0NvbnRhaW5lciIsIl9udW1QYXRjaGVzIiwiX2lucHV0SW1hZ2VXcmFwcGVyIiwiX3NrZWxldG9uaXplciIsImluaXRCdWZmZXJzIiwic2tlbGV0b25JbWFnZURhdGEiLCJza2VsZXRvbml6ZXIiLCJ1c2VXb3JrZXIiLCJwYXRjaGVzIiwib3ZlckF2ZyIsInBhdGNoIiwidHJhbnNNYXQiLCJtaW54IiwibWlueSIsIm1heHgiLCJtYXh5IiwibWF0MiIsImNvcHkiLCJ0cmFuc2Zvcm1NYXQyIiwiaW52ZXJ0IiwiYmluYXJpemVJbWFnZSIsImZpbmRQYXRjaGVzIiwicGF0Y2hlc0ZvdW5kIiwicmFzdGVyaXplciIsInJhc3RlclJlc3VsdCIsImRlc2NyaWJlUGF0Y2giLCJmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzIiwibWF4TGFiZWwiLCJsYWJlbEhpc3QiLCJ0b3BMYWJlbHMiLCJzb3J0IiwiZWwiLCJmaW5kQm94ZXMiLCJzaW1pbGFyTW9tZW50cyIsInRvcENsdXN0ZXIiLCJwYXRjaFBvcyIsImVsaWdpYmxlTW9tZW50cyIsIm1hdGNoaW5nTW9tZW50cyIsIm1pbkNvbXBvbmVudFdlaWdodCIsIl9tYXRjaGluZ01vbWVudHMkayRyYSIsIl9tYXRjaGluZ01vbWVudHMkayIsInJhc3Rlcml6ZUFuZ3VsYXJTaW1pbGFyaXR5IiwiY3VycklkeCIsIm5vdFlldFByb2Nlc3NlZCIsImN1cnJlbnRJZHgiLCJjdXJyZW50UGF0Y2giLCJjaGVja0ltYWdlQ29uc3RyYWludHMiLCJ0aGlzSGFsZlNhbXBsZSIsIlF1YWdnYUNvbnRleHQiLCJDYW52YXNDb250YWluZXIiLCJDYW52YXNJbmZvIiwiZ2V0Vmlld1BvcnQiLCJIVE1MRWxlbWVudCIsIm5vZGVOYW1lIiwibm9kZVR5cGUiLCJzZWxlY3RvciIsImJveFNpemUiLCJCYXJjb2RlTG9jYXRvciIsImZpbmRPckNyZWF0ZUNhbnZhcyIsImdldENhbnZhc0FuZENvbnRleHQiLCJvcHRpb25zIiwiX29wdGlvbnMkZGVidWciLCJpbml0Q2FudmFzZXMiLCJfY29udGV4dCRjb25maWciLCJfY29udGV4dCRjb25maWckaW5wdXQiLCJfY29udGV4dCRjb25maWcyIiwiX2NvbnRleHQkY29uZmlnMiRpbnB1IiwiX2NvbnRleHQkY29uZmlnMyIsIl9jb250ZXh0JGNvbmZpZzMkaW5wdSIsIl9jb250ZXh0JGNvbmZpZzQiLCJfY29udGV4dCRjb25maWc0JGxvY2EiLCJ2aWV3cG9ydCIsImNvbnRhaW5lciIsIndvcmtlclBvb2wiLCJ1cGRhdGVXb3JrZXJzIiwiZnJhbWVHcmFiYmVyIiwiYXZhaWxhYmxlV29ya2VyIiwid29ya2VyVGhyZWFkIiwiYnVzeSIsIndvcmtlciIsInBvc3RNZXNzYWdlIiwiY21kIiwiY29uZmlnRm9yV29ya2VyIiwid29ya2VySW50ZXJmYWNlIiwiZmFjdG9yeSIsIlF1YWdnYSIsIm1lc3NhZ2UiLCJvblByb2Nlc3NlZCIsIndvcmtlckludGVyZmFjZVJlYWR5Iiwib25tZXNzYWdlIiwiZ2VuZXJhdGVXb3JrZXJCbG9iIiwiZmFjdG9yeVNvdXJjZSIsIl9fZmFjdG9yeVNvdXJjZV9fIiwiQmxvYiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImluaXRXb3JrZXIiLCJjYiIsImJsb2JVUkwiLCJXb3JrZXIiLCJyZXZva2VPYmplY3RVUkwiLCJwdWJsaXNoUmVzdWx0IiwiYWRqdXN0V29ya2VyUG9vbCIsImluY3JlYXNlQnkiLCJ3b3JrZXJzVG9UZXJtaW5hdGUiLCJ0ZXJtaW5hdGUiLCJ3b3JrZXJJbml0aWFsaXplZCIsInNldHVwSW5wdXRTdHJlYW0iLCJtb3ZlQm94IiwieE9mZnNldCIsInlPZmZzZXQiLCJjb3JuZXIiLCJtb3ZlTGluZSIsIl90aGlzJGNvbnRleHQkY29uZmlnIiwiZnJhbWVncmFiYmVyIiwiY2FudmFzQ29udGFpbmVyIiwiUVdvcmtlcnMiLCJfdGhpcyRjb250ZXh0JGNvbmZpZzIiLCJpbml0aWFsaXplRGF0YSIsInJlYWR5Iiwib25VSVRocmVhZCIsIndvcmtlcnNVcGRhdGVkIiwiX3RoaXMkY29udGV4dCRpbnB1dEltIiwibG9jYXRlQW5kRGVjb2RlIiwiX3RoaXMkY29udGV4dCRpbnB1dEltMiIsIl9pbml0QnVmZmVyczIiLCJfaW5pdEJ1ZmZlcnMiLCJCYXJjb2RlRGVjb2RlciIsIl9nZXRWaWV3UG9ydCIsIl9pbml0Q2FudmFzIiwiaW5pdElucHV0U3RyZWFtIiwiX3RoaXMkY29udGV4dCRjb25maWckIiwiaW5wdXRUeXBlIiwiX3NldHVwSW5wdXRTdHJlYW0iLCJJbnB1dFN0cmVhbSIsIkNhbWVyYUFjY2VzcyIsImNhblJlY29yZCIsImJpbmQiLCJnZXRCb3VuZGluZ0JveGVzIiwiX3RoaXMkY29udGV4dCRjb25maWczIiwidHJhbnNmb3JtUmVzdWx0IiwiYmFyY29kZSIsIl90aGlzMyIsInJlc3VsdENvbGxlY3RvciIsImhhc0NvZGVSZXN1bHQiLCJyZXN1bHRUb1B1Ymxpc2giLCJfcmVzdWx0JGJhcmNvZGVzIiwiRXZlbnRzIiwiX2xvY2F0ZUFuZERlY29kZSIsIl90aGlzJGNvbnRleHQkaW5wdXRJbTMiLCJkZWNvZGVSZXN1bHQiLCJpbWFnZVJlc3VsdCIsIl90aGlzJGNvbnRleHQkaW5wdXRJbTQiLCJzdGFydENvbnRpbnVvdXNVcGRhdGUiLCJfdGhpcyRjb250ZXh0JGNvbmZpZzQiLCJfdGhpczQiLCJkZWxheSIsInN0b3BwZWQiLCJ0aW1lc3RhbXAiLCJ1cGRhdGUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsIl90aGlzJGNvbnRleHQkY29uZmlnNSIsIl90aGlzJGNvbnRleHQkY29uZmlnNiIsIl9zdG9wIiwiX3RoaXMkY29udGV4dCRjb25maWc3IiwiaW5zdGFuY2UiLCJRdWFnZ2FKU1N0YXRpY0ludGVyZmFjZSIsInF1YWdnYUluc3RhbmNlIiwicHJvbWlzZSIsIkNvbmZpZyIsIm9uRGV0ZWN0ZWQiLCJvZmZEZXRlY3RlZCIsIm9mZlByb2Nlc3NlZCIsInJlZ2lzdGVyUmVzdWx0Q29sbGVjdG9yIiwiZGVjb2RlU2luZ2xlIiwicmVzdWx0Q2FsbGJhY2siLCJkZWZhdWx0IiwiUmVhZGVycyIsIlJlc3VsdENvbGxlY3RvciJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdB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LEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3hCO0lBQUExSCx3QkFBQSxDQUFBMEgsS0FBQSx1QkFDZSxJQUFJO0lBQUExSCx3QkFBQSxDQUFBMEgsS0FBQSxvQkFDUCxJQUFJO0lBQUExSCx3QkFBQSxDQUFBMEgsS0FBQSxZQUNaLFVBQVU7SUFBQTFILHdCQUFBLENBQUEwSCxLQUFBLG9CQUNGO01BQUUwRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUFFSixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFBRSxDQUFDO0lBQUEsT0FBQXRELEtBQUE7RUFBQTtFQUFBTSxrQkFBQSxDQUFBOEQsYUFBQSxFQUFBckUsY0FBQTtFQUFBLE9BQUF4SCxxQkFBQSxDQUFBNkwsYUFBQTtJQUFBM00sR0FBQTtJQUFBZCxLQUFBLEVBRXJELFNBQVUwSyxXQUFXQSxDQUFDakUsS0FBYSxFQUFFYyxVQUE4QixFQUFzQjtNQUNyRixJQUFNdUMsU0FBUyxHQUFHO1FBQ2QvQyxLQUFLLEVBQUU3TCxNQUFNLENBQUNDLFNBQVM7UUFDdkJ5TCxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ1JILEtBQUssRUFBRUEsS0FBSztRQUNaL1AsR0FBRyxFQUFFK1AsS0FBSztRQUNWYyxVQUFVLEVBQUU7VUFDUndGLEdBQUcsRUFBRSxDQUFDO1VBQ05KLEtBQUssRUFBRTtRQUNYO01BQ0osQ0FBQztNQUNELElBQUloRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUNoQyxJQUFNN0ssTUFBTSxHQUFHMkssS0FBSztNQUNwQixJQUFJMkIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDN0IsSUFBSSxDQUFDekssTUFBTSxDQUFDO01BQ2hDLElBQUl3TSxVQUFVLEdBQUcsQ0FBQztNQUVsQixLQUFLLElBQUlwWCxDQUFDLEdBQUc0SyxNQUFNLEVBQUU1SyxDQUFDLEdBQUcsSUFBSSxDQUFDcVYsSUFBSSxDQUFDaFcsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtRQUM1QyxJQUFJLElBQUksQ0FBQ3FWLElBQUksQ0FBQ3JWLENBQUMsQ0FBQyxJQUFJa1gsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUNsQ3pCLE9BQU8sQ0FBQzJCLFVBQVUsQ0FBQyxFQUFFO1FBQ3pCLENBQUMsTUFBTTtVQUNILElBQUlBLFVBQVUsS0FBSzNCLE9BQU8sQ0FBQ3BXLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsSUFBSWdYLFVBQVUsRUFBRTtjQUNaLElBQUksQ0FBQ21HLFFBQVEsQ0FBQy9HLE9BQU8sRUFBRVksVUFBVSxDQUFDO1lBQ3RDO1lBQ0EsS0FBSyxJQUFJWCxJQUFJLEdBQUcsQ0FBQyxFQUFFQSxJQUFJLEdBQUcsSUFBSSxDQUFDcUMsWUFBWSxDQUFDMVksTUFBTSxFQUFFcVcsSUFBSSxFQUFFLEVBQUU7Y0FDeEQsSUFBTUcsS0FBSyxHQUFHLElBQUksQ0FBQ0wsYUFBYSxDQUFDQyxPQUFPLEVBQUUsSUFBSSxDQUFDc0MsWUFBWSxDQUFDckMsSUFBSSxDQUFDLENBQUM7Y0FDbEUsSUFBSUcsS0FBSyxHQUFHK0MsU0FBUyxDQUFDL0MsS0FBSyxFQUFFO2dCQUN6QitDLFNBQVMsQ0FBQ2xELElBQUksR0FBR0EsSUFBSTtnQkFDckJrRCxTQUFTLENBQUMvQyxLQUFLLEdBQUdBLEtBQUs7Y0FDM0I7WUFDSjtZQUNBK0MsU0FBUyxDQUFDcFQsR0FBRyxHQUFHeEYsQ0FBQztZQUNqQixJQUFJNFksU0FBUyxDQUFDbEQsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJa0QsU0FBUyxDQUFDL0MsS0FBSyxHQUFHLElBQUksQ0FBQ2lELGNBQWMsRUFBRTtjQUNoRSxPQUFPLElBQUk7WUFDZjtZQUNBLElBQUksSUFBSSxDQUFDZixZQUFZLENBQUNhLFNBQVMsQ0FBQ2xELElBQUksQ0FBQyxFQUFFO2NBQ25Da0QsU0FBUyxDQUFDdkMsVUFBVSxDQUFDd0YsR0FBRyxHQUFHLElBQUksQ0FBQ1ksbUJBQW1CLENBQy9DLElBQUksQ0FBQzFFLFlBQVksQ0FBQ2EsU0FBUyxDQUFDbEQsSUFBSSxDQUFDLEVBQUVELE9BQU8sRUFDMUMsSUFBSSxDQUFDaUgsY0FBYyxDQUFDYixHQUFHLENBQUM7Y0FDNUJqRCxTQUFTLENBQUN2QyxVQUFVLENBQUNvRixLQUFLLEdBQUcsSUFBSSxDQUFDZ0IsbUJBQW1CLENBQ2pELElBQUksQ0FBQzFFLFlBQVksQ0FBQ2EsU0FBUyxDQUFDbEQsSUFBSSxDQUFDLEVBQUVELE9BQU8sRUFDMUMsSUFBSSxDQUFDaUgsY0FBYyxDQUFDakIsS0FBSyxDQUFDO1lBQ2xDO1lBQ0EsT0FBTzdDLFNBQVM7VUFDcEIsQ0FBQyxNQUFNO1lBQ0h4QixVQUFVLEVBQUU7VUFDaEI7VUFDQTNCLE9BQU8sQ0FBQzJCLFVBQVUsQ0FBQyxHQUFHLENBQUM7VUFDdkJGLE9BQU8sR0FBRyxDQUFDQSxPQUFPO1FBQ3RCO01BQ0o7TUFDQSxPQUFPLElBQUk7SUFDZjtFQUFDO0lBQUF0SCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVME4sUUFBUUEsQ0FBQy9HLE9BQXNCLEVBQUVZLFVBQTZCLEVBQUU7TUFDdEUsSUFBSSxDQUFDRCxZQUFZLENBQUNYLE9BQU8sRUFBRVksVUFBVSxDQUFDd0YsR0FBRyxFQUFFLElBQUksQ0FBQ2EsY0FBYyxDQUFDYixHQUFHLENBQUM7TUFDbkUsSUFBSSxDQUFDekYsWUFBWSxDQUFDWCxPQUFPLEVBQUVZLFVBQVUsQ0FBQ29GLEtBQUssRUFBRSxJQUFJLENBQUNpQixjQUFjLENBQUNqQixLQUFLLENBQUM7SUFDM0U7RUFBQztJQUFBN0wsR0FBQTtJQUFBZCxLQUFBO0lBRUQ7SUFDQSxTQUFVaUssVUFBVUEsQ0FBQSxFQUF1QjtNQUN2QyxJQUFNdEQsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7TUFDbEMsSUFBTTdLLE1BQU0sR0FBRyxJQUFJLENBQUN1TCxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLENBQUM7TUFDdkMsSUFBTXVELFNBQVMsR0FBRztRQUNkL0MsS0FBSyxFQUFFN0wsTUFBTSxDQUFDQyxTQUFTO1FBQ3ZCeUwsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNSSCxLQUFLLEVBQUUsQ0FBQztRQUNSL1AsR0FBRyxFQUFFLENBQUM7UUFDTjZRLFVBQVUsRUFBRTtVQUNSd0YsR0FBRyxFQUFFLENBQUM7VUFDTkosS0FBSyxFQUFFO1FBQ1g7TUFDSixDQUFDO01BQ0QsSUFBSXZFLE9BQU8sR0FBRyxLQUFLO01BQ25CLElBQUlFLFVBQVUsR0FBRyxDQUFDO01BRWxCLEtBQUssSUFBSXBYLENBQUMsR0FBRzRLLE1BQU0sRUFBRTVLLENBQUMsR0FBRyxJQUFJLENBQUNxVixJQUFJLENBQUNoVyxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQzVDLElBQUksSUFBSSxDQUFDcVYsSUFBSSxDQUFDclYsQ0FBQyxDQUFDLElBQUlrWCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1VBQ2xDekIsT0FBTyxDQUFDMkIsVUFBVSxDQUFDLEVBQUU7UUFDekIsQ0FBQyxNQUFNO1VBQ0gsSUFBSUEsVUFBVSxLQUFLM0IsT0FBTyxDQUFDcFcsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFNaUMsR0FBRyxHQUFHbVUsT0FBTyxDQUFDbFYsTUFBTSxDQUFDLFVBQUNVLElBQUksRUFBRUMsSUFBSTtjQUFBLE9BQUtELElBQUksR0FBR0MsSUFBSTtZQUFBLEdBQUUsQ0FBQyxDQUFDO1lBQzFELEtBQUssSUFBSXdVLElBQUksR0FBRyxJQUFJLENBQUNpSCxZQUFZLEVBQUVqSCxJQUFJLElBQUksSUFBSSxDQUFDa0gsWUFBWSxFQUFFbEgsSUFBSSxFQUFFLEVBQUU7Y0FDbEUsSUFBTUcsS0FBSyxHQUFHLElBQUksQ0FBQ0wsYUFBYSxDQUFDQyxPQUFPLEVBQUUsSUFBSSxDQUFDc0MsWUFBWSxDQUFDckMsSUFBSSxDQUFDLENBQUM7Y0FDbEUsSUFBSUcsS0FBSyxHQUFHK0MsU0FBUyxDQUFDL0MsS0FBSyxFQUFFO2dCQUN6QitDLFNBQVMsQ0FBQ2xELElBQUksR0FBR0EsSUFBSTtnQkFDckJrRCxTQUFTLENBQUMvQyxLQUFLLEdBQUdBLEtBQUs7Y0FDM0I7WUFDSjtZQUNBLElBQUkrQyxTQUFTLENBQUMvQyxLQUFLLEdBQUcsSUFBSSxDQUFDaUQsY0FBYyxFQUFFO2NBQ3ZDRixTQUFTLENBQUNyRCxLQUFLLEdBQUd2VixDQUFDLEdBQUdzQixHQUFHO2NBQ3pCc1gsU0FBUyxDQUFDcFQsR0FBRyxHQUFHeEYsQ0FBQztjQUNqQjRZLFNBQVMsQ0FBQ3ZDLFVBQVUsQ0FBQ3dGLEdBQUcsR0FBRyxJQUFJLENBQUNZLG1CQUFtQixDQUMvQyxJQUFJLENBQUMxRSxZQUFZLENBQUNhLFNBQVMsQ0FBQ2xELElBQUksQ0FBQyxFQUFFRCxPQUFPLEVBQzFDLElBQUksQ0FBQ2lILGNBQWMsQ0FBQ2IsR0FBRyxDQUFDO2NBQzVCakQsU0FBUyxDQUFDdkMsVUFBVSxDQUFDb0YsS0FBSyxHQUFHLElBQUksQ0FBQ2dCLG1CQUFtQixDQUNqRCxJQUFJLENBQUMxRSxZQUFZLENBQUNhLFNBQVMsQ0FBQ2xELElBQUksQ0FBQyxFQUFFRCxPQUFPLEVBQzFDLElBQUksQ0FBQ2lILGNBQWMsQ0FBQ2pCLEtBQUssQ0FBQztjQUM5QixPQUFPN0MsU0FBUztZQUNwQjtZQUVBLEtBQUssSUFBSTNZLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsRUFBRSxFQUFFO2NBQ3hCd1YsT0FBTyxDQUFDeFYsQ0FBQyxDQUFDLEdBQUd3VixPQUFPLENBQUN4VixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CO1lBQ0F3VixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNkQSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNkMkIsVUFBVSxFQUFFO1VBQ2hCLENBQUMsTUFBTTtZQUNIQSxVQUFVLEVBQUU7VUFDaEI7VUFDQTNCLE9BQU8sQ0FBQzJCLFVBQVUsQ0FBQyxHQUFHLENBQUM7VUFDdkJGLE9BQU8sR0FBRyxDQUFDQSxPQUFPO1FBQ3RCO01BQ0o7TUFDQSxPQUFPLElBQUk7SUFDZjtFQUFDO0lBQUF0SCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFPMkgsTUFBTUEsQ0FBQy9WLEdBQW1CLEVBQUU2VSxLQUF1QixFQUFrQjtNQUFBLElBQUFzSCxNQUFBO01BQ3hFLElBQU03RCxTQUFTLEdBQUcsSUFBSSxDQUFDRCxVQUFVLENBQUMsQ0FBQztNQUNuQyxJQUFJQyxTQUFTLEtBQUssSUFBSSxFQUFFO1FBQ3BCLE9BQU8sSUFBSTtNQUNmO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTs7TUFFQSxJQUFJdEQsSUFBd0IsR0FBRztRQUMzQkEsSUFBSSxFQUFFc0QsU0FBUyxDQUFDdEQsSUFBSTtRQUNwQkgsS0FBSyxFQUFFeUQsU0FBUyxDQUFDekQsS0FBSztRQUN0Qi9QLEdBQUcsRUFBRXdULFNBQVMsQ0FBQ3hULEdBQUc7UUFDbEI2USxVQUFVLEVBQUU7VUFDUndGLEdBQUcsRUFBRTdDLFNBQVMsQ0FBQzNDLFVBQVUsQ0FBRXdGLEdBQUc7VUFDOUJKLEtBQUssRUFBRXpDLFNBQVMsQ0FBQzNDLFVBQVUsQ0FBRW9GO1FBQ2pDO01BQ0osQ0FBQztNQUNELElBQU0vQixZQUFZLEdBQUcsRUFBRTtNQUN2QkEsWUFBWSxDQUFDN1ksSUFBSSxDQUFDNlUsSUFBSSxDQUFDO01BQ3ZCLElBQUlvSCxRQUFRLEdBQUdwSCxJQUFJLENBQUNBLElBQUk7TUFDeEIsSUFBSXFILE9BQU8sR0FBSSxVQUFDL1AsQ0FBUyxFQUFLO1FBQzFCLFFBQVFBLENBQUM7VUFDTCxLQUFLNlAsTUFBSSxDQUFDRixZQUFZO1lBQ2xCLE9BQU9FLE1BQUksQ0FBQ0csTUFBTTtVQUN0QixLQUFLSCxNQUFJLENBQUNJLFlBQVk7WUFDbEIsT0FBT0osTUFBSSxDQUFDSyxNQUFNO1VBQ3RCLEtBQUtMLE1BQUksQ0FBQ0QsWUFBWTtZQUNsQixPQUFPQyxNQUFJLENBQUNNLE1BQU07VUFDdEI7WUFDSSxPQUFPLElBQUk7UUFDbkI7TUFDSixDQUFDLENBQUV6SCxJQUFJLENBQUNBLElBQUksQ0FBQztNQUNiLElBQUkwSCxJQUFJLEdBQUcsS0FBSztNQUNoQixJQUFJQyxTQUFTLEdBQUcsS0FBSztNQUNyQixJQUFJN1AsT0FBTyxHQUFHNlAsU0FBUztNQUN2QixJQUFJQyxtQkFBbUIsR0FBRyxJQUFJO01BQzlCLElBQUlDLFVBQVUsR0FBRyxDQUFDO01BQ2xCLElBQUlDLFNBQXdCLEdBQUcsRUFBRTtNQUNqQyxJQUFJalcsTUFBOEIsR0FBRyxFQUFFLENBQUMsQ0FBQzs7TUFFekMsT0FBTyxDQUFDNlYsSUFBSSxFQUFFO1FBQ1Y1UCxPQUFPLEdBQUc2UCxTQUFTO1FBQ25CQSxTQUFTLEdBQUcsS0FBSztRQUNqQjNILElBQUksR0FBRyxJQUFJLENBQUM4RCxXQUFXLENBQUM5RCxJQUFJLENBQUVsUSxHQUFHLEVBQUVrUSxJQUFJLENBQUVXLFVBQVUsQ0FBQztRQUNwRCxJQUFJWCxJQUFJLEtBQUssSUFBSSxFQUFFO1VBQ2YsSUFBSUEsSUFBSSxDQUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDK0gsU0FBUyxFQUFFO1lBQzlCSCxtQkFBbUIsR0FBRyxJQUFJO1VBQzlCO1VBRUEsSUFBSTVILElBQUksQ0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQytILFNBQVMsRUFBRTtZQUM5QkQsU0FBUyxDQUFDM2MsSUFBSSxDQUFDNlUsSUFBSSxDQUFDQSxJQUFJLENBQUM7WUFDekI2SCxVQUFVLEVBQUU7WUFDWlQsUUFBUSxJQUFJUyxVQUFVLEdBQUc3SCxJQUFJLENBQUNBLElBQUk7VUFDdEM7VUFDQWdFLFlBQVksQ0FBQzdZLElBQUksQ0FBQzZVLElBQUksQ0FBQztVQUV2QixRQUFRcUgsT0FBTztZQUNmLEtBQUssSUFBSSxDQUFDQyxNQUFNO2NBQ1osSUFBSXRILElBQUksQ0FBQ0EsSUFBSSxHQUFHLEVBQUUsRUFBRTtnQkFDaEJuTyxNQUFNLENBQUMxRyxJQUFJLENBQUNrYSxNQUFNLENBQUNDLFlBQVksQ0FBQyxFQUFFLEdBQUd0RixJQUFJLENBQUNBLElBQUksQ0FBQyxDQUFDO2NBQ3BELENBQUMsTUFBTSxJQUFJQSxJQUFJLENBQUNBLElBQUksR0FBRyxFQUFFLEVBQUU7Z0JBQ3ZCbk8sTUFBTSxDQUFDMUcsSUFBSSxDQUFDa2EsTUFBTSxDQUFDQyxZQUFZLENBQUN0RixJQUFJLENBQUNBLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztjQUNwRCxDQUFDLE1BQU07Z0JBQ0gsSUFBSUEsSUFBSSxDQUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDK0gsU0FBUyxFQUFFO2tCQUM5QkgsbUJBQW1CLEdBQUcsS0FBSztnQkFDL0I7Z0JBQ0EsUUFBUTVILElBQUksQ0FBQ0EsSUFBSTtrQkFDakIsS0FBSyxJQUFJLENBQUNnSSxVQUFVO29CQUNoQkwsU0FBUyxHQUFHLElBQUk7b0JBQ2hCTixPQUFPLEdBQUcsSUFBSSxDQUFDRyxNQUFNO29CQUNyQjtrQkFDSixLQUFLLElBQUksQ0FBQ0EsTUFBTTtvQkFDWkgsT0FBTyxHQUFHLElBQUksQ0FBQ0csTUFBTTtvQkFDckI7a0JBQ0osS0FBSyxJQUFJLENBQUNDLE1BQU07b0JBQ1pKLE9BQU8sR0FBRyxJQUFJLENBQUNJLE1BQU07b0JBQ3JCO2tCQUNKLEtBQUssSUFBSSxDQUFDTSxTQUFTO29CQUNmTCxJQUFJLEdBQUcsSUFBSTtvQkFDWDtnQkFDSjtjQUNKO2NBQ0E7WUFDSixLQUFLLElBQUksQ0FBQ0YsTUFBTTtjQUNaLElBQUl4SCxJQUFJLENBQUNBLElBQUksR0FBRyxFQUFFLEVBQUU7Z0JBQ2hCbk8sTUFBTSxDQUFDMUcsSUFBSSxDQUFDa2EsTUFBTSxDQUFDQyxZQUFZLENBQUMsRUFBRSxHQUFHdEYsSUFBSSxDQUFDQSxJQUFJLENBQUMsQ0FBQztjQUNwRCxDQUFDLE1BQU07Z0JBQ0gsSUFBSUEsSUFBSSxDQUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDK0gsU0FBUyxFQUFFO2tCQUM5QkgsbUJBQW1CLEdBQUcsS0FBSztnQkFDL0I7Z0JBQ0EsUUFBUTVILElBQUksQ0FBQ0EsSUFBSTtrQkFDYixLQUFLLElBQUksQ0FBQ2dJLFVBQVU7b0JBQ2hCTCxTQUFTLEdBQUcsSUFBSTtvQkFDaEJOLE9BQU8sR0FBRyxJQUFJLENBQUNDLE1BQU07b0JBQ3JCO2tCQUNKLEtBQUssSUFBSSxDQUFDQSxNQUFNO29CQUNaRCxPQUFPLEdBQUcsSUFBSSxDQUFDQyxNQUFNO29CQUNyQjtrQkFDSixLQUFLLElBQUksQ0FBQ0csTUFBTTtvQkFDWkosT0FBTyxHQUFHLElBQUksQ0FBQ0ksTUFBTTtvQkFDckI7a0JBQ0osS0FBSyxJQUFJLENBQUNNLFNBQVM7b0JBQ2ZMLElBQUksR0FBRyxJQUFJO29CQUNYO2dCQUNSO2NBQ0o7Y0FDQTtZQUNKLEtBQUssSUFBSSxDQUFDRCxNQUFNO2NBQ1osSUFBSXpILElBQUksQ0FBQ0EsSUFBSSxHQUFHLEdBQUcsRUFBRTtnQkFDakJuTyxNQUFNLENBQUMxRyxJQUFJLENBQUM2VSxJQUFJLENBQUNBLElBQUksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHQSxJQUFJLENBQUNBLElBQUksR0FBR0EsSUFBSSxDQUFDQSxJQUFJLENBQUM7Y0FDN0QsQ0FBQyxNQUFNO2dCQUNILElBQUlBLElBQUksQ0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQytILFNBQVMsRUFBRTtrQkFDOUJILG1CQUFtQixHQUFHLEtBQUs7Z0JBQy9CO2dCQUNBLFFBQVE1SCxJQUFJLENBQUNBLElBQUk7a0JBQ2pCLEtBQUssSUFBSSxDQUFDc0gsTUFBTTtvQkFDWkQsT0FBTyxHQUFHLElBQUksQ0FBQ0MsTUFBTTtvQkFDckI7a0JBQ0osS0FBSyxJQUFJLENBQUNFLE1BQU07b0JBQ1pILE9BQU8sR0FBRyxJQUFJLENBQUNHLE1BQU07b0JBQ3JCO2tCQUNKLEtBQUssSUFBSSxDQUFDTyxTQUFTO29CQUNmTCxJQUFJLEdBQUcsSUFBSTtvQkFDWDtnQkFDSjtjQUNKO2NBQ0E7VUFDSjtRQUNKLENBQUMsTUFBTTtVQUNIQSxJQUFJLEdBQUcsSUFBSTtRQUNmO1FBQ0EsSUFBSTVQLE9BQU8sRUFBRTtVQUNUdVAsT0FBTyxHQUFHQSxPQUFPLEtBQUssSUFBSSxDQUFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDRixNQUFNO1FBQ2pFO01BQ0o7TUFFQSxJQUFJdEgsSUFBSSxLQUFLLElBQUksRUFBRTtRQUNmLE9BQU8sSUFBSTtNQUNmO01BRUFBLElBQUksQ0FBQ2xRLEdBQUcsR0FBRyxJQUFJLENBQUM4UCxVQUFVLENBQUMsSUFBSSxDQUFDRCxJQUFJLEVBQUVLLElBQUksQ0FBQ2xRLEdBQUcsQ0FBQztNQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDMlQseUJBQXlCLENBQUN6RCxJQUFJLENBQUMsRUFBQztRQUN0QyxPQUFPLElBQUk7TUFDZjtNQUVBb0gsUUFBUSxJQUFJUyxVQUFVLEdBQUdDLFNBQVMsQ0FBQ0EsU0FBUyxDQUFDbmUsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUN4RCxJQUFJeWQsUUFBUSxHQUFHLEdBQUcsS0FBS1UsU0FBUyxDQUFDQSxTQUFTLENBQUNuZSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDcEQsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFJLENBQUNrSSxNQUFNLENBQUNsSSxNQUFNLEVBQUU7UUFDaEIsT0FBTyxJQUFJO01BQ2Y7O01BRUE7TUFDQSxJQUFJaWUsbUJBQW1CLEVBQUU7UUFDckIvVixNQUFNLENBQUNvVyxNQUFNLENBQUNwVyxNQUFNLENBQUNsSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztNQUN2QztNQUdBLE9BQU87UUFDSHFXLElBQUksRUFBRW5PLE1BQU0sQ0FBQzNHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIyVSxLQUFLLEVBQUV5RCxTQUFTLENBQUN6RCxLQUFLO1FBQ3RCL1AsR0FBRyxFQUFFa1EsSUFBSSxDQUFDbFEsR0FBRztRQUNidVgsT0FBTyxFQUFFQSxPQUFpQjtRQUMxQi9ELFNBQVMsRUFBRUEsU0FBUztRQUNwQlUsWUFBWSxFQUFFQSxZQUFZO1FBQzFCTixPQUFPLEVBQUUxRCxJQUFJO1FBQ2JvQixNQUFNLEVBQUUsSUFBSSxDQUFDQztNQUNqQixDQUFDO0lBQ0w7RUFBQztJQUFBbkgsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXFLLHlCQUF5QkEsQ0FBQ0MsT0FBb0IsRUFBc0I7TUFFMUUsSUFBSXdFLElBQUksR0FBRyxJQUFJO1FBQ1h2RSxxQkFBcUI7TUFFekJBLHFCQUFxQixHQUFHRCxPQUFPLENBQUM1VCxHQUFHLEdBQUksQ0FBQzRULE9BQU8sQ0FBQzVULEdBQUcsR0FBRzRULE9BQU8sQ0FBQzdELEtBQUssSUFBSSxDQUFFO01BQ3pFLElBQUk4RCxxQkFBcUIsR0FBR3VFLElBQUksQ0FBQ3ZJLElBQUksQ0FBQ2hXLE1BQU0sRUFBRTtRQUMxQyxJQUFJdWUsSUFBSSxDQUFDNUcsV0FBVyxDQUFDb0MsT0FBTyxDQUFDNVQsR0FBRyxFQUFFNlQscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7VUFDekQsT0FBT0QsT0FBTztRQUNsQjtNQUNKO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBeEosR0FBQTtJQUFBZCxLQUFBLEVBR0QsU0FBTzJOLG1CQUFtQkEsQ0FBQ29CLFFBQStCLEVBQUVDLFVBQWlDLEVBQUV4SCxPQUE4QixFQUFVO01BQ25JLElBQUlqWCxNQUFNLEdBQUdpWCxPQUFPLENBQUNqWCxNQUFNO1FBQ3ZCMGUsYUFBYSxHQUFHLENBQUM7UUFDakJDLFdBQVcsR0FBRyxDQUFDO01BRW5CLE9BQU8zZSxNQUFNLEVBQUUsRUFBRTtRQUNiMmUsV0FBVyxJQUFJSCxRQUFRLENBQUN2SCxPQUFPLENBQUNqWCxNQUFNLENBQUMsQ0FBQztRQUN4QzBlLGFBQWEsSUFBSUQsVUFBVSxDQUFDeEgsT0FBTyxDQUFDalgsTUFBTSxDQUFDLENBQUM7TUFDaEQ7TUFDQSxPQUFPMmUsV0FBVyxHQUFHRCxhQUFhO0lBQ3RDO0VBQUM7QUFBQSxFQTlidUI1SSxjQUFhO0FBaWMxQm9ILGlGQUFhLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuYzVCO0FBQ2lEO0FBQ29DO0FBRXJGLElBQU0wQixnQkFBZ0IsR0FBRyw4Q0FBOEM7QUFDdkUsSUFBTXBFLHVCQUFRLEdBQUcsSUFBSXFFLFdBQVcsQ0FBQ0MsMkJBQUEsQ0FBSUYsZ0JBQWdCLEVBQUVHLEdBQUcsQ0FBQyxVQUFDaEQsS0FBSTtFQUFBLE9BQUtBLEtBQUksQ0FBQ0UsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUFBLEVBQUMsQ0FBQztBQUN6RixJQUFNeEIsa0NBQW1CLEdBQUcsSUFBSW9FLFdBQVcsQ0FBQyxDQUN4QyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFDbEYsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUM5RyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQ2pILENBQUM7QUFDRixJQUFNRyxRQUFRLEdBQUcsS0FBSztBQUFDLElBRWpCQywyQkFBWSwwQkFBQXBHLGNBQUE7RUFBQSxTQUFBb0csYUFBQTtJQUFBLElBQUFuRyxLQUFBO0lBQUEzSCx3QkFBQSxPQUFBOE4sWUFBQTtJQUFBLFNBQUFsRyxJQUFBLEdBQUFoWixTQUFBLENBQUFDLE1BQUEsRUFBQWdaLElBQUEsT0FBQUMsS0FBQSxDQUFBRixJQUFBLEdBQUFHLElBQUEsTUFBQUEsSUFBQSxHQUFBSCxJQUFBLEVBQUFHLElBQUE7TUFBQUYsSUFBQSxDQUFBRSxJQUFBLElBQUFuWixTQUFBLENBQUFtWixJQUFBO0lBQUE7SUFBQUosS0FBQSxHQUFBSyx3QkFBQSxPQUFBOEYsWUFBQSxLQUFBM2QsTUFBQSxDQUFBMFgsSUFBQTtJQUFBNUgsd0JBQUEsQ0FBQTBILEtBQUEsWUFDTCxTQUFTO0lBQUEsT0FBQUEsS0FBQTtFQUFBO0VBQUFNLGtCQUFBLENBQUE2RixZQUFBLEVBQUFwRyxjQUFBO0VBQUEsT0FBQXhILHFCQUFBLENBQUE0TixZQUFBO0lBQUExTyxHQUFBO0lBQUFkLEtBQUEsRUFFbEIsU0FBVWlLLFVBQVVBLENBQUEsRUFBMkI7TUFDM0MsSUFBTW5PLE1BQU0sR0FBRyxJQUFJLENBQUN1TCxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLENBQUM7TUFDdkMsSUFBSWtKLFlBQVksR0FBRzNULE1BQU07TUFDekIsSUFBTTZLLE9BQU8sR0FBRyxJQUFJeUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUM1RCxJQUFJOUcsVUFBVSxHQUFHLENBQUM7TUFDbEIsSUFBSUYsT0FBTyxHQUFHLEtBQUs7TUFFbkIsS0FBSyxJQUFJbFgsQ0FBQyxHQUFHNEssTUFBTSxFQUFFNUssQ0FBQyxHQUFHLElBQUksQ0FBQ3FWLElBQUksQ0FBQ2hXLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7UUFDNUM7UUFDQSxJQUFJLElBQUksQ0FBQ3FWLElBQUksQ0FBQ3JWLENBQUMsQ0FBQyxJQUFJa1gsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUNsQ3pCLE9BQU8sQ0FBQzJCLFVBQVUsQ0FBQyxFQUFFO1FBQ3pCLENBQUMsTUFBTTtVQUNILElBQUlBLFVBQVUsS0FBSzNCLE9BQU8sQ0FBQ3BXLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkM7WUFDQSxJQUFJLElBQUksQ0FBQ2liLFVBQVUsQ0FBQzdFLE9BQU8sQ0FBQyxLQUFLNEksUUFBUSxFQUFFO2NBQ3ZDLElBQU1HLG1CQUFtQixHQUFHbGdCLElBQUksQ0FBQzRCLEtBQUssQ0FBQzVCLElBQUksQ0FBQytDLEdBQUcsQ0FBQyxDQUFDLEVBQUVrZCxZQUFZLEdBQUksQ0FBQ3ZlLENBQUMsR0FBR3VlLFlBQVksSUFBSSxDQUFFLENBQUMsQ0FBQztjQUM1RixJQUFJLElBQUksQ0FBQ3ZILFdBQVcsQ0FBQ3dILG1CQUFtQixFQUFFRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hELE9BQU87a0JBQ0hoSixLQUFLLEVBQUVnSixZQUFZO2tCQUNuQi9ZLEdBQUcsRUFBRXhGO2dCQUNULENBQUM7Y0FDTDtZQUNKO1lBRUF1ZSxZQUFZLElBQUk5SSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUdBLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSyxJQUFJeFYsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxFQUFFLEVBQUU7Y0FDeEJ3VixPQUFPLENBQUN4VixDQUFDLENBQUMsR0FBR3dWLE9BQU8sQ0FBQ3hWLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0I7WUFDQXdWLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2RBLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2QyQixVQUFVLEVBQUU7VUFDaEIsQ0FBQyxNQUFNO1lBQ0hBLFVBQVUsRUFBRTtVQUNoQjtVQUNBM0IsT0FBTyxDQUFDMkIsVUFBVSxDQUFDLEdBQUcsQ0FBQztVQUN2QkYsT0FBTyxHQUFHLENBQUNBLE9BQU87UUFDdEI7TUFDSjtNQUNBLE9BQU8sSUFBSTtJQUNmO0VBQUM7SUFBQXRILEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVV3TCxVQUFVQSxDQUFDbkQsUUFBcUIsRUFBVTtNQUNoRCxJQUFNRyxXQUFXLEdBQUdILFFBQVEsQ0FBQzlYLE1BQU07TUFDbkMsSUFBSW9mLGNBQWMsR0FBRyxDQUFDO01BQ3RCLElBQUlDLFdBQVcsR0FBR3BILFdBQVc7TUFDN0IsSUFBSXFILFlBQVksR0FBRyxDQUFDO01BRXBCLE9BQU9ELFdBQVcsR0FBRyxDQUFDLEVBQUU7UUFDcEJELGNBQWMsR0FBRyxJQUFJLENBQUNHLGNBQWMsQ0FBQ3pILFFBQVEsRUFBRXNILGNBQWMsQ0FBQztRQUM5REMsV0FBVyxHQUFHLENBQUM7UUFDZixJQUFJbEksT0FBTyxHQUFHLENBQUM7UUFDZixLQUFLLElBQUl4VyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdzWCxXQUFXLEVBQUV0WCxDQUFDLEVBQUUsRUFBRTtVQUNsQyxJQUFJbVgsUUFBUSxDQUFDblgsQ0FBQyxDQUFDLEdBQUd5ZSxjQUFjLEVBQUU7WUFDOUI7WUFDQWpJLE9BQU8sSUFBSSxDQUFDLElBQUtjLFdBQVcsR0FBRyxDQUFDLEdBQUd0WCxDQUFFO1lBQ3JDMGUsV0FBVyxFQUFFO1lBQ2JDLFlBQVksSUFBSXhILFFBQVEsQ0FBQ25YLENBQUMsQ0FBQztVQUMvQjtRQUNKO1FBRUEsSUFBSTBlLFdBQVcsS0FBSyxDQUFDLEVBQUU7VUFDbkIsS0FBSyxJQUFJMWUsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxHQUFHc1gsV0FBVyxJQUFJb0gsV0FBVyxHQUFHLENBQUMsRUFBRTFlLEVBQUMsRUFBRSxFQUFFO1lBQ3JELElBQUltWCxRQUFRLENBQUNuWCxFQUFDLENBQUMsR0FBR3llLGNBQWMsRUFBRTtjQUM5QkMsV0FBVyxFQUFFO2NBQ2IsSUFBS3ZILFFBQVEsQ0FBQ25YLEVBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSzJlLFlBQVksRUFBRTtnQkFDbkMsT0FBTyxDQUFDLENBQUM7Y0FDYjtZQUNKO1VBQ0o7VUFDQSxPQUFPbkksT0FBTztRQUNsQjtNQUNKO01BQ0EsT0FBTyxDQUFDLENBQUM7SUFDYjtFQUFDO0lBQUE1RyxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVOFAsY0FBY0EsQ0FBQ3pILFFBQXFCLEVBQUVoRSxPQUFlLEVBQVU7TUFDckUsSUFBSTBMLFFBQVEsR0FBRzdVLE1BQU0sQ0FBQ0MsU0FBUztNQUUvQixLQUFLLElBQUlqSyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdtWCxRQUFRLENBQUM5WCxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQ3RDLElBQUltWCxRQUFRLENBQUNuWCxDQUFDLENBQUMsR0FBRzZlLFFBQVEsSUFBSTFILFFBQVEsQ0FBQ25YLENBQUMsQ0FBQyxHQUFHbVQsT0FBTyxFQUFFO1VBQ2pEMEwsUUFBUSxHQUFHMUgsUUFBUSxDQUFDblgsQ0FBQyxDQUFDO1FBQzFCO01BQ0o7TUFFQSxPQUFPNmUsUUFBUTtJQUNuQjtFQUFDO0lBQUFqUCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVZ00sY0FBY0EsQ0FBQ3RFLE9BQWUsRUFBaUI7TUFDckQsS0FBSyxJQUFJeFcsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHOFosa0NBQW1CLENBQUN6YSxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQ2pELElBQUk4WixrQ0FBbUIsQ0FBQzlaLENBQUMsQ0FBQyxLQUFLd1csT0FBTyxFQUFFO1VBQ3BDLE9BQU91RSxNQUFNLENBQUNDLFlBQVksQ0FBQ25CLHVCQUFRLENBQUM3WixDQUFDLENBQUMsQ0FBQztRQUMzQztNQUNKO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBNFAsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXFLLHlCQUF5QkEsQ0FBQzJGLFNBQWlCLEVBQUV6QyxTQUFpQixFQUFFbEYsUUFBcUIsRUFBVztNQUN0RyxJQUFNNEgsV0FBVyxHQUFHNVksWUFBVyxDQUFDN0UsR0FBRyxDQUFDNlYsUUFBUSxDQUFDO01BRTdDLElBQU1rQyxxQkFBcUIsR0FBR2dELFNBQVMsR0FBR3lDLFNBQVMsR0FBR0MsV0FBVztNQUNqRSxJQUFLMUYscUJBQXFCLEdBQUcsQ0FBQyxJQUFLMEYsV0FBVyxFQUFFO1FBQzVDLE9BQU8sSUFBSTtNQUNmO01BQ0EsT0FBTyxLQUFLO0lBQ2hCO0VBQUM7SUFBQW5QLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQU8ySCxNQUFNQSxDQUFBLEVBQW1CO01BQzVCLElBQUlVLFFBQVEsR0FBRyxJQUFJK0csV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMzRCxJQUFNM1csTUFBcUIsR0FBRyxFQUFFO01BQ2hDLElBQU1nTyxLQUFLLEdBQUcsSUFBSSxDQUFDd0QsVUFBVSxDQUFDLENBQUM7TUFFL0IsSUFBSSxDQUFDeEQsS0FBSyxFQUFFO1FBQ1IsT0FBTyxJQUFJO01BQ2Y7TUFDQSxJQUFJOEcsU0FBUyxHQUFHLElBQUksQ0FBQ2xHLFFBQVEsQ0FBQyxJQUFJLENBQUNkLElBQUksRUFBRUUsS0FBSyxDQUFDL1AsR0FBRyxDQUFDO01BRW5ELElBQUk4VyxXQUFXO01BQ2YsSUFBSXdDLFNBQWlCO01BQ3JCLEdBQUc7UUFDQzNILFFBQVEsR0FBRyxJQUFJLENBQUNFLFdBQVcsQ0FBQ2dGLFNBQVMsRUFBRWxGLFFBQVEsQ0FBNkI7UUFDNUUsSUFBTVgsT0FBTyxHQUFHLElBQUksQ0FBQzhELFVBQVUsQ0FBQ25ELFFBQVEsQ0FBQztRQUN6QyxJQUFJWCxPQUFPLEdBQUcsQ0FBQyxFQUFFO1VBQ2IsT0FBTyxJQUFJO1FBQ2Y7UUFDQThGLFdBQVcsR0FBRyxJQUFJLENBQUN4QixjQUFjLENBQUN0RSxPQUFPLENBQUM7UUFDMUMsSUFBSThGLFdBQVcsS0FBSyxJQUFJLEVBQUU7VUFDdEIsT0FBTyxJQUFJO1FBQ2Y7UUFDQS9VLE1BQU0sQ0FBQzFHLElBQUksQ0FBQ3liLFdBQVcsQ0FBQztRQUN4QndDLFNBQVMsR0FBR3pDLFNBQVM7UUFDckJBLFNBQVMsSUFBSWxXLFlBQVcsQ0FBQzdFLEdBQUcsQ0FBQzZWLFFBQVEsQ0FBQztRQUN0Q2tGLFNBQVMsR0FBRyxJQUFJLENBQUNsRyxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLEVBQUVnSCxTQUFTLENBQUM7TUFDbkQsQ0FBQyxRQUFRQyxXQUFXLEtBQUssR0FBRztNQUM1Qi9VLE1BQU0sQ0FBQ3lYLEdBQUcsQ0FBQyxDQUFDO01BRVosSUFBSSxDQUFDelgsTUFBTSxDQUFDbEksTUFBTSxFQUFFO1FBQ2hCLE9BQU8sSUFBSTtNQUNmO01BRUEsSUFBSSxDQUFDLElBQUksQ0FBQzhaLHlCQUF5QixDQUFDMkYsU0FBUyxFQUFFekMsU0FBUyxFQUFFbEYsUUFBUSxDQUFDLEVBQUU7UUFDakUsT0FBTyxJQUFJO01BQ2Y7TUFFQSxPQUFPO1FBQ0h6QixJQUFJLEVBQUVuTyxNQUFNLENBQUMzRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCMlUsS0FBSyxFQUFFQSxLQUFLLENBQUNBLEtBQUs7UUFDbEIvUCxHQUFHLEVBQUU2VyxTQUFTO1FBQ2RyRCxTQUFTLEVBQUV6RCxLQUFLO1FBQ2hCbUUsWUFBWSxFQUFFblMsTUFBTTtRQUNwQnVQLE1BQU0sRUFBRSxJQUFJLENBQUNDO01BQ2pCLENBQUM7SUFDTDtFQUFDO0FBQUEsRUExSnNCNUIsY0FBYTtBQTZKekJtSiw4RUFBWSxFOzs7Ozs7Ozs7Ozs7QUMxS2lCO0FBRTVDLElBQU1XLFFBQVEsR0FBRztFQUNiQyxJQUFJLEVBQUUsU0FBUztFQUNmQyxJQUFJLEVBQUU7QUFDVixDQUFDO0FBRUQsSUFBTUMsU0FBUyxHQUFHLGtDQUFrQztBQUFDLElBRS9DQywyQkFBWSwwQkFBQUMsYUFBQTtFQUFBLFNBQUFELGFBQUE7SUFBQSxJQUFBbEgsS0FBQTtJQUFBM0gsd0JBQUEsT0FBQTZPLFlBQUE7SUFBQSxTQUFBakgsSUFBQSxHQUFBaFosU0FBQSxDQUFBQyxNQUFBLEVBQUFnWixJQUFBLE9BQUFDLEtBQUEsQ0FBQUYsSUFBQSxHQUFBRyxJQUFBLE1BQUFBLElBQUEsR0FBQUgsSUFBQSxFQUFBRyxJQUFBO01BQUFGLElBQUEsQ0FBQUUsSUFBQSxJQUFBblosU0FBQSxDQUFBbVosSUFBQTtJQUFBO0lBQUFKLEtBQUEsR0FBQUssd0JBQUEsT0FBQTZHLFlBQUEsS0FBQTFlLE1BQUEsQ0FBQTBYLElBQUE7SUFBQTVILHdCQUFBLENBQUEwSCxLQUFBLFlBQ0wsZ0JBQWdCO0lBQUEsT0FBQUEsS0FBQTtFQUFBO0VBQUFNLGtCQUFBLENBQUE0RyxZQUFBLEVBQUFDLGFBQUE7RUFBQSxPQUFBNU8scUJBQUEsQ0FBQTJPLFlBQUE7SUFBQXpQLEdBQUE7SUFBQWQsS0FBQSxFQUV6QixTQUFVeVEsYUFBYUEsQ0FBQzdKLElBQVksRUFBRTtNQUNsQyxJQUFJLDhCQUE4QixDQUFDOEosSUFBSSxDQUFDOUosSUFBSSxDQUFDLEVBQUU7UUFDM0MsT0FBTyxJQUFJO01BQ2Y7TUFDQSxJQUFJK0osR0FBRyxHQUFHLENBQUM7TUFDWCxLQUFLLElBQUl6ZixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcwVixJQUFJLENBQUNyVyxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQ2xDeWYsR0FBRyxHQUFHQSxHQUFHLEdBQUcsRUFBRSxHQUFHTCxTQUFTLENBQUNsUSxPQUFPLENBQUN3RyxJQUFJLENBQUMxVixDQUFDLENBQUMsQ0FBQztNQUMvQztNQUNBLElBQUkwZixNQUFNLE1BQUEvZSxNQUFBLENBQU04ZSxHQUFHLENBQUU7TUFDckIsSUFBSUMsTUFBTSxDQUFDcmdCLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDbkJxZ0IsTUFBTSxHQUFHLENBQUMsV0FBVyxHQUFHQSxNQUFNLEVBQUVDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM3QztNQUNBLE9BQU8sR0FBRyxHQUFHRCxNQUFNO0lBQ3ZCOztJQUVBO0VBQUE7SUFBQTlQLEdBQUE7SUFBQWQsS0FBQSxFQUNBLFNBQVU4USxjQUFjQSxDQUFDbEssSUFBWSxFQUFXO01BQzVDLE9BQU8sQ0FBQyxDQUFDQSxJQUFJO0lBQ2pCO0VBQUM7SUFBQTlGLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQU8ySCxNQUFNQSxDQUFBLEVBQUc7TUFDWixJQUFNbFAsTUFBTSxHQUFBc1ksYUFBQSxDQUFBUixZQUFBLHdCQUFpQjtNQUM3QixJQUFJLENBQUM5WCxNQUFNLEVBQUU7UUFDVCxPQUFPLElBQUk7TUFDZjtNQUVBLElBQUltTyxJQUFJLEdBQUduTyxNQUFNLENBQUNtTyxJQUFJO01BRXRCLElBQUksQ0FBQ0EsSUFBSSxFQUFFO1FBQ1AsT0FBTyxJQUFJO01BQ2Y7TUFFQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNvSyxPQUFPLENBQUNiLFFBQVEsQ0FBQ0MsSUFBSSxFQUFFLEVBQUUsQ0FBQztNQUV0QyxJQUFJLENBQUMsSUFBSSxDQUFDVSxjQUFjLENBQUNsSyxJQUFJLENBQUMsRUFBRTtRQUM1QixPQUFPLElBQUk7TUFDZjtNQUVBLElBQU1nSyxNQUFNLEdBQUcsSUFBSSxDQUFDSCxhQUFhLENBQUM3SixJQUFJLENBQUM7TUFFdkMsSUFBSSxDQUFDZ0ssTUFBTSxFQUFFO1FBQ1QsT0FBTyxJQUFJO01BQ2Y7TUFFQW5ZLE1BQU0sQ0FBQ21PLElBQUksR0FBR2dLLE1BQU07TUFDcEIsT0FBT25ZLE1BQU07SUFDakI7RUFBQztBQUFBLEVBakRzQitXLGNBQVk7QUFvRHhCZSw4RUFBWSxFOzs7Ozs7Ozs7Ozs7QUM3RDNCOztBQUU0QztBQUU1QyxJQUFNSiwyQkFBUSxHQUFHO0VBQ2JjLEdBQUcsRUFBRSxRQUFRO0VBQ2JaLElBQUksRUFBRTtBQUNWLENBQUM7QUFBQyxJQUVJYSxrQ0FBZSwwQkFBQVYsYUFBQTtFQUFBLFNBQUFVLGdCQUFBO0lBQUEsSUFBQTdILEtBQUE7SUFBQTNILHdCQUFBLE9BQUF3UCxlQUFBO0lBQUEsU0FBQTVILElBQUEsR0FBQWhaLFNBQUEsQ0FBQUMsTUFBQSxFQUFBZ1osSUFBQSxPQUFBQyxLQUFBLENBQUFGLElBQUEsR0FBQUcsSUFBQSxNQUFBQSxJQUFBLEdBQUFILElBQUEsRUFBQUcsSUFBQTtNQUFBRixJQUFBLENBQUFFLElBQUEsSUFBQW5aLFNBQUEsQ0FBQW1aLElBQUE7SUFBQTtJQUFBSixLQUFBLEdBQUFLLDRCQUFBLE9BQUF3SCxlQUFBLEtBQUFyZixNQUFBLENBQUEwWCxJQUFBO0lBQUE1SCx3QkFBQSxDQUFBMEgsS0FBQSxZQUNSLGFBQWE7SUFBQSxPQUFBQSxLQUFBO0VBQUE7RUFBQU0sa0JBQUEsQ0FBQXVILGVBQUEsRUFBQVYsYUFBQTtFQUFBLE9BQUE1TyxxQkFBQSxDQUFBc1AsZUFBQTtJQUFBcFEsR0FBQTtJQUFBZCxLQUFBO0lBRXRCO0lBQ0EsU0FBVThRLGNBQWNBLENBQUNsSyxJQUFZLEVBQVc7TUFDNUMsT0FBTyxDQUFDLENBQUNBLElBQUk7SUFDakI7O0lBRUE7SUFDQTtFQUFBO0lBQUE5RixHQUFBO0lBQUFkLEtBQUEsRUFDQSxTQUFPMkgsTUFBTUEsQ0FBQSxFQUFtQjtNQUM1QixJQUFNbFAsTUFBTSxHQUFBc1ksK0JBQUEsQ0FBQUcsZUFBQSx3QkFBaUI7TUFDN0IsSUFBSSxDQUFDelksTUFBTSxFQUFFO1FBQ1QsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFNbU8sSUFBSSxHQUFLbk8sTUFBTSxDQUFmbU8sSUFBSTtNQUVWLElBQUksQ0FBQ0EsSUFBSSxFQUFFO1FBQ1AsT0FBTyxJQUFJO01BQ2Y7TUFFQUEsSUFBSSxHQUFHQSxJQUFJLENBQUNvSyxPQUFPLENBQUNiLDJCQUFRLENBQUNjLEdBQUcsRUFBRSxFQUFFLENBQUM7TUFFckMsSUFBSSxDQUFDckssSUFBSSxDQUFDMU4sS0FBSyxDQUFDaVgsMkJBQVEsQ0FBQ0UsSUFBSSxDQUFDLEVBQUU7UUFDNUIsSUFBSWMsSUFBZSxFQUFFO1VBQ2pCaFUsT0FBTyxDQUFDaVUsR0FBRyxDQUFDLDJCQUEyQixFQUFFeEssSUFBSSxDQUFDO1FBQ2xEO1FBQ0EsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDa0ssY0FBYyxDQUFDbEssSUFBSSxDQUFDLEVBQUU7UUFDNUIsT0FBTyxJQUFJO01BQ2Y7TUFFQW5PLE1BQU0sQ0FBQ21PLElBQUksR0FBR0EsSUFBSTtNQUNsQixPQUFPbk8sTUFBTTtJQUNqQjtFQUFDO0FBQUEsRUFyQ3lCK1csY0FBWTtBQXdDM0IwQix5RkFBZSxFOzs7Ozs7Ozs7OztBQ2pENkM7QUFDMUI7QUFFakQsSUFBTS9CLCtCQUFnQixHQUFHLGtEQUFrRDtBQUMzRSxJQUFNcEUsdUJBQVEsR0FBRyxJQUFJcUUsV0FBVyxDQUFDQywyQkFBQSxDQUFJRiwrQkFBZ0IsRUFBRUcsR0FBRyxDQUFDLFVBQUFoRCxLQUFJO0VBQUEsT0FBSUEsS0FBSSxDQUFDRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFBQyxDQUFDO0FBQ3ZGLElBQU14QixrQ0FBbUIsR0FBRyxJQUFJb0UsV0FBVyxDQUFDLENBQ3hDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFDcEUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUNwRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQ3BFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFDcEUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FDekQsQ0FBQztBQUNGLElBQU1HLHVCQUFRLEdBQUcsS0FBSztBQUFDLElBRWpCOEIsMkJBQVksMEJBQUFqSSxjQUFBO0VBQUEsU0FBQWlJLGFBQUE7SUFBQSxJQUFBaEksS0FBQTtJQUFBM0gsd0JBQUEsT0FBQTJQLFlBQUE7SUFBQSxTQUFBL0gsSUFBQSxHQUFBaFosU0FBQSxDQUFBQyxNQUFBLEVBQUFnWixJQUFBLE9BQUFDLEtBQUEsQ0FBQUYsSUFBQSxHQUFBRyxJQUFBLE1BQUFBLElBQUEsR0FBQUgsSUFBQSxFQUFBRyxJQUFBO01BQUFGLElBQUEsQ0FBQUUsSUFBQSxJQUFBblosU0FBQSxDQUFBbVosSUFBQTtJQUFBO0lBQUFKLEtBQUEsR0FBQUssd0JBQUEsT0FBQTJILFlBQUEsS0FBQXhmLE1BQUEsQ0FBQTBYLElBQUE7SUFBQTVILHdCQUFBLENBQUEwSCxLQUFBLFlBQ0wsU0FBUztJQUFBLE9BQUFBLEtBQUE7RUFBQTtFQUFBTSxrQkFBQSxDQUFBMEgsWUFBQSxFQUFBakksY0FBQTtFQUFBLE9BQUF4SCxxQkFBQSxDQUFBeVAsWUFBQTtJQUFBdlEsR0FBQTtJQUFBZCxLQUFBLEVBQ2xCLFNBQVVnTSxjQUFjQSxDQUFDdEUsT0FBZSxFQUFpQjtNQUNyRCxLQUFLLElBQUl4VyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUc4WixrQ0FBbUIsQ0FBQ3phLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7UUFDakQsSUFBSThaLGtDQUFtQixDQUFDOVosQ0FBQyxDQUFDLEtBQUt3VyxPQUFPLEVBQUU7VUFDcEMsT0FBT3VFLE1BQU0sQ0FBQ0MsWUFBWSxDQUFDbkIsdUJBQVEsQ0FBQzdaLENBQUMsQ0FBQyxDQUFDO1FBQzNDO01BQ0o7TUFDQSxPQUFPLElBQUk7SUFDZjtFQUFDO0lBQUE0UCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVd0wsVUFBVUEsQ0FBQ25ELFFBQXFCLEVBQVU7TUFDaEQsSUFBTUcsV0FBVyxHQUFHSCxRQUFRLENBQUM5WCxNQUFNO01BQ25DLElBQU1pQyxHQUFHLEdBQUc2VixRQUFRLENBQUM1VyxNQUFNLENBQUMsVUFBQ1UsSUFBSSxFQUFFQyxJQUFJO1FBQUEsT0FBS0QsSUFBSSxHQUFHQyxJQUFJO01BQUEsR0FBRSxDQUFDLENBQUM7TUFDM0QsSUFBSXNWLE9BQU8sR0FBRyxDQUFDO01BRWYsS0FBSyxJQUFJeFcsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHc1gsV0FBVyxFQUFFdFgsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsSUFBSThkLFVBQVUsR0FBR3hmLElBQUksQ0FBQ2lGLEtBQUssQ0FBQzRULFFBQVEsQ0FBQ25YLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBR3NCLEdBQUcsQ0FBQztRQUNsRCxJQUFJd2MsVUFBVSxHQUFHLENBQUMsSUFBSUEsVUFBVSxHQUFHLENBQUMsRUFBRTtVQUNsQyxPQUFPLENBQUMsQ0FBQztRQUNiO1FBQ0EsSUFBSSxDQUFDOWQsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7VUFDZixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzZkLFVBQVUsRUFBRTdkLENBQUMsRUFBRSxFQUFFO1lBQ2pDdVcsT0FBTyxHQUFJQSxPQUFPLElBQUksQ0FBQyxHQUFJLENBQUM7VUFDaEM7UUFDSixDQUFDLE1BQU07VUFDSEEsT0FBTyxLQUFLc0gsVUFBVTtRQUMxQjtNQUNKO01BQ0EsT0FBT3RILE9BQU87SUFDbEI7RUFBQztJQUFBNUcsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVWlLLFVBQVVBLENBQUEsRUFBMkI7TUFDM0MsSUFBTW5PLE1BQU0sR0FBRyxJQUFJLENBQUN1TCxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLENBQUM7TUFDdkMsSUFBSWtKLFlBQVksR0FBRzNULE1BQU07TUFDekIsSUFBTTZLLE9BQU8sR0FBRyxJQUFJeUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNuRCxJQUFJOUcsVUFBVSxHQUFHLENBQUM7TUFDbEIsSUFBSUYsT0FBTyxHQUFHLEtBQUs7TUFFbkIsS0FBSyxJQUFJbFgsQ0FBQyxHQUFHNEssTUFBTSxFQUFFNUssQ0FBQyxHQUFHLElBQUksQ0FBQ3FWLElBQUksQ0FBQ2hXLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7UUFDNUMsSUFBSSxJQUFJLENBQUNxVixJQUFJLENBQUNyVixDQUFDLENBQUMsSUFBSWtYLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7VUFDbEN6QixPQUFPLENBQUMyQixVQUFVLENBQUMsRUFBRTtRQUN6QixDQUFDLE1BQU07VUFDSCxJQUFJQSxVQUFVLEtBQUszQixPQUFPLENBQUNwVyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DO1lBQ0EsSUFBSSxJQUFJLENBQUNpYixVQUFVLENBQUM3RSxPQUFPLENBQUMsS0FBSzRJLHVCQUFRLEVBQUU7Y0FDdkMsSUFBTUcsbUJBQW1CLEdBQUdsZ0IsSUFBSSxDQUFDNEIsS0FBSyxDQUFDNUIsSUFBSSxDQUFDK0MsR0FBRyxDQUFDLENBQUMsRUFBRWtkLFlBQVksR0FBSSxDQUFDdmUsQ0FBQyxHQUFHdWUsWUFBWSxJQUFJLENBQUUsQ0FBQyxDQUFDO2NBQzVGLElBQUksSUFBSSxDQUFDdkgsV0FBVyxDQUFDd0gsbUJBQW1CLEVBQUVELFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDeEQsT0FBTztrQkFDSGhKLEtBQUssRUFBRWdKLFlBQVk7a0JBQ25CL1ksR0FBRyxFQUFFeEY7Z0JBQ1QsQ0FBQztjQUNMO1lBQ0o7WUFFQXVlLFlBQVksSUFBSTlJLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBR0EsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUl4VixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEVBQUUsRUFBRTtjQUN4QndWLE9BQU8sQ0FBQ3hWLENBQUMsQ0FBQyxHQUFHd1YsT0FBTyxDQUFDeFYsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQjtZQUNBd1YsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDZEEsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDZDJCLFVBQVUsRUFBRTtVQUNoQixDQUFDLE1BQU07WUFDSEEsVUFBVSxFQUFFO1VBQ2hCO1VBQ0EzQixPQUFPLENBQUMyQixVQUFVLENBQUMsR0FBRyxDQUFDO1VBQ3ZCRixPQUFPLEdBQUcsQ0FBQ0EsT0FBTztRQUN0QjtNQUNKO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBdEgsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXNSLFVBQVVBLENBQUN0QixTQUFpQixFQUFFekMsU0FBaUIsRUFBVztNQUNoRSxJQUFJeUMsU0FBUyxLQUFLekMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDaEgsSUFBSSxDQUFDZ0gsU0FBUyxDQUFDLEVBQUU7UUFDbEQsT0FBTyxLQUFLO01BQ2hCO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBek0sR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXVSLGVBQWVBLENBQUNDLFNBQXdCLEVBQW1CO01BQ2pFLElBQU1qaEIsTUFBTSxHQUFHaWhCLFNBQVMsQ0FBQ2poQixNQUFNO01BQy9CLElBQU1rSSxNQUFxQixHQUFHLEVBQUU7TUFDaEMsS0FBSyxJQUFJdkgsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHWCxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQzdCLElBQU1vYixNQUFJLEdBQUdrRixTQUFTLENBQUN0Z0IsQ0FBQyxDQUFDO1FBQ3pCLElBQUlvYixNQUFJLElBQUksR0FBRyxJQUFJQSxNQUFJLElBQUksR0FBRyxFQUFFO1VBQzVCLElBQUlwYixDQUFDLEdBQUlYLE1BQU0sR0FBRyxDQUFFLEVBQUU7WUFDbEIsT0FBTyxJQUFJO1VBQ2Y7VUFDQSxJQUFNa2hCLFFBQVEsR0FBR0QsU0FBUyxDQUFDLEVBQUV0Z0IsQ0FBQyxDQUFDO1VBQy9CLElBQU13Z0IsWUFBWSxHQUFHRCxRQUFRLENBQUNqRixVQUFVLENBQUMsQ0FBQyxDQUFDO1VBQzNDLElBQUlnQixXQUFXO1VBQ2YsUUFBUWxCLE1BQUk7WUFDUixLQUFLLEdBQUc7Y0FDSixJQUFJbUYsUUFBUSxJQUFJLEdBQUcsSUFBSUEsUUFBUSxJQUFJLEdBQUcsRUFBRTtnQkFDcENqRSxXQUFXLEdBQUd2QixNQUFNLENBQUNDLFlBQVksQ0FBQ3dGLFlBQVksR0FBRyxFQUFFLENBQUM7Y0FDeEQsQ0FBQyxNQUFNO2dCQUNILE9BQU8sSUFBSTtjQUNmO2NBQ0E7WUFDSixLQUFLLEdBQUc7Y0FDSixJQUFJRCxRQUFRLElBQUksR0FBRyxJQUFJQSxRQUFRLElBQUksR0FBRyxFQUFFO2dCQUNwQ2pFLFdBQVcsR0FBR3ZCLE1BQU0sQ0FBQ0MsWUFBWSxDQUFDd0YsWUFBWSxHQUFHLEVBQUUsQ0FBQztjQUN4RCxDQUFDLE1BQU0sSUFBSUQsUUFBUSxJQUFJLEdBQUcsSUFBSUEsUUFBUSxJQUFJLEdBQUcsRUFBRTtnQkFDM0NqRSxXQUFXLEdBQUd2QixNQUFNLENBQUNDLFlBQVksQ0FBQ3dGLFlBQVksR0FBRyxFQUFFLENBQUM7Y0FDeEQsQ0FBQyxNQUFNLElBQUlELFFBQVEsSUFBSSxHQUFHLElBQUlBLFFBQVEsSUFBSSxHQUFHLEVBQUU7Z0JBQzNDakUsV0FBVyxHQUFHdkIsTUFBTSxDQUFDQyxZQUFZLENBQUN3RixZQUFZLEdBQUcsRUFBRSxDQUFDO2NBQ3hELENBQUMsTUFBTSxJQUFJRCxRQUFRLElBQUksR0FBRyxJQUFJQSxRQUFRLElBQUksR0FBRyxFQUFFO2dCQUMzQ2pFLFdBQVcsR0FBR3ZCLE1BQU0sQ0FBQ0MsWUFBWSxDQUFDd0YsWUFBWSxHQUFHLEVBQUUsQ0FBQztjQUN4RCxDQUFDLE1BQU0sSUFBSUQsUUFBUSxJQUFJLEdBQUcsSUFBSUEsUUFBUSxJQUFJLEdBQUcsRUFBRTtnQkFDM0NqRSxXQUFXLEdBQUd2QixNQUFNLENBQUNDLFlBQVksQ0FBQyxHQUFHLENBQUM7Y0FDMUMsQ0FBQyxNQUFNO2dCQUNILE9BQU8sSUFBSTtjQUNmO2NBQ0E7WUFDSixLQUFLLEdBQUc7Y0FDSixJQUFJdUYsUUFBUSxJQUFJLEdBQUcsSUFBSUEsUUFBUSxJQUFJLEdBQUcsRUFBRTtnQkFDcENqRSxXQUFXLEdBQUd2QixNQUFNLENBQUNDLFlBQVksQ0FBQ3dGLFlBQVksR0FBRyxFQUFFLENBQUM7Y0FDeEQsQ0FBQyxNQUFNLElBQUlELFFBQVEsS0FBSyxHQUFHLEVBQUU7Z0JBQ3pCakUsV0FBVyxHQUFHLEdBQUc7Y0FDckIsQ0FBQyxNQUFNO2dCQUNILE9BQU8sSUFBSTtjQUNmO2NBQ0E7WUFDSixLQUFLLEdBQUc7Y0FDSixJQUFJaUUsUUFBUSxJQUFJLEdBQUcsSUFBSUEsUUFBUSxJQUFJLEdBQUcsRUFBRTtnQkFDcENqRSxXQUFXLEdBQUd2QixNQUFNLENBQUNDLFlBQVksQ0FBQ3dGLFlBQVksR0FBRyxFQUFFLENBQUM7Y0FDeEQsQ0FBQyxNQUFNO2dCQUNILE9BQU8sSUFBSTtjQUNmO2NBQ0E7WUFDSjtjQUNJdlUsT0FBTyxDQUFDQyxJQUFJLENBQUMseUVBQXlFLEVBQUVvUSxXQUFXLENBQUM7Y0FDcEcsT0FBTyxJQUFJO1VBQ25CO1VBQ0EvVSxNQUFNLENBQUMxRyxJQUFJLENBQUN5YixXQUFXLENBQUM7UUFDNUIsQ0FBQyxNQUFNO1VBQ0gvVSxNQUFNLENBQUMxRyxJQUFJLENBQUN1YSxNQUFJLENBQUM7UUFDckI7TUFDSjtNQUNBLE9BQU83VCxNQUFNO0lBQ2pCO0VBQUM7SUFBQXFJLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVUyUixlQUFlQSxDQUFDSCxTQUF3QixFQUFFbmhCLEtBQWEsRUFBRXVoQixTQUFpQixFQUFXO01BQzNGLElBQU1DLFlBQVksR0FBR0wsU0FBUyxDQUFDWCxLQUFLLENBQUMsQ0FBQyxFQUFFeGdCLEtBQUssQ0FBQztNQUM5QyxJQUFNRSxNQUFNLEdBQUdzaEIsWUFBWSxDQUFDdGhCLE1BQU07TUFDbEMsSUFBTXVoQixZQUFZLEdBQUdELFlBQVksQ0FBQ3BnQixNQUFNLENBQUMsVUFBQ2UsR0FBRyxFQUFFOFosTUFBSSxFQUFFcGIsQ0FBQyxFQUFLO1FBQ3ZELElBQU02Z0IsTUFBTSxHQUFJLENBQUU3Z0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFLWCxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUlxaEIsU0FBUyxHQUFJLENBQUM7UUFDMUQsSUFBTTVSLEtBQUssR0FBRytLLHVCQUFRLENBQUMzSyxPQUFPLENBQUNrTSxNQUFJLENBQUNFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxPQUFPaGEsR0FBRyxHQUFJdWYsTUFBTSxHQUFHL1IsS0FBTTtNQUNqQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BRUwsSUFBTWdTLFNBQVMsR0FBR2pILHVCQUFRLENBQUUrRyxZQUFZLEdBQUcsRUFBRSxDQUFFO01BQy9DLE9BQU9FLFNBQVMsS0FBS1IsU0FBUyxDQUFDbmhCLEtBQUssQ0FBQyxDQUFDbWMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN2RDtFQUFDO0lBQUExTCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVaVMsZ0JBQWdCQSxDQUFDVCxTQUF3QixFQUFXO01BQzFELE9BQU8sSUFBSSxDQUFDRyxlQUFlLENBQUNILFNBQVMsRUFBRUEsU0FBUyxDQUFDamhCLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQ3pELElBQUksQ0FBQ29oQixlQUFlLENBQUNILFNBQVMsRUFBRUEsU0FBUyxDQUFDamhCLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3BFO0VBQUM7SUFBQXVRLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQU8ySCxNQUFNQSxDQUFDL1YsR0FBbUIsRUFBRTZVLEtBQXVDLEVBQWtCO01BQ3hGQSxLQUFLLEdBQUcsSUFBSSxDQUFDd0QsVUFBVSxDQUFDLENBQUM7TUFDekIsSUFBSSxDQUFDeEQsS0FBSyxFQUFFO1FBQ1IsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFJNEIsUUFBUSxHQUFHLElBQUkrRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ2xELElBQUkzVyxNQUE0QixHQUFHLEVBQUU7TUFDckMsSUFBSThVLFNBQVMsR0FBRyxJQUFJLENBQUNsRyxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLEVBQUVFLEtBQUssQ0FBQy9QLEdBQUcsQ0FBQztNQUNuRCxJQUFJc1osU0FBUztNQUNiLElBQUl4QyxXQUEwQjtNQUM5QixHQUFHO1FBQ0NuRixRQUFRLEdBQUcsSUFBSSxDQUFDRSxXQUFXLENBQUNnRixTQUFTLEVBQUVsRixRQUFRLENBQTZCO1FBQzVFLElBQU1YLE9BQU8sR0FBRyxJQUFJLENBQUM4RCxVQUFVLENBQUNuRCxRQUFRLENBQUM7UUFDekMsSUFBSVgsT0FBTyxHQUFHLENBQUMsRUFBRTtVQUNiLE9BQU8sSUFBSTtRQUNmO1FBQ0E4RixXQUFXLEdBQUcsSUFBSSxDQUFDeEIsY0FBYyxDQUFDdEUsT0FBTyxDQUFDO1FBQzFDLElBQUk4RixXQUFXLEtBQUssSUFBSSxFQUFFO1VBQ3RCLE9BQU8sSUFBSTtRQUNmO1FBQ0EvVSxNQUFNLENBQUMxRyxJQUFJLENBQUN5YixXQUFXLENBQUM7UUFDeEJ3QyxTQUFTLEdBQUd6QyxTQUFTO1FBQ3JCQSxTQUFTLElBQUlsVyxZQUFXLENBQUM3RSxHQUFHLENBQUM2VixRQUFRLENBQUM7UUFDdENrRixTQUFTLEdBQUcsSUFBSSxDQUFDbEcsUUFBUSxDQUFDLElBQUksQ0FBQ2QsSUFBSSxFQUFFZ0gsU0FBUyxDQUFDO01BQ25ELENBQUMsUUFBUUMsV0FBVyxLQUFLLEdBQUc7TUFDNUIvVSxNQUFNLENBQUN5WCxHQUFHLENBQUMsQ0FBQztNQUVaLElBQUksQ0FBQ3pYLE1BQU0sQ0FBQ2xJLE1BQU0sRUFBRTtRQUNoQixPQUFPLElBQUk7TUFDZjtNQUVBLElBQUksQ0FBQyxJQUFJLENBQUMrZ0IsVUFBVSxDQUFDdEIsU0FBUyxFQUFFekMsU0FBUyxDQUFDLEVBQUU7UUFDeEMsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFJLENBQUMsSUFBSSxDQUFDMEUsZ0JBQWdCLENBQUN4WixNQUFNLENBQUMsRUFBRTtRQUNoQyxPQUFPLElBQUk7TUFDZjtNQUVBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ29ZLEtBQUssQ0FBQyxDQUFDLEVBQUVwWSxNQUFNLENBQUNsSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO01BQzNDO01BQ0EsSUFBSSxDQUFDa0ksTUFBTSxHQUFHLElBQUksQ0FBQzhZLGVBQWUsQ0FBQzlZLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRTtRQUNsRCxPQUFPLElBQUk7TUFDZjtNQUVBLE9BQU87UUFDSG1PLElBQUksRUFBRW5PLE1BQU0sQ0FBQzNHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckIyVSxLQUFLLEVBQUVBLEtBQUssQ0FBQ0EsS0FBSztRQUNsQi9QLEdBQUcsRUFBRTZXLFNBQVM7UUFDZHJELFNBQVMsRUFBRXpELEtBQUs7UUFDaEJtRSxZQUFZLEVBQUVuUyxNQUFNO1FBQ3BCdVAsTUFBTSxFQUFFLElBQUksQ0FBQ0M7TUFDakIsQ0FBQztJQUVMO0VBQUM7QUFBQSxFQXZOc0I1QixjQUFhO0FBME56QmdMLDhFQUFZLEU7Ozs7Ozs7Ozs7OztBQ3hPa0Y7QUFDNUU7O0FBRWpDO0FBQ0EsSUFBTWEsWUFBWSxHQUFHLEVBQUU7QUFDQztBQUN4QixJQUFNbkosd0JBQWEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLElBQU1vSixjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ1o7QUFDMUIsSUFBTUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QyxJQUFNbkosdUJBQVksR0FBRyxDQUNqQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ1osQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNaLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ2Y7QUFDRCxJQUFNb0osY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQzlEO0FBQ0EsSUFBTXJJLGNBQWMsR0FBRyxJQUFJO0FBQUMsSUFFdEJzSSxvQkFBUywwQkFBQWxKLGNBQUE7RUFHZTs7RUFFMUIsU0FBQWtKLFVBQVk5VixNQUE0QixFQUFFOEosV0FBa0MsRUFBRTtJQUFBLElBQUErQyxLQUFBO0lBQUEzSCx3QkFBQSxPQUFBNFEsU0FBQTtJQUMxRWpKLEtBQUEsR0FBQUssb0JBQUEsT0FBQTRJLFNBQUEsR0FBTUMsZUFBSyxDQUFDO01BQUVqTSxXQUFXLEVBQUU7SUFBRyxDQUFDLEVBQUU5SixNQUFNLENBQUMsRUFBRThKLFdBQVc7SUFBRTNFLHdCQUFBLENBQUEwSCxLQUFBLFlBTGxELFFBQVE7SUFBQTFILHdCQUFBLENBQUEwSCxLQUFBLHVCQUNHLElBQUk7SUFBQTFILHdCQUFBLENBQUEwSCxLQUFBLGtCQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFBQSxPQUFBQSxLQUFBO0VBSXhCO0VBQUNNLGtCQUFBLENBQUEySSxTQUFBLEVBQUFsSixjQUFBO0VBQUEsT0FBQXhILHFCQUFBLENBQUEwUSxTQUFBO0lBQUF4UixHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVNEosWUFBWUEsQ0FBQ2xDLE9BQThCLEVBQUU1TCxNQUFjLEVBQUVzTSxPQUFnQixFQUFFeUIsU0FBa0IsRUFBMEI7TUFDakksSUFBTWxELE9BQU8sR0FBRyxJQUFJNkMsS0FBSyxDQUFTOUIsT0FBTyxDQUFDblgsTUFBTSxDQUFDLENBQUNTLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDekQsSUFBTThZLFNBQTBCLEdBQUc7UUFDL0IvQyxLQUFLLEVBQUU3TCxNQUFNLENBQUNDLFNBQVM7UUFDdkJzTCxLQUFLLEVBQUUsQ0FBQztRQUNSL1AsR0FBRyxFQUFFO01BQ1QsQ0FBQztNQUNELElBQU1xVCxPQUFPLEdBQUdDLGNBQWM7TUFDOUI7TUFDQSxJQUFJMUIsVUFBVSxHQUFHLENBQUM7TUFDbEIsSUFBSSxDQUFDeE0sTUFBTSxFQUFFO1FBQ1RBLE1BQU0sR0FBRyxJQUFJLENBQUN1TCxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLENBQUM7TUFDckM7TUFDQSxJQUFJck8sS0FBSyxHQUFHLEtBQUs7TUFDakIsS0FBSyxJQUFJaEgsQ0FBQyxHQUFHNEssTUFBTSxFQUFFNUssQ0FBQyxHQUFHLElBQUksQ0FBQ3FWLElBQUksQ0FBQ2hXLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7UUFDNUM7UUFDQSxJQUFJLElBQUksQ0FBQ3FWLElBQUksQ0FBQ3JWLENBQUMsQ0FBQyxJQUFJa1gsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUNsQ3pCLE9BQU8sQ0FBQzJCLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsQ0FBQyxNQUFNO1VBQ0gsSUFBSUEsVUFBVSxLQUFLM0IsT0FBTyxDQUFDcFcsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFNd1csS0FBSyxHQUFHLElBQUksQ0FBQ0wsYUFBYSxDQUFDQyxPQUFPLEVBQUVlLE9BQU8sQ0FBQztZQUNsRDtZQUNBLElBQUlYLEtBQUssR0FBR2dELE9BQU8sSUFBSUQsU0FBUyxDQUFDL0MsS0FBSyxJQUFJQSxLQUFLLEdBQUcrQyxTQUFTLENBQUMvQyxLQUFLLEVBQUU7Y0FDL0Q3TyxLQUFLLEdBQUcsSUFBSTtjQUNaNFIsU0FBUyxDQUFDL0MsS0FBSyxHQUFHQSxLQUFLO2NBQ3ZCK0MsU0FBUyxDQUFDckQsS0FBSyxHQUFHdlYsQ0FBQyxHQUFHeVYsT0FBTyxDQUFDbFYsTUFBTSxDQUFDLFVBQUNlLEdBQUcsRUFBRXdOLEtBQUs7Z0JBQUEsT0FBS3hOLEdBQUcsR0FBR3dOLEtBQUs7Y0FBQSxHQUFFLENBQUMsQ0FBQztjQUNwRThKLFNBQVMsQ0FBQ3BULEdBQUcsR0FBR3hGLENBQUM7Y0FDakI7Y0FDQSxPQUFPNFksU0FBUztZQUNwQjtZQUNBLElBQUlELFNBQVMsRUFBRTtjQUNYLEtBQUssSUFBSTFZLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3dWLE9BQU8sQ0FBQ3BXLE1BQU0sR0FBRyxDQUFDLEVBQUVZLENBQUMsRUFBRSxFQUFFO2dCQUN6Q3dWLE9BQU8sQ0FBQ3hWLENBQUMsQ0FBQyxHQUFHd1YsT0FBTyxDQUFDeFYsQ0FBQyxHQUFHLENBQUMsQ0FBQztjQUMvQjtjQUNBd1YsT0FBTyxDQUFDQSxPQUFPLENBQUNwVyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztjQUMvQm9XLE9BQU8sQ0FBQ0EsT0FBTyxDQUFDcFcsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7Y0FDL0IrWCxVQUFVLEVBQUU7WUFDaEI7VUFDSixDQUFDLE1BQU07WUFDSEEsVUFBVSxFQUFFO1VBQ2hCO1VBQ0EzQixPQUFPLENBQUMyQixVQUFVLENBQUMsR0FBRyxDQUFDO1VBQ3ZCRixPQUFPLEdBQUcsQ0FBQ0EsT0FBTztRQUN0QjtNQUNKO01BQ0EsSUFBSWxRLEtBQUssRUFBRTtRQUNQO01BQUEsQ0FDSCxNQUFNO1FBQ0g7TUFBQTtNQUVKLE9BQU9BLEtBQUssR0FBRzRSLFNBQVMsR0FBRyxJQUFJO0lBQ25DOztJQUVBO0VBQUE7SUFBQWhKLEdBQUE7SUFBQWQsS0FBQSxFQUNBLFNBQVUwSyxXQUFXQSxDQUFDakUsS0FBYSxFQUFFK0wsU0FBa0IsRUFBc0I7TUFDekU7TUFDQSxJQUFNN0wsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQzVCLElBQU03SyxNQUFNLEdBQUcySyxLQUFLO01BQ3BCLElBQU1xRCxTQUFzQixHQUFHO1FBQzNCL0MsS0FBSyxFQUFFN0wsTUFBTSxDQUFDQyxTQUFTO1FBQ3ZCeUwsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNSSCxLQUFLLEVBQUVBLEtBQUs7UUFDWi9QLEdBQUcsRUFBRStQO01BQ1QsQ0FBQztNQUNELElBQU1zRCxPQUFPLEdBQUdDLGNBQWM7TUFDOUIsSUFBSTVCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQzdCLElBQUksQ0FBQ3pLLE1BQU0sQ0FBQztNQUNoQyxJQUFJd00sVUFBVSxHQUFHLENBQUM7TUFFbEIsSUFBSSxDQUFDa0ssU0FBUyxFQUFFO1FBQ1o7UUFDQUEsU0FBUyxHQUFHdkosdUJBQVksQ0FBQzFZLE1BQU07UUFDL0I7TUFDSjtNQUVBLElBQUkySCxLQUFLLEdBQUcsS0FBSztNQUNqQixLQUFLLElBQUloSCxDQUFDLEdBQUc0SyxNQUFNLEVBQUU1SyxDQUFDLEdBQUcsSUFBSSxDQUFDcVYsSUFBSSxDQUFDaFcsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtRQUM1QyxJQUFJLElBQUksQ0FBQ3FWLElBQUksQ0FBQ3JWLENBQUMsQ0FBQyxJQUFJa1gsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUNsQ3pCLE9BQU8sQ0FBQzJCLFVBQVUsQ0FBQyxFQUFFO1FBQ3pCLENBQUMsTUFBTTtVQUNILElBQUlBLFVBQVUsS0FBSzNCLE9BQU8sQ0FBQ3BXLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsS0FBSyxJQUFJcVcsSUFBSSxHQUFHLENBQUMsRUFBRUEsSUFBSSxHQUFHNEwsU0FBUyxFQUFFNUwsSUFBSSxFQUFFLEVBQUU7Y0FDekMsSUFBTUcsS0FBSyxHQUFHLElBQUksQ0FBQ0wsYUFBYSxDQUFDQyxPQUFPLEVBQUVzQyx1QkFBWSxDQUFDckMsSUFBSSxDQUFDLENBQUM7Y0FDN0RrRCxTQUFTLENBQUNwVCxHQUFHLEdBQUd4RixDQUFDO2NBQ2pCLElBQUk2VixLQUFLLEdBQUcrQyxTQUFTLENBQUMvQyxLQUFNLEVBQUU7Z0JBQzFCK0MsU0FBUyxDQUFDbEQsSUFBSSxHQUFHQSxJQUFJO2dCQUNyQmtELFNBQVMsQ0FBQy9DLEtBQUssR0FBR0EsS0FBSztjQUMzQjtZQUNKO1lBQ0EsSUFBSStDLFNBQVMsQ0FBQy9DLEtBQUssR0FBSWdELE9BQU8sRUFBRTtjQUM1QjtjQUNBLE9BQU8sSUFBSTtZQUNmO1lBQ0E7WUFDQSxPQUFPRCxTQUFTO1VBQ3BCLENBQUMsTUFBTTtZQUNIeEIsVUFBVSxFQUFFO1VBQ2hCO1VBQ0EzQixPQUFPLENBQUMyQixVQUFVLENBQUMsR0FBRyxDQUFDO1VBQ3ZCRixPQUFPLEdBQUcsQ0FBQ0EsT0FBTztRQUN0QjtNQUNKO01BQ0EsT0FBT2xRLEtBQUssR0FBRzRSLFNBQVMsR0FBRyxJQUFJO0lBQ25DO0VBQUM7SUFBQWhKLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVVpSyxVQUFVQSxDQUFBLEVBQTJCO01BQzNDO01BQ0EsSUFBSW5PLE1BQU0sR0FBRyxJQUFJLENBQUN1TCxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLENBQUM7TUFDckMsSUFBSTJELFNBQWlDLEdBQUcsSUFBSTtNQUU1QyxPQUFPLENBQUNBLFNBQVMsRUFBRTtRQUNmQSxTQUFTLEdBQUcsSUFBSSxDQUFDTixZQUFZLENBQUNiLHdCQUFhLEVBQUVqTixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztRQUNqRTtRQUNBLElBQUksQ0FBQ29PLFNBQVMsRUFBRTtVQUNaLE9BQU8sSUFBSTtRQUNmO1FBRUEsSUFBTUUsc0JBQXNCLEdBQUdGLFNBQVMsQ0FBQ3pELEtBQUssSUFBSXlELFNBQVMsQ0FBQ3hULEdBQUcsR0FBR3dULFNBQVMsQ0FBQ3pELEtBQUssQ0FBQztRQUVsRixJQUFJMkQsc0JBQXNCLElBQUksQ0FBQyxFQUFFO1VBQzdCLElBQUksSUFBSSxDQUFDbEMsV0FBVyxDQUFDa0Msc0JBQXNCLEVBQUVGLFNBQVMsQ0FBQ3pELEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM5RDtZQUNBLE9BQU95RCxTQUFTO1VBQ3BCO1FBQ0o7UUFFQXBPLE1BQU0sR0FBR29PLFNBQVMsQ0FBQ3hULEdBQUc7UUFDdEJ3VCxTQUFTLEdBQUcsSUFBSTtNQUNwQjtNQUNBO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBcEosR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBUXlTLG9CQUFvQkEsQ0FBQ0MsYUFBcUIsRUFBaUI7TUFDL0Q7TUFDQSxLQUFLLElBQUl4aEIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHbWhCLGNBQWMsQ0FBQzloQixNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQzVDLElBQUl3aEIsYUFBYSxLQUFLTCxjQUFjLENBQUNuaEIsQ0FBQyxDQUFDLEVBQUU7VUFDckM7VUFDQSxPQUFPQSxDQUFDO1FBQ1o7TUFDSjtNQUNBO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBNFAsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVTJLLGNBQWNBLENBQUNnSSxNQUF1QixFQUFFbGEsTUFBcUIsRUFBRW1TLFlBQW9DLEVBQXNCO01BQy9IO01BQ0EsSUFBSWdJLE9BQTZDLEdBQUFDLGFBQUEsS0FBUUYsTUFBTSxDQUFFO01BQ2pFLElBQUlELGFBQWEsR0FBRyxHQUFHO01BRXZCLEtBQUssSUFBSXhoQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEVBQUUsRUFBRTtRQUN4QjBoQixPQUFPLEdBQUcsSUFBSSxDQUFDbEksV0FBVyxDQUFDa0ksT0FBTyxDQUFDbGMsR0FBRyxDQUFDO1FBQ3ZDO1FBQ0EsSUFBSSxDQUFDa2MsT0FBTyxFQUFFO1VBQ1Y7VUFDQSxPQUFPLElBQUk7UUFDZjtRQUNBLElBQUtBLE9BQU8sQ0FBaUJoTSxJQUFJLElBQUlzTCxZQUFZLEVBQUU7VUFDOUNVLE9BQU8sQ0FBaUJoTSxJQUFJLElBQUlzTCxZQUFZO1VBQzdDUSxhQUFhLElBQUksQ0FBQyxJQUFLLENBQUMsR0FBR3hoQixDQUFFO1FBQ2pDLENBQUMsTUFBTTtVQUNId2hCLGFBQWEsSUFBSSxDQUFDLElBQUssQ0FBQyxHQUFHeGhCLENBQUU7UUFDakM7UUFDQXVILE1BQU0sQ0FBQzFHLElBQUksQ0FBRTZnQixPQUFPLENBQWlCaE0sSUFBSSxDQUFDO1FBQzFDZ0UsWUFBWSxDQUFDN1ksSUFBSSxDQUFDNmdCLE9BQU8sQ0FBQztNQUM5QjtNQUVBLElBQU1FLFVBQVUsR0FBRyxJQUFJLENBQUNMLG9CQUFvQixDQUFDQyxhQUFhLENBQUM7TUFDM0Q7TUFDQSxJQUFJSSxVQUFVLEtBQUssSUFBSSxFQUFFO1FBQ3JCO1FBQ0EsT0FBTyxJQUFJO01BQ2Y7TUFFQXJhLE1BQU0sQ0FBQ2lHLE9BQU8sQ0FBQ29VLFVBQVUsQ0FBQztNQUUxQixJQUFJQyxhQUFhLEdBQUcsSUFBSSxDQUFDbkosWUFBWSxDQUFDdUksY0FBYyxFQUFFUyxPQUFPLENBQUNsYyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztNQUMvRTs7TUFFQSxJQUFJcWMsYUFBYSxLQUFLLElBQUksSUFBSSxDQUFDQSxhQUFhLENBQUNyYyxHQUFHLEVBQUU7UUFDOUM7UUFDQSxPQUFPLElBQUk7TUFDZjtNQUVBa1UsWUFBWSxDQUFDN1ksSUFBSSxDQUFDZ2hCLGFBQWEsQ0FBQztNQUVoQyxLQUFLLElBQUk3aEIsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxFQUFFLEVBQUU7UUFDeEI2aEIsYUFBYSxHQUFHLElBQUksQ0FBQ3JJLFdBQVcsQ0FBQ3FJLGFBQWEsQ0FBRXJjLEdBQUcsRUFBRXdiLFlBQVksQ0FBQztRQUNsRTs7UUFFQSxJQUFJLENBQUNhLGFBQWEsRUFBRTtVQUNoQjtVQUNBLE9BQU8sSUFBSTtRQUNmO1FBRUFuSSxZQUFZLENBQUM3WSxJQUFJLENBQUNnaEIsYUFBYSxDQUFDO1FBQ2hDdGEsTUFBTSxDQUFDMUcsSUFBSSxDQUFFZ2hCLGFBQWEsQ0FBaUJuTSxJQUFJLENBQUM7TUFDcEQ7O01BRUE7TUFDQTtNQUNBO01BQ0EsT0FBT21NLGFBQWE7SUFDeEI7RUFBQztJQUFBalMsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXFLLHlCQUF5QkEsQ0FBQ0MsT0FBd0IsRUFBMEI7TUFDbEY7TUFDQSxJQUFNQyxxQkFBcUIsR0FBR0QsT0FBTyxDQUFDNVQsR0FBRyxJQUFJNFQsT0FBTyxDQUFDNVQsR0FBRyxHQUFHNFQsT0FBTyxDQUFDN0QsS0FBSyxDQUFDO01BRXpFLElBQUk4RCxxQkFBcUIsR0FBRyxJQUFJLENBQUNoRSxJQUFJLENBQUNoVyxNQUFNLEVBQUU7UUFDMUMsSUFBSSxJQUFJLENBQUMyWCxXQUFXLENBQUNvQyxPQUFPLENBQUM1VCxHQUFHLEVBQUU2VCxxQkFBcUIsRUFBRSxDQUFDLENBQUMsRUFBRTtVQUN6RDtVQUNBLE9BQU9ELE9BQU87UUFDbEI7TUFDSjtNQUNBO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBeEosR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXdLLFFBQVFBLENBQUMxTyxNQUFjLEVBQUVzTSxPQUFnQixFQUEwQjtNQUN6RTtNQUNBLElBQU1rQyxPQUFPLEdBQUcsSUFBSSxDQUFDVixZQUFZLENBQUMsSUFBSSxDQUFDWixZQUFZLEVBQUVsTixNQUFNLEVBQUVzTSxPQUFPLEVBQUUsS0FBSyxDQUFDO01BRTVFLE9BQU9rQyxPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQ0QseUJBQXlCLENBQUNDLE9BQU8sQ0FBQyxHQUFHLElBQUk7SUFDNUU7RUFBQztJQUFBeEosR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVWdULFNBQVNBLENBQUN2YSxNQUFxQixFQUFXO01BQ2hEO01BQ0EsSUFBSWpHLEdBQUcsR0FBRyxDQUFDO01BRVgsS0FBSyxJQUFJdEIsQ0FBQyxHQUFHdUgsTUFBTSxDQUFDbEksTUFBTSxHQUFHLENBQUMsRUFBRVcsQ0FBQyxJQUFJLENBQUMsRUFBRUEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM1Q3NCLEdBQUcsSUFBSWlHLE1BQU0sQ0FBQ3ZILENBQUMsQ0FBQztNQUNwQjtNQUVBc0IsR0FBRyxJQUFJLENBQUM7TUFFUixLQUFLLElBQUl0QixHQUFDLEdBQUd1SCxNQUFNLENBQUNsSSxNQUFNLEdBQUcsQ0FBQyxFQUFFVyxHQUFDLElBQUksQ0FBQyxFQUFFQSxHQUFDLElBQUksQ0FBQyxFQUFFO1FBQzVDc0IsR0FBRyxJQUFJaUcsTUFBTSxDQUFDdkgsR0FBQyxDQUFDO01BQ3BCOztNQUVBO01BQ0EsT0FBT3NCLEdBQUcsR0FBRyxFQUFFLEtBQUssQ0FBQztJQUN6QjtFQUFDO0lBQUFzTyxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFRaVQsaUJBQWlCQSxDQUFDblgsTUFBYyxFQUFrQjtNQUN0RCxJQUFNMkssS0FBSyxHQUFHLElBQUksQ0FBQ1ksUUFBUSxDQUFDLElBQUksQ0FBQ2QsSUFBSSxFQUFFekssTUFBTSxDQUFDO01BQzlDLElBQU1vTyxTQUFTLEdBQUcsSUFBSSxDQUFDTixZQUFZLENBQUN3SSx1QkFBdUIsRUFBRTNMLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO01BRWpGLElBQUl5RCxTQUFTLEtBQUssSUFBSSxFQUFFO1FBQ3BCLE9BQU8sSUFBSTtNQUNmOztNQUVBO01BQ0E7TUFDQSxLQUFLLElBQUloWixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDb1YsV0FBVyxDQUFDL1YsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtRQUM5QztRQUNBLElBQUk7VUFDQSxJQUFJdUgsTUFBTSxHQUFHLElBQUksQ0FBQzZOLFdBQVcsQ0FBQ3BWLENBQUMsQ0FBQyxDQUFDeVcsTUFBTSxDQUFDLElBQUksQ0FBQ3BCLElBQUksRUFBRTJELFNBQVMsQ0FBQ3hULEdBQUcsQ0FBQztVQUNqRTtVQUNBLElBQUkrQixNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE9BQU87Y0FDSG1PLElBQUksRUFBRW5PLE1BQU0sQ0FBQ21PLElBQUk7Y0FDakJILEtBQUssRUFBTEEsS0FBSztjQUNMeUQsU0FBUyxFQUFUQSxTQUFTO2NBQ1R4VCxHQUFHLEVBQUUrQixNQUFNLENBQUMvQixHQUFHO2NBQ2ZrVSxZQUFZLEVBQUVuUyxNQUFNLENBQUNtUyxZQUFZO2NBQ2pDNUMsTUFBTSxFQUFFLElBQUksQ0FBQzFCLFdBQVcsQ0FBQ3BWLENBQUMsQ0FBQyxDQUFDK1c7WUFDaEMsQ0FBQztVQUNMO1FBQ0osQ0FBQyxDQUFDLE9BQU9pTCxHQUFHLEVBQUU7VUFDVi9WLE9BQU8sQ0FBQzRKLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxJQUFJLENBQUNULFdBQVcsQ0FBQ3BWLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRWdpQixHQUFHLENBQUM7UUFDakY7TUFDSjs7TUFFQTtNQUNBLE9BQU8sSUFBSTtJQUNmO0VBQUM7SUFBQXBTLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQU8ySCxNQUFNQSxDQUFDL1YsR0FBbUIsRUFBRTZVLEtBQWdDLEVBQWtCO01BQ2pGO01BQ0E7TUFDQSxJQUFNaE8sTUFBTSxHQUFHLElBQUkrUSxLQUFLLENBQVMsQ0FBQztNQUNsQyxJQUFNb0IsWUFBWSxHQUFHLElBQUlwQixLQUFLLENBQWdDLENBQUM7TUFDL0QsSUFBSTJKLFVBQXdCLEdBQUcsQ0FBQyxDQUFDO01BQ2pDLElBQUlqSixTQUFTLEdBQUcsSUFBSSxDQUFDRCxVQUFVLENBQUMsQ0FBQztNQUVqQyxJQUFJLENBQUNDLFNBQVMsRUFBRTtRQUNaLE9BQU8sSUFBSTtNQUNmO01BRUEsSUFBSXRELElBQTBDLEdBQUc7UUFDN0NILEtBQUssRUFBRXlELFNBQVMsQ0FBQ3pELEtBQUs7UUFDdEIvUCxHQUFHLEVBQUV3VCxTQUFTLENBQUN4VDtNQUNuQixDQUFDO01BQ0RrVSxZQUFZLENBQUM3WSxJQUFJLENBQUM2VSxJQUFJLENBQUM7TUFFdkJBLElBQUksR0FBRyxJQUFJLENBQUMrRCxjQUFjLENBQUMvRCxJQUFJLEVBQUVuTyxNQUFNLEVBQUVtUyxZQUFZLENBQUM7TUFFdEQsSUFBSSxDQUFDaEUsSUFBSSxFQUFFO1FBQ1AsT0FBTyxJQUFJO01BQ2Y7TUFFQUEsSUFBSSxHQUFHLElBQUksQ0FBQzRELFFBQVEsQ0FBQzVELElBQUksQ0FBQ2xRLEdBQUcsRUFBRSxLQUFLLENBQUM7TUFFckMsSUFBSSxDQUFDa1EsSUFBSSxFQUFFO1FBQ1AsT0FBTyxJQUFJO01BQ2Y7TUFFQWdFLFlBQVksQ0FBQzdZLElBQUksQ0FBQzZVLElBQUksQ0FBQzs7TUFFdkI7TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDb00sU0FBUyxDQUFDdmEsTUFBTSxDQUFDLEVBQUU7UUFDekIsT0FBTyxJQUFJO01BQ2Y7O01BRUE7TUFDQSxJQUFJLElBQUksQ0FBQzZOLFdBQVcsQ0FBQy9WLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDN0IsSUFBTTZpQixVQUFVLEdBQUcsSUFBSSxDQUFDSCxpQkFBaUIsQ0FBQ3JNLElBQUksQ0FBQ2xRLEdBQUcsQ0FBQztRQUNuRDtRQUNBLElBQUksQ0FBQzBjLFVBQVUsRUFBRTtVQUNiLE9BQU8sSUFBSTtRQUNmO1FBRUEsSUFBSSxDQUFDQSxVQUFVLENBQUN4SSxZQUFZLEVBQUU7VUFDMUIsT0FBTyxJQUFJO1FBQ2Y7UUFFQSxJQUFNeUksUUFBUSxHQUFHRCxVQUFVLENBQUN4SSxZQUFZLENBQUN3SSxVQUFVLENBQUN4SSxZQUFZLENBQUNyYSxNQUFNLEdBQUcsQ0FBQyxDQUFnQjtRQUMzRixJQUFNK1osT0FBTyxHQUFHO1VBQ1o3RCxLQUFLLEVBQUU0TSxRQUFRLENBQUM1TSxLQUFLLElBQUssQ0FBQzRNLFFBQVEsQ0FBQzNjLEdBQUcsR0FBRzJjLFFBQVEsQ0FBQzVNLEtBQUssSUFBSSxDQUFDLEdBQUksQ0FBQyxDQUFDO1VBQ25FL1AsR0FBRyxFQUFFMmMsUUFBUSxDQUFDM2M7UUFDbEIsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMyVCx5QkFBeUIsQ0FBQ0MsT0FBTyxDQUFDLEVBQUU7VUFDMUMsT0FBTyxJQUFJO1FBQ2Y7UUFFQTZJLFVBQVUsR0FBRztVQUNUQyxVQUFVLEVBQVZBLFVBQVU7VUFDVnhNLElBQUksRUFBRW5PLE1BQU0sQ0FBQzNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR3NoQixVQUFVLENBQUN4TTtRQUN2QyxDQUFDO01BQ0w7TUFFQSxPQUFBaU0sYUFBQSxDQUFBQSxhQUFBO1FBQ0lqTSxJQUFJLEVBQUVuTyxNQUFNLENBQUMzRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCMlUsS0FBSyxFQUFFeUQsU0FBUyxDQUFDekQsS0FBSztRQUN0Qi9QLEdBQUcsRUFBRWtRLElBQUksQ0FBQ2xRLEdBQUc7UUFDYndULFNBQVMsRUFBVEEsU0FBUztRQUNUVSxZQUFZLEVBQVpBO01BQVksR0FDVHVJLFVBQVU7UUFDYm5MLE1BQU0sRUFBRSxJQUFJLENBQUNDO01BQU07SUFFM0I7RUFBQztBQUFBLEVBeFdtQjVCLGNBQWE7QUEyV3RCaU0sbUVBQVMsRTs7Ozs7Ozs7OztBQy9ZK0I7QUFBQSxJQUlqRGdCLHVCQUFVLDBCQUFBQyxVQUFBO0VBQUEsU0FBQUQsV0FBQTtJQUFBLElBQUFqSyxLQUFBO0lBQUEzSCx3QkFBQSxPQUFBNFIsVUFBQTtJQUFBLFNBQUFoSyxJQUFBLEdBQUFoWixTQUFBLENBQUFDLE1BQUEsRUFBQWdaLElBQUEsT0FBQUMsS0FBQSxDQUFBRixJQUFBLEdBQUFHLElBQUEsTUFBQUEsSUFBQSxHQUFBSCxJQUFBLEVBQUFHLElBQUE7TUFBQUYsSUFBQSxDQUFBRSxJQUFBLElBQUFuWixTQUFBLENBQUFtWixJQUFBO0lBQUE7SUFBQUosS0FBQSxHQUFBSyxzQkFBQSxPQUFBNEosVUFBQSxLQUFBemhCLE1BQUEsQ0FBQTBYLElBQUE7SUFBQTVILHdCQUFBLENBQUEwSCxLQUFBLFlBQ0gsT0FBTztJQUFBLE9BQUFBLEtBQUE7RUFBQTtFQUFBTSxrQkFBQSxDQUFBMkosVUFBQSxFQUFBQyxVQUFBO0VBQUEsT0FBQTNSLHFCQUFBLENBQUEwUixVQUFBO0lBQUF4UyxHQUFBO0lBQUFkLEtBQUEsRUFDaEIsU0FBTzJILE1BQU1BLENBQUMvVixHQUFtQixFQUFFNlUsS0FBYyxFQUFrQjtNQUMvRCxJQUFJN1UsR0FBRyxFQUFFO1FBQ0wsSUFBSSxDQUFDMlUsSUFBSSxHQUFHM1UsR0FBRztNQUNuQjtNQUVBLElBQUk4Z0IsYUFBYSxHQUFHLENBQUM7TUFDckIsSUFBSTVXLE1BQU0sR0FBRzJLLEtBQUs7TUFDbEIsSUFBTS9QLEdBQUcsR0FBRyxJQUFJLENBQUM2UCxJQUFJLENBQUNoVyxNQUFNO01BQzVCLElBQU1rSSxNQUFNLEdBQUcsRUFBRTtNQUNqQixJQUFNbVMsWUFBWSxHQUFHLEVBQUU7TUFDdkIsSUFBSWhFLElBQXdCLEdBQUcsSUFBSTtNQUVuQyxJQUFJOUssTUFBTSxLQUFLdEYsU0FBUyxFQUFDO1FBQ3JCLE9BQU8sSUFBSTtNQUNmO01BRUEsS0FBSyxJQUFJdEYsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLENBQUMsSUFBSTRLLE1BQU0sR0FBR3BGLEdBQUcsRUFBRXhGLENBQUMsRUFBRSxFQUFFO1FBQ3hDMFYsSUFBSSxHQUFHLElBQUksQ0FBQzhELFdBQVcsQ0FBQzVPLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUM4SyxJQUFJLEVBQUU7VUFDUCxPQUFPLElBQUk7UUFDZjtRQUNBZ0UsWUFBWSxDQUFDN1ksSUFBSSxDQUFDNlUsSUFBSSxDQUFDO1FBQ3ZCbk8sTUFBTSxDQUFDMUcsSUFBSSxDQUFDNlUsSUFBSSxDQUFDQSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUlBLElBQUksQ0FBQ0EsSUFBSSxJQUFJc0wsWUFBWSxFQUFFO1VBQzNCUSxhQUFhLElBQUksQ0FBQyxJQUFLLENBQUMsR0FBR3hoQixDQUFFO1FBQ2pDO1FBQ0EsSUFBSUEsQ0FBQyxLQUFLLENBQUMsRUFBRTtVQUNUNEssTUFBTSxHQUFHLElBQUksQ0FBQ3VMLFFBQVEsQ0FBQyxJQUFJLENBQUNkLElBQUksRUFBRUssSUFBSSxDQUFDbFEsR0FBRyxDQUFDO1VBQzNDb0YsTUFBTSxHQUFHLElBQUksQ0FBQzBLLFVBQVUsQ0FBQyxJQUFJLENBQUNELElBQUksRUFBRXpLLE1BQU0sQ0FBQztRQUMvQztNQUNKO01BRUEsSUFBSXJELE1BQU0sQ0FBQ2xJLE1BQU0sS0FBSyxDQUFDLElBQUtpakIsUUFBUSxDQUFDL2EsTUFBTSxDQUFDM0csSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFNNGdCLGFBQWEsRUFBRTtRQUMxRSxPQUFPLElBQUk7TUFDZjtNQUVBLElBQU14SSxTQUFTLEdBQUcsSUFBSSxDQUFDRCxVQUFVLENBQUMsQ0FBQztNQUVuQyxPQUFPO1FBQ0hyRCxJQUFJLEVBQUVuTyxNQUFNLENBQUMzRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCOFksWUFBWSxFQUFaQSxZQUFZO1FBQ1psVSxHQUFHLEVBQUdrUSxJQUFJLENBQWlCbFEsR0FBRztRQUM5QnNSLE1BQU0sRUFBRSxJQUFJLENBQUNDLE1BQU07UUFDbkJpQyxTQUFTLEVBQUVBLFNBQTRCO1FBQ3ZDekQsS0FBSyxFQUFHeUQsU0FBUyxDQUFxQnpEO01BQzFDLENBQUM7SUFDTDtFQUFDO0FBQUEsRUFoRG9CNkwsVUFBUztBQWlEakM7QUFFY2dCLHdFQUFVLEU7Ozs7Ozs7Ozs7QUN2RDhCO0FBR3ZELElBQU1HLHFCQUFxQixHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRWxFLFNBQVNDLG1CQUFtQkEsQ0FBQ2hCLGFBQXFCLEVBQUU7RUFDaEQsS0FBSyxJQUFJeGhCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxFQUFFLEVBQUVBLENBQUMsRUFBRSxFQUFFO0lBQ3pCLElBQUl3aEIsYUFBYSxLQUFLZSxxQkFBcUIsQ0FBQ3ZpQixDQUFDLENBQUMsRUFBRTtNQUM1QyxPQUFPQSxDQUFDO0lBQ1o7RUFDSjtFQUNBLE9BQU8sSUFBSTtBQUNmO0FBRUEsU0FBU3lpQixpQkFBaUJBLENBQUNsYixNQUFxQixFQUFFO0VBQzlDLElBQU1sSSxNQUFNLEdBQUdrSSxNQUFNLENBQUNsSSxNQUFNO0VBQzVCLElBQUlpQyxHQUFHLEdBQUcsQ0FBQztFQUVYLEtBQUssSUFBSXRCLENBQUMsR0FBR1gsTUFBTSxHQUFHLENBQUMsRUFBRVcsQ0FBQyxJQUFJLENBQUMsRUFBRUEsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUNyQ3NCLEdBQUcsSUFBSWlHLE1BQU0sQ0FBQ3ZILENBQUMsQ0FBQztFQUNwQjtFQUNBc0IsR0FBRyxJQUFJLENBQUM7RUFDUixLQUFLLElBQUl0QixFQUFDLEdBQUdYLE1BQU0sR0FBRyxDQUFDLEVBQUVXLEVBQUMsSUFBSSxDQUFDLEVBQUVBLEVBQUMsSUFBSSxDQUFDLEVBQUU7SUFDckNzQixHQUFHLElBQUlpRyxNQUFNLENBQUN2SCxFQUFDLENBQUM7RUFDcEI7RUFDQXNCLEdBQUcsSUFBSSxDQUFDO0VBQ1IsT0FBT0EsR0FBRyxHQUFHLEVBQUU7QUFDbkI7QUFBQyxJQUVLb2hCLHVCQUFVLDBCQUFBTCxVQUFBO0VBQUEsU0FBQUssV0FBQTtJQUFBLElBQUF2SyxLQUFBO0lBQUEzSCx3QkFBQSxPQUFBa1MsVUFBQTtJQUFBLFNBQUF0SyxJQUFBLEdBQUFoWixTQUFBLENBQUFDLE1BQUEsRUFBQWdaLElBQUEsT0FBQUMsS0FBQSxDQUFBRixJQUFBLEdBQUFHLElBQUEsTUFBQUEsSUFBQSxHQUFBSCxJQUFBLEVBQUFHLElBQUE7TUFBQUYsSUFBQSxDQUFBRSxJQUFBLElBQUFuWixTQUFBLENBQUFtWixJQUFBO0lBQUE7SUFBQUosS0FBQSxHQUFBSyxzQkFBQSxPQUFBa0ssVUFBQSxLQUFBL2hCLE1BQUEsQ0FBQTBYLElBQUE7SUFBQTVILHdCQUFBLENBQUEwSCxLQUFBLFlBQ0gsT0FBTztJQUFBLE9BQUFBLEtBQUE7RUFBQTtFQUFBTSxrQkFBQSxDQUFBaUssVUFBQSxFQUFBTCxVQUFBO0VBQUEsT0FBQTNSLHFCQUFBLENBQUFnUyxVQUFBO0lBQUE5UyxHQUFBO0lBQUFkLEtBQUEsRUFDaEIsU0FBTzJILE1BQU1BLENBQUMvVixHQUFtQixFQUFFNlUsS0FBYyxFQUFrQjtNQUMvRCxJQUFJQSxLQUFLLEtBQUtqUSxTQUFTLEVBQUU7UUFDckIsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFJNUUsR0FBRyxFQUFFO1FBQ0wsSUFBSSxDQUFDMlUsSUFBSSxHQUFHM1UsR0FBRztNQUNuQjtNQUVBLElBQUk4Z0IsYUFBYSxHQUFHLENBQUM7TUFDckIsSUFBSTVXLE1BQU0sR0FBRzJLLEtBQUs7TUFDbEIsSUFBTS9QLEdBQUcsR0FBRyxJQUFJLENBQUM2UCxJQUFJLENBQUNoVyxNQUFNO01BQzVCLElBQUlxVyxJQUF3QixHQUFHLElBQUk7TUFDbkMsSUFBTW5PLE1BQU0sR0FBRyxFQUFFO01BQ2pCLElBQU1tUyxZQUFZLEdBQUcsRUFBRTtNQUV2QixLQUFLLElBQUkxWixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQyxJQUFJNEssTUFBTSxHQUFHcEYsR0FBRyxFQUFFeEYsQ0FBQyxFQUFFLEVBQUU7UUFDeEMwVixJQUFJLEdBQUcsSUFBSSxDQUFDOEQsV0FBVyxDQUFDNU8sTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQzhLLElBQUksRUFBRTtVQUNQLE9BQU8sSUFBSTtRQUNmO1FBQ0FnRSxZQUFZLENBQUM3WSxJQUFJLENBQUM2VSxJQUFJLENBQUM7UUFDdkJuTyxNQUFNLENBQUMxRyxJQUFJLENBQUM2VSxJQUFJLENBQUNBLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSUEsSUFBSSxDQUFDQSxJQUFJLElBQUlzTCxZQUFZLEVBQUU7VUFDM0JRLGFBQWEsSUFBSSxDQUFDLElBQUssQ0FBQyxHQUFHeGhCLENBQUU7UUFDakM7UUFDQSxJQUFJQSxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQ1Q0SyxNQUFNLEdBQUcsSUFBSSxDQUFDdUwsUUFBUSxDQUFDLElBQUksQ0FBQ2QsSUFBSSxFQUFFSyxJQUFJLENBQUNsUSxHQUFHLENBQUM7VUFDM0NvRixNQUFNLEdBQUcsSUFBSSxDQUFDMEssVUFBVSxDQUFDLElBQUksQ0FBQ0QsSUFBSSxFQUFFekssTUFBTSxDQUFDO1FBQy9DO01BQ0o7TUFFQSxJQUFJckQsTUFBTSxDQUFDbEksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLElBQUk7TUFDZjtNQUVBLElBQUlvakIsaUJBQWlCLENBQUNsYixNQUFNLENBQUMsS0FBS2liLG1CQUFtQixDQUFDaEIsYUFBYSxDQUFDLEVBQUU7UUFDbEUsT0FBTyxJQUFJO01BQ2Y7TUFFQSxJQUFNeEksU0FBUyxHQUFHLElBQUksQ0FBQ0QsVUFBVSxDQUFDLENBQUM7TUFFbkMsT0FBTztRQUNIckQsSUFBSSxFQUFFbk8sTUFBTSxDQUFDM0csSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQjhZLFlBQVksRUFBWkEsWUFBWTtRQUNabFUsR0FBRyxFQUFHa1EsSUFBSSxDQUFpQmxRLEdBQUc7UUFDOUJzUixNQUFNLEVBQUUsSUFBSSxDQUFDQyxNQUFNO1FBQ25CaUMsU0FBUyxFQUFFQSxTQUE0QjtRQUN2Q3pELEtBQUssRUFBR3lELFNBQVMsQ0FBcUJ6RDtNQUMxQyxDQUFDO0lBQ0w7RUFBQztBQUFBLEVBcERvQjZMLFVBQVM7QUFxRGpDO0FBRWNzQix3RUFBVSxFOzs7Ozs7Ozs7O0FDcEY4QztBQUFBLElBR2pFQyx1QkFBVSwwQkFBQU4sVUFBQTtFQUFBLFNBQUFNLFdBQUE7SUFBQSxJQUFBeEssS0FBQTtJQUFBM0gsd0JBQUEsT0FBQW1TLFVBQUE7SUFBQSxTQUFBdkssSUFBQSxHQUFBaFosU0FBQSxDQUFBQyxNQUFBLEVBQUFnWixJQUFBLE9BQUFDLEtBQUEsQ0FBQUYsSUFBQSxHQUFBRyxJQUFBLE1BQUFBLElBQUEsR0FBQUgsSUFBQSxFQUFBRyxJQUFBO01BQUFGLElBQUEsQ0FBQUUsSUFBQSxJQUFBblosU0FBQSxDQUFBbVosSUFBQTtJQUFBO0lBQUFKLEtBQUEsR0FBQUssc0JBQUEsT0FBQW1LLFVBQUEsS0FBQWhpQixNQUFBLENBQUEwWCxJQUFBO0lBQUE1SCx3QkFBQSxDQUFBMEgsS0FBQSxZQUNILE9BQU87SUFBQSxPQUFBQSxLQUFBO0VBQUE7RUFBQU0sa0JBQUEsQ0FBQWtLLFVBQUEsRUFBQU4sVUFBQTtFQUFBLE9BQUEzUixxQkFBQSxDQUFBaVMsVUFBQTtJQUFBL1MsR0FBQTtJQUFBZCxLQUFBLEVBQ2hCLFNBQVUySyxjQUFjQSxDQUFDZ0ksTUFBdUIsRUFBRWxhLE1BQXFCLEVBQUVtUyxZQUFvQyxFQUFzQjtNQUMvSCxJQUFJaEUsSUFBMEMsR0FBRytMLE1BQU07TUFFdkQsS0FBSyxJQUFJemhCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsRUFBRSxFQUFFO1FBQ3hCMFYsSUFBSSxHQUFHLElBQUksQ0FBQzhELFdBQVcsQ0FBQzlELElBQUksQ0FBQ2xRLEdBQUcsRUFBRXdiLFlBQVksQ0FBQztRQUMvQyxJQUFJLENBQUN0TCxJQUFJLEVBQUU7VUFDUCxPQUFPLElBQUk7UUFDZjtRQUNBbk8sTUFBTSxDQUFDMUcsSUFBSSxDQUFFNlUsSUFBSSxDQUFpQkEsSUFBSSxDQUFDO1FBQ3ZDZ0UsWUFBWSxDQUFDN1ksSUFBSSxDQUFDNlUsSUFBSSxDQUFDO01BQzNCO01BRUFBLElBQUksR0FBRyxJQUFJLENBQUNnRCxZQUFZLENBQUN1SSxjQUFjLEVBQUV2TCxJQUFJLENBQUNsUSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztNQUMvRCxJQUFJa1EsSUFBSSxLQUFLLElBQUksRUFBRTtRQUNmLE9BQU8sSUFBSTtNQUNmO01BQ0FnRSxZQUFZLENBQUM3WSxJQUFJLENBQUM2VSxJQUFJLENBQUM7TUFFdkIsS0FBSyxJQUFJMVYsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxFQUFFLEVBQUU7UUFDeEIwVixJQUFJLEdBQUcsSUFBSSxDQUFDOEQsV0FBVyxDQUFDOUQsSUFBSSxDQUFDbFEsR0FBRyxFQUFFd2IsWUFBWSxDQUFDO1FBQy9DLElBQUksQ0FBQ3RMLElBQUksRUFBRTtVQUNQLE9BQU8sSUFBSTtRQUNmO1FBQ0FnRSxZQUFZLENBQUM3WSxJQUFJLENBQUM2VSxJQUFJLENBQUM7UUFDdkJuTyxNQUFNLENBQUMxRyxJQUFJLENBQUU2VSxJQUFJLENBQWlCQSxJQUFJLENBQUM7TUFDM0M7TUFFQSxPQUFPQSxJQUFJO0lBQ2Y7RUFBQztBQUFBLEVBOUJvQjBMLFVBQVM7QUFpQ25CdUIsd0VBQVUsRTs7Ozs7Ozs7Ozs7O0FDcEN6Qjs7QUFFNkc7QUFDNUU7QUFFakMsSUFBTWhMLGNBQUMsR0FBRyxDQUFDO0FBQ1gsSUFBTUMsY0FBQyxHQUFHLENBQUM7QUFBQyxJQUVOZ0wsd0JBQVcsMEJBQUExSyxjQUFBO0VBc0JiLFNBQUEwSyxZQUFZQyxJQUF5QixFQUFFO0lBQUEsSUFBQTFLLEtBQUE7SUFBQTNILHdCQUFBLE9BQUFvUyxXQUFBO0lBQ25DekssS0FBQSxHQUFBSyxzQkFBQSxPQUFBb0ssV0FBQSxHQUFNdkIsZUFBSyxDQUFDO01BQUV5QixzQkFBc0IsRUFBRTtJQUFNLENBQUMsRUFBRUQsSUFBSSxDQUFDO0lBQUVwUyx3QkFBQSxDQUFBMEgsS0FBQSxtQkF0QmxDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUFBMUgsd0JBQUEsQ0FBQTBILEtBQUEsdUJBQ1YsSUFBSTtJQUFBMUgsd0JBQUEsQ0FBQTBILEtBQUEsb0JBQ1AsSUFBSTtJQUFBMUgsd0JBQUEsQ0FBQTBILEtBQUEsbUJBRUwsQ0FBQ1IsY0FBQyxFQUFFQSxjQUFDLEVBQUVBLGNBQUMsRUFBRUEsY0FBQyxDQUFDO0lBQUFsSCx3QkFBQSxDQUFBMEgsS0FBQSxrQkFDYixDQUFDUixjQUFDLEVBQUVBLGNBQUMsRUFBRUMsY0FBQyxDQUFDO0lBQUFuSCx3QkFBQSxDQUFBMEgsS0FBQSxrQkFDVCxDQUNYLENBQUNSLGNBQUMsRUFBRUEsY0FBQyxFQUFFQyxjQUFDLEVBQUVBLGNBQUMsRUFBRUQsY0FBQyxDQUFDLEVBQ2YsQ0FBQ0MsY0FBQyxFQUFFRCxjQUFDLEVBQUVBLGNBQUMsRUFBRUEsY0FBQyxFQUFFQyxjQUFDLENBQUMsRUFDZixDQUFDRCxjQUFDLEVBQUVDLGNBQUMsRUFBRUQsY0FBQyxFQUFFQSxjQUFDLEVBQUVDLGNBQUMsQ0FBQyxFQUNmLENBQUNBLGNBQUMsRUFBRUEsY0FBQyxFQUFFRCxjQUFDLEVBQUVBLGNBQUMsRUFBRUEsY0FBQyxDQUFDLEVBQ2YsQ0FBQ0EsY0FBQyxFQUFFQSxjQUFDLEVBQUVDLGNBQUMsRUFBRUQsY0FBQyxFQUFFQyxjQUFDLENBQUMsRUFDZixDQUFDQSxjQUFDLEVBQUVELGNBQUMsRUFBRUMsY0FBQyxFQUFFRCxjQUFDLEVBQUVBLGNBQUMsQ0FBQyxFQUNmLENBQUNBLGNBQUMsRUFBRUMsY0FBQyxFQUFFQSxjQUFDLEVBQUVELGNBQUMsRUFBRUEsY0FBQyxDQUFDLEVBQ2YsQ0FBQ0EsY0FBQyxFQUFFQSxjQUFDLEVBQUVBLGNBQUMsRUFBRUMsY0FBQyxFQUFFQSxjQUFDLENBQUMsRUFDZixDQUFDQSxjQUFDLEVBQUVELGNBQUMsRUFBRUEsY0FBQyxFQUFFQyxjQUFDLEVBQUVELGNBQUMsQ0FBQyxFQUNmLENBQUNBLGNBQUMsRUFBRUMsY0FBQyxFQUFFRCxjQUFDLEVBQUVDLGNBQUMsRUFBRUQsY0FBQyxDQUFDLENBQ2xCO0lBQUFsSCx3QkFBQSxDQUFBMEgsS0FBQSwyQkFDdUIsQ0FBQztJQUFBMUgsd0JBQUEsQ0FBQTBILEtBQUEsWUFDaEIsT0FBTztJQUlaLElBQUkwSyxJQUFJLENBQUNDLHNCQUFzQixFQUFFO01BQzdCM0ssS0FBQSxDQUFLdkMsaUJBQWlCLEdBQUcsSUFBSTtNQUM3QnVDLEtBQUEsQ0FBS1csY0FBYyxHQUFHLElBQUk7SUFDOUI7SUFDQVgsS0FBQSxDQUFLN00sTUFBTSxHQUFHdVgsSUFBSTtJQUNsQixPQUFBRSxtQ0FBQSxDQUFBNUssS0FBQSxFQUFBQSxLQUFBO0VBQ0o7RUFBQ00sa0JBQUEsQ0FBQW1LLFdBQUEsRUFBQTFLLGNBQUE7RUFBQSxPQUFBeEgscUJBQUEsQ0FBQWtTLFdBQUE7SUFBQWhULEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVUwRyxhQUFhQSxDQUFDQyxPQUFzQixFQUFFQyxJQUEyQixFQUFVO01BQ2pGLElBQUksSUFBSSxDQUFDcEssTUFBTSxDQUFDd1gsc0JBQXNCLEVBQUU7UUFDcEMsSUFBTUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFNQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLElBQU01TSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLElBQU02TSxlQUFlLEdBQUcsSUFBSSxDQUFDQyxxQkFBcUI7UUFDbEQsSUFBTUMsc0JBQXNCLEdBQUcsQ0FBQyxHQUFHRixlQUFlO1FBRWxELEtBQUssSUFBSWxqQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5VixPQUFPLENBQUNwVyxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1VBQ3JDZ2pCLFVBQVUsQ0FBQ2hqQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUl5VixPQUFPLENBQUN6VixDQUFDLENBQUM7VUFDL0JpakIsT0FBTyxDQUFDampCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSTBWLElBQUksQ0FBQzFWLENBQUMsQ0FBQztRQUM3QjtRQUNBcVcsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHNE0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzFDM00sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHNE0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHRCxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRTFDM00sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHL1gsSUFBSSxDQUFDK0MsR0FBRyxDQUFDL0MsSUFBSSxDQUFDc0wsR0FBRyxDQUFDeU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFNk0sZUFBZSxDQUFDLEVBQUVFLHNCQUFzQixDQUFDO1FBQzFGL00sVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHL1gsSUFBSSxDQUFDK0MsR0FBRyxDQUFDL0MsSUFBSSxDQUFDc0wsR0FBRyxDQUFDeU0sVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFNk0sZUFBZSxDQUFDLEVBQUVFLHNCQUFzQixDQUFDO1FBQzFGLElBQUksQ0FBQ3hKLGFBQWEsR0FBR3ZELFVBQVU7UUFDL0IsS0FBSyxJQUFJclcsRUFBQyxHQUFHLENBQUMsRUFBRUEsRUFBQyxHQUFHeVYsT0FBTyxDQUFDcFcsTUFBTSxFQUFFVyxFQUFDLEVBQUUsRUFBRTtVQUNyQ3lWLE9BQU8sQ0FBQ3pWLEVBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQzRaLGFBQWEsQ0FBQzVaLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0M7TUFDSjtNQUNBLE9BQUE2Zix5QkFBQSxDQUFBK0MsV0FBQSw2QkFBMkJuTixPQUFPLEVBQUVDLElBQUk7SUFDNUM7RUFBQztJQUFBOUYsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVTRKLFlBQVlBLENBQUNsQyxPQUE4QixFQUFFNUwsTUFBZSxFQUFnRjtNQUFBLElBQTlFc00sT0FBZ0IsR0FBQTlYLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFrRyxTQUFBLEdBQUFsRyxTQUFBLE1BQUcsS0FBSztNQUFBLElBQUV1WixTQUFrQixHQUFBdlosU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQWtHLFNBQUEsR0FBQWxHLFNBQUEsTUFBRyxLQUFLO01BQ3hILElBQU1xVyxPQUFPLEdBQUcsSUFBSTZDLEtBQUssQ0FBUzlCLE9BQU8sQ0FBQ25YLE1BQU0sQ0FBQyxDQUFDUyxJQUFJLENBQUMsQ0FBQyxDQUFDO01BQ3pELElBQUlzWCxVQUFVLEdBQUcsQ0FBQztNQUNsQixJQUFNd0IsU0FBMEIsR0FBRztRQUMvQi9DLEtBQUssRUFBRTdMLE1BQU0sQ0FBQ0MsU0FBUztRQUN2QnNMLEtBQUssRUFBRSxDQUFDO1FBQ1IvUCxHQUFHLEVBQUU7TUFDVCxDQUFDO01BRUQsSUFBTXFULE9BQU8sR0FBRyxJQUFJLENBQUNDLGNBQWM7TUFFbkM1QixPQUFPLEdBQUdBLE9BQU8sSUFBSSxLQUFLO01BQzFCeUIsU0FBUyxHQUFHQSxTQUFTLElBQUksS0FBSztNQUU5QixJQUFJLENBQUMvTixNQUFNLEVBQUU7UUFDVEEsTUFBTSxHQUFHLElBQUksQ0FBQ3VMLFFBQVEsQ0FBQyxJQUFJLENBQUNkLElBQUksQ0FBQztNQUNyQztNQUVBLEtBQUssSUFBSXJWLENBQUMsR0FBRzRLLE1BQU0sRUFBRTVLLENBQUMsR0FBRyxJQUFJLENBQUNxVixJQUFJLENBQUNoVyxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQzVDLElBQUksSUFBSSxDQUFDcVYsSUFBSSxDQUFDclYsQ0FBQyxDQUFDLElBQUlrWCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1VBQ2xDekIsT0FBTyxDQUFDMkIsVUFBVSxDQUFDLEVBQUU7UUFDekIsQ0FBQyxNQUFNO1VBQ0gsSUFBSUEsVUFBVSxLQUFLM0IsT0FBTyxDQUFDcFcsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFNaUMsR0FBRyxHQUFHbVUsT0FBTyxDQUFDbFYsTUFBTSxDQUFDLFVBQUNVLElBQUksRUFBRUMsSUFBSTtjQUFBLE9BQUtELElBQUksR0FBR0MsSUFBSTtZQUFBLEdBQUUsQ0FBQyxDQUFDO1lBQzFELElBQU0yVSxLQUFLLEdBQUcsSUFBSSxDQUFDTCxhQUFhLENBQUNDLE9BQU8sRUFBRWUsT0FBTyxDQUFDO1lBQ2xELElBQUlYLEtBQUssR0FBR2dELE9BQU8sRUFBRTtjQUNqQkQsU0FBUyxDQUFDL0MsS0FBSyxHQUFHQSxLQUFLO2NBQ3ZCK0MsU0FBUyxDQUFDckQsS0FBSyxHQUFHdlYsQ0FBQyxHQUFHc0IsR0FBRztjQUN6QnNYLFNBQVMsQ0FBQ3BULEdBQUcsR0FBR3hGLENBQUM7Y0FDakIsT0FBTzRZLFNBQVM7WUFDcEI7WUFDQSxJQUFJRCxTQUFTLEVBQUU7Y0FDWCxLQUFLLElBQUkxWSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd3VixPQUFPLENBQUNwVyxNQUFNLEdBQUcsQ0FBQyxFQUFFWSxDQUFDLEVBQUUsRUFBRTtnQkFDekN3VixPQUFPLENBQUN4VixDQUFDLENBQUMsR0FBR3dWLE9BQU8sQ0FBQ3hWLENBQUMsR0FBRyxDQUFDLENBQUM7Y0FDL0I7Y0FDQXdWLE9BQU8sQ0FBQ0EsT0FBTyxDQUFDcFcsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7Y0FDL0JvVyxPQUFPLENBQUNBLE9BQU8sQ0FBQ3BXLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO2NBQy9CK1gsVUFBVSxFQUFFO1lBQ2hCLENBQUMsTUFBTTtjQUNILE9BQU8sSUFBSTtZQUNmO1VBQ0osQ0FBQyxNQUFNO1lBQ0hBLFVBQVUsRUFBRTtVQUNoQjtVQUNBM0IsT0FBTyxDQUFDMkIsVUFBVSxDQUFDLEdBQUcsQ0FBQztVQUN2QkYsT0FBTyxHQUFHLENBQUNBLE9BQU87UUFDdEI7TUFDSjtNQUNBLE9BQU8sSUFBSTtJQUNmO0VBQUM7SUFBQXRILEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVVpSyxVQUFVQSxDQUFBLEVBQTJCO01BQzNDLElBQUlHLHNCQUFzQixHQUFHLENBQUM7TUFDOUIsSUFBSXRPLE1BQU0sR0FBRyxJQUFJLENBQUN1TCxRQUFRLENBQUMsSUFBSSxDQUFDZCxJQUFJLENBQUM7TUFDckMsSUFBSTJELFNBQWlDLEdBQUcsSUFBSTtNQUM1QyxJQUFJQyxjQUFjLEdBQUcsQ0FBQztNQUV0QixPQUFPLENBQUNELFNBQVMsRUFBRTtRQUNmQSxTQUFTLEdBQUcsSUFBSSxDQUFDTixZQUFZLENBQUMsSUFBSSxDQUFDYixhQUFhLEVBQUVqTixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztRQUN0RSxJQUFJLENBQUNvTyxTQUFTLEVBQUU7VUFDWixPQUFPLElBQUk7UUFDZjtRQUNBQyxjQUFjLEdBQUczYSxJQUFJLENBQUM0QixLQUFLLENBQUMsQ0FBQzhZLFNBQVMsQ0FBQ3hULEdBQUcsR0FBR3dULFNBQVMsQ0FBQ3pELEtBQUssSUFBSSxDQUFDLENBQUM7UUFDbEUyRCxzQkFBc0IsR0FBR0YsU0FBUyxDQUFDekQsS0FBSyxHQUFHMEQsY0FBYyxHQUFHLEVBQUU7UUFDOUQsSUFBSUMsc0JBQXNCLElBQUksQ0FBQyxFQUFFO1VBQzdCLElBQUksSUFBSSxDQUFDbEMsV0FBVyxDQUFDa0Msc0JBQXNCLEVBQUVGLFNBQVMsQ0FBQ3pELEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM5RCxPQUFPeUQsU0FBUztVQUNwQjtRQUNKO1FBQ0FwTyxNQUFNLEdBQUdvTyxTQUFTLENBQUN4VCxHQUFHO1FBQ3RCd1QsU0FBUyxHQUFHLElBQUk7TUFDcEI7TUFDQSxPQUFPLElBQUk7SUFDZjtFQUFDO0lBQUFwSixHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVcUsseUJBQXlCQSxDQUFDQyxPQUF3QixFQUEwQjtNQUNsRixJQUFNQyxxQkFBcUIsR0FBR0QsT0FBTyxDQUFDNVQsR0FBRyxHQUFJLENBQUM0VCxPQUFPLENBQUM1VCxHQUFHLEdBQUc0VCxPQUFPLENBQUM3RCxLQUFLLElBQUksQ0FBRTtNQUMvRSxJQUFJOEQscUJBQXFCLEdBQUcsSUFBSSxDQUFDaEUsSUFBSSxDQUFDaFcsTUFBTSxFQUFFO1FBQzFDLElBQUksSUFBSSxDQUFDMlgsV0FBVyxDQUFDb0MsT0FBTyxDQUFDNVQsR0FBRyxFQUFFNlQscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7VUFDekQsT0FBT0QsT0FBTztRQUNsQjtNQUNKO01BQ0EsT0FBTyxJQUFJO0lBQ2Y7RUFBQztJQUFBeEosR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXdLLFFBQVFBLENBQUEsRUFBMkI7TUFDekMsSUFBSSxDQUFDakUsSUFBSSxDQUFDcUIsT0FBTyxDQUFDLENBQUM7TUFDbkIsSUFBTTBDLE9BQU8sR0FBRyxJQUFJLENBQUNWLFlBQVksQ0FBQyxJQUFJLENBQUNaLFlBQVksQ0FBQztNQUNwRCxJQUFJLENBQUN6QyxJQUFJLENBQUNxQixPQUFPLENBQUMsQ0FBQztNQUVuQixJQUFJMEMsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNsQixPQUFPLElBQUk7TUFDZjs7TUFFQTtNQUNBLElBQU1sSCxHQUFHLEdBQUdrSCxPQUFPLENBQUM3RCxLQUFLO01BQ3pCNkQsT0FBTyxDQUFDN0QsS0FBSyxHQUFHLElBQUksQ0FBQ0YsSUFBSSxDQUFDaFcsTUFBTSxHQUFHK1osT0FBTyxDQUFDNVQsR0FBRztNQUM5QzRULE9BQU8sQ0FBQzVULEdBQUcsR0FBRyxJQUFJLENBQUM2UCxJQUFJLENBQUNoVyxNQUFNLEdBQUc2UyxHQUFHO01BRXBDLE9BQU9rSCxPQUFPLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQ0QseUJBQXlCLENBQUNDLE9BQU8sQ0FBQyxHQUFHLElBQUk7SUFDNUU7RUFBQztJQUFBeEosR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXVVLFdBQVdBLENBQUNDLFdBQWlDLEVBQTZCO01BQ2hGLElBQU1DLEtBQXlCLEdBQUcsRUFBRTtNQUVwQyxLQUFLLElBQUl2akIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHc2pCLFdBQVcsQ0FBQ2prQixNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQ3pDLElBQU0wVixJQUFJLEdBQUcsSUFBSSxDQUFDOEQsV0FBVyxDQUFDOEosV0FBVyxDQUFDdGpCLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQzBWLElBQUksRUFBRTtVQUNQLE9BQU8sSUFBSTtRQUNmO1FBQ0E2TixLQUFLLENBQUMxaUIsSUFBSSxDQUFDNlUsSUFBSSxDQUFDO01BQ3BCO01BQ0EsT0FBTzZOLEtBQUs7SUFDaEI7RUFBQztJQUFBM1QsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVTBLLFdBQVdBLENBQUMvRCxPQUFzQixFQUFzQjtNQUM5RCxJQUFNb0QsT0FBTyxHQUFHLElBQUksQ0FBQ0MsY0FBYztNQUVuQyxJQUFNRixTQUFzQixHQUFHO1FBQzNCL0MsS0FBSyxFQUFFN0wsTUFBTSxDQUFDQyxTQUFTO1FBQ3ZCeUwsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNSSCxLQUFLLEVBQUUsQ0FBQztRQUNSL1AsR0FBRyxFQUFFO01BQ1QsQ0FBQztNQUVELEtBQUssSUFBSWtRLElBQUksR0FBRyxDQUFDLEVBQUVBLElBQUksR0FBRyxJQUFJLENBQUNxQyxZQUFZLENBQUMxWSxNQUFNLEVBQUVxVyxJQUFJLEVBQUUsRUFBRTtRQUN4RCxJQUFNRyxLQUFLLEdBQUcsSUFBSSxDQUFDTCxhQUFhLENBQUNDLE9BQU8sRUFBRSxJQUFJLENBQUNzQyxZQUFZLENBQUNyQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxJQUFJRyxLQUFLLEdBQUcrQyxTQUFTLENBQUMvQyxLQUFNLEVBQUU7VUFDMUIrQyxTQUFTLENBQUNsRCxJQUFJLEdBQUdBLElBQUk7VUFDckJrRCxTQUFTLENBQUMvQyxLQUFLLEdBQUdBLEtBQUs7UUFDM0I7TUFDSjtNQUNBLElBQUkrQyxTQUFTLENBQUMvQyxLQUFLLEdBQUlnRCxPQUFPLEVBQUU7UUFDNUIsT0FBT0QsU0FBUztNQUNwQjtNQUNBLE9BQU8sSUFBSTtJQUNmO0VBQUM7SUFBQWhKLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVUySyxjQUFjQSxDQUFDdEMsUUFBK0IsRUFBRTVQLE1BQXFCLEVBQUVtUyxZQUFrRCxFQUE2QjtNQUM1SixJQUFJelIsR0FBRyxHQUFHLENBQUM7TUFDWCxJQUFNMFIsYUFBYSxHQUFHeEMsUUFBUSxDQUFDOVgsTUFBTTtNQUNyQyxJQUFNaWtCLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ3RELElBQUlDLEtBQTJCLEdBQUcsSUFBSTtNQUV0QyxPQUFPdGIsR0FBRyxHQUFHMFIsYUFBYSxFQUFFO1FBQ3hCLEtBQUssSUFBSTNaLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsRUFBRSxFQUFFO1VBQ3hCc2pCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQ3RqQixDQUFDLENBQUMsR0FBR21YLFFBQVEsQ0FBQ2xQLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzJSLGFBQWEsQ0FBQyxDQUFDLENBQUM7VUFDekQwSixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUN0akIsQ0FBQyxDQUFDLEdBQUdtWCxRQUFRLENBQUNsUCxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDMlIsYUFBYSxDQUFDLENBQUMsQ0FBQztVQUM3RDNSLEdBQUcsSUFBSSxDQUFDO1FBQ1o7UUFDQXNiLEtBQUssR0FBRyxJQUFJLENBQUNGLFdBQVcsQ0FBQ0MsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQ0MsS0FBSyxFQUFFO1VBQ1IsT0FBTyxJQUFJO1FBQ2Y7UUFDQSxLQUFLLElBQUl2akIsR0FBQyxHQUFHLENBQUMsRUFBRUEsR0FBQyxHQUFHdWpCLEtBQUssQ0FBQ2xrQixNQUFNLEVBQUVXLEdBQUMsRUFBRSxFQUFFO1VBQ25DdUgsTUFBTSxDQUFDMUcsSUFBSSxDQUFDMGlCLEtBQUssQ0FBQ3ZqQixHQUFDLENBQUMsQ0FBQzBWLElBQUksR0FBRyxFQUFFLENBQUM7VUFDL0JnRSxZQUFZLENBQUM3WSxJQUFJLENBQUMwaUIsS0FBSyxDQUFDdmpCLEdBQUMsQ0FBQyxDQUFDO1FBQy9CO01BQ0o7TUFDQSxPQUFPdWpCLEtBQUs7SUFDaEI7RUFBQztJQUFBM1QsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBVXlLLG9CQUFvQkEsQ0FBQ3BDLFFBQXVCLEVBQUU7TUFDcEQsT0FBUUEsUUFBUSxDQUFDOVgsTUFBTSxHQUFHLEVBQUUsS0FBSyxDQUFDO0lBQ3RDO0VBQUM7SUFBQXVRLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQU8ySCxNQUFNQSxDQUFDL1YsR0FBbUIsRUFBRTZVLEtBQWdDLEVBQWtCO01BQ2pGLElBQUloTyxNQUFNLEdBQUcsSUFBSStRLEtBQUssQ0FBUyxDQUFDO01BQ2hDLElBQUlvQixZQUFZLEdBQUcsSUFBSXBCLEtBQUssQ0FBa0IsQ0FBQztNQUUvQyxJQUFNVSxTQUFTLEdBQUcsSUFBSSxDQUFDRCxVQUFVLENBQUMsQ0FBQztNQUNuQyxJQUFJLENBQUNDLFNBQVMsRUFBRTtRQUNaLE9BQU8sSUFBSTtNQUNmO01BQ0FVLFlBQVksQ0FBQzdZLElBQUksQ0FBQ21ZLFNBQVMsQ0FBQztNQUU1QixJQUFNSSxPQUFPLEdBQUcsSUFBSSxDQUFDRSxRQUFRLENBQUMsQ0FBQztNQUMvQixJQUFJLENBQUNGLE9BQU8sRUFBRTtRQUNWLE9BQU8sSUFBSTtNQUNmO01BRUEsSUFBTWpDLFFBQVEsR0FBRyxJQUFJLENBQUNGLGFBQWEsQ0FBQytCLFNBQVMsQ0FBQ3hULEdBQUcsRUFBRTRULE9BQU8sQ0FBQzdELEtBQUssRUFBRSxLQUFLLENBQUM7TUFDeEUsSUFBSSxDQUFDLElBQUksQ0FBQ2dFLG9CQUFvQixDQUFDcEMsUUFBUSxDQUFDLEVBQUU7UUFDdEMsT0FBTyxJQUFJO01BQ2Y7TUFDQSxJQUFNekIsSUFBSSxHQUFHLElBQUksQ0FBQytELGNBQWMsQ0FBQ3RDLFFBQVEsRUFBRTVQLE1BQU0sRUFBRW1TLFlBQVksQ0FBQztNQUNoRSxJQUFJLENBQUNoRSxJQUFJLEVBQUU7UUFDUCxPQUFPLElBQUk7TUFDZjtNQUNBLElBQUluTyxNQUFNLENBQUNsSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFDbkJrSSxNQUFNLENBQUNsSSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sSUFBSTtNQUNmO01BRUFxYSxZQUFZLENBQUM3WSxJQUFJLENBQUN1WSxPQUFPLENBQUM7TUFDMUIsT0FBTztRQUNIMUQsSUFBSSxFQUFFbk8sTUFBTSxDQUFDM0csSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyQjJVLEtBQUssRUFBRXlELFNBQVMsQ0FBQ3pELEtBQUs7UUFDdEIvUCxHQUFHLEVBQUU0VCxPQUFPLENBQUM1VCxHQUFHO1FBQ2hCd1QsU0FBUyxFQUFFQSxTQUFTO1FBQ3BCVSxZQUFZLEVBQUVBLFlBQVk7UUFDMUI1QyxNQUFNLEVBQUUsSUFBSSxDQUFDQztNQUNqQixDQUFDO0lBQ0w7RUFBQztBQUFBLEVBcFFxQjVCLGNBQWE7QUF1UXhCeU4seUVBQVcsRTs7Ozs7Ozs7Ozs7Ozs7QUMvUTZCO0FBQUEsSUFHakRZLHVCQUFVLDBCQUFBbkIsVUFBQTtFQUFBLFNBQUFtQixXQUFBO0lBQUEsSUFBQXJMLEtBQUE7SUFBQTNILHdCQUFBLE9BQUFnVCxVQUFBO0lBQUEsU0FBQXBMLElBQUEsR0FBQWhaLFNBQUEsQ0FBQUMsTUFBQSxFQUFBZ1osSUFBQSxPQUFBQyxLQUFBLENBQUFGLElBQUEsR0FBQUcsSUFBQSxNQUFBQSxJQUFBLEdBQUFILElBQUEsRUFBQUcsSUFBQTtNQUFBRixJQUFBLENBQUFFLElBQUEsSUFBQW5aLFNBQUEsQ0FBQW1aLElBQUE7SUFBQTtJQUFBSixLQUFBLEdBQUFLLHNCQUFBLE9BQUFnTCxVQUFBLEtBQUE3aUIsTUFBQSxDQUFBMFgsSUFBQTtJQUFBNUgsd0JBQUEsQ0FBQTBILEtBQUEsb0JBQ0ssQ0FDYixDQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBRSxFQUMxQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQUExSCx3QkFBQSxDQUFBMEgsS0FBQSxrQkFDN0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUFBMUgsd0JBQUEsQ0FBQTBILEtBQUEsWUFDeEUsT0FBTztJQUFBLE9BQUFBLEtBQUE7RUFBQTtFQUFBTSxrQkFBQSxDQUFBK0ssVUFBQSxFQUFBbkIsVUFBQTtFQUFBLE9BQUEzUixxQkFBQSxDQUFBOFMsVUFBQTtJQUFBNVQsR0FBQTtJQUFBZCxLQUFBLEVBQ2hCLFNBQVUySyxjQUFjQSxDQUFDZ0ksTUFBdUIsRUFBRWxhLE1BQXFCLEVBQUVtUyxZQUFvQyxFQUFzQjtNQUMvSCxJQUFJZ0ksT0FBNkMsR0FBQUMseUJBQUEsS0FBUUYsTUFBTSxDQUFFO01BQ2pFLElBQUlELGFBQWEsR0FBRyxHQUFHO01BRXZCLEtBQUssSUFBSXhoQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEVBQUUsRUFBRTtRQUN4QjBoQixPQUFPLEdBQUcsSUFBSSxDQUFDbEksV0FBVyxDQUFDa0ksT0FBTyxDQUFDbGMsR0FBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQ2tjLE9BQU8sRUFBRTtVQUNWLE9BQU8sSUFBSTtRQUNmO1FBQ0EsSUFBS0EsT0FBTyxDQUFpQmhNLElBQUksSUFBSXNMLFlBQVksRUFBRTtVQUM5Q1UsT0FBTyxDQUFpQmhNLElBQUksR0FBSWdNLE9BQU8sQ0FBaUJoTSxJQUFJLEdBQUdzTCxZQUFZO1VBQzVFUSxhQUFhLElBQUssQ0FBQyxJQUFLLENBQUMsR0FBR3hoQixDQUFHO1FBQ25DO1FBQ0F1SCxNQUFNLENBQUMxRyxJQUFJLENBQUU2Z0IsT0FBTyxDQUFpQmhNLElBQUksQ0FBQztRQUMxQ2dFLFlBQVksQ0FBQzdZLElBQUksQ0FBQzZnQixPQUFPLENBQUM7TUFDOUI7TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDK0IsZ0JBQWdCLENBQUNqQyxhQUFhLEVBQUVqYSxNQUFNLENBQUMsRUFBRTtRQUMvQyxPQUFPLElBQUk7TUFDZjtNQUNBLE9BQU9tYSxPQUFPO0lBQ2xCO0VBQUM7SUFBQTlSLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVUyVSxnQkFBZ0JBLENBQUNqQyxhQUFxQixFQUFFamEsTUFBcUIsRUFBRTtNQUNyRSxLQUFLLElBQUltYyxRQUFRLEdBQUcsQ0FBQyxFQUFFQSxRQUFRLEdBQUcsSUFBSSxDQUFDdkMsY0FBYyxDQUFDOWhCLE1BQU0sRUFBRXFrQixRQUFRLEVBQUUsRUFBQztRQUNyRSxLQUFLLElBQUkxakIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLElBQUksQ0FBQ21oQixjQUFjLENBQUN1QyxRQUFRLENBQUMsQ0FBQ3JrQixNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1VBQzNELElBQUl3aEIsYUFBYSxLQUFLLElBQUksQ0FBQ0wsY0FBYyxDQUFDdUMsUUFBUSxDQUFDLENBQUMxakIsQ0FBQyxDQUFDLEVBQUU7WUFDcER1SCxNQUFNLENBQUNpRyxPQUFPLENBQUNrVyxRQUFRLENBQUM7WUFDeEJuYyxNQUFNLENBQUMxRyxJQUFJLENBQUNiLENBQUMsQ0FBQztZQUNkLE9BQU8sSUFBSTtVQUNmO1FBQ0o7TUFDSjtNQUNBLE9BQU8sS0FBSztJQUNoQjtFQUFDO0lBQUE0UCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFVNlUsY0FBY0EsQ0FBQ3BjLE1BQXFCLEVBQUU7TUFDNUMsSUFBSXFjLElBQUksR0FBRyxDQUFDcmMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3RCLElBQU1zYyxTQUFTLEdBQUd0YyxNQUFNLENBQUNBLE1BQU0sQ0FBQ2xJLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFFM0MsSUFBSXdrQixTQUFTLElBQUksQ0FBQyxFQUFFO1FBQ2hCRCxJQUFJLEdBQUdBLElBQUksQ0FBQ2pqQixNQUFNLENBQUM0RyxNQUFNLENBQUNvWSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ2pDaGYsTUFBTSxDQUFDLENBQUNrakIsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQy9CbGpCLE1BQU0sQ0FBQzRHLE1BQU0sQ0FBQ29ZLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDbkMsQ0FBQyxNQUFNLElBQUlrRSxTQUFTLEtBQUssQ0FBQyxFQUFFO1FBQ3hCRCxJQUFJLEdBQUdBLElBQUksQ0FBQ2pqQixNQUFNLENBQUM0RyxNQUFNLENBQUNvWSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ2pDaGYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3ZCQSxNQUFNLENBQUM0RyxNQUFNLENBQUNvWSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ25DLENBQUMsTUFBTSxJQUFJa0UsU0FBUyxLQUFLLENBQUMsRUFBRTtRQUN4QkQsSUFBSSxHQUFHQSxJQUFJLENBQUNqakIsTUFBTSxDQUFDNEcsTUFBTSxDQUFDb1ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNqQ2hmLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU0RyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMzQyxDQUFDLE1BQU07UUFDSHFjLElBQUksR0FBR0EsSUFBSSxDQUFDampCLE1BQU0sQ0FBQzRHLE1BQU0sQ0FBQ29ZLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDakNoZixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUVrakIsU0FBUyxDQUFDLENBQUM7TUFDeEM7TUFFQUQsSUFBSSxDQUFDL2lCLElBQUksQ0FBQzBHLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDbEksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ3BDLE9BQU91a0IsSUFBSTtJQUNmO0VBQUM7SUFBQWhVLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVVnVCxTQUFTQSxDQUFDdmEsTUFBcUIsRUFBVztNQUNoRCxPQUFBc1kseUJBQUEsQ0FBQTJELFVBQUEseUJBQXVCLElBQUksQ0FBQ0csY0FBYyxDQUFDcGMsTUFBTSxDQUFDO0lBQ3REO0VBQUM7SUFBQXFJLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVV3SyxRQUFRQSxDQUFDMU8sTUFBYyxFQUFFc00sT0FBZ0IsRUFBMEI7TUFDekUsT0FBQTJJLHlCQUFBLENBQUEyRCxVQUFBLHdCQUFzQjVZLE1BQU0sRUFBRSxJQUFJO0lBQ3RDO0VBQUM7SUFBQWdGLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQVVxSyx5QkFBeUJBLENBQUNDLE9BQXdCLEVBQTBCO01BQ2xGLElBQU1DLHFCQUFxQixHQUFHRCxPQUFPLENBQUM1VCxHQUFHLEdBQUksQ0FBQzRULE9BQU8sQ0FBQzVULEdBQUcsR0FBRzRULE9BQU8sQ0FBQzdELEtBQUssSUFBSSxDQUFFO01BQy9FLElBQUk4RCxxQkFBcUIsR0FBRyxJQUFJLENBQUNoRSxJQUFJLENBQUNoVyxNQUFNLEVBQUU7UUFDMUMsSUFBSSxJQUFJLENBQUMyWCxXQUFXLENBQUNvQyxPQUFPLENBQUM1VCxHQUFHLEVBQUU2VCxxQkFBcUIsRUFBRSxDQUFDLENBQUMsRUFBRTtVQUN6RCxPQUFPRCxPQUFPO1FBQ2xCO01BQ0o7TUFDQSxPQUFPLElBQUk7SUFDZjtFQUFDO0FBQUEsRUFqRm9CZ0ksVUFBUztBQW9GbkJvQyx3RUFBVSxFOzs7Ozs7Ozs7O0FDdkZZO0FBQUEsSUFHL0JNLG9CQUFTLDBCQUFBekIsVUFBQTtFQUFBLFNBQUF5QixVQUFBO0lBQUEsSUFBQTNMLEtBQUE7SUFBQTNILHdCQUFBLE9BQUFzVCxTQUFBO0lBQUEsU0FBQTFMLElBQUEsR0FBQWhaLFNBQUEsQ0FBQUMsTUFBQSxFQUFBZ1osSUFBQSxPQUFBQyxLQUFBLENBQUFGLElBQUEsR0FBQUcsSUFBQSxNQUFBQSxJQUFBLEdBQUFILElBQUEsRUFBQUcsSUFBQTtNQUFBRixJQUFBLENBQUFFLElBQUEsSUFBQW5aLFNBQUEsQ0FBQW1aLElBQUE7SUFBQTtJQUFBSixLQUFBLEdBQUFLLG9CQUFBLE9BQUFzTCxTQUFBLEtBQUFuakIsTUFBQSxDQUFBMFgsSUFBQTtJQUFBNUgsd0JBQUEsQ0FBQTBILEtBQUEsWUFDRixPQUFPO0lBQUEsT0FBQUEsS0FBQTtFQUFBO0VBQUFNLGtCQUFBLENBQUFxTCxTQUFBLEVBQUF6QixVQUFBO0VBQUEsT0FBQTNSLHFCQUFBLENBQUFvVCxTQUFBO0lBQUFsVSxHQUFBO0lBQUFkLEtBQUEsRUFDaEIsU0FBQTJILE1BQU1BLENBQUMvVixHQUFtQixFQUFFNlUsS0FBZ0MsRUFBa0I7TUFDMUUsSUFBTWhPLE1BQU0sR0FBRzZaLFVBQVMsQ0FBQzVoQixTQUFTLENBQUNpWCxNQUFNLENBQUMvVyxJQUFJLENBQUMsSUFBSSxDQUFDO01BRXBELElBQUk2SCxNQUFNLElBQUlBLE1BQU0sQ0FBQ21PLElBQUksSUFBSW5PLE1BQU0sQ0FBQ21PLElBQUksQ0FBQ3JXLE1BQU0sS0FBSyxFQUFFLElBQUlrSSxNQUFNLENBQUNtTyxJQUFJLENBQUNxTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ3JGeGMsTUFBTSxDQUFDbU8sSUFBSSxHQUFHbk8sTUFBTSxDQUFDbU8sSUFBSSxDQUFDc08sU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPemMsTUFBTTtNQUNqQjtNQUNBLE9BQU8sSUFBSTtJQUNmO0VBQUM7QUFBQSxFQVZtQjZaLFVBQVM7QUFhbEIwQyxtRUFBUyxFOztBQ2hCeEIsSUFBTUcsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVwQixJQUFNQyxLQUFLLEdBQUc7RUFDVkMsR0FBRyxFQUFFO0lBQ0RDLEVBQUUsRUFBRSxDQUFDO0lBQ0xDLElBQUksRUFBRSxDQUFDO0VBQ1g7QUFDSixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FKLFNBQVMsQ0FBQ0ssY0FBYyxHQUFHLFVBQVU3Z0IsWUFBWSxFQUFFbUMsRUFBRSxFQUFFQyxFQUFFLEVBQUU7RUFDdkQ7RUFDQSxJQUFJMGUsRUFBRSxHQUFHM2UsRUFBRSxDQUFDM0MsQ0FBQyxHQUFHLENBQUM7RUFDakIsSUFBSXVoQixFQUFFLEdBQUc1ZSxFQUFFLENBQUMxQyxDQUFDLEdBQUcsQ0FBQztFQUNqQixJQUFJdWhCLEVBQUUsR0FBRzVlLEVBQUUsQ0FBQzVDLENBQUMsR0FBRyxDQUFDO0VBQ2pCLElBQUl5aEIsRUFBRSxHQUFHN2UsRUFBRSxDQUFDM0MsQ0FBQyxHQUFHLENBQUM7RUFDakI7RUFDQSxJQUFNeWhCLEtBQUssR0FBR3JtQixJQUFJLENBQUNtRSxHQUFHLENBQUNpaUIsRUFBRSxHQUFHRixFQUFFLENBQUMsR0FBR2xtQixJQUFJLENBQUNtRSxHQUFHLENBQUNnaUIsRUFBRSxHQUFHRixFQUFFLENBQUM7RUFDbkQsSUFBSTFPLEtBQUs7RUFDVCxJQUFJM1MsQ0FBQztFQUNMLElBQUlnUCxHQUFHO0VBQ1AsSUFBSWpQLENBQUM7RUFDTCxJQUFNaUMsSUFBSSxHQUFHLEVBQUU7RUFDZixJQUFNdkIsU0FBUyxHQUFHRixZQUFZLENBQUNHLElBQUk7RUFDbkMsSUFBTUMsS0FBSyxHQUFHSixZQUFZLENBQUNLLElBQUksQ0FBQ2IsQ0FBQztFQUNqQyxJQUFJcEQsR0FBRztFQUNQLElBQUkrSixHQUFHLEdBQUcsR0FBRztFQUNiLElBQUl2SSxHQUFHLEdBQUcsQ0FBQztFQUVYLFNBQVN1akIsSUFBSUEsQ0FBQ3BtQixDQUFDLEVBQUVDLENBQUMsRUFBRTtJQUNoQm9CLEdBQUcsR0FBRzhELFNBQVMsQ0FBQ2xGLENBQUMsR0FBR29GLEtBQUssR0FBR3JGLENBQUMsQ0FBQztJQUM5Qm9MLEdBQUcsR0FBRy9KLEdBQUcsR0FBRytKLEdBQUcsR0FBRy9KLEdBQUcsR0FBRytKLEdBQUc7SUFDM0J2SSxHQUFHLEdBQUd4QixHQUFHLEdBQUd3QixHQUFHLEdBQUd4QixHQUFHLEdBQUd3QixHQUFHO0lBQzNCNkQsSUFBSSxDQUFDckUsSUFBSSxDQUFDaEIsR0FBRyxDQUFDO0VBQ2xCO0VBRUEsSUFBSThrQixLQUFLLEVBQUU7SUFDUHpTLEdBQUcsR0FBR3FTLEVBQUU7SUFDUkEsRUFBRSxHQUFHQyxFQUFFO0lBQ1BBLEVBQUUsR0FBR3RTLEdBQUc7SUFFUkEsR0FBRyxHQUFHdVMsRUFBRTtJQUNSQSxFQUFFLEdBQUdDLEVBQUU7SUFDUEEsRUFBRSxHQUFHeFMsR0FBRztFQUNaO0VBQ0EsSUFBSXFTLEVBQUUsR0FBR0UsRUFBRSxFQUFFO0lBQ1R2UyxHQUFHLEdBQUdxUyxFQUFFO0lBQ1JBLEVBQUUsR0FBR0UsRUFBRTtJQUNQQSxFQUFFLEdBQUd2UyxHQUFHO0lBRVJBLEdBQUcsR0FBR3NTLEVBQUU7SUFDUkEsRUFBRSxHQUFHRSxFQUFFO0lBQ1BBLEVBQUUsR0FBR3hTLEdBQUc7RUFDWjtFQUNBLElBQU0yUyxNQUFNLEdBQUdKLEVBQUUsR0FBR0YsRUFBRTtFQUN0QixJQUFNTyxNQUFNLEdBQUd4bUIsSUFBSSxDQUFDbUUsR0FBRyxDQUFDaWlCLEVBQUUsR0FBR0YsRUFBRSxDQUFDO0VBQ2hDM08sS0FBSyxHQUFJZ1AsTUFBTSxHQUFHLENBQUMsR0FBSSxDQUFDO0VBQ3hCM2hCLENBQUMsR0FBR3NoQixFQUFFO0VBQ04sSUFBTU8sS0FBSyxHQUFHUCxFQUFFLEdBQUdFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLEtBQUt6aEIsQ0FBQyxHQUFHc2hCLEVBQUUsRUFBRXRoQixDQUFDLEdBQUd3aEIsRUFBRSxFQUFFeGhCLENBQUMsRUFBRSxFQUFFO0lBQ3RCLElBQUkwaEIsS0FBSyxFQUFFO01BQ1BDLElBQUksQ0FBQzFoQixDQUFDLEVBQUVELENBQUMsQ0FBQztJQUNkLENBQUMsTUFBTTtNQUNIMmhCLElBQUksQ0FBQzNoQixDQUFDLEVBQUVDLENBQUMsQ0FBQztJQUNkO0lBQ0EyUyxLQUFLLElBQUlpUCxNQUFNO0lBQ2YsSUFBSWpQLEtBQUssR0FBRyxDQUFDLEVBQUU7TUFDWDNTLENBQUMsSUFBSTZoQixLQUFLO01BQ1ZsUCxLQUFLLElBQUlnUCxNQUFNO0lBQ25CO0VBQ0o7RUFFQSxPQUFPO0lBQ0gzZixJQUFJLEVBQUpBLElBQUk7SUFDSjBFLEdBQUcsRUFBSEEsR0FBRztJQUNIdkksR0FBRyxFQUFIQTtFQUNKLENBQUM7QUFDTCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTRpQixTQUFTLENBQUNlLFlBQVksR0FBRyxVQUFVemQsTUFBTSxFQUFFO0VBQ3ZDLElBQVFxQyxHQUFHLEdBQUtyQyxNQUFNLENBQWRxQyxHQUFHO0VBQ1gsSUFBUXZJLEdBQUcsR0FBS2tHLE1BQU0sQ0FBZGxHLEdBQUc7RUFDWCxJQUFRNkQsSUFBSSxHQUFLcUMsTUFBTSxDQUFmckMsSUFBSTtFQUNaLElBQUkrZixLQUFLO0VBQ1QsSUFBSUMsTUFBTTtFQUNWLElBQU14akIsTUFBTSxHQUFHa0ksR0FBRyxHQUFHLENBQUN2SSxHQUFHLEdBQUd1SSxHQUFHLElBQUksQ0FBQztFQUNwQyxJQUFNdWIsT0FBTyxHQUFHLEVBQUU7RUFDbEIsSUFBSUMsVUFBVTtFQUNkLElBQUlDLEdBQUc7RUFDUCxJQUFJdmtCLFNBQVMsR0FBRyxDQUFDTyxHQUFHLEdBQUd1SSxHQUFHLElBQUksRUFBRTtFQUNoQyxJQUFNMGIsVUFBVSxHQUFHLENBQUN4a0IsU0FBUztFQUM3QixJQUFJZCxDQUFDO0VBQ0wsSUFBSUMsQ0FBQzs7RUFFTDtFQUNBbWxCLFVBQVUsR0FBR2xnQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUd4RCxNQUFNLEdBQUd3aUIsS0FBSyxDQUFDQyxHQUFHLENBQUNDLEVBQUUsR0FBR0YsS0FBSyxDQUFDQyxHQUFHLENBQUNFLElBQUk7RUFDN0RjLE9BQU8sQ0FBQ3RrQixJQUFJLENBQUM7SUFDVG9ILEdBQUcsRUFBRSxDQUFDO0lBQ05wSSxHQUFHLEVBQUVxRixJQUFJLENBQUMsQ0FBQztFQUNmLENBQUMsQ0FBQztFQUNGLEtBQUtsRixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdrRixJQUFJLENBQUM3RixNQUFNLEdBQUcsQ0FBQyxFQUFFVyxDQUFDLEVBQUUsRUFBRTtJQUNsQ2lsQixLQUFLLEdBQUkvZixJQUFJLENBQUNsRixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUdrRixJQUFJLENBQUNsRixDQUFDLENBQUU7SUFDL0JrbEIsTUFBTSxHQUFJaGdCLElBQUksQ0FBQ2xGLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR2tGLElBQUksQ0FBQ2xGLENBQUMsR0FBRyxDQUFDLENBQUU7SUFDcEMsSUFBS2lsQixLQUFLLEdBQUdDLE1BQU0sR0FBSUksVUFBVSxJQUFJcGdCLElBQUksQ0FBQ2xGLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBSTBCLE1BQU0sR0FBRyxHQUFJLEVBQUU7TUFDL0QyakIsR0FBRyxHQUFHbkIsS0FBSyxDQUFDQyxHQUFHLENBQUNFLElBQUk7SUFDeEIsQ0FBQyxNQUFNLElBQUtZLEtBQUssR0FBR0MsTUFBTSxHQUFJcGtCLFNBQVMsSUFBSW9FLElBQUksQ0FBQ2xGLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBSTBCLE1BQU0sR0FBRyxHQUFJLEVBQUU7TUFDckUyakIsR0FBRyxHQUFHbkIsS0FBSyxDQUFDQyxHQUFHLENBQUNDLEVBQUU7SUFDdEIsQ0FBQyxNQUFNO01BQ0hpQixHQUFHLEdBQUdELFVBQVU7SUFDcEI7SUFFQSxJQUFJQSxVQUFVLEtBQUtDLEdBQUcsRUFBRTtNQUNwQkYsT0FBTyxDQUFDdGtCLElBQUksQ0FBQztRQUNUb0gsR0FBRyxFQUFFakksQ0FBQztRQUNOSCxHQUFHLEVBQUVxRixJQUFJLENBQUNsRixDQUFDO01BQ2YsQ0FBQyxDQUFDO01BQ0ZvbEIsVUFBVSxHQUFHQyxHQUFHO0lBQ3BCO0VBQ0o7RUFDQUYsT0FBTyxDQUFDdGtCLElBQUksQ0FBQztJQUNUb0gsR0FBRyxFQUFFL0MsSUFBSSxDQUFDN0YsTUFBTTtJQUNoQlEsR0FBRyxFQUFFcUYsSUFBSSxDQUFDQSxJQUFJLENBQUM3RixNQUFNLEdBQUcsQ0FBQztFQUM3QixDQUFDLENBQUM7RUFFRixLQUFLWSxDQUFDLEdBQUdrbEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDbGQsR0FBRyxFQUFFaEksQ0FBQyxHQUFHa2xCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ2xkLEdBQUcsRUFBRWhJLENBQUMsRUFBRSxFQUFFO0lBQzlDaUYsSUFBSSxDQUFDakYsQ0FBQyxDQUFDLEdBQUdpRixJQUFJLENBQUNqRixDQUFDLENBQUMsR0FBR3lCLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUN0Qzs7RUFFQTtFQUNBLEtBQUsxQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdtbEIsT0FBTyxDQUFDOWxCLE1BQU0sR0FBRyxDQUFDLEVBQUVXLENBQUMsRUFBRSxFQUFFO0lBQ3JDLElBQUltbEIsT0FBTyxDQUFDbmxCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQ0gsR0FBRyxHQUFHc2xCLE9BQU8sQ0FBQ25sQixDQUFDLENBQUMsQ0FBQ0gsR0FBRyxFQUFFO01BQ3JDaUIsU0FBUyxHQUFJcWtCLE9BQU8sQ0FBQ25sQixDQUFDLENBQUMsQ0FBQ0gsR0FBRyxHQUFJLENBQUNzbEIsT0FBTyxDQUFDbmxCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQ0gsR0FBRyxHQUFHc2xCLE9BQU8sQ0FBQ25sQixDQUFDLENBQUMsQ0FBQ0gsR0FBRyxJQUFJLENBQUMsR0FBSSxDQUFDLEdBQUksQ0FBQztJQUN0RixDQUFDLE1BQU07TUFDSGlCLFNBQVMsR0FBSXFrQixPQUFPLENBQUNubEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDSCxHQUFHLEdBQUksQ0FBQ3NsQixPQUFPLENBQUNubEIsQ0FBQyxDQUFDLENBQUNILEdBQUcsR0FBR3NsQixPQUFPLENBQUNubEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDSCxHQUFHLElBQUksQ0FBRSxHQUFJLENBQUM7SUFDdEY7SUFFQSxLQUFLSSxDQUFDLEdBQUdrbEIsT0FBTyxDQUFDbmxCLENBQUMsQ0FBQyxDQUFDaUksR0FBRyxFQUFFaEksQ0FBQyxHQUFHa2xCLE9BQU8sQ0FBQ25sQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUNpSSxHQUFHLEVBQUVoSSxDQUFDLEVBQUUsRUFBRTtNQUNsRGlGLElBQUksQ0FBQ2pGLENBQUMsQ0FBQyxHQUFHaUYsSUFBSSxDQUFDakYsQ0FBQyxDQUFDLEdBQUdhLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUN6QztFQUNKO0VBRUEsT0FBTztJQUNIb0UsSUFBSSxFQUFKQSxJQUFJO0lBQ0pwRSxTQUFTLEVBQVRBO0VBQ0osQ0FBQztBQUNMLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0FtakIsU0FBUyxDQUFDc0IsS0FBSyxHQUFHO0VBQ2RDLGNBQWMsV0FBZEEsY0FBY0EsQ0FBQ3RnQixJQUFJLEVBQUV5RyxNQUFNLEVBQUU7SUFDekIsSUFBSTNMLENBQUM7SUFDTCxJQUFNcUssR0FBRyxHQUFHc0IsTUFBTSxDQUFDUSxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ25DO0lBQ0FSLE1BQU0sQ0FBQzlILEtBQUssR0FBR3FCLElBQUksQ0FBQzdGLE1BQU07SUFDMUI7SUFDQXNNLE1BQU0sQ0FBQzVILE1BQU0sR0FBRyxHQUFHO0lBRW5Cc0csR0FBRyxDQUFDa0ssU0FBUyxDQUFDLENBQUM7SUFDZmxLLEdBQUcsQ0FBQzhKLFdBQVcsR0FBRyxNQUFNO0lBQ3hCLEtBQUtuVSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdrRixJQUFJLENBQUM3RixNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO01BQzlCcUssR0FBRyxDQUFDdUssTUFBTSxDQUFDNVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQztNQUNsQnFLLEdBQUcsQ0FBQ3dLLE1BQU0sQ0FBQzdVLENBQUMsRUFBRSxHQUFHLEdBQUdrRixJQUFJLENBQUNsRixDQUFDLENBQUMsQ0FBQztJQUNoQztJQUNBcUssR0FBRyxDQUFDMEssTUFBTSxDQUFDLENBQUM7SUFDWjFLLEdBQUcsQ0FBQ3lLLFNBQVMsQ0FBQyxDQUFDO0VBQ25CLENBQUM7RUFFRDJRLFlBQVksV0FBWkEsWUFBWUEsQ0FBQ3ZnQixJQUFJLEVBQUV5RyxNQUFNLEVBQUU7SUFDdkIsSUFBTXRCLEdBQUcsR0FBR3NCLE1BQU0sQ0FBQ1EsVUFBVSxDQUFDLElBQUksQ0FBQztJQUFFLElBQ2pDbk0sQ0FBQzs7SUFFTDtJQUNBMkwsTUFBTSxDQUFDOUgsS0FBSyxHQUFHcUIsSUFBSSxDQUFDN0YsTUFBTTtJQUMxQmdMLEdBQUcsQ0FBQ3FiLFNBQVMsR0FBRyxPQUFPO0lBQ3ZCLEtBQUsxbEIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHa0YsSUFBSSxDQUFDN0YsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtNQUM5QixJQUFJa0YsSUFBSSxDQUFDbEYsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2ZxSyxHQUFHLENBQUNzYixRQUFRLENBQUMzbEIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO01BQzlCO0lBQ0o7RUFDSjtBQUNKLENBQUM7QUFFY2lrQix1REFBUyxFOzs7Ozs7OztBQ3BNeEI7O0FBRStDO0FBQ0s7QUFDQztBQUNDO0FBQ0Y7QUFDQTtBQUNPO0FBQ1A7QUFDSjtBQUNBO0FBQ0E7QUFDSDtBQUNJO0FBQ0Q7QUFDSDtBQUNUO0FBRXBDLElBQU0yQixPQUFPLEdBQUc7RUFDWkMsZUFBZSxFQUFFdEosZUFBYTtFQUM5QnVKLFVBQVUsRUFBRTFFLFVBQVM7RUFDckIyRSxZQUFZLEVBQUVyRCxZQUFVO0VBQ3hCc0QsWUFBWSxFQUFFNUQsWUFBVTtFQUN4QjZELFlBQVksRUFBRXRELFlBQVU7RUFDeEJ1RCxjQUFjLEVBQUU1SCxjQUFZO0VBQzVCNkgsa0JBQWtCLEVBQUVuRyxrQkFBZTtFQUNuQ29HLGNBQWMsRUFBRUMsY0FBYTtFQUM3QkMsVUFBVSxFQUFFeEMsVUFBUztFQUNyQnlDLFlBQVksRUFBRS9DLFlBQVU7RUFDeEJnRCxZQUFZLEVBQUU1RCxZQUFXO0VBQ3pCLGFBQWEsRUFBRTNLLFlBQWU7RUFDOUJ3TyxjQUFjLEVBQUV0RyxjQUFZO0VBQzVCdUcsY0FBYyxFQUFFckgsY0FBWUE7QUFDaEMsQ0FBQztBQUVjO0VBQ1hzSCxjQUFjLEVBQUUsU0FBaEJBLGNBQWNBLENBQUdDLElBQUksRUFBRUMsTUFBTSxFQUFLO0lBQzlCakIsT0FBTyxDQUFDZ0IsSUFBSSxDQUFDLEdBQUdDLE1BQU07RUFDMUIsQ0FBQztFQUNEdGxCLE1BQU0sV0FBTkEsTUFBTUEsQ0FBQytKLE1BQU0sRUFBRXdiLGlCQUFpQixFQUFFO0lBQzlCLElBQU1DLE9BQU8sR0FBRztNQUNaMWMsR0FBRyxFQUFFO1FBQ0QyYyxTQUFTLEVBQUUsSUFBSTtRQUNmeFEsT0FBTyxFQUFFLElBQUk7UUFDYi9DLE9BQU8sRUFBRTtNQUNiLENBQUM7TUFDRHdULEdBQUcsRUFBRTtRQUNERCxTQUFTLEVBQUUsSUFBSTtRQUNmeFEsT0FBTyxFQUFFLElBQUk7UUFDYi9DLE9BQU8sRUFBRTtNQUNiO0lBQ0osQ0FBQztJQUNELElBQU15VCxlQUFlLEdBQUcsRUFBRTtJQUUxQkMsVUFBVSxDQUFDLENBQUM7SUFDWkMsV0FBVyxDQUFDLENBQUM7SUFDYkMsVUFBVSxDQUFDLENBQUM7SUFFWixTQUFTRixVQUFVQSxDQUFBLEVBQUc7TUFDbEIsSUFBSWxILEtBQWUsSUFBSSxPQUFPclUsUUFBUSxLQUFLLFdBQVcsRUFBRTtRQUFBLElBQUEwYixhQUFBO1FBQ3BELElBQU1DLE1BQU0sR0FBRzNiLFFBQVEsQ0FBQzRiLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN6RFQsT0FBTyxDQUFDRSxHQUFHLENBQUNELFNBQVMsR0FBR3BiLFFBQVEsQ0FBQzRiLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQztRQUNsRSxJQUFJLENBQUNULE9BQU8sQ0FBQ0UsR0FBRyxDQUFDRCxTQUFTLEVBQUU7VUFDeEJELE9BQU8sQ0FBQ0UsR0FBRyxDQUFDRCxTQUFTLEdBQUdwYixRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUM7VUFDeERrYixPQUFPLENBQUNFLEdBQUcsQ0FBQ0QsU0FBUyxDQUFDUyxTQUFTLEdBQUcsV0FBVztVQUM3QyxJQUFJRixNQUFNLEVBQUU7WUFDUkEsTUFBTSxDQUFDRyxXQUFXLENBQUNYLE9BQU8sQ0FBQ0UsR0FBRyxDQUFDRCxTQUFTLENBQUM7VUFDN0M7UUFDSjtRQUNBLElBQUkvRyxLQUFlLEtBQUFxSCxhQUFBLEdBQUloYyxNQUFNLENBQUNpYSxLQUFLLGNBQUErQixhQUFBLGVBQVpBLGFBQUEsQ0FBY0ssZUFBZSxFQUFFO1VBQ2xEMWIsT0FBTyxDQUFDQyxJQUFJLENBQUMsNENBQTRDLENBQUM7UUFDOUQ7UUFDQTZhLE9BQU8sQ0FBQzFjLEdBQUcsQ0FBQzJjLFNBQVMsR0FBR0QsT0FBTyxDQUFDRSxHQUFHLENBQUNELFNBQVMsQ0FBQzdhLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFFOUQ0YSxPQUFPLENBQUNFLEdBQUcsQ0FBQ3pRLE9BQU8sR0FBRzVLLFFBQVEsQ0FBQzRiLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztRQUNwRSxJQUFJLENBQUNULE9BQU8sQ0FBQ0UsR0FBRyxDQUFDelEsT0FBTyxFQUFFO1VBQ3RCdVEsT0FBTyxDQUFDRSxHQUFHLENBQUN6USxPQUFPLEdBQUc1SyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUM7VUFDdERrYixPQUFPLENBQUNFLEdBQUcsQ0FBQ3pRLE9BQU8sQ0FBQ2lSLFNBQVMsR0FBRyxlQUFlO1VBQy9DLElBQUlGLE1BQU0sRUFBRTtZQUNSQSxNQUFNLENBQUNHLFdBQVcsQ0FBQ1gsT0FBTyxDQUFDRSxHQUFHLENBQUN6USxPQUFPLENBQUM7VUFDM0M7UUFDSjtRQUNBdVEsT0FBTyxDQUFDMWMsR0FBRyxDQUFDbU0sT0FBTyxHQUFHdVEsT0FBTyxDQUFDRSxHQUFHLENBQUN6USxPQUFPLENBQUNySyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBRTFENGEsT0FBTyxDQUFDRSxHQUFHLENBQUN4VCxPQUFPLEdBQUc3SCxRQUFRLENBQUM0YixhQUFhLENBQUMsc0JBQXNCLENBQUM7UUFDcEUsSUFBSVQsT0FBTyxDQUFDRSxHQUFHLENBQUN4VCxPQUFPLEVBQUU7VUFDckJzVCxPQUFPLENBQUMxYyxHQUFHLENBQUNvSixPQUFPLEdBQUdzVCxPQUFPLENBQUNFLEdBQUcsQ0FBQ3hULE9BQU8sQ0FBQ3RILFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDOUQ7TUFDSjtJQUNKO0lBRUEsU0FBU2liLFdBQVdBLENBQUEsRUFBRztNQUFBLElBQUFRLGNBQUE7TUFDbkJ0YyxNQUFNLENBQUN1YyxPQUFPLENBQUM3TCxPQUFPLENBQUMsVUFBQzhMLFlBQVksRUFBSztRQUFBLElBQUFDLGNBQUE7UUFDckMsSUFBSWxCLE1BQU07UUFDVixJQUFJbUIsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJNVMsV0FBVyxHQUFHLEVBQUU7UUFFcEIsSUFBSTZTLGdCQUFBLENBQU9ILFlBQVksTUFBSyxRQUFRLEVBQUU7VUFDbENqQixNQUFNLEdBQUdpQixZQUFZLENBQUNoUixNQUFNO1VBQzVCa1IsYUFBYSxHQUFHRixZQUFZLENBQUN4YyxNQUFNO1FBQ3ZDLENBQUMsTUFBTSxJQUFJLE9BQU93YyxZQUFZLEtBQUssUUFBUSxFQUFFO1VBQ3pDakIsTUFBTSxHQUFHaUIsWUFBWTtRQUN6QjtRQUNBLElBQUk3SCxLQUFlLEtBQUE4SCxjQUFBLEdBQUl6YyxNQUFNLENBQUNpYSxLQUFLLGNBQUF3QyxjQUFBLGVBQVpBLGNBQUEsQ0FBY0osZUFBZSxFQUFFO1VBQ2xEMWIsT0FBTyxDQUFDaVUsR0FBRyxDQUFDLDZCQUE2QixFQUFFMkcsTUFBTSxDQUFDO1FBQ3REO1FBQ0EsSUFBSW1CLGFBQWEsQ0FBQzVTLFdBQVcsRUFBRTtVQUMzQkEsV0FBVyxHQUFHNFMsYUFBYSxDQUN0QjVTLFdBQVcsQ0FBQ2dKLEdBQUcsQ0FBQyxVQUFDOEQsVUFBVTtZQUFBLE9BQUssSUFBSTBELE9BQU8sQ0FBQzFELFVBQVUsQ0FBQyxDQUFDLENBQUM7VUFBQSxFQUFDO1FBQ25FO1FBQ0EsSUFBSTtVQUNBLElBQU1nRyxTQUFTLEdBQUcsSUFBSXRDLE9BQU8sQ0FBQ2lCLE1BQU0sQ0FBQyxDQUFDbUIsYUFBYSxFQUFFNVMsV0FBVyxDQUFDO1VBQ2pFOFIsZUFBZSxDQUFDcm1CLElBQUksQ0FBQ3FuQixTQUFTLENBQUM7UUFDbkMsQ0FBQyxDQUFDLE9BQU9sRyxHQUFHLEVBQUU7VUFDVi9WLE9BQU8sQ0FBQzRKLEtBQUssQ0FBQyw4QkFBOEIsRUFBRWdSLE1BQU0sRUFBRTdFLEdBQUcsQ0FBQztVQUMxRCxNQUFNQSxHQUFHO1FBQ2I7TUFDSixDQUFDLENBQUM7TUFDRixJQUFJL0IsS0FBZSxLQUFBMkgsY0FBQSxHQUFJdGMsTUFBTSxDQUFDaWEsS0FBSyxjQUFBcUMsY0FBQSxlQUFaQSxjQUFBLENBQWNELGVBQWUsRUFBRTtRQUNsRDFiLE9BQU8sQ0FBQ2lVLEdBQUcsd0JBQUF2ZixNQUFBLENBQXdCdW1CLGVBQWUsQ0FDN0M5SSxHQUFHLENBQUMsVUFBQ3lJLE1BQU07VUFBQSxPQUFLc0IsSUFBSSxDQUFDQyxTQUFTLENBQUM7WUFBRXRSLE1BQU0sRUFBRStQLE1BQU0sQ0FBQzlQLE1BQU07WUFBRXpMLE1BQU0sRUFBRXViLE1BQU0sQ0FBQ3ZiO1VBQU8sQ0FBQyxDQUFDO1FBQUEsRUFBQyxDQUNqRjFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFDO01BQ3RCO0lBQ0o7SUFFQSxTQUFTeW1CLFVBQVVBLENBQUEsRUFBRztNQUNsQixJQUFJcEgsS0FBZSxJQUFJLE9BQU9yVSxRQUFRLEtBQUssV0FBVyxFQUFFO1FBQ3BELElBQUk1TCxDQUFDO1FBQ0wsSUFBTXFvQixHQUFHLEdBQUcsQ0FBQztVQUNUQyxJQUFJLEVBQUV2QixPQUFPLENBQUNFLEdBQUcsQ0FBQ0QsU0FBUztVQUMzQnVCLElBQUksRUFBRWpkLE1BQU0sQ0FBQ2lhLEtBQUssQ0FBQ2lEO1FBQ3ZCLENBQUMsRUFBRTtVQUNDRixJQUFJLEVBQUV2QixPQUFPLENBQUNFLEdBQUcsQ0FBQ3pRLE9BQU87VUFDekIrUixJQUFJLEVBQUVqZCxNQUFNLENBQUNpYSxLQUFLLENBQUNrRDtRQUN2QixDQUFDLENBQUM7UUFFRixLQUFLem9CLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3FvQixHQUFHLENBQUNocEIsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtVQUM3QixJQUFJcW9CLEdBQUcsQ0FBQ3JvQixDQUFDLENBQUMsQ0FBQ3VvQixJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3RCRixHQUFHLENBQUNyb0IsQ0FBQyxDQUFDLENBQUNzb0IsSUFBSSxDQUFDcFUsS0FBSyxDQUFDd1UsT0FBTyxHQUFHLE9BQU87VUFDdkMsQ0FBQyxNQUFNO1lBQ0hMLEdBQUcsQ0FBQ3JvQixDQUFDLENBQUMsQ0FBQ3NvQixJQUFJLENBQUNwVSxLQUFLLENBQUN3VSxPQUFPLEdBQUcsTUFBTTtVQUN0QztRQUNKO01BQ0o7SUFDSjs7SUFFQTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0lBQ1EsU0FBU0MsZUFBZUEsQ0FBQ3pqQixJQUFJLEVBQUUwakIsS0FBSyxFQUFFQyxHQUFHLEVBQUU7TUFDdkMsU0FBU0MsVUFBVUEsQ0FBQ0MsTUFBTSxFQUFFO1FBQ3hCLElBQU1DLFNBQVMsR0FBRztVQUNkOWxCLENBQUMsRUFBRTZsQixNQUFNLEdBQUd6cUIsSUFBSSxDQUFDK0QsR0FBRyxDQUFDdW1CLEtBQUssQ0FBQztVQUMzQjNsQixDQUFDLEVBQUU4bEIsTUFBTSxHQUFHenFCLElBQUksQ0FBQzhELEdBQUcsQ0FBQ3dtQixLQUFLO1FBQzlCLENBQUM7UUFDRDtRQUNBMWpCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2hDLENBQUMsSUFBSThsQixTQUFTLENBQUM5bEIsQ0FBQztRQUN4QmdDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2pDLENBQUMsSUFBSStsQixTQUFTLENBQUMvbEIsQ0FBQztRQUN4QmlDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2hDLENBQUMsSUFBSThsQixTQUFTLENBQUM5bEIsQ0FBQztRQUN4QmdDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2pDLENBQUMsSUFBSStsQixTQUFTLENBQUMvbEIsQ0FBQztRQUN4QjtNQUNKOztNQUVBO01BQ0E2bEIsVUFBVSxDQUFDRCxHQUFHLENBQUM7TUFDZixPQUFPQSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMvQixpQkFBaUIsQ0FBQ25XLGlCQUFpQixDQUFDekwsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQ3JELENBQUM0aEIsaUJBQWlCLENBQUNuVyxpQkFBaUIsQ0FBQ3pMLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkQ7UUFDQTJqQixHQUFHLElBQUl2cUIsSUFBSSxDQUFDNGQsSUFBSSxDQUFDMk0sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN6QkMsVUFBVSxDQUFDLENBQUNELEdBQUcsQ0FBQztNQUNwQjtNQUNBLE9BQU8zakIsSUFBSTtJQUNmO0lBRUEsU0FBUytqQixPQUFPQSxDQUFDQyxHQUFHLEVBQUU7TUFDbEIsT0FBTyxDQUFDO1FBQ0pqbUIsQ0FBQyxFQUFFLENBQUNpbUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHQSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDaG1CLENBQUMsRUFBRSxDQUFDZ21CLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0EsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBR0EsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDN0MsQ0FBQyxFQUFFO1FBQ0NqbUIsQ0FBQyxFQUFFLENBQUNpbUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHQSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDaG1CLENBQUMsRUFBRSxDQUFDZ21CLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR0EsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBR0EsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDN0MsQ0FBQyxDQUFDO0lBQ047SUFFQSxTQUFTQyxTQUFTQSxDQUFDamtCLElBQUksRUFBRTtNQUNyQixJQUFJcUMsTUFBTSxHQUFHLElBQUk7TUFDakIsSUFBSXZILENBQUM7TUFDTCxJQUFNb3BCLFdBQVcsR0FBR25GLFNBQVMsQ0FBQ0ssY0FBYyxDQUFDd0MsaUJBQWlCLEVBQUU1aEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFQSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFFakYsSUFBSSthLEtBQWUsSUFBSTNVLE1BQU0sQ0FBQ2lhLEtBQUssQ0FBQ2lELGFBQWEsRUFBRTtRQUMvQ2EsV0FBVSxDQUFDNVUsUUFBUSxDQUFDdlAsSUFBSSxFQUFFO1VBQUVqQyxDQUFDLEVBQUUsR0FBRztVQUFFQyxDQUFDLEVBQUU7UUFBSSxDQUFDLEVBQUU2akIsT0FBTyxDQUFDMWMsR0FBRyxDQUFDb0osT0FBTyxFQUFFO1VBQUVXLEtBQUssRUFBRSxLQUFLO1VBQUVFLFNBQVMsRUFBRTtRQUFFLENBQUMsQ0FBQztRQUNsRzJQLFNBQVMsQ0FBQ3NCLEtBQUssQ0FBQ0MsY0FBYyxDQUFDNEQsV0FBVyxDQUFDbGtCLElBQUksRUFBRTZoQixPQUFPLENBQUNFLEdBQUcsQ0FBQ0QsU0FBUyxDQUFDO01BQzNFO01BRUEvQyxTQUFTLENBQUNlLFlBQVksQ0FBQ29FLFdBQVcsQ0FBQztNQUVuQyxJQUFJbkosS0FBZSxJQUFJM1UsTUFBTSxDQUFDaWEsS0FBSyxDQUFDa0QsV0FBVyxFQUFFO1FBQzdDeEUsU0FBUyxDQUFDc0IsS0FBSyxDQUFDRSxZQUFZLENBQUMyRCxXQUFXLENBQUNsa0IsSUFBSSxFQUFFNmhCLE9BQU8sQ0FBQ0UsR0FBRyxDQUFDelEsT0FBTyxDQUFDO01BQ3ZFO01BRUEsS0FBS3hXLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2tuQixlQUFlLENBQUM3bkIsTUFBTSxJQUFJa0ksTUFBTSxLQUFLLElBQUksRUFBRXZILENBQUMsRUFBRSxFQUFFO1FBQzVEdUgsTUFBTSxHQUFHMmYsZUFBZSxDQUFDbG5CLENBQUMsQ0FBQyxDQUFDdVcsYUFBYSxDQUFDNlMsV0FBVyxDQUFDbGtCLElBQUksQ0FBQztNQUMvRDtNQUNBLElBQUlxQyxNQUFNLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE9BQU8sSUFBSTtNQUNmO01BQ0EsT0FBTztRQUNIK2hCLFVBQVUsRUFBRS9oQixNQUFNO1FBQ2xCNmhCLFdBQVcsRUFBWEE7TUFDSixDQUFDO0lBQ0w7O0lBRUE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDUSxTQUFTRyxtQkFBbUJBLENBQUNMLEdBQUcsRUFBRWhrQixJQUFJLEVBQUVza0IsU0FBUyxFQUFFO01BQy9DLElBQU1DLFVBQVUsR0FBR25yQixJQUFJLENBQUNpUCxJQUFJLENBQUNqUCxJQUFJLENBQUNvckIsR0FBRyxDQUFDUixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdBLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRzVxQixJQUFJLENBQUNvckIsR0FBRyxDQUFFUixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdBLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRyxDQUFDLENBQUMsQ0FBQztNQUN2RyxJQUFJbHBCLENBQUM7TUFDTCxJQUFNMnBCLE1BQU0sR0FBRyxFQUFFO01BQ2pCLElBQUlwaUIsTUFBTSxHQUFHLElBQUk7TUFDakIsSUFBSThkLEdBQUc7TUFDUCxJQUFJMkQsU0FBUztNQUNiLElBQU1ZLElBQUksR0FBR3RyQixJQUFJLENBQUMrRCxHQUFHLENBQUNtbkIsU0FBUyxDQUFDO01BQ2hDLElBQU1LLElBQUksR0FBR3ZyQixJQUFJLENBQUM4RCxHQUFHLENBQUNvbkIsU0FBUyxDQUFDO01BRWhDLEtBQUt4cEIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHMnBCLE1BQU0sSUFBSXBpQixNQUFNLEtBQUssSUFBSSxFQUFFdkgsQ0FBQyxFQUFFLEVBQUU7UUFDNUM7UUFDQTtRQUNBcWxCLEdBQUcsR0FBR29FLFVBQVUsR0FBR0UsTUFBTSxHQUFHM3BCLENBQUMsSUFBSUEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3REZ3BCLFNBQVMsR0FBRztVQUNSOWxCLENBQUMsRUFBRW1pQixHQUFHLEdBQUd1RSxJQUFJO1VBQ2IzbUIsQ0FBQyxFQUFFb2lCLEdBQUcsR0FBR3dFO1FBQ2IsQ0FBQztRQUNEO1FBQ0Eza0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDaEMsQ0FBQyxJQUFJOGxCLFNBQVMsQ0FBQy9sQixDQUFDO1FBQ3hCaUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDakMsQ0FBQyxJQUFJK2xCLFNBQVMsQ0FBQzlsQixDQUFDO1FBQ3hCZ0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDaEMsQ0FBQyxJQUFJOGxCLFNBQVMsQ0FBQy9sQixDQUFDO1FBQ3hCaUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDakMsQ0FBQyxJQUFJK2xCLFNBQVMsQ0FBQzlsQixDQUFDO1FBQ3hCOztRQUVBcUUsTUFBTSxHQUFHNGhCLFNBQVMsQ0FBQ2prQixJQUFJLENBQUM7TUFDNUI7TUFDQSxPQUFPcUMsTUFBTTtJQUNqQjtJQUVBLFNBQVN1aUIsYUFBYUEsQ0FBQzVrQixJQUFJLEVBQUU7TUFDekIsT0FBTzVHLElBQUksQ0FBQ2lQLElBQUksQ0FDWmpQLElBQUksQ0FBQ29yQixHQUFHLENBQUNwckIsSUFBSSxDQUFDbUUsR0FBRyxDQUFDeUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDaEMsQ0FBQyxHQUFHZ0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDaEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQzFDNUUsSUFBSSxDQUFDb3JCLEdBQUcsQ0FBQ3ByQixJQUFJLENBQUNtRSxHQUFHLENBQUN5QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNqQyxDQUFDLEdBQUdpQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNqQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ2pELENBQUM7SUFDTDtJQUFDLFNBRWM4bUIsaUJBQWVBLENBQUFDLEVBQUE7TUFBQSxPQUFBQyxnQkFBQSxDQUFBOW9CLEtBQUEsT0FBQS9CLFNBQUE7SUFBQTtJQVk5QjtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFMUSxTQUFBNnFCLGlCQUFBO01BQUFBLGdCQUFBLEdBQUFDLDBCQUFBLGNBQUFDLHFCQUFBLENBQUFDLElBQUEsQ0FaQSxTQUFBQyxTQUErQjVtQixZQUFZO1FBQUEsSUFBQThELE1BQUEsRUFBQStpQixTQUFBLEVBQUFDLEtBQUEsRUFBQTFELE1BQUEsRUFBQTJELEVBQUE7UUFBQSxPQUFBTCxxQkFBQSxDQUFBTSxJQUFBLFdBQUFDLFNBQUE7VUFBQSxrQkFBQUEsU0FBQSxDQUFBenBCLElBQUEsR0FBQXlwQixTQUFBLENBQUF4cEIsSUFBQTtZQUFBO2NBQ25DcUcsTUFBTSxHQUFHLElBQUk7Y0FBQStpQixTQUFBLEdBQUFLLDBCQUFBLENBQ0l6RCxlQUFlO2NBQUF3RCxTQUFBLENBQUF6cEIsSUFBQTtjQUFBcXBCLFNBQUEsQ0FBQXZkLENBQUE7WUFBQTtjQUFBLEtBQUF3ZCxLQUFBLEdBQUFELFNBQUEsQ0FBQTdwQixDQUFBLElBQUEyYyxJQUFBO2dCQUFBc04sU0FBQSxDQUFBeHBCLElBQUE7Z0JBQUE7Y0FBQTtjQUF6QjJsQixNQUFNLEdBQUEwRCxLQUFBLENBQUF6YixLQUFBO2NBQUEsS0FDVCtYLE1BQU0sQ0FBQ3RQLFdBQVc7Z0JBQUFtVCxTQUFBLENBQUF4cEIsSUFBQTtnQkFBQTtjQUFBO2NBQUF3cEIsU0FBQSxDQUFBeHBCLElBQUE7Y0FBQSxPQUNIMmxCLE1BQU0sQ0FBQ3RQLFdBQVcsQ0FBQzlULFlBQVksQ0FBQztZQUFBO2NBQS9DOEQsTUFBTSxHQUFBbWpCLFNBQUEsQ0FBQUUsSUFBQTtjQUFBLEtBQ0ZyakIsTUFBTTtnQkFBQW1qQixTQUFBLENBQUF4cEIsSUFBQTtnQkFBQTtjQUFBO2NBQUEsT0FBQXdwQixTQUFBLENBQUFHLE1BQUE7WUFBQTtjQUFBSCxTQUFBLENBQUF4cEIsSUFBQTtjQUFBO1lBQUE7Y0FBQXdwQixTQUFBLENBQUF4cEIsSUFBQTtjQUFBO1lBQUE7Y0FBQXdwQixTQUFBLENBQUF6cEIsSUFBQTtjQUFBdXBCLEVBQUEsR0FBQUUsU0FBQTtjQUFBSixTQUFBLENBQUFRLENBQUEsQ0FBQU4sRUFBQTtZQUFBO2NBQUFFLFNBQUEsQ0FBQXpwQixJQUFBO2NBQUFxcEIsU0FBQSxDQUFBUyxDQUFBO2NBQUEsT0FBQUwsU0FBQSxDQUFBTSxNQUFBO1lBQUE7Y0FBQSxPQUFBTixTQUFBLENBQUFHLE1BQUEsV0FLWHRqQixNQUFNO1lBQUE7WUFBQTtjQUFBLE9BQUFtakIsU0FBQSxDQUFBTyxJQUFBO1VBQUE7UUFBQSxHQUFBWixRQUFBO01BQUEsQ0FDaEI7TUFBQSxPQUFBSixnQkFBQSxDQUFBOW9CLEtBQUEsT0FBQS9CLFNBQUE7SUFBQTtJQU9ELFNBQVM4ckIsc0JBQXFCQSxDQUFDaEMsR0FBRyxFQUFFO01BQ2hDLElBQUloa0IsSUFBSTtNQUNSLElBQU1tRixHQUFHLEdBQUcwYyxPQUFPLENBQUMxYyxHQUFHLENBQUNvSixPQUFPO01BQy9CLElBQUlsTSxNQUFNO01BRVYsSUFBSTBZLElBQWUsRUFBRTtRQUNqQixJQUFJM1UsTUFBTSxDQUFDaWEsS0FBSyxDQUFDNEYsZUFBZSxJQUFJOWdCLEdBQUcsRUFBRTtVQUNyQ2dmLFdBQVUsQ0FBQzVVLFFBQVEsQ0FBQ3lVLEdBQUcsRUFBRTtZQUFFam1CLENBQUMsRUFBRSxDQUFDO1lBQUVDLENBQUMsRUFBRTtVQUFFLENBQUMsRUFBRW1ILEdBQUcsRUFBRTtZQUFFK0osS0FBSyxFQUFFLE1BQU07WUFBRUUsU0FBUyxFQUFFO1VBQUUsQ0FBQyxDQUFDO1FBQ2xGO01BQ0o7TUFFQXBQLElBQUksR0FBRytqQixPQUFPLENBQUNDLEdBQUcsQ0FBQztNQUNuQixJQUFNa0MsVUFBVSxHQUFHdEIsYUFBYSxDQUFDNWtCLElBQUksQ0FBQztNQUN0QyxJQUFNc2tCLFNBQVMsR0FBR2xyQixJQUFJLENBQUMrc0IsS0FBSyxDQUFDbm1CLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2hDLENBQUMsR0FBR2dDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2hDLENBQUMsRUFBRWdDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2pDLENBQUMsR0FBR2lDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2pDLENBQUMsQ0FBQztNQUMxRWlDLElBQUksR0FBR3lqQixlQUFlLENBQUN6akIsSUFBSSxFQUFFc2tCLFNBQVMsRUFBRWxyQixJQUFJLENBQUM0QixLQUFLLENBQUNrckIsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDO01BQ3JFLElBQUlsbUIsSUFBSSxLQUFLLElBQUksRUFBRTtRQUNmLE9BQU8sSUFBSTtNQUNmO01BRUFxQyxNQUFNLEdBQUc0aEIsU0FBUyxDQUFDamtCLElBQUksQ0FBQztNQUN4QixJQUFJcUMsTUFBTSxLQUFLLElBQUksRUFBRTtRQUNqQkEsTUFBTSxHQUFHZ2lCLG1CQUFtQixDQUFDTCxHQUFHLEVBQUVoa0IsSUFBSSxFQUFFc2tCLFNBQVMsQ0FBQztNQUN0RDtNQUVBLElBQUlqaUIsTUFBTSxLQUFLLElBQUksRUFBRTtRQUNqQixPQUFPLElBQUk7TUFDZjtNQUVBLElBQUkwWSxLQUFlLElBQUkxWSxNQUFNLElBQUkrRCxNQUFNLENBQUNpYSxLQUFLLENBQUMrRixZQUFZLElBQUlqaEIsR0FBRyxFQUFFO1FBQy9EZ2YsV0FBVSxDQUFDNVUsUUFBUSxDQUFDdlAsSUFBSSxFQUFFO1VBQUVqQyxDQUFDLEVBQUUsR0FBRztVQUFFQyxDQUFDLEVBQUU7UUFBSSxDQUFDLEVBQUVtSCxHQUFHLEVBQUU7VUFBRStKLEtBQUssRUFBRSxLQUFLO1VBQUVFLFNBQVMsRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN0RjtNQUVBLE9BQU87UUFDSGdWLFVBQVUsRUFBRS9oQixNQUFNLENBQUMraEIsVUFBVTtRQUM3QnBrQixJQUFJLEVBQUpBLElBQUk7UUFDSjBqQixLQUFLLEVBQUVZLFNBQVM7UUFDaEJoVCxPQUFPLEVBQUVqUCxNQUFNLENBQUM2aEIsV0FBVyxDQUFDbGtCLElBQUk7UUFDaENwRSxTQUFTLEVBQUV5RyxNQUFNLENBQUM2aEIsV0FBVyxDQUFDdG9CO01BQ2xDLENBQUM7SUFDTDtJQUVBLE9BQU87TUFDSG9xQixxQkFBcUIsV0FBckJBLHFCQUFxQkEsQ0FBQ2hDLEdBQUcsRUFBRTtRQUN2QixPQUFPZ0Msc0JBQXFCLENBQUNoQyxHQUFHLENBQUM7TUFDckMsQ0FBQztNQUNEcUMsdUJBQXVCLFdBQXZCQSx1QkFBdUJBLENBQUNDLEtBQUssRUFBRTtRQUMzQixJQUFJeHJCLENBQUM7UUFBRSxJQUFJdUgsTUFBTTtRQUNqQixJQUFNa2tCLFFBQVEsR0FBRyxFQUFFO1FBQ25CLElBQVFDLFFBQVEsR0FBS3BnQixNQUFNLENBQW5Cb2dCLFFBQVE7UUFFaEIsS0FBSzFyQixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd3ckIsS0FBSyxDQUFDbnNCLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7VUFDL0IsSUFBTWtwQixHQUFHLEdBQUdzQyxLQUFLLENBQUN4ckIsQ0FBQyxDQUFDO1VBQ3BCdUgsTUFBTSxHQUFHMmpCLHNCQUFxQixDQUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQ3pDM2hCLE1BQU0sQ0FBQzJoQixHQUFHLEdBQUdBLEdBQUc7VUFFaEIsSUFBSXdDLFFBQVEsRUFBRTtZQUNWRCxRQUFRLENBQUM1cUIsSUFBSSxDQUFDMEcsTUFBTSxDQUFDO1VBQ3pCLENBQUMsTUFBTSxJQUFJQSxNQUFNLENBQUMraEIsVUFBVSxFQUFFO1lBQzFCLE9BQU8vaEIsTUFBTTtVQUNqQjtRQUNKO1FBRUEsT0FBTztVQUNIa2tCLFFBQVEsRUFBUkE7UUFDSixDQUFDO01BQ0wsQ0FBQztNQUNLMUIsZUFBZSxXQUFmQSxlQUFlQSxDQUFDNEIsY0FBYyxFQUFFO1FBQUEsT0FBQXpCLDBCQUFBLGNBQUFDLHFCQUFBLENBQUFDLElBQUEsVUFBQXdCLFFBQUE7VUFBQSxJQUFBcmtCLE1BQUE7VUFBQSxPQUFBNGlCLHFCQUFBLENBQUFNLElBQUEsV0FBQW9CLFFBQUE7WUFBQSxrQkFBQUEsUUFBQSxDQUFBNXFCLElBQUEsR0FBQTRxQixRQUFBLENBQUEzcUIsSUFBQTtjQUFBO2dCQUFBMnFCLFFBQUEsQ0FBQTNxQixJQUFBO2dCQUFBLE9BQ2I2b0IsaUJBQWUsQ0FBQzRCLGNBQWMsQ0FBQztjQUFBO2dCQUE5Q3BrQixNQUFNLEdBQUFza0IsUUFBQSxDQUFBakIsSUFBQTtnQkFBQSxPQUFBaUIsUUFBQSxDQUFBaEIsTUFBQSxXQUNMdGpCLE1BQU07Y0FBQTtjQUFBO2dCQUFBLE9BQUFza0IsUUFBQSxDQUFBWixJQUFBO1lBQUE7VUFBQSxHQUFBVyxPQUFBO1FBQUE7TUFDakIsQ0FBQztNQUNEakYsY0FBYyxXQUFkQSxjQUFjQSxDQUFDQyxJQUFJLEVBQUVDLE1BQU0sRUFBRTtRQUN6QixJQUFJakIsT0FBTyxDQUFDZ0IsSUFBSSxDQUFDLEVBQUU7VUFDZixNQUFNLElBQUl4VyxLQUFLLENBQUMsaUNBQWlDLEVBQUV3VyxJQUFJLENBQUM7UUFDNUQ7UUFDQWhCLE9BQU8sQ0FBQ2dCLElBQUksQ0FBQyxHQUFHQyxNQUFNO01BQzFCLENBQUM7TUFDRGlGLFVBQVUsV0FBVkEsVUFBVUEsQ0FBQ2pFLE9BQU8sRUFBRTtRQUNoQjtRQUNBdmMsTUFBTSxDQUFDdWMsT0FBTyxHQUFHQSxPQUFPO1FBQ3hCWCxlQUFlLENBQUM3bkIsTUFBTSxHQUFHLENBQUM7UUFDMUIrbkIsV0FBVyxDQUFDLENBQUM7TUFDakI7SUFDSixDQUFDO0VBQ0w7QUFDSixDQUFDLEU7O0FDelc0QztBQUNEO0FBQ0k7QUFDRjtBQUNGO0FBQ0E7QUFDTztBQUNQO0FBQ0o7QUFDQTtBQUNBO0FBQ0g7QUFDSTtBQUNEO0FBQ0g7OztBQ1NyQixxREFBUzJFLGNBQWNBLENBQUEsRUFBbUI7RUFDdEQsSUFBSUMsTUFBYyxHQUFHLENBQUMsQ0FBQztFQUV2QixTQUFTQyxRQUFRQSxDQUFDQyxTQUFvQixFQUFhO0lBQy9DLElBQUksQ0FBQ0YsTUFBTSxDQUFDRSxTQUFTLENBQUMsRUFBRTtNQUNwQkYsTUFBTSxDQUFDRSxTQUFTLENBQUMsR0FBRztRQUNoQkMsV0FBVyxFQUFFO01BQ2pCLENBQUM7SUFDTDtJQUNBLE9BQU9ILE1BQU0sQ0FBQ0UsU0FBUyxDQUFDO0VBQzVCO0VBRUEsU0FBU0UsV0FBV0EsQ0FBQSxFQUFTO0lBQ3pCSixNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ2Y7RUFFQSxTQUFTSyxtQkFBbUJBLENBQUNDLFlBQTBCLEVBQUUxb0IsSUFBVyxFQUFRO0lBQ3hFLElBQUkwb0IsWUFBWSxDQUFDQyxLQUFLLEVBQUU7TUFDcEJsdUIsVUFBVSxDQUFDLFlBQU07UUFDYml1QixZQUFZLENBQUNsdUIsUUFBUSxDQUFDd0YsSUFBSSxDQUFDO01BQy9CLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDLE1BQU07TUFDSDBvQixZQUFZLENBQUNsdUIsUUFBUSxDQUFDd0YsSUFBSSxDQUFDO0lBQy9CO0VBQ0o7RUFFQSxTQUFTNG9CLFVBQVVBLENBQUNDLEtBQWdCLEVBQUVydUIsUUFBaUMsRUFBRW11QixLQUFlLEVBQVE7SUFDNUYsSUFBSUQsWUFBWTtJQUVoQixJQUFJLE9BQU9sdUIsUUFBUSxLQUFLLFVBQVUsRUFBRTtNQUNoQ2t1QixZQUFZLEdBQUc7UUFDWGx1QixRQUFRLEVBQVJBLFFBQVE7UUFDUm11QixLQUFLLEVBQUxBO01BQ0osQ0FBQztJQUNMLENBQUMsTUFBTTtNQUNIRCxZQUFZLEdBQUdsdUIsUUFBUTtNQUN2QixJQUFJLENBQUNrdUIsWUFBWSxDQUFDbHVCLFFBQVEsRUFBRTtRQUN4QixNQUFNLElBQUlnUyxLQUFLLENBQUMsdUNBQXVDLENBQUM7TUFDNUQ7SUFDSjtJQUVBNmIsUUFBUSxDQUFDUSxLQUFLLENBQUMsQ0FBQ04sV0FBVyxDQUFDdHJCLElBQUksQ0FBQ3lyQixZQUFZLENBQUM7RUFDbEQ7RUFFQSxPQUFPO0lBQ0hJLFNBQVMsV0FBVEEsU0FBU0EsQ0FBQ0QsS0FBZ0IsRUFBRXJ1QixRQUFpQyxFQUFFbXVCLEtBQWUsRUFBUTtNQUNsRixPQUFPQyxVQUFVLENBQUNDLEtBQUssRUFBRXJ1QixRQUFRLEVBQUVtdUIsS0FBSyxDQUFDO0lBQzdDLENBQUM7SUFDREksT0FBTyxXQUFQQSxPQUFPQSxDQUFDVCxTQUFvQixFQUFFdG9CLElBQVksRUFBUTtNQUM5QyxJQUFNNm9CLEtBQUssR0FBR1IsUUFBUSxDQUFDQyxTQUFTLENBQUM7TUFDakMsSUFBUUMsV0FBVyxHQUFLTSxLQUFLLENBQXJCTixXQUFXOztNQUVuQjtNQUNBQSxXQUFXLENBQUNTLE1BQU0sQ0FBQyxVQUFDQyxVQUFVO1FBQUEsT0FBSyxDQUFDLENBQUNBLFVBQVUsQ0FBQ0MsSUFBSTtNQUFBLEVBQUMsQ0FBQzlRLE9BQU8sQ0FBQyxVQUFDNlEsVUFBVSxFQUFLO1FBQzFFUixtQkFBbUIsQ0FBQ1EsVUFBVSxFQUFFanBCLElBQWEsQ0FBQztNQUNsRCxDQUFDLENBQUM7O01BRUY7TUFDQTZvQixLQUFLLENBQUNOLFdBQVcsR0FBR0EsV0FBVyxDQUFDUyxNQUFNLENBQUMsVUFBQ0MsVUFBVTtRQUFBLE9BQUssQ0FBQ0EsVUFBVSxDQUFDQyxJQUFJO01BQUEsRUFBQzs7TUFFeEU7TUFDQUwsS0FBSyxDQUFDTixXQUFXLENBQUNuUSxPQUFPLENBQUMsVUFBQzZRLFVBQVUsRUFBSztRQUN0Q1IsbUJBQW1CLENBQUNRLFVBQVUsRUFBRWpwQixJQUFhLENBQUM7TUFDbEQsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNEa3BCLElBQUksV0FBSkEsSUFBSUEsQ0FBQ0wsS0FBZ0IsRUFBRXJ1QixRQUFrQixFQUF1QjtNQUFBLElBQXJCbXVCLEtBQUssR0FBQW50QixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBa0csU0FBQSxHQUFBbEcsU0FBQSxNQUFHLEtBQUs7TUFDcERvdEIsVUFBVSxDQUFDQyxLQUFLLEVBQUU7UUFDZHJ1QixRQUFRLEVBQVJBLFFBQVE7UUFDUm11QixLQUFLLEVBQUxBLEtBQUs7UUFDTE8sSUFBSSxFQUFFO01BQ1YsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNEQyxXQUFXLFdBQVhBLFdBQVdBLENBQUNiLFNBQXFCLEVBQUU5dEIsUUFBa0MsRUFBUTtNQUN6RSxJQUFJOHRCLFNBQVMsRUFBRTtRQUNYLElBQU1PLE1BQUssR0FBR1IsUUFBUSxDQUFDQyxTQUFTLENBQUM7UUFDakMsSUFBSU8sTUFBSyxJQUFJcnVCLFFBQVEsRUFBRTtVQUNuQnF1QixNQUFLLENBQUNOLFdBQVcsR0FBR00sTUFBSyxDQUFDTixXQUFXLENBQUNTLE1BQU0sQ0FBQyxVQUFDQyxVQUFVO1lBQUEsT0FBS0EsVUFBVSxDQUFDenVCLFFBQVEsS0FBS0EsUUFBUTtVQUFBLEVBQUM7UUFDbEcsQ0FBQyxNQUFNO1VBQ0hxdUIsTUFBSyxDQUFDTixXQUFXLEdBQUcsRUFBRTtRQUMxQjtNQUNKLENBQUMsTUFBTTtRQUNIQyxXQUFXLENBQUMsQ0FBQztNQUNqQjtJQUNKO0VBQ0osQ0FBQztBQUNMLENBQUMsRUFBQyxDQUFDLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUM1R2tCWSxtQkFBUywwQkFBQUMsTUFBQTtFQUcxQixTQUFBRCxVQUFZL2YsQ0FBUyxFQUFFeUksSUFBYSxFQUFFO0lBQUEsSUFBQXlDLEtBQUE7SUFBQTNILHdCQUFBLE9BQUF3YyxTQUFBO0lBQ2xDN1UsS0FBQSxHQUFBSyxtQkFBQSxPQUFBd1UsU0FBQSxHQUFNL2YsQ0FBQztJQUFFd0Qsd0JBQUEsQ0FBQTBILEtBQUE7SUFDVEEsS0FBQSxDQUFLekMsSUFBSSxHQUFHQSxJQUFJO0lBQ2hCNVcsTUFBTSxDQUFDb3VCLGNBQWMsQ0FBQS9VLEtBQUEsRUFBTzZVLFNBQVMsQ0FBQ3h0QixTQUFTLENBQUM7SUFBQyxPQUFBMlksS0FBQTtFQUNyRDtFQUFDTSxrQkFBQSxDQUFBdVUsU0FBQSxFQUFBQyxNQUFBO0VBQUEsT0FBQXZjLHFCQUFBLENBQUFzYyxTQUFBO0FBQUEsZUFBQUcseUJBQUEsQ0FQa0MvYyxLQUFLOzs7QUNBQTtBQUU1QyxJQUFNZ2QsVUFBVSxHQUFHLHFKQUFxSjtBQUVqSyxTQUFTQyxnQkFBZ0JBLENBQUEsRUFBb0M7RUFDaEUsSUFBSTtJQUNBLE9BQU9DLFNBQVMsQ0FBQ0MsWUFBWSxDQUFDRixnQkFBZ0IsQ0FBQyxDQUFDO0VBQ3BELENBQUMsQ0FBQyxPQUFPckwsR0FBRyxFQUFFO0lBQ1YsSUFBTW5NLEtBQVksR0FBRyxJQUFJbVgsbUJBQVMscUNBQUFyc0IsTUFBQSxDQUFxQ3lzQixVQUFVLEdBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEYsT0FBT0ksT0FBTyxDQUFDQyxNQUFNLENBQUM1WCxLQUFLLENBQUM7RUFDaEM7QUFDSjtBQUVPLFNBQVM2WCxZQUFZQSxDQUFDQyxXQUFtQyxFQUF3QjtFQUNwRixJQUFJO0lBQ0EsT0FBT0wsU0FBUyxDQUFDQyxZQUFZLENBQUNHLFlBQVksQ0FBQ0MsV0FBVyxDQUFDO0VBQzNELENBQUMsQ0FBQyxPQUFPM0wsR0FBRyxFQUFFO0lBQ1YsSUFBTW5NLEtBQVksR0FBRyxJQUFJbVgsbUJBQVMsaUNBQUFyc0IsTUFBQSxDQUFpQ3lzQixVQUFVLEdBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEYsT0FBT0ksT0FBTyxDQUFDQyxNQUFNLENBQUM1WCxLQUFLLENBQUM7RUFDaEM7QUFDSixDOzs7O0FDcEJBO0FBQ0E7QUFDQTtBQUMrQjtBQUN5QztBQUM1QjtBQU01QyxJQUFJK1gsU0FBNkI7QUFFakMsU0FBU0MsWUFBWUEsQ0FBQ0MsS0FBdUIsRUFBaUI7RUFDMUQsT0FBTyxJQUFJTixPQUFPLENBQUMsVUFBQ08sT0FBTyxFQUFFTixNQUFNLEVBQUs7SUFDcEMsSUFBSU8sUUFBUSxHQUFHLEVBQUU7SUFFakIsU0FBU0MsVUFBVUEsQ0FBQSxFQUFTO01BQ3hCLElBQUlELFFBQVEsR0FBRyxDQUFDLEVBQUU7UUFDZCxJQUFJRixLQUFLLENBQUNJLFVBQVUsR0FBRyxFQUFFLElBQUlKLEtBQUssQ0FBQ0ssV0FBVyxHQUFHLEVBQUUsRUFBRTtVQUNqRCxJQUFJbE8sSUFBZSxFQUFFO1lBQ2pCaFUsT0FBTyxDQUFDaVUsR0FBRyw0QkFBQXZmLE1BQUEsQ0FBNEJtdEIsS0FBSyxDQUFDSSxVQUFVLFdBQUF2dEIsTUFBQSxDQUFRbXRCLEtBQUssQ0FBQ0ssV0FBVyxPQUFJLENBQUM7VUFDekY7VUFDQUosT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDLE1BQU07VUFDSGp3QixNQUFNLENBQUNPLFVBQVUsQ0FBQzR2QixVQUFVLEVBQUUsR0FBRyxDQUFDO1FBQ3RDO01BQ0osQ0FBQyxNQUFNO1FBQ0hSLE1BQU0sQ0FBQyxJQUFJVCxtQkFBUyxDQUFDLGlEQUFpRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ2xGO01BQ0FnQixRQUFRLEVBQUU7SUFDZDtJQUNBQyxVQUFVLENBQUMsQ0FBQztFQUNoQixDQUFDLENBQUM7QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQSxTQU1lRyxVQUFVQSxDQUFBcEUsRUFBQSxFQUFBcUUsR0FBQTtFQUFBLE9BQUFDLFdBQUEsQ0FBQW50QixLQUFBLE9BQUEvQixTQUFBO0FBQUE7QUFBQSxTQUFBa3ZCLFlBQUE7RUFBQUEsV0FBQSxHQUFBcEUsMEJBQUEsY0FBQUMscUJBQUEsQ0FBQUMsSUFBQSxDQUF6QixTQUFBbUUsU0FBMEJULEtBQThCLEVBQUVILFdBQW1DO0lBQUEsSUFBQWEsTUFBQTtJQUFBLE9BQUFyRSxxQkFBQSxDQUFBTSxJQUFBLFdBQUFnRSxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQXh0QixJQUFBLEdBQUF3dEIsU0FBQSxDQUFBdnRCLElBQUE7UUFBQTtVQUFBdXRCLFNBQUEsQ0FBQXZ0QixJQUFBO1VBQUEsT0FDcEV3c0IsWUFBWSxDQUFDQyxXQUFXLENBQUM7UUFBQTtVQUF4Q2EsTUFBTSxHQUFBQyxTQUFBLENBQUE3RCxJQUFBO1VBQ1pnRCxTQUFTLEdBQUdZLE1BQU07VUFBQyxLQUNmVixLQUFLO1lBQUFXLFNBQUEsQ0FBQXZ0QixJQUFBO1lBQUE7VUFBQTtVQUNMNHNCLEtBQUssQ0FBQ1ksWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7VUFDdENaLEtBQUssQ0FBQ1ksWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7VUFDbkNaLEtBQUssQ0FBQ1ksWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1VBQzNDO1VBQ0FaLEtBQUssQ0FBQ2EsU0FBUyxHQUFHSCxNQUFNO1VBQ3hCVixLQUFLLENBQUNjLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLFlBQU07WUFDM0NkLEtBQUssQ0FBQ2UsSUFBSSxDQUFDLENBQUMsU0FBTSxDQUFDLFVBQUM3TSxHQUFHLEVBQUs7Y0FDeEIvVixPQUFPLENBQUNDLElBQUksQ0FBQyw0Q0FBNEMsRUFBRThWLEdBQUcsQ0FBQztZQUNuRSxDQUFDLENBQUM7VUFDTixDQUFDLENBQUM7VUFBQyxPQUFBeU0sU0FBQSxDQUFBNUQsTUFBQSxXQUNJZ0QsWUFBWSxDQUFDQyxLQUFLLENBQUM7UUFBQTtVQUFBLE9BQUFXLFNBQUEsQ0FBQTVELE1BQUEsV0FFdkIyQyxPQUFPLENBQUNPLE9BQU8sQ0FBQyxDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUFVLFNBQUEsQ0FBQXhELElBQUE7TUFBQTtJQUFBLEdBQUFzRCxRQUFBO0VBQUEsQ0FDM0I7RUFBQSxPQUFBRCxXQUFBLENBQUFudEIsS0FBQSxPQUFBL0IsU0FBQTtBQUFBO0FBRUQsU0FBUzB2QixxQkFBcUJBLENBQUNDLGdCQUFxRCxFQUF5QjtFQUN6RyxJQUFNalIsVUFBVSxHQUFHa1IsY0FBSSxDQUFDRCxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUN0RSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7RUFFL0IsSUFBSSxPQUFPQSxnQkFBZ0IsQ0FBQ0UsY0FBYyxLQUFLLFdBQVcsSUFDL0NGLGdCQUFnQixDQUFDRSxjQUFjLEdBQUcsQ0FBQyxFQUFFO0lBQzVDblIsVUFBVSxDQUFDb1IsV0FBVyxHQUFHSCxnQkFBZ0IsQ0FBQ0UsY0FBYztJQUN4RGhqQixPQUFPLENBQUNpVSxHQUFHLENBQUMsbUZBQW1GLENBQUM7RUFDcEc7RUFDQSxJQUFJLE9BQU82TyxnQkFBZ0IsQ0FBQ0ksTUFBTSxLQUFLLFdBQVcsRUFBRTtJQUNoRHJSLFVBQVUsQ0FBQ3NSLFVBQVUsR0FBR0wsZ0JBQWdCLENBQUNJLE1BQU07SUFDL0NsakIsT0FBTyxDQUFDaVUsR0FBRyxDQUFDLDRFQUE0RSxDQUFDO0VBQzdGO0VBQ0EsT0FBT3BDLFVBQVU7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBU3VSLGVBQWVBLENBQUEsRUFBOEY7RUFBQSxJQUE3Rk4sZ0JBQXFELEdBQUEzdkIsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQWtHLFNBQUEsR0FBQWxHLFNBQUEsTUFBRyxDQUFDLENBQUM7RUFDdEYsSUFBTTB1QixLQUFLLEdBQUdnQixxQkFBcUIsQ0FBQ0MsZ0JBQWdCLENBQUM7RUFFckQsSUFBSWpCLEtBQUssSUFBSUEsS0FBSyxDQUFDd0IsUUFBUSxJQUFJeEIsS0FBSyxDQUFDc0IsVUFBVSxFQUFFO0lBQzdDLE9BQU90QixLQUFLLENBQUNzQixVQUFVO0VBQzNCO0VBQ0EsT0FBTzVCLE9BQU8sQ0FBQ08sT0FBTyxDQUFDO0lBQUV3QixLQUFLLEVBQUUsS0FBSztJQUFFekIsS0FBSyxFQUFMQTtFQUFNLENBQUMsQ0FBQztBQUNuRDtBQUFDLFNBRWMwQixxQkFBcUJBLENBQUE7RUFBQSxPQUFBQyxzQkFBQSxDQUFBdHVCLEtBQUEsT0FBQS9CLFNBQUE7QUFBQTtBQUFBLFNBQUFxd0IsdUJBQUE7RUFBQUEsc0JBQUEsR0FBQXZGLDBCQUFBLGNBQUFDLHFCQUFBLENBQUFDLElBQUEsQ0FBcEMsU0FBQXNGLFNBQUE7SUFBQSxJQUFBQyxPQUFBO0lBQUEsT0FBQXhGLHFCQUFBLENBQUFNLElBQUEsV0FBQW1GLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBM3VCLElBQUEsR0FBQTJ1QixTQUFBLENBQUExdUIsSUFBQTtRQUFBO1VBQUEwdUIsU0FBQSxDQUFBMXVCLElBQUE7VUFBQSxPQUMwQm1zQixnQkFBZ0IsQ0FBQyxDQUFDO1FBQUE7VUFBbENzQyxPQUFPLEdBQUFDLFNBQUEsQ0FBQWhGLElBQUE7VUFBQSxPQUFBZ0YsU0FBQSxDQUFBL0UsTUFBQSxXQUNOOEUsT0FBTyxDQUFDL0MsTUFBTSxDQUFDLFVBQUNpRCxNQUF1QjtZQUFBLE9BQUtBLE1BQU0sQ0FBQy9ULElBQUksS0FBSyxZQUFZO1VBQUEsRUFBQztRQUFBO1FBQUE7VUFBQSxPQUFBOFQsU0FBQSxDQUFBM0UsSUFBQTtNQUFBO0lBQUEsR0FBQXlFLFFBQUE7RUFBQSxDQUNuRjtFQUFBLE9BQUFELHNCQUFBLENBQUF0dUIsS0FBQSxPQUFBL0IsU0FBQTtBQUFBO0FBRUQsU0FBUzB3QixjQUFjQSxDQUFBLEVBQTRCO0VBQy9DLElBQUksQ0FBQ2xDLFNBQVMsRUFBRTtJQUNaLE9BQU8sSUFBSTtFQUNmO0VBQ0EsSUFBTW1DLE1BQU0sR0FBR25DLFNBQVMsQ0FBQ29DLGNBQWMsQ0FBQyxDQUFDO0VBQ3pDLE9BQU9ELE1BQU0sSUFBSUEsTUFBTSxhQUFOQSxNQUFNLGVBQU5BLE1BQU0sQ0FBRTF3QixNQUFNLEdBQUcwd0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7QUFDdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBTUUsb0JBQXNDLEdBQUc7RUFDM0NDLHFCQUFxQixFQUFFLElBQUk7RUFDckJDLE9BQU8sV0FBUEEsT0FBT0EsQ0FBQ3JDLEtBQThCLEVBQUVpQixnQkFBc0QsRUFBZ0I7SUFBQSxPQUFBN0UsMEJBQUEsY0FBQUMscUJBQUEsQ0FBQUMsSUFBQSxVQUFBd0IsUUFBQTtNQUFBLElBQUF3RSxjQUFBO01BQUEsT0FBQWpHLHFCQUFBLENBQUFNLElBQUEsV0FBQW9CLFFBQUE7UUFBQSxrQkFBQUEsUUFBQSxDQUFBNXFCLElBQUEsR0FBQTRxQixRQUFBLENBQUEzcUIsSUFBQTtVQUFBO1lBQ2hIK3VCLG9CQUFvQixDQUFDQyxxQkFBcUIsR0FBR3BDLEtBQUs7WUFBQ2pDLFFBQUEsQ0FBQTNxQixJQUFBO1lBQUEsT0FDdEJtdUIsZUFBZSxDQUFDTixnQkFBZ0IsQ0FBQztVQUFBO1lBQXhEcUIsY0FBYyxHQUFBdkUsUUFBQSxDQUFBakIsSUFBQTtZQUFBLE9BQUFpQixRQUFBLENBQUFoQixNQUFBLFdBQ2J1RCxVQUFVLENBQUNOLEtBQUssRUFBRXNDLGNBQWMsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBdkUsUUFBQSxDQUFBWixJQUFBO1FBQUE7TUFBQSxHQUFBVyxPQUFBO0lBQUE7RUFDNUMsQ0FBQztFQUNEeUUsT0FBTyxXQUFQQSxPQUFPQSxDQUFBLEVBQWtCO0lBQ3JCLElBQU1OLE1BQU0sR0FBR25DLFNBQVMsSUFBSUEsU0FBUyxDQUFDb0MsY0FBYyxDQUFDLENBQUM7SUFDdEQsSUFBSUMsb0JBQW9CLENBQUNDLHFCQUFxQixLQUFLLElBQUksRUFBRTtNQUNyREQsb0JBQW9CLENBQUNDLHFCQUFxQixDQUFDSSxLQUFLLENBQUMsQ0FBQztJQUN0RDtJQUNBLE9BQU8sSUFBSTlDLE9BQU8sQ0FBTyxVQUFDTyxPQUFPLEVBQUs7TUFDbEMxdkIsVUFBVSxDQUFDLFlBQU07UUFDYixJQUFJMHhCLE1BQU0sSUFBSUEsTUFBTSxDQUFDMXdCLE1BQU0sRUFBRTtVQUN6QjB3QixNQUFNLENBQUMvVCxPQUFPLENBQUMsVUFBQ3VVLEtBQUs7WUFBQSxPQUFLQSxLQUFLLENBQUN0RixJQUFJLENBQUMsQ0FBQztVQUFBLEVBQUM7UUFDM0M7UUFDQTJDLFNBQVMsR0FBRyxJQUFJO1FBQ2hCcUMsb0JBQW9CLENBQUNDLHFCQUFxQixHQUFHLElBQUk7UUFDakRuQyxPQUFPLENBQUMsQ0FBQztNQUNiLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUM7RUFDTixDQUFDO0VBQ0R5QixxQkFBcUIsRUFBckJBLHFCQUFxQjtFQUNyQmdCLG9CQUFvQixXQUFwQkEsb0JBQW9CQSxDQUFBLEVBQVc7SUFDM0IsSUFBTUQsS0FBSyxHQUFHVCxjQUFjLENBQUMsQ0FBQztJQUM5QixPQUFPUyxLQUFLLEdBQUdBLEtBQUssQ0FBQzNlLEtBQUssR0FBRyxFQUFFO0VBQ25DLENBQUM7RUFDRGtlLGNBQWMsRUFBZEEsY0FBYztFQUNSVyxZQUFZLFdBQVpBLFlBQVlBLENBQUEsRUFBRztJQUFBLE9BQUF2RywwQkFBQSxjQUFBQyxxQkFBQSxDQUFBQyxJQUFBLFVBQUFDLFNBQUE7TUFBQSxJQUFBa0csS0FBQSxFQUFBL0YsRUFBQTtNQUFBLE9BQUFMLHFCQUFBLENBQUFNLElBQUEsV0FBQUMsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUF6cEIsSUFBQSxHQUFBeXBCLFNBQUEsQ0FBQXhwQixJQUFBO1VBQUE7WUFDWHF2QixLQUFLLEdBQUdULGNBQWMsQ0FBQyxDQUFDLEVBQzlCO1lBQ0E7WUFBQSxLQUNJUyxLQUFLO2NBQUE3RixTQUFBLENBQUF4cEIsSUFBQTtjQUFBO1lBQUE7WUFBQXdwQixTQUFBLENBQUF6cEIsSUFBQTtZQUFBeXBCLFNBQUEsQ0FBQXhwQixJQUFBO1lBQUEsT0FFS3F2QixLQUFLLENBQUNHLGdCQUFnQixDQUFDO2NBQUVDLFFBQVEsRUFBRSxDQUFDO2dCQUFFQyxLQUFLLEVBQUU7Y0FBTSxDQUFDO1lBQUUsQ0FBNEIsQ0FBQztVQUFBO1lBQUFsRyxTQUFBLENBQUF4cEIsSUFBQTtZQUFBO1VBQUE7WUFBQXdwQixTQUFBLENBQUF6cEIsSUFBQTtZQUFBdXBCLEVBQUEsR0FBQUUsU0FBQTtZQUV6RixJQUFJRixFQUFBLFlBQWVxRyxvQkFBb0IsRUFBRTtjQUNyQzVrQixPQUFPLENBQUNDLElBQUksQ0FBQywwREFBMEQsQ0FBQztZQUM1RTtZQUFDLE1BQUFzZSxFQUFBO1VBQUE7VUFBQTtZQUFBLE9BQUFFLFNBQUEsQ0FBQU8sSUFBQTtRQUFBO01BQUEsR0FBQVosUUFBQTtJQUFBO0VBSWIsQ0FBQztFQUNLeUcsV0FBVyxXQUFYQSxXQUFXQSxDQUFBLEVBQUc7SUFBQSxPQUFBNUcsMEJBQUEsY0FBQUMscUJBQUEsQ0FBQUMsSUFBQSxVQUFBMkcsU0FBQTtNQUFBLElBQUFSLEtBQUEsRUFBQVMsR0FBQTtNQUFBLE9BQUE3RyxxQkFBQSxDQUFBTSxJQUFBLFdBQUF3RyxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQWh3QixJQUFBLEdBQUFnd0IsU0FBQSxDQUFBL3ZCLElBQUE7VUFBQTtZQUNWcXZCLEtBQUssR0FBR1QsY0FBYyxDQUFDLENBQUMsRUFDOUI7WUFDQTtZQUFBLEtBQ0lTLEtBQUs7Y0FBQVUsU0FBQSxDQUFBL3ZCLElBQUE7Y0FBQTtZQUFBO1lBQUErdkIsU0FBQSxDQUFBaHdCLElBQUE7WUFBQWd3QixTQUFBLENBQUEvdkIsSUFBQTtZQUFBLE9BRUtxdkIsS0FBSyxDQUFDRyxnQkFBZ0IsQ0FBQztjQUFFQyxRQUFRLEVBQUUsQ0FBQztnQkFBRUMsS0FBSyxFQUFFO2NBQUssQ0FBQztZQUFFLENBQTRCLENBQUM7VUFBQTtZQUFBSyxTQUFBLENBQUEvdkIsSUFBQTtZQUFBO1VBQUE7WUFBQSt2QixTQUFBLENBQUFod0IsSUFBQTtZQUFBK3ZCLEdBQUEsR0FBQUMsU0FBQTtZQUV4RixJQUFJRCxHQUFBLFlBQWVILG9CQUFvQixFQUFFO2NBQ3JDNWtCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLDBEQUEwRCxDQUFDO1lBQzVFO1lBQUMsTUFBQThrQixHQUFBO1VBQUE7VUFBQTtZQUFBLE9BQUFDLFNBQUEsQ0FBQWhHLElBQUE7UUFBQTtNQUFBLEdBQUE4RixRQUFBO0lBQUE7RUFJYjtBQUNKLENBQUM7QUFFY2Qsc0VBQW9CLEU7O0FDdEtZO0FBUy9DLFNBQVNpQixRQUFRQSxDQUFDNUgsVUFBOEIsRUFBRTVmLElBQStCLEVBQVc7RUFDeEYsT0FBT0EsSUFBSSxJQUFJQSxJQUFJLENBQUN5bkIsSUFBSSxDQUFDLFVBQUNwbkIsSUFBSSxFQUFLO0lBQy9CLElBQU00RixJQUFJLEdBQUc3USxNQUFNLENBQUM2USxJQUFJLENBQUM1RixJQUFJLENBQW9DO0lBQ2pFLE9BQU80RixJQUFJLENBQUN5aEIsS0FBSyxDQUFDLFVBQUN4aEIsR0FBRztNQUFBLE9BQUs3RixJQUFJLENBQUM2RixHQUFHLENBQUMsS0FBSzBaLFVBQVUsQ0FBQzFaLEdBQUcsQ0FBQztJQUFBLEVBQUM7RUFDN0QsQ0FBQyxDQUFDO0FBQ047QUFFQSxTQUFTeWhCLFlBQVlBLENBQ2pCL0gsVUFBOEIsRUFDOUJzRCxNQUF5RCxFQUNsRDtFQUNQLE9BQU8sT0FBT0EsTUFBTSxLQUFLLFVBQVUsR0FBR0EsTUFBTSxDQUFDdEQsVUFBVSxDQUFDLEdBQUcsSUFBSTtBQUNuRTtBQU9lO0VBQ1gvbkIsTUFBTSxXQUFOQSxNQUFNQSxDQUFDK0osTUFBK0IsRUFBbUI7SUFBQSxJQUFBZ21CLGdCQUFBO0lBQ3JELElBQU0zbEIsTUFBTSxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDL0MsSUFBTXhCLEdBQUcsR0FBR3NCLE1BQU0sQ0FBQ1EsVUFBVSxDQUFDLElBQUksRUFBRTtNQUFFb2xCLGtCQUFrQixFQUFFLENBQUMsQ0FBQ2ptQixNQUFNLENBQUNpbUI7SUFBbUIsQ0FBQyxDQUE2QjtJQUNwSCxJQUFNQyxPQUFrQyxHQUFHLEVBQUU7SUFDN0MsSUFBSUMsUUFBUSxJQUFBSCxnQkFBQSxHQUFHaG1CLE1BQU0sQ0FBQ21tQixRQUFRLGNBQUFILGdCQUFBLGNBQUFBLGdCQUFBLEdBQUksRUFBRTtJQUNwQyxJQUFNSSxPQUFPLEdBQUdwbUIsTUFBTSxDQUFDb21CLE9BQU8sS0FBSyxJQUFJO0lBRXZDLFNBQVNDLGtCQUFrQkEsQ0FBQ3JJLFVBQThCLEVBQVc7TUFDakUsT0FBTyxDQUFDLENBQUNtSSxRQUFRLElBQ1ZuSSxVQUFVLElBQ1YsQ0FBQzRILFFBQVEsQ0FBQzVILFVBQVUsRUFBRWhlLE1BQU0sQ0FBQ3NtQixTQUFzQyxDQUFDLElBQ3BFUCxZQUFZLENBQUMvSCxVQUFVLEVBQUVoZSxNQUFNLENBQUNzaEIsTUFBTSxDQUFDO0lBQ2xEO0lBRUEsT0FBTztNQUNIaUYsU0FBUyxXQUFUQSxTQUFTQSxDQUFDanVCLElBQXFCLEVBQUVrdUIsU0FBaUIsRUFBRXhJLFVBQThCLEVBQVE7UUFDdEYsSUFBTS9oQixNQUFXLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJb3FCLGtCQUFrQixDQUFDckksVUFBVSxDQUFDLEVBQUU7VUFDaENtSSxRQUFRLEVBQUU7VUFDVmxxQixNQUFNLENBQUMraEIsVUFBVSxHQUFHQSxVQUFVO1VBQzlCLElBQUlvSSxPQUFPLEVBQUU7WUFDVC9sQixNQUFNLENBQUM5SCxLQUFLLEdBQUdpdUIsU0FBUyxDQUFDN3VCLENBQUM7WUFDMUIwSSxNQUFNLENBQUM1SCxNQUFNLEdBQUcrdEIsU0FBUyxDQUFDNXVCLENBQUM7WUFDM0JtbUIsV0FBVSxDQUFDOWUsU0FBUyxDQUFDM0csSUFBSSxFQUFFa3VCLFNBQVMsRUFBRXpuQixHQUFHLENBQUM7WUFDMUM5QyxNQUFNLENBQUM4TCxLQUFLLEdBQUcxSCxNQUFNLENBQUNvbUIsU0FBUyxDQUFDLENBQUM7VUFDckM7VUFDQVAsT0FBTyxDQUFDM3dCLElBQUksQ0FBQzBHLE1BQU0sQ0FBQztRQUN4QjtNQUNKLENBQUM7TUFDRHlxQixVQUFVLFdBQVZBLFVBQVVBLENBQUEsRUFBOEI7UUFDcEMsT0FBT1IsT0FBTztNQUNsQjtJQUNKLENBQUM7RUFDTDtBQUNKLENBQUMsRTs7QUM3REQsSUFBTVMsU0FBK0IsR0FBRztFQUNwQ0MsV0FBVyxFQUFFO0lBQ1R0TCxJQUFJLEVBQUUsTUFBTTtJQUNadUwsSUFBSSxFQUFFLFlBQVk7SUFDbEJ4RSxXQUFXLEVBQUU7TUFDVDlwQixLQUFLLEVBQUUsR0FBRztNQUNWRSxNQUFNLEVBQUUsR0FBRztNQUNYO01BQ0FxckIsVUFBVSxFQUFFLGFBQWEsQ0FBRTtNQUMzQjtJQUNKLENBQUM7SUFDRDNmLElBQUksRUFBRTtNQUNGbkksR0FBRyxFQUFFLElBQUk7TUFDVGxDLEtBQUssRUFBRSxJQUFJO01BQ1hELElBQUksRUFBRSxJQUFJO01BQ1ZrSyxNQUFNLEVBQUU7SUFDWixDQUFDO0lBQ0Q3RCxhQUFhLEVBQUUsS0FBSztJQUFFO0lBQ3RCK1osS0FBSyxFQUFFO01BQ0g2TSxnQkFBZ0IsRUFBRSxLQUFLLENBQUU7SUFDN0I7RUFDSixDQUFDO0VBQ0RDLE1BQU0sRUFBRSxJQUFJO0VBQ1pDLFlBQVksRUFBRSxDQUFDO0VBQ2ZDLE9BQU8sRUFBRTtJQUNMMUssT0FBTyxFQUFFLENBQ0wsaUJBQWlCLENBQ3BCO0lBQ0R0QyxLQUFLLEVBQUU7TUFDSDRGLGVBQWUsRUFBRSxLQUFLO01BQ3RCM0MsYUFBYSxFQUFFLEtBQUs7TUFDcEI4QyxZQUFZLEVBQUUsS0FBSztNQUNuQjdDLFdBQVcsRUFBRSxLQUFLO01BQ2xCZCxlQUFlLEVBQUUsS0FBSyxDQUFFO0lBQzVCO0VBQ0osQ0FBQztFQUNENkssT0FBTyxFQUFFO0lBQ0xsbUIsVUFBVSxFQUFFLElBQUk7SUFDaEJ1QixTQUFTLEVBQUUsUUFBUTtJQUFFO0lBQ3JCMFgsS0FBSyxFQUFFO01BQ0hrTixVQUFVLEVBQUUsS0FBSztNQUNqQkMsV0FBVyxFQUFFLEtBQUs7TUFDbEJDLGdCQUFnQixFQUFFLEtBQUs7TUFDdkJDLFlBQVksRUFBRSxLQUFLO01BQ25CQyxVQUFVLEVBQUUsS0FBSztNQUNqQkMsZUFBZSxFQUFFLEtBQUs7TUFDdEJDLHdCQUF3QixFQUFFLEtBQUs7TUFDL0JDLGFBQWEsRUFBRSxLQUFLO01BQUU7TUFDdEJaLGdCQUFnQixFQUFFLEtBQUs7TUFBRTtNQUN6QmEsY0FBYyxFQUFFO1FBQ1pDLGVBQWUsRUFBRSxLQUFLO1FBQ3RCQyxrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCQyxNQUFNLEVBQUU7TUFDWjtJQUNKO0VBQ0o7QUFDSixDQUFDO0FBRWNuQix3REFBUyxFOztBQzFEeEIsSUFBTW9CLFVBQWdDLEdBQUc7RUFDckNuQixXQUFXLEVBQUU7SUFDVEMsSUFBSSxFQUFFLGFBQWE7SUFDbkJtQixRQUFRLEVBQUUsS0FBSztJQUNmeHZCLElBQUksRUFBRSxHQUFHO0lBQ1QyTCxJQUFJLEVBQUU7TUFDRm5JLEdBQUcsRUFBRSxJQUFJO01BQ1RsQyxLQUFLLEVBQUUsSUFBSTtNQUNYRCxJQUFJLEVBQUUsSUFBSTtNQUNWa0ssTUFBTSxFQUFFO0lBQ1osQ0FBQztJQUNEN0QsYUFBYSxFQUFFLEtBQUssQ0FBRTtFQUMxQixDQUFDO0VBQ0Q2bUIsTUFBTSxFQUFFLElBQUk7RUFDWkMsWUFBWSxFQUFFLENBQUM7RUFDZkMsT0FBTyxFQUFFO0lBQ0wxSyxPQUFPLEVBQUUsQ0FDTCxpQkFBaUI7RUFFekIsQ0FBQztFQUNEMkssT0FBTyxFQUFFO0lBQ0xsbUIsVUFBVSxFQUFFLElBQUk7SUFDaEJ1QixTQUFTLEVBQUUsUUFBUSxDQUFFO0VBQ3pCO0FBQ0osQ0FBQztBQUVjd2xCLDBEQUFVLEU7O0FDMUJ6QixJQUFNRSxVQUFnQyxHQUFHO0VBQ3JDckIsV0FBVyxFQUFFO0lBQ1R0TCxJQUFJLEVBQUUsTUFBTTtJQUNadUwsSUFBSSxFQUFFLFlBQVk7SUFDbEJ4RSxXQUFXLEVBQUU7TUFDVDlwQixLQUFLLEVBQUUsR0FBRztNQUNWRSxNQUFNLEVBQUUsR0FBRztNQUNYO01BQ0FxckIsVUFBVSxFQUFFLGFBQWEsQ0FBRTtNQUMzQjtJQUNKLENBQUM7SUFDRDNmLElBQUksRUFBRTtNQUNGbkksR0FBRyxFQUFFLElBQUk7TUFDVGxDLEtBQUssRUFBRSxJQUFJO01BQ1hELElBQUksRUFBRSxJQUFJO01BQ1ZrSyxNQUFNLEVBQUU7SUFDWixDQUFDO0lBQ0Q3RCxhQUFhLEVBQUUsS0FBSyxDQUFFO0VBQzFCLENBQUM7RUFDRDZtQixNQUFNLEVBQUUsSUFBSTtFQUNaQyxZQUFZLEVBQUUsQ0FBQztFQUNmQyxPQUFPLEVBQUU7SUFDTDFLLE9BQU8sRUFBRSxDQUNMLGlCQUFpQjtFQUV6QixDQUFDO0VBQ0QySyxPQUFPLEVBQUU7SUFDTGxtQixVQUFVLEVBQUUsSUFBSTtJQUNoQnVCLFNBQVMsRUFBRSxRQUFRLENBQUU7RUFDekI7QUFDSixDQUFDO0FBRWMwbEIsMERBQVUsRTs7QUNqQ1k7QUFDRTtBQUNBO0FBRXZDLElBQU1DLFlBQWtDLEdBQUksWUFBTTtFQUM5QyxJQUFJQyxZQUFrQztFQUN0QyxJQUFJLElBQTZDLEVBQUU7SUFDL0NBLFlBQVksR0FBR3hCLFVBQVM7RUFDNUIsQ0FBQyxNQUFNLEVBSU47RUFDRCxPQUFPd0IsWUFBWTtBQUN2QixDQUFDLENBQUUsQ0FBQztBQUVXRCw4REFBWSxFOztBQ2pCM0I7QUFDQTs7QUFNNEI7QUFFNUIsSUFBTUUsVUFBVSxHQUFHcDFCLElBQUksQ0FBQzZULEVBQUUsR0FBRyxHQUFHO0FBRWhDLFNBQVN3aEIsZ0JBQWdCQSxDQUFDaG9CLE1BQU0sRUFBRWlvQixVQUFVLEVBQUVyTyxLQUFLLEVBQUU7RUFDakQsSUFBSTVaLE1BQU0sQ0FBQzlILEtBQUssS0FBSyt2QixVQUFVLENBQUMzd0IsQ0FBQyxFQUFFO0lBQy9CLElBQUlnZCxLQUFlLElBQUlzRixLQUFLLGFBQUxBLEtBQUssZUFBTEEsS0FBSyxDQUFFNk0sZ0JBQWdCLEVBQUU7TUFDNUNubUIsT0FBTyxDQUFDaVUsR0FBRyxDQUFDLDJDQUEyQyxDQUFDO0lBQzVEO0lBQ0F2VSxNQUFNLENBQUM5SCxLQUFLLEdBQUcrdkIsVUFBVSxDQUFDM3dCLENBQUM7RUFDL0I7RUFDQSxJQUFJMEksTUFBTSxDQUFDNUgsTUFBTSxLQUFLNnZCLFVBQVUsQ0FBQzF3QixDQUFDLEVBQUU7SUFDaEMsSUFBSStjLEtBQWUsSUFBSXNGLEtBQUssYUFBTEEsS0FBSyxlQUFMQSxLQUFLLENBQUU2TSxnQkFBZ0IsRUFBRTtNQUM1Q25tQixPQUFPLENBQUNpVSxHQUFHLENBQUMsMkNBQTJDLENBQUM7SUFDNUQ7SUFDQXZVLE1BQU0sQ0FBQzVILE1BQU0sR0FBRzZ2QixVQUFVLENBQUMxd0IsQ0FBQztFQUNoQztBQUNKO0FBRUEsSUFBTTJ3QixZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRXZCQSxZQUFZLENBQUN0eUIsTUFBTSxHQUFHLFVBQVUyd0IsV0FBVyxFQUFFdm1CLE1BQU0sRUFBRTtFQUFBLElBQUFtb0IsbUJBQUEsRUFBQUMsb0JBQUE7RUFDakQ7RUFDQSxJQUFNQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQ2hCLElBQU1DLGFBQWEsR0FBRy9CLFdBQVcsQ0FBQ2dDLFNBQVMsQ0FBQyxDQUFDO0VBQzdDLElBQU1DLFVBQVUsR0FBR254QixRQUFRLENBQUNrdkIsV0FBVyxDQUFDa0MsWUFBWSxDQUFDLENBQUMsRUFBRWxDLFdBQVcsQ0FBQ21DLGFBQWEsQ0FBQyxDQUFDLENBQUM7RUFDcEYsSUFBTUMsV0FBVyxHQUFHcEMsV0FBVyxDQUFDcUMsYUFBYSxDQUFDLENBQUM7RUFDL0MsSUFBTUMsS0FBSyxHQUFHeHhCLFFBQVEsQ0FBQ2t2QixXQUFXLENBQUN1QyxRQUFRLENBQUMsQ0FBQyxFQUFFdkMsV0FBVyxDQUFDd0MsU0FBUyxDQUFDLENBQUMsQ0FBQztFQUN2RSxJQUFNQyxRQUFRLEdBQUd6QyxXQUFXLENBQUMwQyxXQUFXLENBQUMsQ0FBQztFQUMxQyxJQUFNQyxHQUFHLEdBQUdGLFFBQVEsQ0FBQzF4QixDQUFDO0VBQ3RCLElBQU02eEIsR0FBRyxHQUFHSCxRQUFRLENBQUN6eEIsQ0FBQztFQUN0QixJQUFJNmpCLE9BQU87RUFDWCxJQUFJZ08sSUFBSSxHQUFHLElBQUk7RUFDZixJQUFJQyxLQUFLLEdBQUcsSUFBSTtFQUNoQixJQUFRekQsa0JBQWtCLEdBQUswQyxhQUFhLENBQXBDMUMsa0JBQWtCO0VBRTFCeEssT0FBTyxHQUFHcGIsTUFBTSxJQUFJQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUM7RUFDcERrYixPQUFPLENBQUNsakIsS0FBSyxHQUFHeXdCLFdBQVcsQ0FBQ3J4QixDQUFDO0VBQzdCOGpCLE9BQU8sQ0FBQ2hqQixNQUFNLEdBQUd1d0IsV0FBVyxDQUFDcHhCLENBQUM7RUFDOUIsSUFBSStjLEtBQWUsS0FBQTZULG1CQUFBLEdBQUlHLGFBQWEsQ0FBQzFPLEtBQUssY0FBQXVPLG1CQUFBLGVBQW5CQSxtQkFBQSxDQUFxQjFCLGdCQUFnQixFQUFFO0lBQzFEbm1CLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLGdEQUFnRCxFQUFFcWxCLGtCQUFrQixFQUFFLFNBQVMsRUFBRXhLLE9BQU8sQ0FBQztFQUMxRztFQUNBZ08sSUFBSSxHQUFHaE8sT0FBTyxDQUFDNWEsVUFBVSxDQUFDLElBQUksRUFBRTtJQUFFb2xCLGtCQUFrQixFQUFFLENBQUMsQ0FBQ0E7RUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMvRXlELEtBQUssR0FBRyxJQUFJNW9CLFVBQVUsQ0FBQ29vQixLQUFLLENBQUN2eEIsQ0FBQyxHQUFHdXhCLEtBQUssQ0FBQ3R4QixDQUFDLENBQUM7RUFDekMsSUFBSStjLEtBQWUsS0FBQThULG9CQUFBLEdBQUlFLGFBQWEsQ0FBQzFPLEtBQUssY0FBQXdPLG9CQUFBLGVBQW5CQSxvQkFBQSxDQUFxQjNCLGdCQUFnQixFQUFFO0lBQzFEbm1CLE9BQU8sQ0FBQ2lVLEdBQUcsQ0FBQyxjQUFjLEVBQUVpSSxJQUFJLENBQUNDLFNBQVMsQ0FBQztNQUN2Q3RrQixJQUFJLEVBQUUwd0IsS0FBSztNQUNYRyxRQUFRLEVBQVJBLFFBQVE7TUFDUk0sU0FBUyxFQUFFZCxVQUFVO01BQ3JCZSxVQUFVLEVBQUVaO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0VBQ1A7O0VBRUE7QUFDSjtBQUNBO0VBQ0lOLEtBQUssQ0FBQ21CLFVBQVUsR0FBRyxVQUFVdnhCLElBQUksRUFBRTtJQUMvQm94QixLQUFLLEdBQUdweEIsSUFBSTtFQUNoQixDQUFDOztFQUVEO0FBQ0o7QUFDQTtFQUNJb3dCLEtBQUssQ0FBQ29CLE9BQU8sR0FBRyxZQUFZO0lBQ3hCLE9BQU9KLEtBQUs7RUFDaEIsQ0FBQzs7RUFFRDtBQUNKO0FBQ0E7QUFDQTtFQUNJaEIsS0FBSyxDQUFDcUIsSUFBSSxHQUFHLFlBQVk7SUFDckIsSUFBTUMsWUFBWSxHQUFHckIsYUFBYSxDQUFDM25CLFVBQVU7SUFDN0MsSUFBTStHLEtBQUssR0FBRzZlLFdBQVcsQ0FBQ3FELFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLElBQUlDLFFBQVEsR0FBR25pQixLQUFLO0lBQ3BCLElBQUlvaUIsU0FBUyxHQUFHLENBQUM7SUFDakIsSUFBSWpyQixPQUFPO0lBQ1gsSUFBSWdyQixRQUFRLEVBQUU7TUFDVjdCLGdCQUFnQixDQUFDNU0sT0FBTyxFQUFFdU4sV0FBVyxFQUFFTCxhQUFhLENBQUMxTyxLQUFLLENBQUM7TUFDM0QsSUFBSTBPLGFBQWEsQ0FBQzlCLElBQUksS0FBSyxhQUFhLEVBQUU7UUFDdENxRCxRQUFRLEdBQUduaUIsS0FBSyxDQUFDdkgsR0FBRztRQUNwQixJQUFJdUgsS0FBSyxDQUFDcWlCLElBQUksSUFBSXJpQixLQUFLLENBQUNxaUIsSUFBSSxDQUFDQyxXQUFXLEVBQUU7VUFDdEMsUUFBUXRpQixLQUFLLENBQUNxaUIsSUFBSSxDQUFDQyxXQUFXO1lBQzFCLEtBQUssQ0FBQztjQUNGRixTQUFTLEdBQUcsRUFBRSxHQUFHL0IsVUFBVTtjQUMzQjtZQUNKLEtBQUssQ0FBQztjQUNGK0IsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHL0IsVUFBVTtjQUM1QjtVQUNSO1FBQ0o7TUFDSjtNQUVBLElBQUkrQixTQUFTLEtBQUssQ0FBQyxFQUFFO1FBQ2pCVixJQUFJLENBQUNhLFNBQVMsQ0FBQ3RCLFdBQVcsQ0FBQ3J4QixDQUFDLEdBQUcsQ0FBQyxFQUFFcXhCLFdBQVcsQ0FBQ3B4QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BENnhCLElBQUksQ0FBQ2MsTUFBTSxDQUFDSixTQUFTLENBQUM7UUFDdEJWLElBQUksQ0FBQ3hxQixTQUFTLENBQUNpckIsUUFBUSxFQUFFLENBQUNsQixXQUFXLENBQUNweEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDb3hCLFdBQVcsQ0FBQ3J4QixDQUFDLEdBQUcsQ0FBQyxFQUFFcXhCLFdBQVcsQ0FBQ3B4QixDQUFDLEVBQUVveEIsV0FBVyxDQUFDcnhCLENBQUMsQ0FBQztRQUM5Rjh4QixJQUFJLENBQUNjLE1BQU0sQ0FBQyxDQUFDSixTQUFTLENBQUM7UUFDdkJWLElBQUksQ0FBQ2EsU0FBUyxDQUFDLENBQUN0QixXQUFXLENBQUNyeEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDcXhCLFdBQVcsQ0FBQ3B4QixDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQzFELENBQUMsTUFBTTtRQUNINnhCLElBQUksQ0FBQ3hxQixTQUFTLENBQUNpckIsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUVsQixXQUFXLENBQUNyeEIsQ0FBQyxFQUFFcXhCLFdBQVcsQ0FBQ3B4QixDQUFDLENBQUM7TUFDaEU7TUFFQXNILE9BQU8sR0FBR3VxQixJQUFJLENBQUN0cUIsWUFBWSxDQUFDb3FCLEdBQUcsRUFBRUMsR0FBRyxFQUFFTixLQUFLLENBQUN2eEIsQ0FBQyxFQUFFdXhCLEtBQUssQ0FBQ3R4QixDQUFDLENBQUMsQ0FBQ1UsSUFBSTtNQUM1RCxJQUFJMHhCLFlBQVksRUFBRTtRQUNkenFCLCtCQUErQixDQUFDTCxPQUFPLEVBQUVncUIsS0FBSyxFQUFFUSxLQUFLLENBQUM7TUFDMUQsQ0FBQyxNQUFNO1FBQ0h0cUIsV0FBVyxDQUFDRixPQUFPLEVBQUV3cUIsS0FBSyxFQUFFZixhQUFhLENBQUM7TUFDOUM7TUFDQSxPQUFPLElBQUk7SUFDZjtJQUNBLE9BQU8sS0FBSztFQUNoQixDQUFDO0VBRURELEtBQUssQ0FBQzhCLE9BQU8sR0FBRyxZQUFZO0lBQ3hCLE9BQU90QixLQUFLO0VBQ2hCLENBQUM7RUFFRCxPQUFPUixLQUFLO0FBQ2hCLENBQUM7QUFFY0gsc0VBQVksRTs7QUNoSTNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQU1rQyxRQUFRLEdBQUc7RUFBRSxNQUFNLEVBQUU7QUFBYyxDQUFDO0FBQ25DLElBQU1DLGFBQWEsR0FBR2wzQixNQUFNLENBQUM2USxJQUFJLENBQUNvbUIsUUFBUSxDQUFDLENBQUMzWCxHQUFHLENBQUMsVUFBQ3hPLEdBQUc7RUFBQSxPQUFLbW1CLFFBQVEsQ0FBQ25tQixHQUFHLENBQUM7QUFBQSxFQUFDO0FBRXZFLFNBQVNxbUIsbUJBQW1CQSxDQUFDdnFCLEdBQUcsRUFBd0I7RUFBQSxJQUF0QmdxQixJQUFJLEdBQUF0MkIsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQWtHLFNBQUEsR0FBQWxHLFNBQUEsTUFBRzQyQixhQUFhO0VBQ3pELElBQUksU0FBUyxDQUFDeFcsSUFBSSxDQUFDOVQsR0FBRyxDQUFDLEVBQUU7SUFDckIsT0FBT3dxQixlQUFlLENBQUN4cUIsR0FBRyxDQUFDLENBQ3RCeXFCLElBQUksQ0FBQ0MsWUFBWSxDQUFDLENBQ2xCRCxJQUFJLENBQUMsVUFBQ0UsTUFBTTtNQUFBLE9BQUtDLGdCQUFnQixDQUFDRCxNQUFNLEVBQUVYLElBQUksQ0FBQztJQUFBLEVBQUM7RUFDekQ7RUFDQSxPQUFPbEksT0FBTyxDQUFDTyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ2hDO0FBRU8sU0FBU3dJLG1CQUFtQkEsQ0FBQ0MsT0FBTyxFQUFFO0VBQ3pDLElBQU1DLE1BQU0sR0FBR0QsT0FBTyxDQUFDMVcsT0FBTyxDQUFDLDBCQUEwQixFQUFFLEVBQUUsQ0FBQztFQUM5RCxJQUFNNFcsTUFBTSxHQUFHQyxJQUFJLENBQUNGLE1BQU0sQ0FBQztFQUMzQixJQUFNRyxHQUFHLEdBQUdGLE1BQU0sQ0FBQ3IzQixNQUFNO0VBQ3pCLElBQU1nM0IsTUFBTSxHQUFHLElBQUlRLFdBQVcsQ0FBQ0QsR0FBRyxDQUFDO0VBQ25DLElBQU1FLElBQUksR0FBRyxJQUFJMXFCLFVBQVUsQ0FBQ2lxQixNQUFNLENBQUM7RUFFbkMsS0FBSyxJQUFJcjJCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzQyQixHQUFHLEVBQUU1MkIsQ0FBQyxFQUFFLEVBQUU7SUFDMUI4MkIsSUFBSSxDQUFDOTJCLENBQUMsQ0FBQyxHQUFHMDJCLE1BQU0sQ0FBQ3BiLFVBQVUsQ0FBQ3RiLENBQUMsQ0FBQztFQUNsQztFQUNBLE9BQU9xMkIsTUFBTTtBQUNqQjtBQUVBLFNBQVNELFlBQVlBLENBQUNXLElBQUksRUFBRTtFQUN4QixPQUFPLElBQUl2SixPQUFPLENBQUMsVUFBQ08sT0FBTyxFQUFLO0lBQzVCLElBQU1pSixVQUFVLEdBQUcsSUFBSUMsVUFBVSxDQUFDLENBQUM7SUFDbkNELFVBQVUsQ0FBQ2hyQixNQUFNLEdBQUcsVUFBVThlLENBQUMsRUFBRTtNQUM3QixPQUFPaUQsT0FBTyxDQUFDakQsQ0FBQyxDQUFDOXJCLE1BQU0sQ0FBQ3VJLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBQ0R5dkIsVUFBVSxDQUFDRSxpQkFBaUIsQ0FBQ0gsSUFBSSxDQUFDO0VBQ3RDLENBQUMsQ0FBQztBQUNOO0FBRUEsU0FBU2IsZUFBZUEsQ0FBQ2lCLEdBQUcsRUFBRTtFQUMxQixPQUFPLElBQUkzSixPQUFPLENBQUMsVUFBQ08sT0FBTyxFQUFFTixNQUFNLEVBQUs7SUFDcEMsSUFBTTJKLElBQUksR0FBRyxJQUFJQyxjQUFjLENBQUMsQ0FBQztJQUNqQ0QsSUFBSSxDQUFDRSxJQUFJLENBQUMsS0FBSyxFQUFFSCxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQzNCQyxJQUFJLENBQUNHLFlBQVksR0FBRyxNQUFNO0lBQzFCSCxJQUFJLENBQUNJLGtCQUFrQixHQUFHLFlBQVk7TUFDbEMsSUFBSUosSUFBSSxDQUFDSyxVQUFVLEtBQUtKLGNBQWMsQ0FBQ0ssSUFBSSxLQUFLTixJQUFJLENBQUNPLE1BQU0sS0FBSyxHQUFHLElBQUlQLElBQUksQ0FBQ08sTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ3ZGNUosT0FBTyxDQUFDLElBQUksQ0FBQzZKLFFBQVEsQ0FBQztNQUMxQjtJQUNKLENBQUM7SUFDRFIsSUFBSSxDQUFDUyxPQUFPLEdBQUdwSyxNQUFNO0lBQ3JCMkosSUFBSSxDQUFDVSxJQUFJLENBQUMsQ0FBQztFQUNmLENBQUMsQ0FBQztBQUNOO0FBRU8sU0FBU3hCLGdCQUFnQkEsQ0FBQ3lCLElBQUksRUFBZ0M7RUFBQSxJQUE5QkMsWUFBWSxHQUFBNTRCLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFrRyxTQUFBLEdBQUFsRyxTQUFBLE1BQUc0MkIsYUFBYTtFQUMvRCxJQUFNaUMsUUFBUSxHQUFHLElBQUlDLFFBQVEsQ0FBQ0gsSUFBSSxDQUFDO0VBQ25DLElBQU0xNEIsTUFBTSxHQUFHMDRCLElBQUksQ0FBQ0ksVUFBVTtFQUM5QixJQUFNQyxRQUFRLEdBQUdKLFlBQVksQ0FBQ3ozQixNQUFNLENBQUMsVUFBQ2dILE1BQU0sRUFBRTh3QixXQUFXLEVBQUs7SUFDMUQsSUFBTUMsT0FBTyxHQUFHeDVCLE1BQU0sQ0FBQzZRLElBQUksQ0FBQ29tQixRQUFRLENBQUMsQ0FBQ25KLE1BQU0sQ0FBQyxVQUFDMkwsR0FBRztNQUFBLE9BQUt4QyxRQUFRLENBQUN3QyxHQUFHLENBQUMsS0FBS0YsV0FBVztJQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkYsSUFBSUMsT0FBTyxFQUFFO01BQ1Qvd0IsTUFBTSxDQUFDK3dCLE9BQU8sQ0FBQyxHQUFHRCxXQUFXO0lBQ2pDO0lBQ0EsT0FBTzl3QixNQUFNO0VBQ2pCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNOLElBQUlxRCxNQUFNLEdBQUcsQ0FBQztFQUNkLElBQUk0dEIsTUFBTTtFQUVWLElBQUtQLFFBQVEsQ0FBQ1EsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBTVIsUUFBUSxDQUFDUSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSyxFQUFFO0lBQ3BFLE9BQU8sS0FBSztFQUNoQjtFQUVBLE9BQU83dEIsTUFBTSxHQUFHdkwsTUFBTSxFQUFFO0lBQ3BCLElBQUk0NEIsUUFBUSxDQUFDUSxRQUFRLENBQUM3dEIsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO01BQ3BDLE9BQU8sS0FBSztJQUNoQjtJQUVBNHRCLE1BQU0sR0FBR1AsUUFBUSxDQUFDUSxRQUFRLENBQUM3dEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJNHRCLE1BQU0sS0FBSyxJQUFJLEVBQUU7TUFDakIsT0FBT0UsWUFBWSxDQUFDVCxRQUFRLEVBQUVydEIsTUFBTSxHQUFHLENBQUMsRUFBRXd0QixRQUFRLENBQUM7SUFDdkQ7SUFDQXh0QixNQUFNLElBQUksQ0FBQyxHQUFHcXRCLFFBQVEsQ0FBQ1UsU0FBUyxDQUFDL3RCLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDaEQ7RUFFQSxPQUFPLEtBQUs7QUFDaEI7QUFFQSxTQUFTOHRCLFlBQVlBLENBQUNYLElBQUksRUFBRXhpQixLQUFLLEVBQUU2aUIsUUFBUSxFQUFFO0VBQ3pDLElBQUlRLG1CQUFtQixDQUFDYixJQUFJLEVBQUV4aUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtJQUNoRCxPQUFPLEtBQUs7RUFDaEI7RUFFQSxJQUFNc2pCLFVBQVUsR0FBR3RqQixLQUFLLEdBQUcsQ0FBQztFQUM1QixJQUFJdWpCLE1BQU07RUFFVixJQUFJZixJQUFJLENBQUNZLFNBQVMsQ0FBQ0UsVUFBVSxDQUFDLEtBQUssTUFBTSxFQUFFO0lBQ3ZDQyxNQUFNLEdBQUcsS0FBSztFQUNsQixDQUFDLE1BQU0sSUFBSWYsSUFBSSxDQUFDWSxTQUFTLENBQUNFLFVBQVUsQ0FBQyxLQUFLLE1BQU0sRUFBRTtJQUM5Q0MsTUFBTSxHQUFHLElBQUk7RUFDakIsQ0FBQyxNQUFNO0lBQ0gsT0FBTyxLQUFLO0VBQ2hCO0VBRUEsSUFBSWYsSUFBSSxDQUFDWSxTQUFTLENBQUNFLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQ0MsTUFBTSxDQUFDLEtBQUssTUFBTSxFQUFFO0lBQ3BELE9BQU8sS0FBSztFQUNoQjtFQUVBLElBQU1DLGNBQWMsR0FBR2hCLElBQUksQ0FBQ2lCLFNBQVMsQ0FBQ0gsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDQyxNQUFNLENBQUM7RUFDOUQsSUFBSUMsY0FBYyxHQUFHLFVBQVUsRUFBRTtJQUM3QixPQUFPLEtBQUs7RUFDaEI7RUFFQSxJQUFNckQsSUFBSSxHQUFHdUQsUUFBUSxDQUFDbEIsSUFBSSxFQUFFYyxVQUFVLEVBQUVBLFVBQVUsR0FBR0UsY0FBYyxFQUFFWCxRQUFRLEVBQUVVLE1BQU0sQ0FBQztFQUN0RixPQUFPcEQsSUFBSTtBQUNmO0FBRUEsU0FBU3VELFFBQVFBLENBQUNsQixJQUFJLEVBQUVtQixTQUFTLEVBQUVDLFFBQVEsRUFBRUMsT0FBTyxFQUFFTixNQUFNLEVBQUU7RUFDMUQsSUFBTU8sT0FBTyxHQUFHdEIsSUFBSSxDQUFDWSxTQUFTLENBQUNRLFFBQVEsRUFBRSxDQUFDTCxNQUFNLENBQUM7RUFDakQsSUFBTXBELElBQUksR0FBRyxDQUFDLENBQUM7RUFFZixLQUFLLElBQUkxMUIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHcTVCLE9BQU8sRUFBRXI1QixDQUFDLEVBQUUsRUFBRTtJQUM5QixJQUFNczVCLFdBQVcsR0FBR0gsUUFBUSxHQUFHbjVCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN6QyxJQUFNdTRCLEdBQUcsR0FBR2EsT0FBTyxDQUFDckIsSUFBSSxDQUFDWSxTQUFTLENBQUNXLFdBQVcsRUFBRSxDQUFDUixNQUFNLENBQUMsQ0FBQztJQUN6RCxJQUFJUCxHQUFHLEVBQUU7TUFDTDdDLElBQUksQ0FBQzZDLEdBQUcsQ0FBQyxHQUFHZ0IsWUFBWSxDQUFDeEIsSUFBSSxFQUFFdUIsV0FBVyxFQUFFSixTQUFTLEVBQUVDLFFBQVEsRUFBRUwsTUFBTSxDQUFDO0lBQzVFO0VBQ0o7RUFDQSxPQUFPcEQsSUFBSTtBQUNmO0FBRUEsU0FBUzZELFlBQVlBLENBQUN4QixJQUFJLEVBQUV1QixXQUFXLEVBQUVKLFNBQVMsRUFBRUMsUUFBUSxFQUFFTCxNQUFNLEVBQUU7RUFDbEUsSUFBTTNHLElBQUksR0FBRzRGLElBQUksQ0FBQ1ksU0FBUyxDQUFDVyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUNSLE1BQU0sQ0FBQztFQUNyRCxJQUFNVSxTQUFTLEdBQUd6QixJQUFJLENBQUNpQixTQUFTLENBQUNNLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQ1IsTUFBTSxDQUFDO0VBRTFELFFBQVEzRyxJQUFJO0lBQ1IsS0FBSyxDQUFDO01BQ0YsSUFBSXFILFNBQVMsS0FBSyxDQUFDLEVBQUU7UUFDakIsT0FBT3pCLElBQUksQ0FBQ1ksU0FBUyxDQUFDVyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUNSLE1BQU0sQ0FBQztNQUNuRDtFQUNSO0VBRUEsT0FBTyxJQUFJO0FBQ2Y7QUFFQSxTQUFTRixtQkFBbUJBLENBQUN2QyxNQUFNLEVBQUU5Z0IsS0FBSyxFQUFFbFcsTUFBTSxFQUFFO0VBQ2hELElBQUlvNkIsTUFBTSxHQUFHLEVBQUU7RUFDZixLQUFLLElBQUloNUIsQ0FBQyxHQUFHOFUsS0FBSyxFQUFFOVUsQ0FBQyxHQUFHOFUsS0FBSyxHQUFHbFcsTUFBTSxFQUFFb0IsQ0FBQyxFQUFFLEVBQUU7SUFDekNnNUIsTUFBTSxJQUFJMWUsTUFBTSxDQUFDQyxZQUFZLENBQUNxYixNQUFNLENBQUNvQyxRQUFRLENBQUNoNEIsQ0FBQyxDQUFDLENBQUM7RUFDckQ7RUFDQSxPQUFPZzVCLE1BQU07QUFDakIsQzs7QUN0Sm9EO0FBRXBELElBQU1DLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEJBLFdBQVcsQ0FBQ0MsSUFBSSxHQUFHLFVBQVVDLFNBQVMsRUFBRXg3QixRQUFRLEVBQUV3TSxNQUFNLEVBQUU5RyxJQUFJLEVBQUV3dkIsUUFBUSxFQUFFaG9CLE1BQU0sRUFBRTtFQUM5RSxJQUFNdXVCLGtCQUFrQixHQUFHLElBQUl2aEIsS0FBSyxDQUFDeFUsSUFBSSxDQUFDO0VBQzFDLElBQU1nMkIsZUFBZSxHQUFHLElBQUl4aEIsS0FBSyxDQUFDdWhCLGtCQUFrQixDQUFDeDZCLE1BQU0sQ0FBQztFQUM1RCxJQUFJVyxDQUFDO0VBQ0wsSUFBSThMLEdBQUc7RUFDUCxJQUFJaXVCLEdBQUc7RUFFUCxJQUFJekcsUUFBUSxLQUFLLEtBQUssRUFBRTtJQUNwQnVHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxHQUFHRCxTQUFTO0VBQ3JDLENBQUMsTUFBTTtJQUNILEtBQUs1NUIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHNjVCLGtCQUFrQixDQUFDeDZCLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7TUFDNUMrNUIsR0FBRyxHQUFJbnZCLE1BQU0sR0FBRzVLLENBQUU7TUFDbEI2NUIsa0JBQWtCLENBQUM3NUIsQ0FBQyxDQUFDLE1BQUFXLE1BQUEsQ0FBTWk1QixTQUFTLFlBQUFqNUIsTUFBQSxDQUFTLEtBQUFBLE1BQUEsQ0FBTW81QixHQUFHLEVBQUlwYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBTTtJQUM3RTtFQUNKO0VBQ0FtYSxlQUFlLENBQUNFLFNBQVMsR0FBRyxFQUFFO0VBQzlCRixlQUFlLENBQUNHLFFBQVEsR0FBRyxVQUFVQyxLQUFLLEVBQUU7SUFDeENKLGVBQWUsQ0FBQ0UsU0FBUyxDQUFDbjVCLElBQUksQ0FBQ3E1QixLQUFLLENBQUM7RUFDekMsQ0FBQztFQUNESixlQUFlLENBQUNLLE1BQU0sR0FBRyxVQUFVQyxTQUFTLEVBQUU7SUFDMUMsSUFBTUMsYUFBYSxHQUFHUCxlQUFlLENBQUNFLFNBQVM7SUFDL0MsS0FBSyxJQUFJLzJCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR28zQixhQUFhLENBQUNoN0IsTUFBTSxFQUFFNEQsQ0FBQyxFQUFFLEVBQUU7TUFDM0MsSUFBSW8zQixhQUFhLENBQUNwM0IsQ0FBQyxDQUFDLEtBQUttM0IsU0FBUyxFQUFFO1FBQ2hDQyxhQUFhLENBQUMxYyxNQUFNLENBQUMxYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHMjJCLGtCQUFrQixDQUFDeDZCLE1BQU0sRUFBRTZELENBQUMsRUFBRSxFQUFFO1VBQ2hELElBQU1vM0IsT0FBTyxHQUFHVCxrQkFBa0IsQ0FBQzMyQixDQUFDLENBQUMsQ0FBQ3EzQixNQUFNLENBQUNWLGtCQUFrQixDQUFDMzJCLENBQUMsQ0FBQyxDQUFDczNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUNwRixJQUFJSixTQUFTLENBQUMxdUIsR0FBRyxDQUFDOHVCLFdBQVcsQ0FBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDM0NSLGVBQWUsQ0FBQzUyQixDQUFDLENBQUMsR0FBRztjQUFFNEksR0FBRyxFQUFFc3VCO1lBQVUsQ0FBQztZQUN2QztVQUNKO1FBQ0o7UUFDQTtNQUNKO0lBQ0o7SUFDQSxJQUFJQyxhQUFhLENBQUNoN0IsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUFBLElBQUFpb0IsYUFBQTtNQUM1QixJQUFJckgsS0FBZSxJQUFJM1UsTUFBTSxhQUFOQSxNQUFNLGdCQUFBZ2MsYUFBQSxHQUFOaGMsTUFBTSxDQUFFaWEsS0FBSyxjQUFBK0IsYUFBQSxlQUFiQSxhQUFBLENBQWU4SyxnQkFBZ0IsRUFBRTtRQUNwRG5tQixPQUFPLENBQUNpVSxHQUFHLG1CQUFBdmYsTUFBQSxDQUFtQm01QixlQUFlLENBQUN6NkIsTUFBTSxZQUFBc0IsTUFBQSxDQUFTbTVCLGVBQWUsQ0FBQ3o2QixNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLFlBQUFzQixNQUFBLENBQVMyeUIsUUFBUSxLQUFLLEtBQUssR0FBR3NHLFNBQVMsR0FBR0EsU0FBUyxHQUFHLGFBQWEsQ0FBRSxDQUFDO01BQzlLO01BQ0EsSUFBSXRHLFFBQVEsS0FBSyxLQUFLLEVBQUU7UUFDcEIyQyxtQkFBbUIsQ0FBQzJELFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQzFDekQsSUFBSSxDQUFDLFVBQUNULElBQUksRUFBSztVQUNab0UsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDcEUsSUFBSSxHQUFHQSxJQUFJO1VBQzlCdDNCLFFBQVEsQ0FBQzA3QixlQUFlLENBQUM7UUFDN0IsQ0FBQyxDQUFDLFNBQU0sQ0FBQyxVQUFDaFAsQ0FBQyxFQUFLO1VBQ1o3ZSxPQUFPLENBQUNpVSxHQUFHLENBQUM0SyxDQUFDLENBQUM7VUFDZDFzQixRQUFRLENBQUMwN0IsZUFBZSxDQUFDO1FBQzdCLENBQUMsQ0FBQztNQUNWLENBQUMsTUFBTTtRQUNIMTdCLFFBQVEsQ0FBQzA3QixlQUFlLENBQUM7TUFDN0I7SUFDSjtFQUNKLENBQUM7RUFFRCxLQUFLOTVCLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzY1QixrQkFBa0IsQ0FBQ3g2QixNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO0lBQzVDOEwsR0FBRyxHQUFHLElBQUlDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCK3RCLGVBQWUsQ0FBQ0csUUFBUSxDQUFDbnVCLEdBQUcsQ0FBQztJQUM3QjJ1QixnQkFBZ0IsQ0FBQzN1QixHQUFHLEVBQUVndUIsZUFBZSxDQUFDO0lBQ3RDaHVCLEdBQUcsQ0FBQ0osR0FBRyxHQUFHbXVCLGtCQUFrQixDQUFDNzVCLENBQUMsQ0FBQztFQUNuQztBQUNKLENBQUM7QUFFRCxTQUFTeTZCLGdCQUFnQkEsQ0FBQzN1QixHQUFHLEVBQUVndUIsZUFBZSxFQUFFO0VBQzVDaHVCLEdBQUcsQ0FBQ0UsTUFBTSxHQUFHLFlBQVk7SUFDckI4dEIsZUFBZSxDQUFDSyxNQUFNLENBQUMsSUFBSSxDQUFDO0VBQ2hDLENBQUM7QUFDTDtBQUVnQlQsNERBQVcsRTs7QUN0RTNCOztBQUUwQztBQUkxQyxJQUFNZ0Isa0JBQXNDLEdBQUc7RUFDM0NDLGlCQUFpQixXQUFqQkEsaUJBQWlCQSxDQUFDN00sS0FBSyxFQUFlO0lBQ2xDN2hCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLDJDQUEyQyxDQUFDO0lBQ3pELElBQUkwdUIsT0FBOEMsR0FBRyxJQUFJO0lBQ3pELElBQU1DLFdBQVcsR0FBRyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7SUFDMUMsSUFBTUMsY0FBZ0MsR0FBRyxDQUFDLENBQUM7SUFDM0MsSUFBSUMsZ0JBQXdCO0lBQzVCLElBQUlDLGlCQUF5QjtJQUM3QixJQUFNQyxTQUFnQixHQUFHO01BQUVoNEIsQ0FBQyxFQUFFLENBQUM7TUFBRUMsQ0FBQyxFQUFFLENBQUM7TUFBRWl2QixJQUFJLEVBQUU7SUFBUSxDQUFDO0lBQ3RELElBQU1tQyxXQUFtQixHQUFHO01BQUVyeEIsQ0FBQyxFQUFFLENBQUM7TUFBRUMsQ0FBQyxFQUFFLENBQUM7TUFBRWl2QixJQUFJLEVBQUU7SUFBUyxDQUFDO0lBRTFELFNBQVMrSSxRQUFRQSxDQUFBLEVBQVM7TUFBQSxJQUFBQyxRQUFBLEVBQUFDLFFBQUE7TUFDdEIsSUFBTXYzQixLQUFLLEdBQUdpcUIsS0FBSyxDQUFDSSxVQUFVO01BQzlCLElBQU1ucUIsTUFBTSxHQUFHK3BCLEtBQUssQ0FBQ0ssV0FBVzs7TUFFaEM7TUFDQTRNLGdCQUFnQixHQUFHLENBQUFJLFFBQUEsR0FBQVAsT0FBTyxjQUFBTyxRQUFBLGVBQVBBLFFBQUEsQ0FBU3IzQixJQUFJLEdBQUdELEtBQUssR0FBR0UsTUFBTSxHQUFHLENBQUMsR0FBRzYyQixPQUFPLENBQUM5MkIsSUFBSSxHQUFHeEYsSUFBSSxDQUFDNEIsS0FBSyxDQUFFMkQsS0FBSyxHQUFHRSxNQUFNLEdBQUk2MkIsT0FBTyxDQUFDOTJCLElBQUksQ0FBQyxHQUFHRCxLQUFLO01BQzFIO01BQ0FtM0IsaUJBQWlCLEdBQUcsQ0FBQUksUUFBQSxHQUFBUixPQUFPLGNBQUFRLFFBQUEsZUFBUEEsUUFBQSxDQUFTdDNCLElBQUksR0FBR0QsS0FBSyxHQUFHRSxNQUFNLEdBQUcsQ0FBQyxHQUFHekYsSUFBSSxDQUFDNEIsS0FBSyxDQUFFNkQsTUFBTSxHQUFHRixLQUFLLEdBQUkrMkIsT0FBTyxDQUFDOTJCLElBQUksQ0FBQyxHQUFHODJCLE9BQU8sQ0FBQzkyQixJQUFJLEdBQUdDLE1BQU07TUFFNUh1d0IsV0FBVyxDQUFDcnhCLENBQUMsR0FBRzgzQixnQkFBZ0I7TUFDaEN6RyxXQUFXLENBQUNweEIsQ0FBQyxHQUFHODNCLGlCQUFpQjtJQUNyQztJQUNBLElBQU05SSxXQUF3QixHQUFHO01BQzdCa0MsWUFBWSxXQUFaQSxZQUFZQSxDQUFBLEVBQUc7UUFDWCxPQUFPdEcsS0FBSyxDQUFDSSxVQUFVO01BQzNCLENBQUM7TUFFRG1HLGFBQWEsV0FBYkEsYUFBYUEsQ0FBQSxFQUFHO1FBQ1osT0FBT3ZHLEtBQUssQ0FBQ0ssV0FBVztNQUM1QixDQUFDO01BRURzRyxRQUFRLFdBQVJBLFFBQVFBLENBQUEsRUFBRztRQUNQLE9BQU9zRyxnQkFBZ0I7TUFDM0IsQ0FBQztNQUVEckcsU0FBUyxXQUFUQSxTQUFTQSxDQUFBLEVBQUc7UUFDUixPQUFPc0csaUJBQWlCO01BQzVCLENBQUM7TUFFREssUUFBUSxXQUFSQSxRQUFRQSxDQUFDeDNCLEtBQUssRUFBRTtRQUNaazNCLGdCQUFnQixHQUFHbDNCLEtBQUs7TUFDNUIsQ0FBQztNQUVEeTNCLFNBQVMsV0FBVEEsU0FBU0EsQ0FBQ3YzQixNQUFNLEVBQUU7UUFDZGkzQixpQkFBaUIsR0FBR2ozQixNQUFNO01BQzlCLENBQUM7TUFFRHczQixjQUFjLFdBQWRBLGNBQWNBLENBQUNqd0IsTUFBTSxFQUFFO1FBQ25CO1FBQ0FzdkIsT0FBTyxHQUFHdHZCLE1BQU07UUFDaEI7UUFDQSxJQUFJLENBQUNvakIsWUFBWSxDQUFDLEtBQUssRUFBRyxPQUFPcGpCLE1BQU0sQ0FBQ0ksR0FBRyxLQUFLLFdBQVcsR0FBSUosTUFBTSxDQUFDSSxHQUFHLEdBQUcsRUFBRSxDQUFDO01BQ25GLENBQUM7TUFFRDh2QixLQUFLLFdBQUxBLEtBQUtBLENBQUEsRUFBRztRQUNKLE9BQU8xTixLQUFLLENBQUMwTixLQUFLO01BQ3RCLENBQUM7TUFFRHRILFNBQVMsV0FBVEEsU0FBU0EsQ0FBQSxFQUFHO1FBQ1IsT0FBTzBHLE9BQU87TUFDbEIsQ0FBQztNQUVEbE0sWUFBWSxXQUFaQSxZQUFZQSxDQUFDOUgsSUFBSSxFQUFFOVgsS0FBSyxFQUFFO1FBQ3RCLElBQUlnZixLQUFLLEVBQUU7VUFDUEEsS0FBSyxDQUFDWSxZQUFZLENBQUM5SCxJQUFJLEVBQUU5WCxLQUFLLENBQUM7UUFDbkM7TUFDSixDQUFDO01BRUR3aEIsS0FBSyxXQUFMQSxLQUFLQSxDQUFBLEVBQUc7UUFDSnhDLEtBQUssQ0FBQ3dDLEtBQUssQ0FBQyxDQUFDO01BQ2pCLENBQUM7TUFFRHpCLElBQUksV0FBSkEsSUFBSUEsQ0FBQSxFQUFHO1FBQ0g7UUFDQWYsS0FBSyxDQUFDZSxJQUFJLENBQUMsQ0FBQztNQUNoQixDQUFDO01BRUQ0TSxjQUFjLFdBQWRBLGNBQWNBLENBQUNDLElBQUksRUFBRTtRQUFBLElBQUFDLFFBQUE7UUFDakIsSUFBSSxFQUFBQSxRQUFBLEdBQUFmLE9BQU8sY0FBQWUsUUFBQSx1QkFBUEEsUUFBQSxDQUFTeEosSUFBSSxNQUFLLFlBQVksRUFBRTtVQUNoQyxJQUFJLENBQUN6RCxZQUFZLENBQUMsYUFBYSxFQUFFZ04sSUFBSSxDQUFDRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3JEO01BQ0osQ0FBQztNQUVEaE4sZ0JBQWdCLFdBQWhCQSxnQkFBZ0JBLENBQUNuQyxLQUFLLEVBQUUxQixDQUFDLEVBQUU4USxJQUFJLEVBQUU7UUFDN0IsSUFBSWhCLFdBQVcsQ0FBQzNyQixPQUFPLENBQUN1ZCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtVQUNuQyxJQUFJLENBQUNxTyxjQUFjLENBQUNyTyxLQUFLLENBQUMsRUFBRTtZQUN4QnFPLGNBQWMsQ0FBQ3JPLEtBQUssQ0FBQyxHQUFHLEVBQUU7VUFDOUI7VUFDQXFPLGNBQWMsQ0FBQ3JPLEtBQUssQ0FBQyxDQUFDNXJCLElBQUksQ0FBQ2txQixDQUFDLENBQUM7UUFDakMsQ0FBQyxNQUFNO1VBQ0grQyxLQUFLLENBQUNjLGdCQUFnQixDQUFDbkMsS0FBSyxFQUFFMUIsQ0FBQyxFQUFFOFEsSUFBSSxDQUFDO1FBQzFDO01BQ0osQ0FBQztNQUVEQyxrQkFBa0IsV0FBbEJBLGtCQUFrQkEsQ0FBQSxFQUFHO1FBQ2pCakIsV0FBVyxDQUFDN2UsT0FBTyxDQUFDLFVBQUNrUSxTQUFTLEVBQUs7VUFDL0IsSUFBTTZQLFFBQVEsR0FBR2pCLGNBQWMsQ0FBQzVPLFNBQVMsQ0FBQztVQUMxQyxJQUFJNlAsUUFBUSxJQUFJQSxRQUFRLENBQUMxOEIsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqQzA4QixRQUFRLENBQUMvZixPQUFPLENBQUMsVUFBQ2dnQixPQUFPLEVBQUs7Y0FDMUJsTyxLQUFLLENBQUNtTyxtQkFBbUIsQ0FBQy9QLFNBQVMsRUFBRThQLE9BQU8sQ0FBQztZQUNqRCxDQUFDLENBQUM7VUFDTjtRQUNKLENBQUMsQ0FBQztNQUNOLENBQUM7TUFFREUsT0FBTyxXQUFQQSxPQUFPQSxDQUFDaFEsU0FBUyxFQUFFN1QsSUFBSSxFQUFFO1FBQ3JCLElBQUlwWSxDQUFDO1FBQ0w7UUFDQSxJQUFNODdCLFFBQVEsR0FBR2pCLGNBQWMsQ0FBQzVPLFNBQVMsQ0FBQztRQUUxQyxJQUFJQSxTQUFTLEtBQUssV0FBVyxFQUFFO1VBQzNCZ1AsUUFBUSxDQUFDLENBQUM7UUFDZDtRQUNBLElBQUlhLFFBQVEsSUFBSUEsUUFBUSxDQUFDMThCLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDakMsS0FBS1ksQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHODdCLFFBQVEsQ0FBQzE4QixNQUFNLEVBQUVZLENBQUMsRUFBRSxFQUFFO1lBQ2xDODdCLFFBQVEsQ0FBQzk3QixDQUFDLENBQUMsQ0FBQ2tCLEtBQUssQ0FBQyt3QixXQUFXLEVBQUU3WixJQUFJLENBQUM7VUFDeEM7UUFDSjtNQUNKLENBQUM7TUFFRDhqQixXQUFXLFdBQVhBLFdBQVdBLENBQUN4SCxRQUFRLEVBQUU7UUFDbEJzRyxTQUFTLENBQUNoNEIsQ0FBQyxHQUFHMHhCLFFBQVEsQ0FBQzF4QixDQUFDO1FBQ3hCZzRCLFNBQVMsQ0FBQy8zQixDQUFDLEdBQUd5eEIsUUFBUSxDQUFDenhCLENBQUM7TUFDNUIsQ0FBQztNQUVEMHhCLFdBQVcsV0FBWEEsV0FBV0EsQ0FBQSxFQUFHO1FBQ1YsT0FBT3FHLFNBQVM7TUFDcEIsQ0FBQztNQUVEbUIsYUFBYSxXQUFiQSxhQUFhQSxDQUFDdDRCLElBQUksRUFBRTtRQUNoQnd3QixXQUFXLENBQUNyeEIsQ0FBQyxHQUFHYSxJQUFJLENBQUNiLENBQUM7UUFDdEJxeEIsV0FBVyxDQUFDcHhCLENBQUMsR0FBR1ksSUFBSSxDQUFDWixDQUFDO01BQzFCLENBQUM7TUFFRHF4QixhQUFhLFdBQWJBLGFBQWFBLENBQUEsRUFBRztRQUNaLE9BQU9ELFdBQVc7TUFDdEIsQ0FBQztNQUVEaUIsUUFBUSxXQUFSQSxRQUFRQSxDQUFBLEVBQUc7UUFDUCxPQUFPekgsS0FBSztNQUNoQjtJQUNKLENBQUM7SUFDRCxPQUFPb0UsV0FBVztFQUN0QixDQUFDO0VBQ0RtSyxnQkFBZ0IsV0FBaEJBLGdCQUFnQkEsQ0FBQ3ZPLEtBQUssRUFBZTtJQUNqQzdoQixPQUFPLENBQUNDLElBQUksQ0FBQywwQ0FBMEMsQ0FBQztJQUN4RCxJQUFJNGhCLEtBQUssRUFBRTtNQUNQQSxLQUFLLENBQUNZLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQzFDO0lBQ0EsSUFBTXZyQixJQUFJLEdBQUd1M0Isa0JBQWtCLENBQUNDLGlCQUFpQixDQUFDN00sS0FBSyxDQUFDO0lBQ3hEM3FCLElBQUksQ0FBQ3E0QixLQUFLLEdBQUcsU0FBU0EsS0FBS0EsQ0FBQSxFQUFVO01BQ2pDLE9BQU8sS0FBSztJQUNoQixDQUFDO0lBQ0QsT0FBT3I0QixJQUFJO0VBQ2YsQ0FBQztFQUNEbTVCLGlCQUFpQixXQUFqQkEsaUJBQWlCQSxDQUFBLEVBQWdCO0lBQzdCO0lBQ0EsSUFBSTFCLE9BQStDLEdBQUcsSUFBSTtJQUUxRCxJQUFJLzJCLEtBQUssR0FBRyxDQUFDO0lBQ2IsSUFBSUUsTUFBTSxHQUFHLENBQUM7SUFDZCxJQUFJdzRCLFFBQVEsR0FBRyxDQUFDO0lBQ2hCLElBQUlDLE1BQU0sR0FBRyxJQUFJO0lBQ2pCLElBQUlyQyxNQUFNLEdBQUcsS0FBSztJQUNsQixJQUFJc0MsUUFBc0IsR0FBRyxJQUFJO0lBQ2pDLElBQUkzNEIsSUFBSSxHQUFHLENBQUM7SUFDWixJQUFNOEcsTUFBTSxHQUFHLENBQUM7SUFDaEIsSUFBSTh4QixPQUFzQixHQUFHLElBQUk7SUFDakMsSUFBSWxCLE1BQUssR0FBRyxLQUFLO0lBQ2pCLElBQUltQixlQUF1QjtJQUMzQixJQUFJQyxnQkFBd0I7SUFDNUIsSUFBTS9CLFdBQVcsR0FBRyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7SUFDMUMsSUFBTUMsY0FBZ0MsR0FBRyxDQUFDLENBQUM7SUFDM0MsSUFBTUcsU0FBZ0IsR0FBRztNQUFFaDRCLENBQUMsRUFBRSxDQUFDO01BQUVDLENBQUMsRUFBRSxDQUFDO01BQUVpdkIsSUFBSSxFQUFFO0lBQVEsQ0FBQztJQUN0RCxJQUFNbUMsV0FBbUIsR0FBRztNQUFFcnhCLENBQUMsRUFBRSxDQUFDO01BQUVDLENBQUMsRUFBRSxDQUFDO01BQUVpdkIsSUFBSSxFQUFFO0lBQVMsQ0FBQztJQUUxRCxTQUFTMEssVUFBVUEsQ0FBQSxFQUFTO01BQUEsSUFBQUMsUUFBQTtNQUN4QjNDLE1BQU0sR0FBRyxLQUFLO01BQ2RULFlBQVcsQ0FBQ0MsSUFBSSxDQUFDK0MsT0FBTyxFQUFFLFVBQUNLLElBQWdELEVBQUs7UUFBQSxJQUFBQyxRQUFBLEVBQUFDLFFBQUE7UUFDNUVSLFFBQVEsR0FBR00sSUFBSTtRQUNmO1FBQ0EsSUFBSUEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDckgsSUFBSSxJQUFJcUgsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDckgsSUFBSSxDQUFDQyxXQUFXLEVBQUU7VUFDMUM7VUFDQSxRQUFRb0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDckgsSUFBSSxDQUFDQyxXQUFXO1lBQzVCLEtBQUssQ0FBQztZQUNOLEtBQUssQ0FBQztjQUNGOXhCLEtBQUssR0FBR2s1QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNqeEIsR0FBRyxDQUFDL0gsTUFBTTtjQUMxQkEsTUFBTSxHQUFHZzVCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2p4QixHQUFHLENBQUNqSSxLQUFLO2NBQzFCO1lBQ0o7Y0FDSUEsS0FBSyxHQUFHazVCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2p4QixHQUFHLENBQUNqSSxLQUFLO2NBQ3pCRSxNQUFNLEdBQUdnNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDanhCLEdBQUcsQ0FBQy9ILE1BQU07VUFDbkM7UUFDSixDQUFDLE1BQU07VUFDSEYsS0FBSyxHQUFHazVCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ2p4QixHQUFHLENBQUNqSSxLQUFLO1VBQ3pCRSxNQUFNLEdBQUdnNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDanhCLEdBQUcsQ0FBQy9ILE1BQU07UUFDL0I7UUFDQTtRQUNBNDRCLGVBQWUsR0FBRyxDQUFBSyxRQUFBLEdBQUFwQyxPQUFPLGNBQUFvQyxRQUFBLGVBQVBBLFFBQUEsQ0FBU2w1QixJQUFJLEdBQUdELEtBQUssR0FBR0UsTUFBTSxHQUFHLENBQUMsR0FBRzYyQixPQUFPLENBQUM5MkIsSUFBSSxHQUFHeEYsSUFBSSxDQUFDNEIsS0FBSyxDQUFFMkQsS0FBSyxHQUFHRSxNQUFNLEdBQUk2MkIsT0FBTyxDQUFDOTJCLElBQUksQ0FBQyxHQUFHRCxLQUFLO1FBQ3pIO1FBQ0ErNEIsZ0JBQWdCLEdBQUcsQ0FBQUssUUFBQSxHQUFBckMsT0FBTyxjQUFBcUMsUUFBQSxlQUFQQSxRQUFBLENBQVNuNUIsSUFBSSxHQUFHRCxLQUFLLEdBQUdFLE1BQU0sR0FBRyxDQUFDLEdBQUd6RixJQUFJLENBQUM0QixLQUFLLENBQUU2RCxNQUFNLEdBQUdGLEtBQUssR0FBSSsyQixPQUFPLENBQUM5MkIsSUFBSSxDQUFDLEdBQUc4MkIsT0FBTyxDQUFDOTJCLElBQUksR0FBR0MsTUFBTTtRQUMzSHV3QixXQUFXLENBQUNyeEIsQ0FBQyxHQUFHMDVCLGVBQWU7UUFDL0JySSxXQUFXLENBQUNweEIsQ0FBQyxHQUFHMDVCLGdCQUFnQjtRQUNoQ3pDLE1BQU0sR0FBRyxJQUFJO1FBQ2JvQyxRQUFRLEdBQUcsQ0FBQztRQUNabCtCLFVBQVUsQ0FBQyxZQUFNO1VBQ2I7VUFDQTYrQixZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO01BQ1QsQ0FBQyxFQUFFdHlCLE1BQU0sRUFBRTlHLElBQUksR0FBQWc1QixRQUFBLEdBQUVsQyxPQUFPLGNBQUFrQyxRQUFBLHVCQUFQQSxRQUFBLENBQVN4SixRQUFRLEVBQUVzSCxPQUFPLENBQUM7SUFDaEQ7SUFFQSxTQUFTc0MsWUFBWUEsQ0FBQ2hSLFNBQWlCLEVBQUU3VCxJQUFnQixFQUFRO01BQzdELElBQUlwWSxDQUFDO01BQ0wsSUFBTTg3QixRQUFRLEdBQUdqQixjQUFjLENBQUM1TyxTQUFTLENBQUM7TUFFMUMsSUFBSTZQLFFBQVEsSUFBSUEsUUFBUSxDQUFDMThCLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDakMsS0FBS1ksQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHODdCLFFBQVEsQ0FBQzE4QixNQUFNLEVBQUVZLENBQUMsRUFBRSxFQUFFO1VBQ2xDO1VBQ0E4N0IsUUFBUSxDQUFDOTdCLENBQUMsQ0FBQyxDQUFDa0IsS0FBSyxDQUFDK3dCLFdBQVcsRUFBRTdaLElBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakQ7TUFDSjtJQUNKOztJQUVBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsSUFBSTZaLFdBQXdCLEdBQUc7TUFFM0JnSyxPQUFPLEVBQUVnQixZQUFZO01BRXJCekksUUFBUSxXQUFSQSxRQUFRQSxDQUFBLEVBQUc7UUFDUCxPQUFPa0ksZUFBZTtNQUMxQixDQUFDO01BRURqSSxTQUFTLFdBQVRBLFNBQVNBLENBQUEsRUFBRztRQUNSLE9BQU9rSSxnQkFBZ0I7TUFDM0IsQ0FBQztNQUVEdkIsUUFBUSxXQUFSQSxRQUFRQSxDQUFDOEIsUUFBUSxFQUFFO1FBQ2ZSLGVBQWUsR0FBR1EsUUFBUTtNQUM5QixDQUFDO01BRUQ3QixTQUFTLFdBQVRBLFNBQVNBLENBQUM4QixTQUFTLEVBQUU7UUFDakJSLGdCQUFnQixHQUFHUSxTQUFTO01BQ2hDLENBQUM7TUFFRGhKLFlBQVksV0FBWkEsWUFBWUEsQ0FBQSxFQUFHO1FBQ1gsT0FBT3Z3QixLQUFLO01BQ2hCLENBQUM7TUFFRHd3QixhQUFhLFdBQWJBLGFBQWFBLENBQUEsRUFBRztRQUNaLE9BQU90d0IsTUFBTTtNQUNqQixDQUFDO01BRUR3M0IsY0FBYyxXQUFkQSxjQUFjQSxDQUFDL00sTUFBTSxFQUFFO1FBQ25CO1FBQ0FvTSxPQUFPLEdBQUdwTSxNQUFNO1FBQ2hCO1FBQ0EsSUFBSUEsTUFBTSxDQUFDOEUsUUFBUSxLQUFLLEtBQUssRUFBRTtVQUMzQjtVQUNBb0osT0FBTyxHQUFHbE8sTUFBTSxDQUFDOWlCLEdBQUc7VUFDcEI1SCxJQUFJLEdBQUcsQ0FBQztRQUNaLENBQUMsTUFBTTtVQUNIO1VBQ0E0NEIsT0FBTyxHQUFHbE8sTUFBTSxDQUFDOWlCLEdBQUc7VUFDcEI7VUFDQTVILElBQUksR0FBRzBxQixNQUFNLENBQUNudkIsTUFBTTtRQUN4QjtRQUNBdzlCLFVBQVUsQ0FBQyxDQUFDO01BQ2hCLENBQUM7TUFFRHJCLEtBQUssV0FBTEEsS0FBS0EsQ0FBQSxFQUFHO1FBQ0osT0FBT0EsTUFBSztNQUNoQixDQUFDO01BRUQ5TSxZQUFZLFdBQVpBLFlBQVlBLENBQUEsRUFBRyxDQUFDLENBQUM7TUFFakJ3RixTQUFTLFdBQVRBLFNBQVNBLENBQUEsRUFBRztRQUNSLE9BQU8wRyxPQUFPO01BQ2xCLENBQUM7TUFFRHRLLEtBQUssV0FBTEEsS0FBS0EsQ0FBQSxFQUFHO1FBQ0prTSxNQUFNLEdBQUcsSUFBSTtNQUNqQixDQUFDO01BRUQzTixJQUFJLFdBQUpBLElBQUlBLENBQUEsRUFBRztRQUNIMk4sTUFBTSxHQUFHLEtBQUs7TUFDbEIsQ0FBQztNQUVEZixjQUFjLFdBQWRBLGNBQWNBLENBQUNDLElBQUksRUFBRTtRQUNqQmEsUUFBUSxHQUFHYixJQUFJO01BQ25CLENBQUM7TUFFRDlNLGdCQUFnQixXQUFoQkEsZ0JBQWdCQSxDQUFDbkMsS0FBSyxFQUFFMUIsQ0FBQyxFQUFFO1FBQ3ZCLElBQUk4UCxXQUFXLENBQUMzckIsT0FBTyxDQUFDdWQsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7VUFDbkMsSUFBSSxDQUFDcU8sY0FBYyxDQUFDck8sS0FBSyxDQUFDLEVBQUU7WUFDeEJxTyxjQUFjLENBQUNyTyxLQUFLLENBQUMsR0FBRyxFQUFFO1VBQzlCO1VBQ0FxTyxjQUFjLENBQUNyTyxLQUFLLENBQUMsQ0FBQzVyQixJQUFJLENBQUNrcUIsQ0FBQyxDQUFDO1FBQ2pDO01BQ0osQ0FBQztNQUVEK1Esa0JBQWtCLFdBQWxCQSxrQkFBa0JBLENBQUEsRUFBRztRQUNqQmg5QixNQUFNLENBQUM2USxJQUFJLENBQUNtckIsY0FBYyxDQUFDLENBQUM5ZSxPQUFPLENBQUMsVUFBQ3FoQixHQUFHO1VBQUEsT0FBSyxPQUFPdkMsY0FBYyxDQUFDdUMsR0FBRyxDQUFDO1FBQUEsRUFBQztNQUM1RSxDQUFDO01BRURsQixXQUFXLFdBQVhBLFdBQVdBLENBQUN4SCxRQUFRLEVBQUU7UUFDbEJzRyxTQUFTLENBQUNoNEIsQ0FBQyxHQUFHMHhCLFFBQVEsQ0FBQzF4QixDQUFDO1FBQ3hCZzRCLFNBQVMsQ0FBQy8zQixDQUFDLEdBQUd5eEIsUUFBUSxDQUFDenhCLENBQUM7TUFDNUIsQ0FBQztNQUVEMHhCLFdBQVcsV0FBWEEsV0FBV0EsQ0FBQSxFQUFHO1FBQ1YsT0FBT3FHLFNBQVM7TUFDcEIsQ0FBQztNQUVEbUIsYUFBYSxXQUFiQSxhQUFhQSxDQUFDbEgsVUFBVSxFQUFFO1FBQ3RCWixXQUFXLENBQUNyeEIsQ0FBQyxHQUFHaXlCLFVBQVUsQ0FBQ2p5QixDQUFDO1FBQzVCcXhCLFdBQVcsQ0FBQ3B4QixDQUFDLEdBQUdneUIsVUFBVSxDQUFDaHlCLENBQUM7TUFDaEMsQ0FBQztNQUVEcXhCLGFBQWEsV0FBYkEsYUFBYUEsQ0FBQSxFQUFHO1FBQ1osT0FBT0QsV0FBVztNQUN0QixDQUFDO01BRURpQixRQUFRLFdBQVJBLFFBQVFBLENBQUEsRUFBRztRQUNQLElBQUlsaUIsS0FBSztRQUVULElBQUksQ0FBQzhtQixNQUFNLEVBQUU7VUFDVCxPQUFPLElBQUk7UUFDZjtRQUNBLElBQUksQ0FBQ3FDLE1BQU0sRUFBRTtVQUFBLElBQUFjLFNBQUE7VUFDVDtVQUNBanFCLEtBQUssSUFBQWlxQixTQUFBLEdBQUdiLFFBQVEsY0FBQWEsU0FBQSx1QkFBUkEsU0FBQSxDQUFXZixRQUFRLENBQUM7VUFDNUIsSUFBSUEsUUFBUSxHQUFJejRCLElBQUksR0FBRyxDQUFFLEVBQUU7WUFDdkJ5NEIsUUFBUSxFQUFFO1VBQ2QsQ0FBQyxNQUFNO1lBQ0hsK0IsVUFBVSxDQUFDLFlBQU07Y0FDYm05QixNQUFLLEdBQUcsSUFBSTtjQUNaMEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDN0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztVQUNUO1FBQ0o7UUFDQTtRQUNBLE9BQU83cEIsS0FBSztNQUNoQjtJQUNKLENBQUM7SUFDRCxPQUFPNmUsV0FBVztFQUN0QjtBQUNKLENBQUM7QUFFY3dJLDJFQUFrQixFOztBQ3ZXakM7QUFDQTtBQUNBO0FBQ0EsSUFBTXh6QixhQUFNLEdBQUc7RUFDWHEyQixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ3hGaDhCLE1BQU0sV0FBTkEsTUFBTUEsQ0FBQ2tDLFlBQVksRUFBRSs1QixZQUFZLEVBQUU7SUFDL0IsSUFBTTc1QixTQUFTLEdBQUdGLFlBQVksQ0FBQ0csSUFBSTtJQUNuQyxJQUFNNjVCLFNBQVMsR0FBR0QsWUFBWSxDQUFDNTVCLElBQUk7SUFDbkMsSUFBUTI1QixnQkFBZ0IsR0FBSyxJQUFJLENBQXpCQSxnQkFBZ0I7SUFDeEIsSUFBTTE1QixLQUFLLEdBQUdKLFlBQVksQ0FBQ0ssSUFBSSxDQUFDYixDQUFDO0lBQ2pDLElBQUlnRixHQUFHO0lBRVAsU0FBU2QsTUFBS0EsQ0FBQ2dNLE9BQU8sRUFBRWlCLEtBQUssRUFBRXhDLEtBQUssRUFBRThyQixTQUFTLEVBQUU7TUFDN0MsSUFBSTE5QixDQUFDO01BQ0wsSUFBSWtELENBQUM7TUFDTCxJQUFJRCxDQUFDO01BRUwsS0FBS2pELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3U5QixnQkFBZ0IsQ0FBQ2wrQixNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO1FBQzFDa0QsQ0FBQyxHQUFHaVEsT0FBTyxDQUFDd3FCLEVBQUUsR0FBR0osZ0JBQWdCLENBQUNwcUIsT0FBTyxDQUFDa1MsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pEcGlCLENBQUMsR0FBR2tRLE9BQU8sQ0FBQ3lxQixFQUFFLEdBQUdMLGdCQUFnQixDQUFDcHFCLE9BQU8sQ0FBQ2tTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRHBkLEdBQUcsR0FBRy9FLENBQUMsR0FBR1csS0FBSyxHQUFHWixDQUFDO1FBQ25CLElBQUtVLFNBQVMsQ0FBQ3NFLEdBQUcsQ0FBQyxLQUFLbU0sS0FBSyxLQUFPcXBCLFNBQVMsQ0FBQ3gxQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQU13MUIsU0FBUyxDQUFDeDFCLEdBQUcsQ0FBQyxLQUFLMkosS0FBTSxDQUFDLEVBQUU7VUFDdEY2ckIsU0FBUyxDQUFDeDFCLEdBQUcsQ0FBQyxHQUFHMkosS0FBSztVQUN0QnVCLE9BQU8sQ0FBQ3dxQixFQUFFLEdBQUd6NkIsQ0FBQztVQUNkaVEsT0FBTyxDQUFDeXFCLEVBQUUsR0FBRzM2QixDQUFDO1VBQ2QsT0FBTyxJQUFJO1FBQ2Y7UUFDQSxJQUFJdzZCLFNBQVMsQ0FBQ3gxQixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7VUFDdEJ3MUIsU0FBUyxDQUFDeDFCLEdBQUcsQ0FBQyxHQUFHeTFCLFNBQVM7UUFDOUI7UUFDQXZxQixPQUFPLENBQUNrUyxHQUFHLEdBQUcsQ0FBQ2xTLE9BQU8sQ0FBQ2tTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztNQUN2QztNQUNBLE9BQU8sS0FBSztJQUNoQjtJQUVBLFNBQVN3WSxRQUFRQSxDQUFDNTZCLENBQUMsRUFBRUMsQ0FBQyxFQUFFbWlCLEdBQUcsRUFBRTtNQUN6QixPQUFPO1FBQ0hBLEdBQUcsRUFBSEEsR0FBRztRQUNIcGlCLENBQUMsRUFBREEsQ0FBQztRQUNEQyxDQUFDLEVBQURBLENBQUM7UUFDRGhDLElBQUksRUFBRSxJQUFJO1FBQ1ZELElBQUksRUFBRTtNQUNWLENBQUM7SUFDTDtJQUVBLFNBQVM2OEIsZUFBY0EsQ0FBQzl0QixFQUFFLEVBQUVELEVBQUUsRUFBRTZCLEtBQUssRUFBRXdDLEtBQUssRUFBRXNwQixTQUFTLEVBQUU7TUFDckQsSUFBSUssRUFBRSxHQUFHLElBQUk7TUFDYixJQUFJQyxFQUFFO01BQ04sSUFBSUMsQ0FBQztNQUNMLElBQUlDLElBQUk7TUFDUixJQUFNL3FCLE9BQU8sR0FBRztRQUNaeXFCLEVBQUUsRUFBRTd0QixFQUFFO1FBQ040dEIsRUFBRSxFQUFFM3RCLEVBQUU7UUFDTnFWLEdBQUcsRUFBRTtNQUNULENBQUM7TUFFRCxJQUFJbGUsTUFBSyxDQUFDZ00sT0FBTyxFQUFFaUIsS0FBSyxFQUFFeEMsS0FBSyxFQUFFOHJCLFNBQVMsQ0FBQyxFQUFFO1FBQ3pDSyxFQUFFLEdBQUdGLFFBQVEsQ0FBQzl0QixFQUFFLEVBQUVDLEVBQUUsRUFBRW1ELE9BQU8sQ0FBQ2tTLEdBQUcsQ0FBQztRQUNsQzJZLEVBQUUsR0FBR0QsRUFBRTtRQUNQRyxJQUFJLEdBQUcvcUIsT0FBTyxDQUFDa1MsR0FBRztRQUNsQjRZLENBQUMsR0FBR0osUUFBUSxDQUFDMXFCLE9BQU8sQ0FBQ3lxQixFQUFFLEVBQUV6cUIsT0FBTyxDQUFDd3FCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkNNLENBQUMsQ0FBQ2g5QixJQUFJLEdBQUcrOEIsRUFBRTtRQUNYQSxFQUFFLENBQUM5OEIsSUFBSSxHQUFHKzhCLENBQUM7UUFDWEEsQ0FBQyxDQUFDLzhCLElBQUksR0FBRyxJQUFJO1FBQ2I4OEIsRUFBRSxHQUFHQyxDQUFDO1FBRU4sSUFBSUUsZUFBZSxHQUFHMTZCLFlBQVksQ0FBQ0ssSUFBSSxDQUFDYixDQUFDLEdBQUdRLFlBQVksQ0FBQ0ssSUFBSSxDQUFDWixDQUFDO1FBQy9ELElBQUlrN0IsWUFBWSxHQUFHLENBQUM7UUFDcEIsR0FBRztVQUNDanJCLE9BQU8sQ0FBQ2tTLEdBQUcsR0FBRyxDQUFDbFMsT0FBTyxDQUFDa1MsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1VBQ25DbGUsTUFBSyxDQUFDZ00sT0FBTyxFQUFFaUIsS0FBSyxFQUFFeEMsS0FBSyxFQUFFOHJCLFNBQVMsQ0FBQztVQUN2QyxJQUFJUSxJQUFJLEtBQUsvcUIsT0FBTyxDQUFDa1MsR0FBRyxFQUFFO1lBQ3RCMlksRUFBRSxDQUFDM1ksR0FBRyxHQUFHbFMsT0FBTyxDQUFDa1MsR0FBRztZQUNwQjRZLENBQUMsR0FBR0osUUFBUSxDQUFDMXFCLE9BQU8sQ0FBQ3lxQixFQUFFLEVBQUV6cUIsT0FBTyxDQUFDd3FCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkNNLENBQUMsQ0FBQ2g5QixJQUFJLEdBQUcrOEIsRUFBRTtZQUNYQSxFQUFFLENBQUM5OEIsSUFBSSxHQUFHKzhCLENBQUM7WUFDWEEsQ0FBQyxDQUFDLzhCLElBQUksR0FBRyxJQUFJO1lBQ2I4OEIsRUFBRSxHQUFHQyxDQUFDO1VBQ1YsQ0FBQyxNQUFNO1lBQ0hELEVBQUUsQ0FBQzNZLEdBQUcsR0FBRzZZLElBQUk7WUFDYkYsRUFBRSxDQUFDLzZCLENBQUMsR0FBR2tRLE9BQU8sQ0FBQ3lxQixFQUFFO1lBQ2pCSSxFQUFFLENBQUM5NkIsQ0FBQyxHQUFHaVEsT0FBTyxDQUFDd3FCLEVBQUU7VUFDckI7VUFDQU8sSUFBSSxHQUFHL3FCLE9BQU8sQ0FBQ2tTLEdBQUc7UUFDdEIsQ0FBQyxRQUFRLENBQUNsUyxPQUFPLENBQUN5cUIsRUFBRSxLQUFLN3RCLEVBQUUsSUFBSW9ELE9BQU8sQ0FBQ3dxQixFQUFFLEtBQUszdEIsRUFBRSxLQUFLLEVBQUVvdUIsWUFBWSxHQUFHRCxlQUFlO1FBQ3JGSixFQUFFLENBQUM5OEIsSUFBSSxHQUFHKzhCLEVBQUUsQ0FBQy84QixJQUFJO1FBQ2pCKzhCLEVBQUUsQ0FBQy84QixJQUFJLENBQUNDLElBQUksR0FBRzY4QixFQUFFO01BQ3JCO01BQ0EsT0FBT0EsRUFBRTtJQUNiO0lBRUEsT0FBTztNQUNINTJCLEtBQUssV0FBTEEsS0FBS0EsQ0FBQ2dNLE9BQU8sRUFBRWlCLEtBQUssRUFBRXhDLEtBQUssRUFBRThyQixTQUFTLEVBQUU7UUFDcEMsT0FBT3YyQixNQUFLLENBQUNnTSxPQUFPLEVBQUVpQixLQUFLLEVBQUV4QyxLQUFLLEVBQUU4ckIsU0FBUyxDQUFDO01BQ2xELENBQUM7TUFDREksY0FBYyxXQUFkQSxjQUFjQSxDQUFDOXRCLEVBQUUsRUFBRUQsRUFBRSxFQUFFNkIsS0FBSyxFQUFFd0MsS0FBSyxFQUFFc3BCLFNBQVMsRUFBRTtRQUM1QyxPQUFPSSxlQUFjLENBQUM5dEIsRUFBRSxFQUFFRCxFQUFFLEVBQUU2QixLQUFLLEVBQUV3QyxLQUFLLEVBQUVzcEIsU0FBUyxDQUFDO01BQzFEO0lBQ0osQ0FBQztFQUNMO0FBQ0osQ0FBQztBQUVleDJCLGdFQUFNLEU7O0FDdEdROztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxJQUFNbTNCLFVBQVUsR0FBRztFQUNmQyxlQUFlLFdBQWZBLGVBQWVBLENBQUEsRUFBRztJQUNkLE9BQU87TUFDSGpaLEdBQUcsRUFBRSxJQUFJO01BQ1RsbUIsS0FBSyxFQUFFLElBQUk7TUFDWG8vQixXQUFXLEVBQUUsSUFBSTtNQUNqQkMsY0FBYyxFQUFFLElBQUk7TUFDcEJDLFFBQVEsRUFBRSxJQUFJO01BQ2RDLFFBQVEsRUFBRTtJQUNkLENBQUM7RUFDTCxDQUFDO0VBQ0RDLFdBQVcsRUFBRTtJQUNUQyxNQUFNLEVBQUUsQ0FBQztJQUNUQyxPQUFPLEVBQUUsQ0FBQztJQUNWQyxXQUFXLEVBQUU7RUFDakIsQ0FBQztFQUNEM2EsR0FBRyxFQUFFO0lBQ0Q0YSxZQUFZLEVBQUUsQ0FBQyxLQUFLO0lBQ3BCQyxXQUFXLEVBQUUsQ0FBQztFQUNsQixDQUFDO0VBQ0R6OUIsTUFBTSxXQUFOQSxNQUFNQSxDQUFDa0MsWUFBWSxFQUFFKzVCLFlBQVksRUFBRTtJQUMvQixJQUFNNzVCLFNBQVMsR0FBR0YsWUFBWSxDQUFDRyxJQUFJO0lBQ25DLElBQU02NUIsU0FBUyxHQUFHRCxZQUFZLENBQUM1NUIsSUFBSTtJQUNuQyxJQUFNQyxLQUFLLEdBQUdKLFlBQVksQ0FBQ0ssSUFBSSxDQUFDYixDQUFDO0lBQ2pDLElBQU1jLE1BQU0sR0FBR04sWUFBWSxDQUFDSyxJQUFJLENBQUNaLENBQUM7SUFDbEMsSUFBTSs3QixNQUFNLEdBQUcvM0IsY0FBTSxDQUFDM0YsTUFBTSxDQUFDa0MsWUFBWSxFQUFFKzVCLFlBQVksQ0FBQztJQUV4RCxPQUFPO01BQ0gwQixTQUFTLFdBQVRBLFNBQVNBLENBQUNDLFVBQVUsRUFBRTtRQUNsQixJQUFJL3FCLEtBQUs7UUFDVCxJQUFJZ3JCLEVBQUU7UUFDTixJQUFJQyxFQUFFO1FBQ04sSUFBSUMsVUFBVTtRQUNkLElBQUkxQixFQUFFO1FBQ04sSUFBSUQsRUFBRTtRQUNOLElBQU00QixRQUFRLEdBQUcsRUFBRTtRQUNuQixJQUFJQyxNQUFNO1FBQ1YsSUFBSWgvQixDQUFDO1FBQ0wsSUFBSWkvQixFQUFFO1FBQ04sSUFBSUMsRUFBRTtRQUNOLElBQUl6M0IsR0FBRztRQUNQLElBQUkwM0IsY0FBYyxHQUFHLENBQUM7UUFDdEIsSUFBSTMvQixDQUFDO1FBRUwsS0FBS0EsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLEdBQUcsRUFBRUEsQ0FBQyxFQUFFLEVBQUU7VUFDdEJ1L0IsUUFBUSxDQUFDdi9CLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDbkI7UUFFQXUvQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUc1N0IsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMxQjg3QixFQUFFLEdBQUcsSUFBSTtRQUNULEtBQUs5QixFQUFFLEdBQUcsQ0FBQyxFQUFFQSxFQUFFLEdBQUc1NUIsTUFBTSxHQUFHLENBQUMsRUFBRTQ1QixFQUFFLEVBQUUsRUFBRTtVQUNoQzJCLFVBQVUsR0FBRyxDQUFDO1VBQ2RGLEVBQUUsR0FBR0csUUFBUSxDQUFDLENBQUMsQ0FBQztVQUNoQixLQUFLM0IsRUFBRSxHQUFHLENBQUMsRUFBRUEsRUFBRSxHQUFHLzVCLEtBQUssR0FBRyxDQUFDLEVBQUUrNUIsRUFBRSxFQUFFLEVBQUU7WUFDL0IzMUIsR0FBRyxHQUFHMDFCLEVBQUUsR0FBRzk1QixLQUFLLEdBQUcrNUIsRUFBRTtZQUNyQixJQUFJSCxTQUFTLENBQUN4MUIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2NBQ3RCbU0sS0FBSyxHQUFHelEsU0FBUyxDQUFDc0UsR0FBRyxDQUFDO2NBQ3RCLElBQUltTSxLQUFLLEtBQUtnckIsRUFBRSxFQUFFO2dCQUNkLElBQUlFLFVBQVUsS0FBSyxDQUFDLEVBQUU7a0JBQ2xCRCxFQUFFLEdBQUdNLGNBQWMsR0FBRyxDQUFDO2tCQUN2QkosUUFBUSxDQUFDRixFQUFFLENBQUMsR0FBR2pyQixLQUFLO2tCQUNwQmdyQixFQUFFLEdBQUdockIsS0FBSztrQkFDVm9yQixNQUFNLEdBQUdQLE1BQU0sQ0FBQ25CLGNBQWMsQ0FBQ0gsRUFBRSxFQUFFQyxFQUFFLEVBQUV5QixFQUFFLEVBQUVqckIsS0FBSyxFQUFFaXFCLFVBQVUsQ0FBQ2xhLEdBQUcsQ0FBQzRhLFlBQVksQ0FBQztrQkFDOUUsSUFBSVMsTUFBTSxLQUFLLElBQUksRUFBRTtvQkFDakJHLGNBQWMsRUFBRTtvQkFDaEJMLFVBQVUsR0FBR0QsRUFBRTtvQkFDZjcrQixDQUFDLEdBQUc2OUIsVUFBVSxDQUFDQyxlQUFlLENBQUMsQ0FBQztvQkFDaEM5OUIsQ0FBQyxDQUFDNmtCLEdBQUcsR0FBR2daLFVBQVUsQ0FBQ00sV0FBVyxDQUFDQyxNQUFNO29CQUNyQ3ArQixDQUFDLENBQUNyQixLQUFLLEdBQUdtZ0MsVUFBVTtvQkFDcEI5K0IsQ0FBQyxDQUFDKzlCLFdBQVcsR0FBR2lCLE1BQU07b0JBQ3RCaC9CLENBQUMsQ0FBQ2krQixRQUFRLEdBQUdnQixFQUFFO29CQUNmai9CLENBQUMsQ0FBQ2crQixjQUFjLEdBQUcsSUFBSTtvQkFDdkIsSUFBSWlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7c0JBQ2JBLEVBQUUsQ0FBQ2YsUUFBUSxHQUFHbCtCLENBQUM7b0JBQ25CO29CQUNBaS9CLEVBQUUsR0FBR2ovQixDQUFDO2tCQUNWO2dCQUNKLENBQUMsTUFBTTtrQkFDSGcvQixNQUFNLEdBQUdQLE1BQU0sQ0FDVm5CLGNBQWMsQ0FBQ0gsRUFBRSxFQUFFQyxFQUFFLEVBQUVTLFVBQVUsQ0FBQ2xhLEdBQUcsQ0FBQzZhLFdBQVcsRUFBRTVxQixLQUFLLEVBQUVrckIsVUFBVSxDQUFDO2tCQUMxRSxJQUFJRSxNQUFNLEtBQUssSUFBSSxFQUFFO29CQUNqQmgvQixDQUFDLEdBQUc2OUIsVUFBVSxDQUFDQyxlQUFlLENBQUMsQ0FBQztvQkFDaEM5OUIsQ0FBQyxDQUFDKzlCLFdBQVcsR0FBR2lCLE1BQU07b0JBQ3RCaC9CLENBQUMsQ0FBQ2crQixjQUFjLEdBQUcsSUFBSTtvQkFDdkIsSUFBSVcsVUFBVSxLQUFLLENBQUMsRUFBRTtzQkFDbEIzK0IsQ0FBQyxDQUFDNmtCLEdBQUcsR0FBR2daLFVBQVUsQ0FBQ00sV0FBVyxDQUFDRSxPQUFPO29CQUMxQyxDQUFDLE1BQU07c0JBQ0hyK0IsQ0FBQyxDQUFDNmtCLEdBQUcsR0FBR2daLFVBQVUsQ0FBQ00sV0FBVyxDQUFDQyxNQUFNO29CQUN6QztvQkFDQXArQixDQUFDLENBQUNyQixLQUFLLEdBQUdnZ0MsVUFBVTtvQkFDcEJPLEVBQUUsR0FBR0QsRUFBRTtvQkFDUCxPQUFRQyxFQUFFLEtBQUssSUFBSSxJQUFLQSxFQUFFLENBQUN2Z0MsS0FBSyxLQUFLbWdDLFVBQVUsRUFBRTtzQkFDN0NJLEVBQUUsR0FBR0EsRUFBRSxDQUFDakIsUUFBUTtvQkFDcEI7b0JBQ0EsSUFBSWlCLEVBQUUsS0FBSyxJQUFJLEVBQUU7c0JBQ2JsL0IsQ0FBQyxDQUFDaStCLFFBQVEsR0FBR2lCLEVBQUUsQ0FBQ2xCLGNBQWM7c0JBQzlCLElBQUlrQixFQUFFLENBQUNsQixjQUFjLEtBQUssSUFBSSxFQUFFO3dCQUM1QmtCLEVBQUUsQ0FBQ2xCLGNBQWMsQ0FBQ0UsUUFBUSxHQUFHbCtCLENBQUM7c0JBQ2xDO3NCQUNBay9CLEVBQUUsQ0FBQ2xCLGNBQWMsR0FBR2grQixDQUFDO29CQUN6QjtrQkFDSjtnQkFDSjtjQUNKLENBQUMsTUFBTTtnQkFDSGk5QixTQUFTLENBQUN4MUIsR0FBRyxDQUFDLEdBQUdxM0IsVUFBVTtjQUMvQjtZQUNKLENBQUMsTUFBTSxJQUFJN0IsU0FBUyxDQUFDeDFCLEdBQUcsQ0FBQyxLQUFLbzJCLFVBQVUsQ0FBQ2xhLEdBQUcsQ0FBQzRhLFlBQVksSUFDOUN0QixTQUFTLENBQUN4MUIsR0FBRyxDQUFDLEtBQUtvMkIsVUFBVSxDQUFDbGEsR0FBRyxDQUFDNmEsV0FBVyxFQUFFO2NBQ3RETSxVQUFVLEdBQUcsQ0FBQztjQUNkLElBQUk3QixTQUFTLENBQUN4MUIsR0FBRyxDQUFDLEtBQUtvMkIsVUFBVSxDQUFDbGEsR0FBRyxDQUFDNmEsV0FBVyxFQUFFO2dCQUMvQ0ksRUFBRSxHQUFHejdCLFNBQVMsQ0FBQ3NFLEdBQUcsQ0FBQztjQUN2QixDQUFDLE1BQU07Z0JBQ0htM0IsRUFBRSxHQUFHRyxRQUFRLENBQUMsQ0FBQyxDQUFDO2NBQ3BCO1lBQ0osQ0FBQyxNQUFNO2NBQ0hELFVBQVUsR0FBRzdCLFNBQVMsQ0FBQ3gxQixHQUFHLENBQUM7Y0FDM0JtM0IsRUFBRSxHQUFHRyxRQUFRLENBQUNELFVBQVUsQ0FBQztZQUM3QjtVQUNKO1FBQ0o7UUFDQUksRUFBRSxHQUFHRCxFQUFFO1FBQ1AsT0FBT0MsRUFBRSxLQUFLLElBQUksRUFBRTtVQUNoQkEsRUFBRSxDQUFDdmdDLEtBQUssR0FBR2dnQyxVQUFVO1VBQ3JCTyxFQUFFLEdBQUdBLEVBQUUsQ0FBQ2pCLFFBQVE7UUFDcEI7UUFDQSxPQUFPO1VBQ0hnQixFQUFFLEVBQUZBLEVBQUU7VUFDRnhwQixLQUFLLEVBQUUwcEI7UUFDWCxDQUFDO01BQ0wsQ0FBQztNQUNEcGEsS0FBSyxFQUFFO1FBQ0hxYSxXQUFXLFdBQVhBLFdBQVdBLENBQUNqMEIsTUFBTSxFQUFFazBCLFlBQVksRUFBRTtVQUM5QixJQUFNeDFCLEdBQUcsR0FBR3NCLE1BQU0sQ0FBQ1EsVUFBVSxDQUFDLElBQUksQ0FBQztVQUNuQyxJQUFJMnpCLEVBQUUsR0FBR0QsWUFBWTtVQUNyQixJQUFJRSxFQUFFO1VBQ04sSUFBSUMsQ0FBQztVQUNMLElBQUl4L0IsQ0FBQztVQUVMNkosR0FBRyxDQUFDOEosV0FBVyxHQUFHLEtBQUs7VUFDdkI5SixHQUFHLENBQUNnSyxTQUFTLEdBQUcsS0FBSztVQUNyQmhLLEdBQUcsQ0FBQ2lLLFNBQVMsR0FBRyxDQUFDO1VBRWpCLElBQUl3ckIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNiQyxFQUFFLEdBQUdELEVBQUUsQ0FBQ3RCLGNBQWM7VUFDMUIsQ0FBQyxNQUFNO1lBQ0h1QixFQUFFLEdBQUcsSUFBSTtVQUNiO1VBRUEsT0FBT0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNoQixJQUFJQyxFQUFFLEtBQUssSUFBSSxFQUFFO2NBQ2JDLENBQUMsR0FBR0QsRUFBRTtjQUNOQSxFQUFFLEdBQUdBLEVBQUUsQ0FBQ3RCLFFBQVE7WUFDcEIsQ0FBQyxNQUFNO2NBQ0h1QixDQUFDLEdBQUdGLEVBQUU7Y0FDTkEsRUFBRSxHQUFHQSxFQUFFLENBQUNyQixRQUFRO2NBQ2hCLElBQUlxQixFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNiQyxFQUFFLEdBQUdELEVBQUUsQ0FBQ3RCLGNBQWM7Y0FDMUIsQ0FBQyxNQUFNO2dCQUNIdUIsRUFBRSxHQUFHLElBQUk7Y0FDYjtZQUNKO1lBRUEsUUFBUUMsQ0FBQyxDQUFDM2EsR0FBRztjQUNULEtBQUtnWixVQUFVLENBQUNNLFdBQVcsQ0FBQ0MsTUFBTTtnQkFDOUJ2MEIsR0FBRyxDQUFDOEosV0FBVyxHQUFHLEtBQUs7Z0JBQ3ZCO2NBQ0osS0FBS2txQixVQUFVLENBQUNNLFdBQVcsQ0FBQ0UsT0FBTztnQkFDL0J4MEIsR0FBRyxDQUFDOEosV0FBVyxHQUFHLE1BQU07Z0JBQ3hCO2NBQ0osS0FBS2txQixVQUFVLENBQUNNLFdBQVcsQ0FBQ0csV0FBVztnQkFDbkN6MEIsR0FBRyxDQUFDOEosV0FBVyxHQUFHLE9BQU87Z0JBQ3pCO1lBQ1I7WUFFQTNULENBQUMsR0FBR3cvQixDQUFDLENBQUN6QixXQUFXO1lBQ2pCbDBCLEdBQUcsQ0FBQ2tLLFNBQVMsQ0FBQyxDQUFDO1lBQ2ZsSyxHQUFHLENBQUN1SyxNQUFNLENBQUNwVSxDQUFDLENBQUN5QyxDQUFDLEVBQUV6QyxDQUFDLENBQUMwQyxDQUFDLENBQUM7WUFDcEIsR0FBRztjQUNDMUMsQ0FBQyxHQUFHQSxDQUFDLENBQUNVLElBQUk7Y0FDVm1KLEdBQUcsQ0FBQ3dLLE1BQU0sQ0FBQ3JVLENBQUMsQ0FBQ3lDLENBQUMsRUFBRXpDLENBQUMsQ0FBQzBDLENBQUMsQ0FBQztZQUN4QixDQUFDLFFBQVExQyxDQUFDLEtBQUt3L0IsQ0FBQyxDQUFDekIsV0FBVztZQUM1QmwwQixHQUFHLENBQUMwSyxNQUFNLENBQUMsQ0FBQztVQUNoQjtRQUNKO01BQ0o7SUFDSixDQUFDO0VBQ0w7QUFDSixDQUFDO0FBRWNzcEIsaUVBQVUsRTs7QUNsTXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTNEIsWUFBWUEsQ0FBQ0MsTUFBTSxFQUFFQyxPQUFPLEVBQUU5SixNQUFNLEVBQUU7RUFDM0MsU0FBUzs7RUFFVCxJQUFJK0osTUFBTSxHQUFHLElBQUlGLE1BQU0sQ0FBQzl6QixVQUFVLENBQUNpcUIsTUFBTSxDQUFDO0VBQzFDLElBQUl2eUIsSUFBSSxHQUFHcThCLE9BQU8sQ0FBQ3I4QixJQUFJLEdBQUcsQ0FBQztFQUMzQixJQUFJdkYsSUFBSSxHQUFHMmhDLE1BQU0sQ0FBQzVoQyxJQUFJLENBQUNDLElBQUk7O0VBRTNCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxTQUFTd0ssS0FBS0EsQ0FBQ3MzQixVQUFVLEVBQUVDLFdBQVcsRUFBRTtJQUNwQ0QsVUFBVSxHQUFHQSxVQUFVLEdBQUcsQ0FBQztJQUMzQkMsV0FBVyxHQUFHQSxXQUFXLEdBQUcsQ0FBQztJQUU3QixJQUFJaDhCLENBQUMsR0FBRyxDQUFDO0lBQ1QsSUFBSUMsQ0FBQyxHQUFHLENBQUM7SUFDVCxJQUFJakQsR0FBRyxHQUFHLENBQUM7SUFDWCxJQUFJcUgsT0FBTyxHQUFHLENBQUM7SUFDZixJQUFJQyxPQUFPLEdBQUcsQ0FBQztJQUNmLElBQUlDLE9BQU8sR0FBRyxDQUFDO0lBQ2YsSUFBSUMsT0FBTyxHQUFHLENBQUM7SUFDZixJQUFJOEIsTUFBTSxHQUFHLENBQUM7SUFFZCxLQUFLdEcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDQSxDQUFDLEdBQUcsQ0FBQyxLQUFNUixJQUFJLEdBQUcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxFQUFFUSxDQUFDLEdBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxFQUFFO01BQ3JEc0csTUFBTSxHQUFJQSxNQUFNLEdBQUc5RyxJQUFJLEdBQUksQ0FBQztNQUM1QixLQUFLUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUNBLENBQUMsR0FBRyxDQUFDLEtBQU1ULElBQUksR0FBRyxDQUFDLEdBQUksQ0FBQyxDQUFDLEVBQUVTLENBQUMsR0FBSUEsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLEVBQUU7UUFDckRvRSxPQUFPLEdBQUlpQyxNQUFNLEdBQUc5RyxJQUFJLEdBQUksQ0FBQztRQUM3QjhFLE9BQU8sR0FBSWdDLE1BQU0sR0FBRzlHLElBQUksR0FBSSxDQUFDO1FBQzdCK0UsT0FBTyxHQUFJdEUsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDO1FBQ3JCdUUsT0FBTyxHQUFJdkUsQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDO1FBQ3JCakQsR0FBRyxHQUFJLENBQUM4K0IsTUFBTSxDQUFFQyxVQUFVLEdBQUcxM0IsT0FBTyxHQUFHRSxPQUFPLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUNqRHUzQixNQUFNLENBQUVDLFVBQVUsR0FBRzEzQixPQUFPLEdBQUdHLE9BQU8sR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDakRzM0IsTUFBTSxDQUFFQyxVQUFVLEdBQUd6MUIsTUFBTSxHQUFHckcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUMxQzY3QixNQUFNLENBQUVDLFVBQVUsR0FBR3ozQixPQUFPLEdBQUdDLE9BQU8sR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDakR1M0IsTUFBTSxDQUFFQyxVQUFVLEdBQUd6M0IsT0FBTyxHQUFHRSxPQUFPLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUksQ0FBQztRQUM3RDtRQUNBLElBQUksQ0FBQ3hILEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1VBQ3RCOCtCLE1BQU0sQ0FBRUUsV0FBVyxHQUFHMTFCLE1BQU0sR0FBR3JHLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzlDLENBQUMsTUFBTTtVQUNINjdCLE1BQU0sQ0FBRUUsV0FBVyxHQUFHMTFCLE1BQU0sR0FBR3JHLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzlDO01BQ0o7SUFDSjtFQUNKOztFQUVBO0VBQ0EsU0FBU3lFLFFBQVFBLENBQUN1M0IsU0FBUyxFQUFFQyxTQUFTLEVBQUVGLFdBQVcsRUFBRTtJQUNqREMsU0FBUyxHQUFHQSxTQUFTLEdBQUcsQ0FBQztJQUN6QkMsU0FBUyxHQUFHQSxTQUFTLEdBQUcsQ0FBQztJQUN6QkYsV0FBVyxHQUFHQSxXQUFXLEdBQUcsQ0FBQztJQUU3QixJQUFJamhDLE1BQU0sR0FBRyxDQUFDO0lBRWRBLE1BQU0sR0FBR2QsSUFBSSxDQUFDdUYsSUFBSSxFQUFFQSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRTdCLE9BQU8sQ0FBQ3pFLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ3JCQSxNQUFNLEdBQUlBLE1BQU0sR0FBRyxDQUFDLEdBQUksQ0FBQztNQUN6QitnQyxNQUFNLENBQUVFLFdBQVcsR0FBR2poQyxNQUFNLEdBQUksQ0FBQyxDQUFDLEdBQUksQ0FBQytnQyxNQUFNLENBQUVHLFNBQVMsR0FBR2xoQyxNQUFNLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLK2dDLE1BQU0sQ0FBRUksU0FBUyxHQUFHbmhDLE1BQU0sR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBSSxDQUFDO0lBQzlIO0VBQ0o7O0VBRUE7RUFDQSxTQUFTa0ssU0FBU0EsQ0FBQ2czQixTQUFTLEVBQUVDLFNBQVMsRUFBRUYsV0FBVyxFQUFFO0lBQ2xEQyxTQUFTLEdBQUdBLFNBQVMsR0FBRyxDQUFDO0lBQ3pCQyxTQUFTLEdBQUdBLFNBQVMsR0FBRyxDQUFDO0lBQ3pCRixXQUFXLEdBQUdBLFdBQVcsR0FBRyxDQUFDO0lBRTdCLElBQUlqaEMsTUFBTSxHQUFHLENBQUM7SUFFZEEsTUFBTSxHQUFHZCxJQUFJLENBQUN1RixJQUFJLEVBQUVBLElBQUksQ0FBQyxHQUFHLENBQUM7SUFFN0IsT0FBTyxDQUFDekUsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDckJBLE1BQU0sR0FBSUEsTUFBTSxHQUFHLENBQUMsR0FBSSxDQUFDO01BQ3pCK2dDLE1BQU0sQ0FBRUUsV0FBVyxHQUFHamhDLE1BQU0sR0FBSSxDQUFDLENBQUMsR0FBSytnQyxNQUFNLENBQUVHLFNBQVMsR0FBR2xoQyxNQUFNLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFLK2dDLE1BQU0sQ0FBRUksU0FBUyxHQUFHbmhDLE1BQU0sR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBSSxDQUFDO0lBQzlIO0VBQ0o7O0VBRUE7RUFDQSxTQUFTbUssWUFBWUEsQ0FBQ2kzQixRQUFRLEVBQUU7SUFDNUJBLFFBQVEsR0FBR0EsUUFBUSxHQUFHLENBQUM7SUFFdkIsSUFBSW4vQixHQUFHLEdBQUcsQ0FBQztJQUNYLElBQUlqQyxNQUFNLEdBQUcsQ0FBQztJQUVkQSxNQUFNLEdBQUdkLElBQUksQ0FBQ3VGLElBQUksRUFBRUEsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUU3QixPQUFPLENBQUN6RSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUNyQkEsTUFBTSxHQUFJQSxNQUFNLEdBQUcsQ0FBQyxHQUFJLENBQUM7TUFDekJpQyxHQUFHLEdBQUksQ0FBQ0EsR0FBRyxHQUFHLENBQUMsS0FBSzgrQixNQUFNLENBQUVLLFFBQVEsR0FBR3BoQyxNQUFNLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUksQ0FBQztJQUNqRTtJQUVBLE9BQVFpQyxHQUFHLEdBQUcsQ0FBQztFQUNuQjs7RUFFQTtFQUNBLFNBQVMzQixJQUFJQSxDQUFDOGdDLFFBQVEsRUFBRTN4QixLQUFLLEVBQUU7SUFDM0IyeEIsUUFBUSxHQUFHQSxRQUFRLEdBQUcsQ0FBQztJQUN2QjN4QixLQUFLLEdBQUdBLEtBQUssR0FBRyxDQUFDO0lBRWpCLElBQUl6UCxNQUFNLEdBQUcsQ0FBQztJQUVkQSxNQUFNLEdBQUdkLElBQUksQ0FBQ3VGLElBQUksRUFBRUEsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUU3QixPQUFPLENBQUN6RSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUNyQkEsTUFBTSxHQUFJQSxNQUFNLEdBQUcsQ0FBQyxHQUFJLENBQUM7TUFDekIrZ0MsTUFBTSxDQUFFSyxRQUFRLEdBQUdwaEMsTUFBTSxHQUFJLENBQUMsQ0FBQyxHQUFHeVAsS0FBSztJQUMzQztFQUNKOztFQUVBO0VBQ0EsU0FBU3hHLE1BQU1BLENBQUMrM0IsVUFBVSxFQUFFQyxXQUFXLEVBQUU7SUFDckNELFVBQVUsR0FBR0EsVUFBVSxHQUFHLENBQUM7SUFDM0JDLFdBQVcsR0FBR0EsV0FBVyxHQUFHLENBQUM7SUFFN0IsSUFBSWg4QixDQUFDLEdBQUcsQ0FBQztJQUNULElBQUlDLENBQUMsR0FBRyxDQUFDO0lBQ1QsSUFBSWpELEdBQUcsR0FBRyxDQUFDO0lBQ1gsSUFBSXFILE9BQU8sR0FBRyxDQUFDO0lBQ2YsSUFBSUMsT0FBTyxHQUFHLENBQUM7SUFDZixJQUFJQyxPQUFPLEdBQUcsQ0FBQztJQUNmLElBQUlDLE9BQU8sR0FBRyxDQUFDO0lBQ2YsSUFBSThCLE1BQU0sR0FBRyxDQUFDO0lBRWQsS0FBS3RHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQ0EsQ0FBQyxHQUFHLENBQUMsS0FBTVIsSUFBSSxHQUFHLENBQUMsR0FBSSxDQUFDLENBQUMsRUFBRVEsQ0FBQyxHQUFJQSxDQUFDLEdBQUcsQ0FBQyxHQUFJLENBQUMsRUFBRTtNQUNyRHNHLE1BQU0sR0FBSUEsTUFBTSxHQUFHOUcsSUFBSSxHQUFJLENBQUM7TUFDNUIsS0FBS1MsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDQSxDQUFDLEdBQUcsQ0FBQyxLQUFNVCxJQUFJLEdBQUcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxFQUFFUyxDQUFDLEdBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxFQUFFO1FBQ3JEb0UsT0FBTyxHQUFJaUMsTUFBTSxHQUFHOUcsSUFBSSxHQUFJLENBQUM7UUFDN0I4RSxPQUFPLEdBQUlnQyxNQUFNLEdBQUc5RyxJQUFJLEdBQUksQ0FBQztRQUM3QitFLE9BQU8sR0FBSXRFLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQztRQUNyQnVFLE9BQU8sR0FBSXZFLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQztRQUNyQmpELEdBQUcsR0FBSSxDQUFDOCtCLE1BQU0sQ0FBRUMsVUFBVSxHQUFHMTNCLE9BQU8sR0FBR0UsT0FBTyxHQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FDakR1M0IsTUFBTSxDQUFFQyxVQUFVLEdBQUcxM0IsT0FBTyxHQUFHRyxPQUFPLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQ2pEczNCLE1BQU0sQ0FBRUMsVUFBVSxHQUFHejFCLE1BQU0sR0FBR3JHLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDMUM2N0IsTUFBTSxDQUFFQyxVQUFVLEdBQUd6M0IsT0FBTyxHQUFHQyxPQUFPLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQ2pEdTNCLE1BQU0sQ0FBRUMsVUFBVSxHQUFHejNCLE9BQU8sR0FBR0UsT0FBTyxHQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFJLENBQUM7UUFDN0QsSUFBSSxDQUFDeEgsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7VUFDckI4K0IsTUFBTSxDQUFFRSxXQUFXLEdBQUcxMUIsTUFBTSxHQUFHckcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDOUMsQ0FBQyxNQUFNO1VBQ0g2N0IsTUFBTSxDQUFFRSxXQUFXLEdBQUcxMUIsTUFBTSxHQUFHckcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDOUM7TUFDSjtJQUNKO0VBQ0o7O0VBRUE7RUFDQSxTQUFTbThCLE1BQU1BLENBQUNDLFdBQVcsRUFBRUMsV0FBVyxFQUFFO0lBQ3RDRCxXQUFXLEdBQUdBLFdBQVcsR0FBRyxDQUFDO0lBQzdCQyxXQUFXLEdBQUdBLFdBQVcsR0FBRyxDQUFDO0lBRTdCLElBQUl2aEMsTUFBTSxHQUFHLENBQUM7SUFFZEEsTUFBTSxHQUFHZCxJQUFJLENBQUN1RixJQUFJLEVBQUVBLElBQUksQ0FBQyxHQUFHLENBQUM7SUFFN0IsT0FBTyxDQUFDekUsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDckJBLE1BQU0sR0FBSUEsTUFBTSxHQUFHLENBQUMsR0FBSSxDQUFDO01BQ3pCK2dDLE1BQU0sQ0FBRVEsV0FBVyxHQUFHdmhDLE1BQU0sR0FBSSxDQUFDLENBQUMsR0FBSStnQyxNQUFNLENBQUVPLFdBQVcsR0FBR3RoQyxNQUFNLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBRTtJQUNqRjtFQUNKOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDSSxTQUFTaVMsVUFBVUEsQ0FBQ212QixRQUFRLEVBQUU7SUFDMUJBLFFBQVEsR0FBR0EsUUFBUSxHQUFHLENBQUM7SUFFdkIsSUFBSXg5QixDQUFDLEdBQUcsQ0FBQztJQUNULElBQUlDLENBQUMsR0FBRyxDQUFDO0lBRVQsS0FBS0QsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDQSxDQUFDLEdBQUcsQ0FBQyxLQUFNYSxJQUFJLEdBQUcsQ0FBQyxHQUFJLENBQUMsQ0FBQyxFQUFFYixDQUFDLEdBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxFQUFFO01BQ3JEbTlCLE1BQU0sQ0FBRUssUUFBUSxHQUFHeDlCLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDO01BQzlCbTlCLE1BQU0sQ0FBRUssUUFBUSxHQUFHdjlCLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDO01BQzlCQSxDQUFDLEdBQUtBLENBQUMsR0FBR1ksSUFBSSxHQUFJLENBQUMsR0FBSSxDQUFDO01BQ3hCczhCLE1BQU0sQ0FBRUssUUFBUSxHQUFHdjlCLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDO01BQzlCQSxDQUFDLEdBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQztJQUNuQjtJQUNBLEtBQUtELENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQ0EsQ0FBQyxHQUFHLENBQUMsS0FBS2EsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFYixDQUFDLEdBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxFQUFFO01BQy9DbTlCLE1BQU0sQ0FBRUssUUFBUSxHQUFHdjlCLENBQUMsR0FBSSxDQUFDLENBQUMsR0FBRyxDQUFDO01BQzlCQSxDQUFDLEdBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQztJQUNuQjtFQUNKOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksU0FBUzI5QixXQUFXQSxDQUFBLEVBQUc7SUFDbkIsSUFBSUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFRO0lBQzVCLElBQUlDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBSztJQUM1QixJQUFJQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQU87SUFDNUIsSUFBSUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFPO0lBQzVCLElBQUkzL0IsR0FBRyxHQUFHLENBQUM7SUFDWCxJQUFJOGIsSUFBSSxHQUFHLENBQUM7O0lBRVo7SUFDQTJqQixjQUFjLEdBQUd4aUMsSUFBSSxDQUFDdUYsSUFBSSxFQUFFQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBa0I7SUFDeERrOUIsWUFBWSxHQUFJRCxjQUFjLEdBQUdBLGNBQWMsR0FBSSxDQUFDLENBQUMsQ0FBRTtJQUN2REUsWUFBWSxHQUFJRCxZQUFZLEdBQUdELGNBQWMsR0FBSSxDQUFDLENBQUMsQ0FBSTs7SUFFdkQ7SUFDQXBoQyxJQUFJLENBQUNzaEMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNyQjN2QixVQUFVLENBQUN3dkIsV0FBVyxDQUFDO0lBRXZCLEdBQUc7TUFDQy8zQixLQUFLLENBQUMrM0IsV0FBVyxFQUFFQyxjQUFjLENBQUM7TUFDbEN6NEIsTUFBTSxDQUFDeTRCLGNBQWMsRUFBRUMsWUFBWSxDQUFDO01BQ3BDaDRCLFFBQVEsQ0FBQzgzQixXQUFXLEVBQUVFLFlBQVksRUFBRUEsWUFBWSxDQUFDO01BQ2pEejNCLFNBQVMsQ0FBQzAzQixZQUFZLEVBQUVELFlBQVksRUFBRUMsWUFBWSxDQUFDO01BQ25EUCxNQUFNLENBQUNLLGNBQWMsRUFBRUQsV0FBVyxDQUFDO01BQ25DeC9CLEdBQUcsR0FBR2tJLFlBQVksQ0FBQ3MzQixXQUFXLENBQUMsR0FBRyxDQUFDO01BQ25DMWpCLElBQUksR0FBSSxDQUFDOWIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBRTtJQUMvQixDQUFDLFFBQVEsQ0FBQzhiLElBQUk7RUFDbEI7RUFDQSxPQUFPO0lBQUV5akIsV0FBVyxFQUFFQTtFQUFZLENBQUM7QUFDdkM7QUFDQTs7QUFFZVosNkRBQVksRUFBQztBQUM1QiwwQjs7QUNwUHVDO0FBQ1k7QUFVdkI7QUFDcUI7QUFDRjtBQUNUO0FBQ1I7QUFDWTtBQUUxQyxJQUFJckYsc0JBQU87QUFDWCxJQUFJc0csb0JBQW9CO0FBQ3hCLElBQUlDLGlCQUFpQjtBQUNyQixJQUFJQyxnQkFBZ0I7QUFDcEIsSUFBSUMsa0JBQWtCO0FBQ3RCLElBQUlDLFVBQVU7QUFDZCxJQUFJQyxlQUFlO0FBQ25CLElBQUlDLGlCQUFpQjtBQUNyQixJQUFJQyxtQkFBbUI7QUFDdkIsSUFBSUMsVUFBVTtBQUNkLElBQU1DLGdCQUFnQixHQUFHO0VBQ3JCdDNCLEdBQUcsRUFBRTtJQUNEcXNCLE1BQU0sRUFBRTtFQUNaLENBQUM7RUFDRHpQLEdBQUcsRUFBRTtJQUNEeVAsTUFBTSxFQUFFO0VBQ1o7QUFDSixDQUFDO0FBQ0QsSUFBTWtMLFdBQVcsR0FBRztFQUFFMytCLENBQUMsRUFBRSxDQUFDO0VBQUVDLENBQUMsRUFBRTtBQUFFLENBQUM7QUFDbEMsSUFBSTIrQixrQkFBa0I7QUFDdEIsSUFBSUMsYUFBYTtBQUVqQixTQUFTQywyQkFBV0EsQ0FBQSxFQUFHO0VBQ25CLElBQUluSCxzQkFBTyxDQUFDdHVCLFVBQVUsRUFBRTtJQUNwQjQwQixvQkFBb0IsR0FBRyxJQUFJN3dCLGFBQVksQ0FBQztNQUNwQztNQUNBcE4sQ0FBQyxFQUFFNCtCLGtCQUFrQixDQUFDLzlCLElBQUksQ0FBQ2IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO01BQ3BDO01BQ0FDLENBQUMsRUFBRTIrQixrQkFBa0IsQ0FBQy85QixJQUFJLENBQUNaLENBQUMsR0FBRyxDQUFDLEdBQUc7SUFDdkMsQ0FBQyxDQUFDO0VBQ04sQ0FBQyxNQUFNO0lBQ0hnK0Isb0JBQW9CLEdBQUdXLGtCQUFrQjtFQUM3QztFQUVBSCxVQUFVLEdBQUc5ekIsa0JBQWtCLENBQUNndEIsc0JBQU8sQ0FBQy9zQixTQUFTLEVBQUVxekIsb0JBQW9CLENBQUNwOUIsSUFBSSxDQUFDOztFQUU3RTtFQUNBODlCLFdBQVcsQ0FBQzMrQixDQUFDLEdBQUdpK0Isb0JBQW9CLENBQUNwOUIsSUFBSSxDQUFDYixDQUFDLEdBQUd5K0IsVUFBVSxDQUFDeitCLENBQUMsR0FBRyxDQUFDO0VBQzlEO0VBQ0EyK0IsV0FBVyxDQUFDMStCLENBQUMsR0FBR2crQixvQkFBb0IsQ0FBQ3A5QixJQUFJLENBQUNaLENBQUMsR0FBR3crQixVQUFVLENBQUN4K0IsQ0FBQyxHQUFHLENBQUM7RUFFOUR1K0IsbUJBQW1CLEdBQUcsSUFBSXB4QixhQUFZLENBQUM2d0Isb0JBQW9CLENBQUNwOUIsSUFBSSxFQUFFd0IsU0FBUyxFQUFFOEcsVUFBVSxFQUFFLEtBQUssQ0FBQztFQUUvRmkxQixrQkFBa0IsR0FBRyxJQUFJaHhCLGFBQVksQ0FBQ3F4QixVQUFVLEVBQUVwOEIsU0FBUyxFQUFFZ1QsS0FBSyxFQUFFLElBQUksQ0FBQztFQUV6RSxJQUFNMHBCLGlCQUFpQixHQUFHLElBQUluTCxXQUFXLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztFQUNwRHVLLGdCQUFnQixHQUFHLElBQUkvd0IsYUFBWSxDQUFDcXhCLFVBQVUsRUFDMUMsSUFBSXQxQixVQUFVLENBQUM0MUIsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFTixVQUFVLENBQUN6K0IsQ0FBQyxHQUFHeStCLFVBQVUsQ0FBQ3grQixDQUFDLENBQUMsQ0FBQztFQUN0RWkrQixpQkFBaUIsR0FBRyxJQUFJOXdCLGFBQVksQ0FBQ3F4QixVQUFVLEVBQzNDLElBQUl0MUIsVUFBVSxDQUFDNDFCLGlCQUFpQixFQUFFTixVQUFVLENBQUN6K0IsQ0FBQyxHQUFHeStCLFVBQVUsQ0FBQ3grQixDQUFDLEdBQUcsQ0FBQyxFQUFFdytCLFVBQVUsQ0FBQ3orQixDQUFDLEdBQUd5K0IsVUFBVSxDQUFDeCtCLENBQUMsQ0FBQyxFQUMvRm9DLFNBQVMsRUFBRSxJQUFJLENBQUM7RUFDcEJ3OEIsYUFBYSxHQUFHRyxZQUFZLENBQ3hCO0lBQUUzakMsSUFBSSxFQUFKQSxJQUFJO0lBQUU4TixVQUFVLEVBQVZBO0VBQVcsQ0FBQyxFQUNwQjtJQUFFdEksSUFBSSxFQUFFNDlCLFVBQVUsQ0FBQ3orQjtFQUFFLENBQUMsRUFDdEIrK0IsaUJBQ0osQ0FBQztFQUVEUixpQkFBaUIsR0FBRyxJQUFJbnhCLGFBQVksQ0FBQztJQUNqQztJQUNBcE4sQ0FBQyxFQUFHaStCLG9CQUFvQixDQUFDcDlCLElBQUksQ0FBQ2IsQ0FBQyxHQUFHbStCLGdCQUFnQixDQUFDdDlCLElBQUksQ0FBQ2IsQ0FBQyxHQUFJLENBQUM7SUFDOUQ7SUFDQUMsQ0FBQyxFQUFHZytCLG9CQUFvQixDQUFDcDlCLElBQUksQ0FBQ1osQ0FBQyxHQUFHaytCLGdCQUFnQixDQUFDdDlCLElBQUksQ0FBQ1osQ0FBQyxHQUFJO0VBQ2pFLENBQUMsRUFBRW9DLFNBQVMsRUFBRWdULEtBQUssRUFBRSxJQUFJLENBQUM7RUFDMUJncEIsVUFBVSxHQUFHLElBQUlqeEIsYUFBWSxDQUFDbXhCLGlCQUFpQixDQUFDMTlCLElBQUksRUFBRXdCLFNBQVMsRUFBRUEsU0FBUyxFQUFFLElBQUksQ0FBQztFQUNqRmk4QixlQUFlLEdBQUcsSUFBSWx4QixhQUFZLENBQUNteEIsaUJBQWlCLENBQUMxOUIsSUFBSSxFQUFFd0IsU0FBUyxFQUFFTixVQUFVLEVBQUUsSUFBSSxDQUFDO0FBQzNGO0FBRUEsU0FBU21pQiwwQkFBVUEsQ0FBQSxFQUFHO0VBQUEsSUFBQUcsYUFBQTtFQUNsQixJQUFJc1Qsc0JBQU8sQ0FBQ3NILFNBQVMsSUFBSSxPQUFPdDJCLFFBQVEsS0FBSyxXQUFXLEVBQUU7SUFDdEQ7RUFDSjtFQUNBKzFCLGdCQUFnQixDQUFDMWEsR0FBRyxDQUFDeVAsTUFBTSxHQUFHOXFCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQztFQUM5RDgxQixnQkFBZ0IsQ0FBQzFhLEdBQUcsQ0FBQ3lQLE1BQU0sQ0FBQ2pQLFNBQVMsR0FBRyxjQUFjO0VBQ3RELElBQUl4SCxLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDa04sVUFBVSxLQUFLLElBQUksRUFBRTtJQUN0RDdtQixRQUFRLENBQUM0YixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUNFLFdBQVcsQ0FBQ2lhLGdCQUFnQixDQUFDMWEsR0FBRyxDQUFDeVAsTUFBTSxDQUFDO0VBQzdFO0VBQ0EsSUFBTW5GLGtCQUFrQixHQUFHLENBQUMsQ0FBQ3FKLHNCQUFPLENBQUNySixrQkFBa0I7RUFDdkQsSUFBSXRSLEtBQWUsS0FBQXFILGFBQUEsR0FBSXNULHNCQUFPLENBQUNyVixLQUFLLGNBQUErQixhQUFBLGVBQWJBLGFBQUEsQ0FBZW1MLFVBQVUsRUFBRTtJQUM5Q3htQixPQUFPLENBQUNDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRXFsQixrQkFBa0IsRUFBRXFKLHNCQUFPLENBQUM7RUFDaEY7RUFDQStHLGdCQUFnQixDQUFDdDNCLEdBQUcsQ0FBQ3FzQixNQUFNLEdBQUdpTCxnQkFBZ0IsQ0FBQzFhLEdBQUcsQ0FBQ3lQLE1BQU0sQ0FBQ3ZxQixVQUFVLENBQUMsSUFBSSxFQUFFO0lBQUVvbEIsa0JBQWtCLEVBQWxCQTtFQUFtQixDQUFDLENBQUM7RUFDbEdvUSxnQkFBZ0IsQ0FBQzFhLEdBQUcsQ0FBQ3lQLE1BQU0sQ0FBQzd5QixLQUFLLEdBQUc0OUIsbUJBQW1CLENBQUMzOUIsSUFBSSxDQUFDYixDQUFDO0VBQzlEMCtCLGdCQUFnQixDQUFDMWEsR0FBRyxDQUFDeVAsTUFBTSxDQUFDM3lCLE1BQU0sR0FBRzA5QixtQkFBbUIsQ0FBQzM5QixJQUFJLENBQUNaLENBQUM7QUFDbkU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTK3ZCLGNBQWNBLENBQUNrUCxPQUFPLEVBQUU7RUFDN0IsSUFBSUMsT0FBTztFQUNYLElBQUlwaUMsQ0FBQztFQUNMLElBQUlDLENBQUM7RUFDTCxJQUFJb2lDLEtBQUs7RUFDVCxJQUFJQyxRQUFRO0VBQ1osSUFBSUMsSUFBSSxHQUFHZCxtQkFBbUIsQ0FBQzM5QixJQUFJLENBQUNiLENBQUM7RUFDckMsSUFBSXUvQixJQUFJLEdBQUdmLG1CQUFtQixDQUFDMzlCLElBQUksQ0FBQ1osQ0FBQztFQUNyQyxJQUFJdS9CLElBQUksR0FBRyxDQUFDaEIsbUJBQW1CLENBQUMzOUIsSUFBSSxDQUFDYixDQUFDO0VBQ3RDLElBQUl5L0IsSUFBSSxHQUFHLENBQUNqQixtQkFBbUIsQ0FBQzM5QixJQUFJLENBQUNaLENBQUM7RUFDdEMsSUFBSWdtQixHQUFHO0VBQ1AsSUFBSW5XLEtBQUs7O0VBRVQ7RUFDQXF2QixPQUFPLEdBQUcsQ0FBQztFQUNYLEtBQUtwaUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHbWlDLE9BQU8sQ0FBQzlpQyxNQUFNLEVBQUVXLENBQUMsRUFBRSxFQUFFO0lBQ2pDcWlDLEtBQUssR0FBR0YsT0FBTyxDQUFDbmlDLENBQUMsQ0FBQztJQUNsQm9pQyxPQUFPLElBQUlDLEtBQUssQ0FBQzFnQyxHQUFHO0lBQ3BCLElBQUlzZSxLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDbU4sV0FBVyxFQUFFO01BQzlDckosV0FBVSxDQUFDcFYsUUFBUSxDQUFDb3VCLEtBQUssQ0FBQ3A2QixHQUFHLEVBQUVtNUIsZ0JBQWdCLENBQUN0OUIsSUFBSSxFQUFFNjlCLGdCQUFnQixDQUFDdDNCLEdBQUcsQ0FBQ3FzQixNQUFNLEVBQUU7UUFBRXRpQixLQUFLLEVBQUU7TUFBTSxDQUFDLENBQUM7SUFDeEc7RUFDSjtFQUVBZ3VCLE9BQU8sSUFBSUQsT0FBTyxDQUFDOWlDLE1BQU07RUFDekIraUMsT0FBTyxHQUFHLENBQUNBLE9BQU8sR0FBRyxHQUFHLEdBQUc5akMsSUFBSSxDQUFDNlQsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRTtFQUNuRCxJQUFJaXdCLE9BQU8sR0FBRyxDQUFDLEVBQUU7SUFDYkEsT0FBTyxJQUFJLEdBQUc7RUFDbEI7RUFFQUEsT0FBTyxHQUFHLENBQUMsR0FBRyxHQUFHQSxPQUFPLElBQUk5akMsSUFBSSxDQUFDNlQsRUFBRSxHQUFHLEdBQUc7RUFDekNtd0IsUUFBUSxHQUFHSyxvQkFBSSxDQUFDQyxJQUFJLENBQUNELG9CQUFJLENBQUNwaEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDakQsSUFBSSxDQUFDOEQsR0FBRyxDQUFDZ2dDLE9BQU8sQ0FBQyxFQUFFOWpDLElBQUksQ0FBQytELEdBQUcsQ0FBQysvQixPQUFPLENBQUMsRUFBRSxDQUFDOWpDLElBQUksQ0FBQytELEdBQUcsQ0FBQysvQixPQUFPLENBQUMsRUFBRTlqQyxJQUFJLENBQUM4RCxHQUFHLENBQUNnZ0MsT0FBTyxDQUFDLENBQUMsQ0FBQzs7RUFFbEg7RUFDQSxLQUFLcGlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR21pQyxPQUFPLENBQUM5aUMsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtJQUNqQ3FpQyxLQUFLLEdBQUdGLE9BQU8sQ0FBQ25pQyxDQUFDLENBQUM7SUFDbEIsS0FBS0MsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxFQUFFLEVBQUU7TUFDcEI0QixvQkFBSSxDQUFDZ2hDLGFBQWEsQ0FBQ1IsS0FBSyxDQUFDblosR0FBRyxDQUFDanBCLENBQUMsQ0FBQyxFQUFFb2lDLEtBQUssQ0FBQ25aLEdBQUcsQ0FBQ2pwQixDQUFDLENBQUMsRUFBRXFpQyxRQUFRLENBQUM7SUFDNUQ7SUFFQSxJQUFJcmlCLEtBQWUsSUFBSTJhLHNCQUFPLENBQUNyVixLQUFLLENBQUMwTixjQUFjLENBQUNDLGVBQWUsRUFBRTtNQUNqRTdKLFdBQVUsQ0FBQzVVLFFBQVEsQ0FBQzR0QixLQUFLLENBQUNuWixHQUFHLEVBQUU7UUFBRWptQixDQUFDLEVBQUUsQ0FBQztRQUFFQyxDQUFDLEVBQUU7TUFBRSxDQUFDLEVBQUV5K0IsZ0JBQWdCLENBQUN0M0IsR0FBRyxDQUFDcXNCLE1BQU0sRUFBRTtRQUFFdGlCLEtBQUssRUFBRSxTQUFTO1FBQUVFLFNBQVMsRUFBRTtNQUFFLENBQUMsQ0FBQztJQUNuSDtFQUNKOztFQUVBO0VBQ0EsS0FBS3RVLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR21pQyxPQUFPLENBQUM5aUMsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtJQUNqQ3FpQyxLQUFLLEdBQUdGLE9BQU8sQ0FBQ25pQyxDQUFDLENBQUM7SUFDbEIsS0FBS0MsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxFQUFFLEVBQUU7TUFDcEIsSUFBSW9pQyxLQUFLLENBQUNuWixHQUFHLENBQUNqcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdzaUMsSUFBSSxFQUFFO1FBQ3hCQSxJQUFJLEdBQUdGLEtBQUssQ0FBQ25aLEdBQUcsQ0FBQ2pwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDMUI7TUFDQSxJQUFJb2lDLEtBQUssQ0FBQ25aLEdBQUcsQ0FBQ2pwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR3dpQyxJQUFJLEVBQUU7UUFDeEJBLElBQUksR0FBR0osS0FBSyxDQUFDblosR0FBRyxDQUFDanBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMxQjtNQUNBLElBQUlvaUMsS0FBSyxDQUFDblosR0FBRyxDQUFDanBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHdWlDLElBQUksRUFBRTtRQUN4QkEsSUFBSSxHQUFHSCxLQUFLLENBQUNuWixHQUFHLENBQUNqcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQzFCO01BQ0EsSUFBSW9pQyxLQUFLLENBQUNuWixHQUFHLENBQUNqcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUd5aUMsSUFBSSxFQUFFO1FBQ3hCQSxJQUFJLEdBQUdMLEtBQUssQ0FBQ25aLEdBQUcsQ0FBQ2pwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDMUI7SUFDSjtFQUNKO0VBRUFpcEIsR0FBRyxHQUFHLENBQUMsQ0FBQ3FaLElBQUksRUFBRUMsSUFBSSxDQUFDLEVBQUUsQ0FBQ0MsSUFBSSxFQUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDQyxJQUFJLEVBQUVDLElBQUksQ0FBQyxFQUFFLENBQUNILElBQUksRUFBRUcsSUFBSSxDQUFDLENBQUM7RUFFOUQsSUFBSXppQixLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDME4sY0FBYyxDQUFDRSxrQkFBa0IsRUFBRTtJQUNwRTlKLFdBQVUsQ0FBQzVVLFFBQVEsQ0FBQ3lVLEdBQUcsRUFBRTtNQUFFam1CLENBQUMsRUFBRSxDQUFDO01BQUVDLENBQUMsRUFBRTtJQUFFLENBQUMsRUFBRXkrQixnQkFBZ0IsQ0FBQ3QzQixHQUFHLENBQUNxc0IsTUFBTSxFQUFFO01BQUV0aUIsS0FBSyxFQUFFLFNBQVM7TUFBRUUsU0FBUyxFQUFFO0lBQUUsQ0FBQyxDQUFDO0VBQzdHO0VBRUF2QixLQUFLLEdBQUc2bkIsc0JBQU8sQ0FBQ3R1QixVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUM7RUFDbEM7RUFDQWcyQixRQUFRLEdBQUdLLG9CQUFJLENBQUNHLE1BQU0sQ0FBQ1IsUUFBUSxFQUFFQSxRQUFRLENBQUM7RUFDMUMsS0FBS3JpQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEVBQUUsRUFBRTtJQUNwQjRCLG9CQUFJLENBQUNnaEMsYUFBYSxDQUFDM1osR0FBRyxDQUFDanBCLENBQUMsQ0FBQyxFQUFFaXBCLEdBQUcsQ0FBQ2pwQixDQUFDLENBQUMsRUFBRXFpQyxRQUFRLENBQUM7RUFDaEQ7RUFFQSxJQUFJcmlCLEtBQWUsSUFBSTJhLHNCQUFPLENBQUNyVixLQUFLLENBQUMwTixjQUFjLENBQUNHLE1BQU0sRUFBRTtJQUN4RC9KLFdBQVUsQ0FBQzVVLFFBQVEsQ0FBQ3lVLEdBQUcsRUFBRTtNQUFFam1CLENBQUMsRUFBRSxDQUFDO01BQUVDLENBQUMsRUFBRTtJQUFFLENBQUMsRUFBRXkrQixnQkFBZ0IsQ0FBQ3QzQixHQUFHLENBQUNxc0IsTUFBTSxFQUFFO01BQUV0aUIsS0FBSyxFQUFFLFNBQVM7TUFBRUUsU0FBUyxFQUFFO0lBQUUsQ0FBQyxDQUFDO0VBQzdHO0VBRUEsS0FBS3JVLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsRUFBRSxFQUFFO0lBQ3BCNEIsb0JBQUksQ0FBQ2tSLEtBQUssQ0FBQ21XLEdBQUcsQ0FBQ2pwQixDQUFDLENBQUMsRUFBRWlwQixHQUFHLENBQUNqcEIsQ0FBQyxDQUFDLEVBQUU4UyxLQUFLLENBQUM7RUFDckM7RUFFQSxPQUFPbVcsR0FBRztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM2WixhQUFhQSxDQUFBLEVBQUc7RUFDckIzOEIsYUFBYSxDQUFDODZCLG9CQUFvQixFQUFFTyxtQkFBbUIsQ0FBQztFQUN4REEsbUJBQW1CLENBQUNud0IsVUFBVSxDQUFDLENBQUM7RUFDaEMsSUFBSTJPLEtBQWUsSUFBSTJhLHNCQUFPLENBQUNyVixLQUFLLENBQUNrTixVQUFVLEVBQUU7SUFDN0NnUCxtQkFBbUIsQ0FBQ3J1QixJQUFJLENBQUN1dUIsZ0JBQWdCLENBQUMxYSxHQUFHLENBQUN5UCxNQUFNLEVBQUUsR0FBRyxDQUFDO0VBQzlEO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTc00sV0FBV0EsQ0FBQSxFQUFHO0VBQ25CLElBQUloakMsQ0FBQztFQUNMLElBQUlDLENBQUM7RUFDTCxJQUFJZ0QsQ0FBQztFQUNMLElBQUlDLENBQUM7RUFDTCxJQUFJc08sT0FBTztFQUNYLElBQUl5eEIsWUFBWSxHQUFHLEVBQUU7RUFDckIsSUFBSUMsVUFBVTtFQUNkLElBQUlDLFlBQVk7RUFDaEIsSUFBSWQsS0FBSztFQUNULEtBQUtyaUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHNGhDLFdBQVcsQ0FBQzMrQixDQUFDLEVBQUVqRCxDQUFDLEVBQUUsRUFBRTtJQUNoQyxLQUFLQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcyaEMsV0FBVyxDQUFDMStCLENBQUMsRUFBRWpELENBQUMsRUFBRSxFQUFFO01BQ2hDZ0QsQ0FBQyxHQUFHbStCLGdCQUFnQixDQUFDdDlCLElBQUksQ0FBQ2IsQ0FBQyxHQUFHakQsQ0FBQztNQUMvQmtELENBQUMsR0FBR2srQixnQkFBZ0IsQ0FBQ3Q5QixJQUFJLENBQUNaLENBQUMsR0FBR2pELENBQUM7O01BRS9CO01BQ0E0Z0MsV0FBVyxDQUFDNTlCLENBQUMsRUFBRUMsQ0FBQyxDQUFDOztNQUVqQjtNQUNBaStCLGlCQUFpQixDQUFDN3ZCLFVBQVUsQ0FBQyxDQUFDO01BQzlCbkwsWUFBVyxDQUFDeEcsSUFBSSxDQUFDMGhDLGtCQUFrQixDQUFDejlCLElBQUksRUFBRSxDQUFDLENBQUM7TUFDNUNzL0IsVUFBVSxHQUFHN0Usa0JBQVUsQ0FBQzk4QixNQUFNLENBQUM0L0IsaUJBQWlCLEVBQUVFLGtCQUFrQixDQUFDO01BQ3JFOEIsWUFBWSxHQUFHRCxVQUFVLENBQUNoRSxTQUFTLENBQUMsQ0FBQyxDQUFDO01BRXRDLElBQUlqZixLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDc04sVUFBVSxFQUFFO1FBQzdDd08sa0JBQWtCLENBQUM1dEIsT0FBTyxDQUFDa3VCLGdCQUFnQixDQUFDMWEsR0FBRyxDQUFDeVAsTUFBTSxFQUFFcDRCLElBQUksQ0FBQzRCLEtBQUssQ0FBQyxHQUFHLEdBQUdpakMsWUFBWSxDQUFDbHRCLEtBQUssQ0FBQyxFQUN4RjtVQUFFaFQsQ0FBQyxFQUFEQSxDQUFDO1VBQUVDLENBQUMsRUFBREE7UUFBRSxDQUFDLENBQUM7TUFDakI7O01BRUE7TUFDQXNPLE9BQU8sR0FBRzZ2QixrQkFBa0IsQ0FBQzd2QixPQUFPLENBQUMyeEIsWUFBWSxDQUFDbHRCLEtBQUssQ0FBQzs7TUFFeEQ7TUFDQWd0QixZQUFZLEdBQUdBLFlBQVksQ0FBQ3RpQyxNQUFNLENBQUN5aUMsYUFBYSxDQUFDNXhCLE9BQU8sRUFBRSxDQUFDeFIsQ0FBQyxFQUFFQyxDQUFDLENBQUMsRUFBRWdELENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUM7SUFDNUU7RUFDSjtFQUVBLElBQUkrYyxLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDb04sZ0JBQWdCLEVBQUU7SUFDbkQsS0FBSzN5QixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdpakMsWUFBWSxDQUFDNWpDLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7TUFDdENxaUMsS0FBSyxHQUFHWSxZQUFZLENBQUNqakMsQ0FBQyxDQUFDO01BQ3ZCcXBCLFdBQVUsQ0FBQ3BWLFFBQVEsQ0FBQ291QixLQUFLLENBQUNwNkIsR0FBRyxFQUFFbTVCLGdCQUFnQixDQUFDdDlCLElBQUksRUFBRTY5QixnQkFBZ0IsQ0FBQ3QzQixHQUFHLENBQUNxc0IsTUFBTSxFQUM3RTtRQUFFdGlCLEtBQUssRUFBRSxTQUFTO1FBQUVFLFNBQVMsRUFBRTtNQUFFLENBQUMsQ0FBQztJQUMzQztFQUNKO0VBRUEsT0FBTzJ1QixZQUFZO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTSSx5QkFBeUJBLENBQUNDLFFBQVEsRUFBRTtFQUN6QyxJQUFJdGpDLENBQUM7RUFDTCxJQUFJc0IsR0FBRztFQUNQLElBQUlpaUMsU0FBUyxHQUFHLEVBQUU7RUFDbEIsSUFBSUMsU0FBUyxHQUFHLEVBQUU7RUFFbEIsS0FBS3hqQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdzakMsUUFBUSxFQUFFdGpDLENBQUMsRUFBRSxFQUFFO0lBQzNCdWpDLFNBQVMsQ0FBQzFpQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3JCO0VBQ0FTLEdBQUcsR0FBR2lnQyxlQUFlLENBQUMzOUIsSUFBSSxDQUFDdkUsTUFBTTtFQUNqQyxPQUFPaUMsR0FBRyxFQUFFLEVBQUU7SUFDVixJQUFJaWdDLGVBQWUsQ0FBQzM5QixJQUFJLENBQUN0QyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDL0JpaUMsU0FBUyxDQUFDaEMsZUFBZSxDQUFDMzlCLElBQUksQ0FBQ3RDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQzlDO0VBQ0o7RUFFQWlpQyxTQUFTLEdBQUdBLFNBQVMsQ0FBQ25sQixHQUFHLENBQUMsVUFBQ3ZlLEdBQUcsRUFBRTZILEdBQUc7SUFBQSxPQUFNO01BQ3JDN0gsR0FBRyxFQUFIQSxHQUFHO01BQ0grUixLQUFLLEVBQUVsSyxHQUFHLEdBQUc7SUFDakIsQ0FBQztFQUFBLENBQUMsQ0FBQztFQUVINjdCLFNBQVMsQ0FBQ0UsSUFBSSxDQUFDLFVBQUNqbEMsQ0FBQyxFQUFFQyxDQUFDO0lBQUEsT0FBS0EsQ0FBQyxDQUFDb0IsR0FBRyxHQUFHckIsQ0FBQyxDQUFDcUIsR0FBRztFQUFBLEVBQUM7O0VBRXZDO0VBQ0EyakMsU0FBUyxHQUFHRCxTQUFTLENBQUMzVyxNQUFNLENBQUMsVUFBQzhXLEVBQUU7SUFBQSxPQUFLQSxFQUFFLENBQUM3akMsR0FBRyxJQUFJLENBQUM7RUFBQSxFQUFDO0VBRWpELE9BQU8yakMsU0FBUztBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTRyxTQUFTQSxDQUFDSCxTQUFTLEVBQUVGLFFBQVEsRUFBRTtFQUNwQyxJQUFJdGpDLENBQUM7RUFDTCxJQUFJQyxDQUFDO0VBQ0wsSUFBSXFCLEdBQUc7RUFDUCxJQUFNNmdDLE9BQU8sR0FBRyxFQUFFO0VBQ2xCLElBQUlFLEtBQUs7RUFDVCxJQUFJblosR0FBRztFQUNQLElBQU1zQyxLQUFLLEdBQUcsRUFBRTtFQUNoQixJQUFNNWUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDckIsSUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7RUFFckIsS0FBSzdNLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3dqQyxTQUFTLENBQUNua0MsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtJQUNuQ3NCLEdBQUcsR0FBR2lnQyxlQUFlLENBQUMzOUIsSUFBSSxDQUFDdkUsTUFBTTtJQUNqQzhpQyxPQUFPLENBQUM5aUMsTUFBTSxHQUFHLENBQUM7SUFDbEIsT0FBT2lDLEdBQUcsRUFBRSxFQUFFO01BQ1YsSUFBSWlnQyxlQUFlLENBQUMzOUIsSUFBSSxDQUFDdEMsR0FBRyxDQUFDLEtBQUtraUMsU0FBUyxDQUFDeGpDLENBQUMsQ0FBQyxDQUFDNFIsS0FBSyxFQUFFO1FBQ2xEeXdCLEtBQUssR0FBR2IsaUJBQWlCLENBQUM1OUIsSUFBSSxDQUFDdEMsR0FBRyxDQUFDO1FBQ25DNmdDLE9BQU8sQ0FBQ3RoQyxJQUFJLENBQUN3aEMsS0FBSyxDQUFDO01BQ3ZCO0lBQ0o7SUFDQW5aLEdBQUcsR0FBRytKLGNBQWMsQ0FBQ2tQLE9BQU8sQ0FBQztJQUM3QixJQUFJalosR0FBRyxFQUFFO01BQ0xzQyxLQUFLLENBQUMzcUIsSUFBSSxDQUFDcW9CLEdBQUcsQ0FBQzs7TUFFZjtNQUNBLElBQUlqSixLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDd04sd0JBQXdCLEVBQUU7UUFDM0QsS0FBSzl5QixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdraUMsT0FBTyxDQUFDOWlDLE1BQU0sRUFBRVksQ0FBQyxFQUFFLEVBQUU7VUFDakNvaUMsS0FBSyxHQUFHRixPQUFPLENBQUNsaUMsQ0FBQyxDQUFDO1VBQ2xCMk0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFJNDJCLFNBQVMsQ0FBQ3hqQyxDQUFDLENBQUMsQ0FBQzRSLEtBQUssSUFBSTB4QixRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUksR0FBRztVQUNwRDMyQixPQUFPLENBQUNDLEdBQUcsRUFBRUMsR0FBRyxDQUFDO1VBQ2pCd2MsV0FBVSxDQUFDcFYsUUFBUSxDQUFDb3VCLEtBQUssQ0FBQ3A2QixHQUFHLEVBQUVtNUIsZ0JBQWdCLENBQUN0OUIsSUFBSSxFQUFFNjlCLGdCQUFnQixDQUFDdDNCLEdBQUcsQ0FBQ3FzQixNQUFNLEVBQzdFO1lBQUV0aUIsS0FBSyxTQUFBelQsTUFBQSxDQUFTa00sR0FBRyxDQUFDak0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFHO1lBQUUwVCxTQUFTLEVBQUU7VUFBRSxDQUFDLENBQUM7UUFDekQ7TUFDSjtJQUNKO0VBQ0o7RUFDQSxPQUFPa1gsS0FBSztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNvWSxjQUFjQSxDQUFDcHlCLE9BQU8sRUFBRTtFQUM3QixJQUFNMUssUUFBUSxHQUFHRixnQkFBTyxDQUFDNEssT0FBTyxFQUFFLElBQUksQ0FBQztFQUN2QyxJQUFNcXlCLFVBQVUsR0FBR3A2QixVQUFVLENBQUMzQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQUNna0IsQ0FBQztJQUFBLE9BQUtBLENBQUMsQ0FBQ25vQixTQUFTLENBQUMsQ0FBQyxDQUFDdEQsTUFBTTtFQUFBLEVBQUM7RUFDdkUsSUFBSW9DLE1BQU0sR0FBRyxFQUFFO0VBQUUsSUFDYjhGLE1BQU0sR0FBRyxFQUFFO0VBQ2YsSUFBSXM4QixVQUFVLENBQUN4a0MsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUN6Qm9DLE1BQU0sR0FBR29pQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM5NUIsSUFBSSxDQUFDcEgsU0FBUyxDQUFDLENBQUM7SUFDdkMsS0FBSyxJQUFJM0MsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeUIsTUFBTSxDQUFDcEMsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtNQUNwQ3VILE1BQU0sQ0FBQzFHLElBQUksQ0FBQ1ksTUFBTSxDQUFDekIsQ0FBQyxDQUFDLENBQUN3QixLQUFLLENBQUM7SUFDaEM7RUFDSjtFQUNBLE9BQU8rRixNQUFNO0FBQ2pCO0FBRUEsU0FBU3M1QixXQUFXQSxDQUFDNTlCLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ3ZCdStCLG1CQUFtQixDQUFDM3dCLGNBQWMsQ0FBQ3N3QixnQkFBZ0IsRUFBRXArQixRQUFRLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUM7RUFDcEU0K0IsYUFBYSxDQUFDakIsV0FBVyxDQUFDLENBQUM7O0VBRTNCO0VBQ0EsSUFBSTVnQixLQUFlLElBQUkyYSxzQkFBTyxDQUFDclYsS0FBSyxDQUFDcU4sWUFBWSxFQUFFO0lBQy9DdU8saUJBQWlCLENBQUMxdEIsT0FBTyxDQUFDa3VCLGdCQUFnQixDQUFDMWEsR0FBRyxDQUFDeVAsTUFBTSxFQUFFLEdBQUcsRUFBRTF6QixRQUFRLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxDQUFDLENBQUM7RUFDL0U7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU2tnQyxhQUFhQSxDQUFDNXhCLE9BQU8sRUFBRXN5QixRQUFRLEVBQUU3Z0MsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDNUMsSUFBSWdELENBQUM7RUFDTCxJQUFJUyxHQUFHO0VBQ1AsSUFBTW85QixlQUFlLEdBQUcsRUFBRTtFQUMxQixJQUFJQyxlQUFlO0VBQ25CLElBQUkzQixLQUFLO0VBQ1QsSUFBTVksWUFBWSxHQUFHLEVBQUU7RUFDdkIsSUFBTWdCLGtCQUFrQixHQUFHM2xDLElBQUksQ0FBQzRkLElBQUksQ0FBQ3dsQixVQUFVLENBQUN6K0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUV0RCxJQUFJdU8sT0FBTyxDQUFDblMsTUFBTSxJQUFJLENBQUMsRUFBRTtJQUNyQjtJQUNBLEtBQUs2RyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdzTCxPQUFPLENBQUNuUyxNQUFNLEVBQUU2RyxDQUFDLEVBQUUsRUFBRTtNQUNqQyxJQUFJc0wsT0FBTyxDQUFDdEwsQ0FBQyxDQUFDLENBQUNtTSxHQUFHLEdBQUc0eEIsa0JBQWtCLEVBQUU7UUFDckNGLGVBQWUsQ0FBQ2xqQyxJQUFJLENBQUMyUSxPQUFPLENBQUN0TCxDQUFDLENBQUMsQ0FBQztNQUNwQztJQUNKOztJQUVBO0lBQ0EsSUFBSTY5QixlQUFlLENBQUMxa0MsTUFBTSxJQUFJLENBQUMsRUFBRTtNQUM3QjJrQyxlQUFlLEdBQUdKLGNBQWMsQ0FBQ0csZUFBZSxDQUFDO01BQ2pEcDlCLEdBQUcsR0FBRyxDQUFDO01BQ1A7TUFDQSxLQUFLVCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUc4OUIsZUFBZSxDQUFDM2tDLE1BQU0sRUFBRTZHLENBQUMsRUFBRSxFQUFFO1FBQUEsSUFBQWcrQixxQkFBQSxFQUFBQyxrQkFBQTtRQUN6Q3g5QixHQUFHLEtBQUF1OUIscUJBQUEsSUFBQUMsa0JBQUEsR0FBSUgsZUFBZSxDQUFDOTlCLENBQUMsQ0FBQyxjQUFBaStCLGtCQUFBLHVCQUFsQkEsa0JBQUEsQ0FBb0J4aUMsR0FBRyxjQUFBdWlDLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksQ0FBQztNQUN2Qzs7TUFFQTtNQUNBO01BQ0EsSUFBSUYsZUFBZSxDQUFDM2tDLE1BQU0sR0FBRyxDQUFDLElBQ25CMmtDLGVBQWUsQ0FBQzNrQyxNQUFNLElBQUswa0MsZUFBZSxDQUFDMWtDLE1BQU0sR0FBRyxDQUFDLEdBQUksQ0FBQyxJQUMxRDJrQyxlQUFlLENBQUMza0MsTUFBTSxHQUFHbVMsT0FBTyxDQUFDblMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwRHNILEdBQUcsSUFBSXE5QixlQUFlLENBQUMza0MsTUFBTTtRQUM3QmdqQyxLQUFLLEdBQUc7VUFDSmxqQyxLQUFLLEVBQUUya0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHbEMsV0FBVyxDQUFDMytCLENBQUMsR0FBRzZnQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1VBQ2hENzdCLEdBQUcsRUFBRTtZQUNEaEYsQ0FBQyxFQUFEQSxDQUFDO1lBQ0RDLENBQUMsRUFBREE7VUFDSixDQUFDO1VBQ0RnbUIsR0FBRyxFQUFFLENBQ0RybkIsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUNtQixDQUFDLEVBQUVDLENBQUMsQ0FBQyxDQUFDLEVBQ2xCckIsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUNtQixDQUFDLEdBQUdtK0IsZ0JBQWdCLENBQUN0OUIsSUFBSSxDQUFDYixDQUFDLEVBQUVDLENBQUMsQ0FBQyxDQUFDLEVBQzVDckIsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUNtQixDQUFDLEdBQUdtK0IsZ0JBQWdCLENBQUN0OUIsSUFBSSxDQUFDYixDQUFDLEVBQUVDLENBQUMsR0FBR2srQixnQkFBZ0IsQ0FBQ3Q5QixJQUFJLENBQUNaLENBQUMsQ0FBQyxDQUFDLEVBQ3RFckIsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUNtQixDQUFDLEVBQUVDLENBQUMsR0FBR2srQixnQkFBZ0IsQ0FBQ3Q5QixJQUFJLENBQUNaLENBQUMsQ0FBQyxDQUFDLENBQy9DO1VBQ0RzTyxPQUFPLEVBQUV3eUIsZUFBZTtVQUN4QnJpQyxHQUFHLEVBQUVnRixHQUFHO1VBQ1IvRSxHQUFHLEVBQUVDLG9CQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDeEQsSUFBSSxDQUFDOEQsR0FBRyxDQUFDdUUsR0FBRyxDQUFDLEVBQUVySSxJQUFJLENBQUMrRCxHQUFHLENBQUNzRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0RzOEIsWUFBWSxDQUFDcGlDLElBQUksQ0FBQ3doQyxLQUFLLENBQUM7TUFDNUI7SUFDSjtFQUNKO0VBQ0EsT0FBT1ksWUFBWTtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNtQiwwQkFBMEJBLENBQUNuQixZQUFZLEVBQUU7RUFDOUMsSUFBSXJ4QixLQUFLLEdBQUcsQ0FBQztFQUNiLElBQU05USxTQUFTLEdBQUcsSUFBSTtFQUN0QixJQUFJdWpDLE9BQU8sR0FBRyxDQUFDO0VBQ2YsSUFBSXBrQyxDQUFDO0VBQ0wsSUFBSW9pQyxLQUFLO0VBQ1QsSUFBTXoxQixHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUNyQixJQUFNQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUVyQixTQUFTeTNCLGVBQWVBLENBQUEsRUFBRztJQUN2QixJQUFJdGtDLENBQUM7SUFDTCxLQUFLQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd1aEMsZUFBZSxDQUFDMzlCLElBQUksQ0FBQ3ZFLE1BQU0sRUFBRVcsQ0FBQyxFQUFFLEVBQUU7TUFDOUMsSUFBSXVoQyxlQUFlLENBQUMzOUIsSUFBSSxDQUFDNUQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJc2hDLFVBQVUsQ0FBQzE5QixJQUFJLENBQUM1RCxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDM0QsT0FBT0EsQ0FBQztNQUNaO0lBQ0o7SUFDQSxPQUFPdWhDLGVBQWUsQ0FBQzM5QixJQUFJLENBQUN2RSxNQUFNO0VBQ3RDO0VBRUEsU0FBUzhILEtBQUtBLENBQUNvOUIsVUFBVSxFQUFFO0lBQ3ZCLElBQUl0aEMsQ0FBQztJQUNMLElBQUlDLENBQUM7SUFDTCxJQUFJc2hDLFlBQVk7SUFDaEIsSUFBSTk4QixHQUFHO0lBQ1AsSUFBSTJkLEdBQUc7SUFDUCxJQUFNbFMsT0FBTyxHQUFHO01BQ1psUSxDQUFDLEVBQUVzaEMsVUFBVSxHQUFHaEQsZUFBZSxDQUFDejlCLElBQUksQ0FBQ2IsQ0FBQztNQUN0Q0MsQ0FBQyxFQUFHcWhDLFVBQVUsR0FBR2hELGVBQWUsQ0FBQ3o5QixJQUFJLENBQUNiLENBQUMsR0FBSTtJQUMvQyxDQUFDO0lBQ0QsSUFBSVQsVUFBVTtJQUVkLElBQUkraEMsVUFBVSxHQUFHaEQsZUFBZSxDQUFDMzlCLElBQUksQ0FBQ3ZFLE1BQU0sRUFBRTtNQUMxQ21sQyxZQUFZLEdBQUdoRCxpQkFBaUIsQ0FBQzU5QixJQUFJLENBQUMyZ0MsVUFBVSxDQUFDO01BQ2pEO01BQ0FoRCxlQUFlLENBQUMzOUIsSUFBSSxDQUFDMmdDLFVBQVUsQ0FBQyxHQUFHM3lCLEtBQUs7TUFDeEMsS0FBS3lULEdBQUcsR0FBRyxDQUFDLEVBQUVBLEdBQUcsR0FBR25lLGNBQU0sQ0FBQ3EyQixnQkFBZ0IsQ0FBQ2wrQixNQUFNLEVBQUVnbUIsR0FBRyxFQUFFLEVBQUU7UUFDdkRuaUIsQ0FBQyxHQUFHaVEsT0FBTyxDQUFDalEsQ0FBQyxHQUFHZ0UsY0FBTSxDQUFDcTJCLGdCQUFnQixDQUFDbFksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DcGlCLENBQUMsR0FBR2tRLE9BQU8sQ0FBQ2xRLENBQUMsR0FBR2lFLGNBQU0sQ0FBQ3EyQixnQkFBZ0IsQ0FBQ2xZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQzNkLEdBQUcsR0FBR3hFLENBQUMsR0FBR3ErQixlQUFlLENBQUN6OUIsSUFBSSxDQUFDYixDQUFDLEdBQUdBLENBQUM7O1FBRXBDO1FBQ0EsSUFBSXErQixVQUFVLENBQUMxOUIsSUFBSSxDQUFDOEQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1VBQzVCNjVCLGVBQWUsQ0FBQzM5QixJQUFJLENBQUM4RCxHQUFHLENBQUMsR0FBR3NDLE1BQU0sQ0FBQ0MsU0FBUztVQUM1QztVQUNBO1FBQ0o7UUFFQSxJQUFJczNCLGVBQWUsQ0FBQzM5QixJQUFJLENBQUM4RCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7VUFDakNsRixVQUFVLEdBQUdsRSxJQUFJLENBQUNtRSxHQUFHLENBQUNaLG9CQUFJLENBQUNhLEdBQUcsQ0FBQzgrQixpQkFBaUIsQ0FBQzU5QixJQUFJLENBQUM4RCxHQUFHLENBQUMsQ0FBQzlGLEdBQUcsRUFBRTRpQyxZQUFZLENBQUM1aUMsR0FBRyxDQUFDLENBQUM7VUFDbEYsSUFBSVksVUFBVSxHQUFHMUIsU0FBUyxFQUFFO1lBQ3hCcUcsS0FBSyxDQUFDTyxHQUFHLENBQUM7VUFDZDtRQUNKO01BQ0o7SUFDSjtFQUNKOztFQUVBO0VBQ0F2QixZQUFXLENBQUN4RyxJQUFJLENBQUMyaEMsVUFBVSxDQUFDMTlCLElBQUksRUFBRSxDQUFDLENBQUM7RUFDcEN1QyxZQUFXLENBQUN4RyxJQUFJLENBQUM0aEMsZUFBZSxDQUFDMzlCLElBQUksRUFBRSxDQUFDLENBQUM7RUFDekN1QyxZQUFXLENBQUN4RyxJQUFJLENBQUM2aEMsaUJBQWlCLENBQUM1OUIsSUFBSSxFQUFFLElBQUksQ0FBQztFQUU5QyxLQUFLM0QsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHZ2pDLFlBQVksQ0FBQzVqQyxNQUFNLEVBQUVZLENBQUMsRUFBRSxFQUFFO0lBQ3RDb2lDLEtBQUssR0FBR1ksWUFBWSxDQUFDaGpDLENBQUMsQ0FBQztJQUN2QnVoQyxpQkFBaUIsQ0FBQzU5QixJQUFJLENBQUN5K0IsS0FBSyxDQUFDbGpDLEtBQUssQ0FBQyxHQUFHa2pDLEtBQUs7SUFDM0NmLFVBQVUsQ0FBQzE5QixJQUFJLENBQUN5K0IsS0FBSyxDQUFDbGpDLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDcEM7O0VBRUE7RUFDQW1pQyxVQUFVLENBQUNod0IsVUFBVSxDQUFDLENBQUM7O0VBRXZCO0VBQ0EsT0FBTyxDQUFDK3lCLE9BQU8sR0FBR0MsZUFBZSxDQUFDLENBQUMsSUFBSS9DLGVBQWUsQ0FBQzM5QixJQUFJLENBQUN2RSxNQUFNLEVBQUU7SUFDaEV1UyxLQUFLLEVBQUU7SUFDUHpLLEtBQUssQ0FBQ2s5QixPQUFPLENBQUM7RUFDbEI7O0VBRUE7RUFDQSxJQUFJcGtCLEtBQWUsSUFBSTJhLHNCQUFPLENBQUNyVixLQUFLLENBQUN1TixlQUFlLEVBQUU7SUFDbEQsS0FBSzd5QixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdzaEMsZUFBZSxDQUFDMzlCLElBQUksQ0FBQ3ZFLE1BQU0sRUFBRVksQ0FBQyxFQUFFLEVBQUU7TUFDOUMsSUFBSXNoQyxlQUFlLENBQUMzOUIsSUFBSSxDQUFDM0QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJc2hDLGVBQWUsQ0FBQzM5QixJQUFJLENBQUMzRCxDQUFDLENBQUMsSUFBSTJSLEtBQUssRUFBRTtRQUNqRXl3QixLQUFLLEdBQUdiLGlCQUFpQixDQUFDNTlCLElBQUksQ0FBQzNELENBQUMsQ0FBQztRQUNqQzJNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBSTIwQixlQUFlLENBQUMzOUIsSUFBSSxDQUFDM0QsQ0FBQyxDQUFDLElBQUkyUixLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUksR0FBRztRQUN0RGpGLE9BQU8sQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLENBQUM7UUFDakJ3YyxXQUFVLENBQUNwVixRQUFRLENBQUNvdUIsS0FBSyxDQUFDcDZCLEdBQUcsRUFBRW01QixnQkFBZ0IsQ0FBQ3Q5QixJQUFJLEVBQUU2OUIsZ0JBQWdCLENBQUN0M0IsR0FBRyxDQUFDcXNCLE1BQU0sRUFDN0U7VUFBRXRpQixLQUFLLFNBQUF6VCxNQUFBLENBQVNrTSxHQUFHLENBQUNqTSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQUc7VUFBRTBULFNBQVMsRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN6RDtJQUNKO0VBQ0o7RUFFQSxPQUFPMUMsS0FBSztBQUNoQjtBQUVlO0VBQ1hqUyxJQUFJLFdBQUpBLElBQUlBLENBQUNtbkIsaUJBQWlCLEVBQUV4YixNQUFNLEVBQUU7SUFDNUJzdkIsc0JBQU8sR0FBR3R2QixNQUFNO0lBQ2hCdTJCLGtCQUFrQixHQUFHL2EsaUJBQWlCO0lBRXRDaWIsMkJBQVcsQ0FBQyxDQUFDO0lBQ2I1YSwwQkFBVSxDQUFDLENBQUM7RUFDaEIsQ0FBQztFQUVEa0wsTUFBTSxXQUFOQSxNQUFNQSxDQUFBLEVBQUc7SUFDTCxJQUFJdUksc0JBQU8sQ0FBQ3R1QixVQUFVLEVBQUU7TUFDcEJBLFVBQVUsQ0FBQ3UxQixrQkFBa0IsRUFBRVgsb0JBQW9CLENBQUM7SUFDeEQ7SUFFQTZCLGFBQWEsQ0FBQyxDQUFDO0lBQ2YsSUFBTUUsWUFBWSxHQUFHRCxXQUFXLENBQUMsQ0FBQztJQUNsQztJQUNBLElBQUlDLFlBQVksQ0FBQzVqQyxNQUFNLEdBQUd1aUMsV0FBVyxDQUFDMytCLENBQUMsR0FBRzIrQixXQUFXLENBQUMxK0IsQ0FBQyxHQUFHLElBQUksRUFBRTtNQUM1RCxPQUFPLElBQUk7SUFDZjs7SUFFQTtJQUNBLElBQU1vZ0MsUUFBUSxHQUFHYywwQkFBMEIsQ0FBQ25CLFlBQVksQ0FBQztJQUN6RCxJQUFJSyxRQUFRLEdBQUcsQ0FBQyxFQUFFO01BQ2QsT0FBTyxJQUFJO0lBQ2Y7O0lBRUE7SUFDQSxJQUFNRSxTQUFTLEdBQUdILHlCQUF5QixDQUFDQyxRQUFRLENBQUM7SUFDckQsSUFBSUUsU0FBUyxDQUFDbmtDLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDeEIsT0FBTyxJQUFJO0lBQ2Y7SUFFQSxJQUFNbXNCLEtBQUssR0FBR21ZLFNBQVMsQ0FBQ0gsU0FBUyxFQUFFRixRQUFRLENBQUM7SUFDNUMsT0FBTzlYLEtBQUs7RUFDaEIsQ0FBQztFQUVEaVoscUJBQXFCLFdBQXJCQSxxQkFBcUJBLENBQUN2UyxXQUFXLEVBQUU1bUIsTUFBTSxFQUFFO0lBQUEsSUFBQXljLGNBQUE7SUFDdkMsSUFBSWxhLFNBQVM7SUFDYixJQUFJaEssS0FBSyxHQUFHcXVCLFdBQVcsQ0FBQ3VDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLElBQUkxd0IsTUFBTSxHQUFHbXVCLFdBQVcsQ0FBQ3dDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLElBQU1nUSxjQUFjLEdBQUdwNUIsTUFBTSxDQUFDZ0IsVUFBVSxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2xELElBQUltRCxJQUFJOztJQUVSO0lBQ0EsSUFBSXlpQixXQUFXLENBQUNnQyxTQUFTLENBQUMsQ0FBQyxDQUFDemtCLElBQUksRUFBRTtNQUM5QkEsSUFBSSxHQUFHSCxnQkFBZ0IsQ0FBQ3pMLEtBQUssRUFBRUUsTUFBTSxFQUFFbXVCLFdBQVcsQ0FBQ2dDLFNBQVMsQ0FBQyxDQUFDLENBQUN6a0IsSUFBSSxDQUFDO01BQ3BFeWlCLFdBQVcsQ0FBQ2lLLFdBQVcsQ0FBQztRQUFFbDVCLENBQUMsRUFBRXdNLElBQUksQ0FBQ00sRUFBRTtRQUFFN00sQ0FBQyxFQUFFdU0sSUFBSSxDQUFDTztNQUFHLENBQUMsQ0FBQztNQUNuRGtpQixXQUFXLENBQUNrSyxhQUFhLENBQUM7UUFBRW41QixDQUFDLEVBQUVZLEtBQUs7UUFBRVgsQ0FBQyxFQUFFYTtNQUFPLENBQUMsQ0FBQztNQUNsREYsS0FBSyxHQUFHNEwsSUFBSSxDQUFDUSxFQUFFO01BQ2ZsTSxNQUFNLEdBQUcwTCxJQUFJLENBQUNTLEVBQUU7SUFDcEI7SUFFQSxJQUFNcE0sSUFBSSxHQUFHO01BQ1RiLENBQUMsRUFBRTNFLElBQUksQ0FBQzRCLEtBQUssQ0FBQzJELEtBQUssR0FBRzZnQyxjQUFjLENBQUM7TUFDckN4aEMsQ0FBQyxFQUFFNUUsSUFBSSxDQUFDNEIsS0FBSyxDQUFDNkQsTUFBTSxHQUFHMmdDLGNBQWM7SUFDekMsQ0FBQztJQUVENzJCLFNBQVMsR0FBR0Qsa0JBQWtCLENBQUN0QyxNQUFNLENBQUN1QyxTQUFTLEVBQUUvSixJQUFJLENBQUM7SUFDdEQsSUFBSW1jLEtBQWUsS0FBQThILGNBQUEsR0FBSXpjLE1BQU0sQ0FBQ2lhLEtBQUssY0FBQXdDLGNBQUEsZUFBWkEsY0FBQSxDQUFjaUwsYUFBYSxFQUFFO01BQ2hEL21CLE9BQU8sQ0FBQ2lVLEdBQUcsZ0JBQUF2ZixNQUFBLENBQWdCd25CLElBQUksQ0FBQ0MsU0FBUyxDQUFDdmEsU0FBUyxDQUFDLENBQUUsQ0FBQztJQUMzRDtJQUVBcWtCLFdBQVcsQ0FBQ21KLFFBQVEsQ0FBQy84QixJQUFJLENBQUMrQyxHQUFHLENBQUMvQyxJQUFJLENBQUM0QixLQUFLLENBQUM1QixJQUFJLENBQUM0QixLQUFLLENBQUM0RCxJQUFJLENBQUNiLENBQUMsR0FBRzRLLFNBQVMsQ0FBQzVLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBR3loQyxjQUFjLENBQUMsR0FBRzcyQixTQUFTLENBQUM1SyxDQUFDLENBQUMsRUFBRTRLLFNBQVMsQ0FBQzVLLENBQUMsQ0FBQyxDQUFDO0lBQzlIaXZCLFdBQVcsQ0FBQ29KLFNBQVMsQ0FBQ2g5QixJQUFJLENBQUMrQyxHQUFHLENBQUMvQyxJQUFJLENBQUM0QixLQUFLLENBQUM1QixJQUFJLENBQUM0QixLQUFLLENBQUM0RCxJQUFJLENBQUNaLENBQUMsR0FBRzJLLFNBQVMsQ0FBQzNLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBR3doQyxjQUFjLENBQUMsR0FBRzcyQixTQUFTLENBQUMzSyxDQUFDLENBQUMsRUFBRTJLLFNBQVMsQ0FBQzNLLENBQUMsQ0FBQyxDQUFDO0lBRS9ILElBQUtndkIsV0FBVyxDQUFDdUMsUUFBUSxDQUFDLENBQUMsR0FBRzVtQixTQUFTLENBQUM1SyxDQUFDLEtBQU0sQ0FBQyxJQUFLaXZCLFdBQVcsQ0FBQ3dDLFNBQVMsQ0FBQyxDQUFDLEdBQUc3bUIsU0FBUyxDQUFDM0ssQ0FBQyxLQUFNLENBQUMsRUFBRTtNQUMvRixPQUFPLElBQUk7SUFDZjtJQUVBLE1BQU0sSUFBSWtOLEtBQUsscUVBQUF6UCxNQUFBLENBQ1hrRCxLQUFLLG9CQUFBbEQsTUFBQSxDQUFpQm9ELE1BQU0sMkJBQUFwRCxNQUFBLENBQ1JrTixTQUFTLENBQUM1SyxDQUFDLENBQUUsQ0FBQztFQUMxQztBQUNKLENBQUMsRTs7Ozs7QUNobEJNLElBQU0waEMsMkJBQWEsZ0JBQUFqMEIscUJBQUEsVUFBQWkwQixjQUFBO0VBQUFuMEIsd0JBQUEsT0FBQW0wQixhQUFBO0VBQUFsMEIsd0JBQUE7RUFBQUEsd0JBQUE7RUFBQUEsd0JBQUE7RUFBQUEsd0JBQUE7RUFBQUEsd0JBQUEsa0JBU0ksS0FBSztFQUFBQSx3QkFBQTtFQUFBQSx3QkFBQTtFQUFBQSx3QkFBQTtFQUFBQSx3QkFBQSxxQkFRSixFQUFFO0VBQUFBLHdCQUFBLHFCQUVULElBQUk7RUFBQUEsd0JBQUEsMEJBRVUsSUFBSW0wQiw2QkFBZSxDQUFDLENBQUM7QUFBQTtBQUdwRCxJQUFNQyx3QkFBVSxnQkFBQW4wQixxQkFBQSxVQUFBbTBCLFdBQUE7RUFBQXIwQix3QkFBQSxPQUFBcTBCLFVBQUE7RUFBQXAwQix3QkFBQTtFQUFBQSx3QkFBQTtBQUFBO0FBS2hCLElBQU1tMEIsNkJBQWUsZ0JBQUFsMEIscUJBQUEsQ0FJeEIsU0FBQWswQixnQkFBQSxFQUFjO0VBQUFwMEIsd0JBQUEsT0FBQW8wQixlQUFBO0VBQUFuMEIsd0JBQUE7RUFBQUEsd0JBQUE7RUFDVixJQUFJLENBQUNwRyxHQUFHLEdBQUcsSUFBSXc2Qix3QkFBVSxDQUFDLENBQUM7RUFDM0IsSUFBSSxDQUFDNWQsR0FBRyxHQUFHLElBQUk0ZCx3QkFBVSxDQUFDLENBQUM7QUFDL0IsQ0FBQyxFOztBQ3ZDVSxTQUFTQyx1QkFBV0EsQ0FBQzlsQyxNQUF5QixFQUFrQjtFQUMzRSxJQUFJLE9BQU80TSxRQUFRLEtBQUssV0FBVyxFQUFFO0lBQ2pDLE9BQU8sSUFBSTtFQUNmOztFQUVBO0VBQ0EsSUFBSTVNLE1BQU0sWUFBWStsQyxXQUFXLElBQUkvbEMsTUFBTSxDQUFDZ21DLFFBQVEsSUFBSWhtQyxNQUFNLENBQUNpbUMsUUFBUSxLQUFLLENBQUMsRUFBRTtJQUMzRSxPQUFPam1DLE1BQU07RUFDakI7RUFDQTtFQUNBLElBQU1rbUMsUUFBUSxHQUFHLE9BQU9sbUMsTUFBTSxLQUFLLFFBQVEsR0FBR0EsTUFBTSxHQUFHLHVCQUF1QjtFQUM5RSxPQUFPNE0sUUFBUSxDQUFDNGIsYUFBYSxDQUFDMGQsUUFBUSxDQUFDO0FBQzNDLEM7O0FDWmlDO0FBQ2tCO0FBRUs7O0FBRXhEO0FBQ2UsU0FBU25ELHVCQUFXQSxDQUMvQjdQLFdBQXdCLEVBQ3hCenVCLFlBQXNDLEVBQ3RDK3VCLE9BQVksRUFDZDtFQUFBLElBQUFvSSxPQUFBLEVBQUF0VCxhQUFBO0VBQ0UsSUFBTVIsaUJBQWlCLEdBQUdyakIsWUFBWSxJQUFJLElBQUk0TSxhQUFZLENBQUM7SUFDdkRwTixDQUFDLEVBQUVpdkIsV0FBVyxDQUFDdUMsUUFBUSxDQUFDLENBQUM7SUFDekJ2eEIsQ0FBQyxFQUFFZ3ZCLFdBQVcsQ0FBQ3dDLFNBQVMsQ0FBQyxDQUFDO0lBQzFCdkMsSUFBSSxFQUFFO0VBQ1YsQ0FBQyxDQUFDO0VBRUYsSUFBSWxTLEtBQWUsS0FBQTJhLE9BQUEsR0FBS3BJLE9BQU8sQ0FBU2xuQixNQUFNLGNBQUFzdkIsT0FBQSxnQkFBQXRULGFBQUEsR0FBdkJzVCxPQUFBLENBQXlCclYsS0FBSyxjQUFBK0IsYUFBQSxlQUE5QkEsYUFBQSxDQUFnQzhLLGdCQUFnQixFQUFFO0lBQ3JFbm1CLE9BQU8sQ0FBQ2lVLEdBQUcsdUJBQUF2ZixNQUFBLENBQXVCbW1CLGlCQUFpQixDQUFDaGpCLElBQUksQ0FBRSxDQUFDO0VBQy9EO0VBQ0EsSUFBTXFoQyxPQUFPLEdBQUcsQ0FDWnRqQyxvQkFBSSxDQUFDQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDbEJELG9CQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRWdsQixpQkFBaUIsQ0FBQ2hqQixJQUFJLENBQUNaLENBQUMsQ0FBQyxDQUFDLEVBQ3pDckIsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLENBQUNnbEIsaUJBQWlCLENBQUNoakIsSUFBSSxDQUFDYixDQUFDLEVBQUU2akIsaUJBQWlCLENBQUNoakIsSUFBSSxDQUFDWixDQUFDLENBQUMsQ0FBQyxFQUNoRXJCLG9CQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDZ2xCLGlCQUFpQixDQUFDaGpCLElBQUksQ0FBQ2IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzVDO0VBQ0RtaUMsZUFBYyxDQUFDemxDLElBQUksQ0FBQ21uQixpQkFBaUIsRUFBRTBMLE9BQU8sQ0FBQztFQUMvQyxPQUFPO0lBQUUxTCxpQkFBaUIsRUFBakJBLGlCQUFpQjtJQUFFcWUsT0FBTyxFQUFQQTtFQUFRLENBQUM7QUFDekMsQzs7QUMzQndDO0FBR3hDLFNBQVNFLGtCQUFrQkEsQ0FBQ0gsUUFBZ0IsRUFBRXpkLFNBQWlCLEVBQUU7RUFDN0QsSUFBSTliLE1BQWdDLEdBQUdDLFFBQVEsQ0FBQzRiLGFBQWEsQ0FBQzBkLFFBQVEsQ0FBQztFQUN2RSxJQUFJLENBQUN2NUIsTUFBTSxFQUFFO0lBQ1RBLE1BQU0sR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3pDRixNQUFNLENBQUM4YixTQUFTLEdBQUdBLFNBQVM7RUFDaEM7RUFDQSxPQUFPOWIsTUFBTTtBQUNqQjtBQUVBLFNBQVMyNUIsbUJBQW1CQSxDQUFDSixRQUFnQixFQUFFemQsU0FBaUIsRUFBRThkLE9BQXFELEVBQUU7RUFBQSxJQUFBQyxjQUFBO0VBQ3JILElBQU03NUIsTUFBTSxHQUFHMDVCLGtCQUFrQixDQUFDSCxRQUFRLEVBQUV6ZCxTQUFTLENBQUM7RUFDdEQsSUFBSXhILEtBQWUsS0FBQXVsQixjQUFBLEdBQUlELE9BQU8sQ0FBQ2hnQixLQUFLLGNBQUFpZ0IsY0FBQSxlQUFiQSxjQUFBLENBQWVwVCxnQkFBZ0IsRUFBRTtJQUNwRG5tQixPQUFPLENBQUNDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztFQUNwRDtFQUNBLElBQU1rRCxPQUFPLEdBQUd6RCxNQUFNLENBQUNRLFVBQVUsQ0FBQyxJQUFJLEVBQUU7SUFBRW9sQixrQkFBa0IsRUFBRWdVLE9BQU8sQ0FBQ2hVO0VBQW1CLENBQUMsQ0FBQztFQUMzRixPQUFPO0lBQUU1bEIsTUFBTSxFQUFOQSxNQUFNO0lBQUV5RCxPQUFPLEVBQVBBO0VBQVEsQ0FBQztBQUM5QjtBQUVBLFNBQVNxMkIsWUFBWUEsQ0FBQ3ZRLFVBQWtCLEVBQUE5MEIsSUFBQSxFQUF1RztFQUFBLElBQW5HbXhCLGtCQUFrQixHQUFBbnhCLElBQUEsQ0FBbEJteEIsa0JBQWtCO0lBQUVoTSxLQUFLLEdBQUFubEIsSUFBQSxDQUFMbWxCLEtBQUs7RUFDakUsSUFBSSxPQUFPM1osUUFBUSxLQUFLLFdBQVcsRUFBRTtJQUNqQyxJQUFNc3VCLEtBQUssR0FBR29MLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLFdBQVcsRUFBRTtNQUFFL1Qsa0JBQWtCLEVBQWxCQSxrQkFBa0I7TUFBRWhNLEtBQUssRUFBTEE7SUFBTSxDQUFDLENBQUM7SUFDakcsSUFBTTlSLE9BQU8sR0FBRzZ4QixtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxlQUFlLEVBQUU7TUFBRS9ULGtCQUFrQixFQUFsQkEsa0JBQWtCO01BQUVoTSxLQUFLLEVBQUxBO0lBQU0sQ0FBQyxDQUFDOztJQUUzRztJQUNBMlUsS0FBSyxDQUFDdnVCLE1BQU0sQ0FBQzlILEtBQUssR0FBRzRQLE9BQU8sQ0FBQzlILE1BQU0sQ0FBQzlILEtBQUssR0FBR3F4QixVQUFVLENBQUNqeUIsQ0FBQztJQUN4RDtJQUNBaTNCLEtBQUssQ0FBQ3Z1QixNQUFNLENBQUM1SCxNQUFNLEdBQUcwUCxPQUFPLENBQUM5SCxNQUFNLENBQUM1SCxNQUFNLEdBQUdteEIsVUFBVSxDQUFDaHlCLENBQUM7SUFFMUQsT0FBTztNQUNIK2pCLEdBQUcsRUFBRTtRQUNEaVQsS0FBSyxFQUFFQSxLQUFLLENBQUN2dUIsTUFBTTtRQUNuQjhILE9BQU8sRUFBRUEsT0FBTyxDQUFDOUg7TUFDckIsQ0FBQztNQUNEdEIsR0FBRyxFQUFFO1FBQ0Q2dkIsS0FBSyxFQUFFQSxLQUFLLENBQUM5cUIsT0FBTztRQUNwQnFFLE9BQU8sRUFBRUEsT0FBTyxDQUFDckU7TUFDckI7SUFDSixDQUFDO0VBQ0w7RUFDQSxPQUFPLElBQUk7QUFDZjtBQUVlLFNBQVMrWCxxQkFBVUEsQ0FBQy9YLE9BQXNCLEVBQTBCO0VBQUEsSUFBQXMyQixlQUFBLEVBQUFDLHFCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLGdCQUFBLEVBQUFDLHFCQUFBO0VBQy9FLElBQU1DLFFBQVEsR0FBR3BCLHVCQUFXLENBQUMxMUIsT0FBTyxhQUFQQSxPQUFPLHdCQUFBczJCLGVBQUEsR0FBUHQyQixPQUFPLENBQUU5RCxNQUFNLGNBQUFvNkIsZUFBQSx3QkFBQUMscUJBQUEsR0FBZkQsZUFBQSxDQUFpQnhULFdBQVcsY0FBQXlULHFCQUFBLHVCQUE1QkEscUJBQUEsQ0FBOEIzbUMsTUFBTSxDQUFDO0VBQ2xFLElBQU1tekIsSUFBSSxHQUFHL2lCLE9BQU8sYUFBUEEsT0FBTyx3QkFBQXcyQixnQkFBQSxHQUFQeDJCLE9BQU8sQ0FBRTlELE1BQU0sY0FBQXM2QixnQkFBQSx3QkFBQUMscUJBQUEsR0FBZkQsZ0JBQUEsQ0FBaUIxVCxXQUFXLGNBQUEyVCxxQkFBQSx1QkFBNUJBLHFCQUFBLENBQThCMVQsSUFBSTtFQUMvQyxJQUFJLENBQUNBLElBQUksRUFBRSxPQUFPLElBQUk7RUFDdEIsSUFBTWdVLFNBQVMsR0FBR1YsWUFBWSxDQUMxQnIyQixPQUFPLENBQUM4aUIsV0FBVyxDQUFDcUMsYUFBYSxDQUFDLENBQUMsRUFDbkM7SUFDSWhELGtCQUFrQixFQUFFLENBQUMsRUFBQ25pQixPQUFPLGFBQVBBLE9BQU8sZ0JBQUEwMkIsZ0JBQUEsR0FBUDEyQixPQUFPLENBQUU5RCxNQUFNLGNBQUF3NkIsZ0JBQUEsZ0JBQUFDLHFCQUFBLEdBQWZELGdCQUFBLENBQWlCNVQsV0FBVyxjQUFBNlQscUJBQUEsZUFBNUJBLHFCQUFBLENBQThCeFUsa0JBQWtCO0lBQ3RFaE0sS0FBSyxFQUFFblcsT0FBTyxhQUFQQSxPQUFPLHdCQUFBNDJCLGdCQUFBLEdBQVA1MkIsT0FBTyxDQUFFOUQsTUFBTSxjQUFBMDZCLGdCQUFBLHdCQUFBQyxxQkFBQSxHQUFmRCxnQkFBQSxDQUFpQnhULE9BQU8sY0FBQXlULHFCQUFBLHVCQUF4QkEscUJBQUEsQ0FBMEIxZ0I7RUFDckMsQ0FDSixDQUFDO0VBQ0QsSUFBSSxDQUFDNGdCLFNBQVMsRUFBRSxPQUFPO0lBQUVsZixHQUFHLEVBQUU7TUFBRWlULEtBQUssRUFBRSxJQUFJO01BQUV6bUIsT0FBTyxFQUFFO0lBQUssQ0FBQztJQUFFcEosR0FBRyxFQUFFO01BQUU2dkIsS0FBSyxFQUFFLElBQUk7TUFBRXptQixPQUFPLEVBQUU7SUFBSztFQUFFLENBQUM7RUFFbkcsSUFBUXdULEdBQUcsR0FBS2tmLFNBQVMsQ0FBakJsZixHQUFHO0VBQ1gsSUFBSSxPQUFPcmIsUUFBUSxLQUFLLFdBQVcsRUFBRTtJQUNqQyxJQUFJczZCLFFBQVEsRUFBRTtNQUNWLElBQUkvVCxJQUFJLEtBQUssYUFBYSxJQUFJLENBQUMrVCxRQUFRLENBQUNoVixRQUFRLENBQUNqSyxHQUFHLENBQUNpVCxLQUFLLENBQUMsRUFBRTtRQUN6RGdNLFFBQVEsQ0FBQ3hlLFdBQVcsQ0FBQ1QsR0FBRyxDQUFDaVQsS0FBSyxDQUFDO01BQ25DO01BQ0EsSUFBSSxDQUFDZ00sUUFBUSxDQUFDaFYsUUFBUSxDQUFDakssR0FBRyxDQUFDeFQsT0FBTyxDQUFDLEVBQUU7UUFDakN5eUIsUUFBUSxDQUFDeGUsV0FBVyxDQUFDVCxHQUFHLENBQUN4VCxPQUFPLENBQUM7TUFDckM7SUFDSjtFQUNKO0VBQ0EsT0FBTzB5QixTQUFTO0FBQ3BCLEM7Ozs7O0FDdkVBO0FBQ0E7QUFDQTtBQUNBOztBQUlBOztBQVFBLElBQUlDLFVBQWdDLEdBQUcsRUFBRTtBQUVsQyxTQUFTQyxhQUFhQSxDQUFDQyxZQUFpQixFQUFFO0VBQzdDLElBQUlDLGVBQThCO0VBQ2xDLElBQUlILFVBQVUsQ0FBQy9tQyxNQUFNLEVBQUU7SUFDbkJrbkMsZUFBZSxHQUFHSCxVQUFVLENBQUN4WixNQUFNLENBQUMsVUFBQzRaLFlBQVk7TUFBQSxPQUFLLENBQUNBLFlBQVksQ0FBQ0MsSUFBSTtJQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsSUFBSUYsZUFBZSxFQUFFO01BQ2pCRCxZQUFZLENBQUNuUixVQUFVLENBQUNvUixlQUFlLENBQUM1aUMsU0FBUyxDQUFDO01BQ2xELElBQUkyaUMsWUFBWSxDQUFDalIsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUNyQmtSLGVBQWUsQ0FBQ0UsSUFBSSxHQUFHLElBQUk7UUFDM0JGLGVBQWUsQ0FBQ0csTUFBTSxDQUFDQyxXQUFXLENBQUM7VUFDL0JDLEdBQUcsRUFBRSxTQUFTO1VBQ2RqakMsU0FBUyxFQUFFNGlDLGVBQWUsQ0FBQzVpQztRQUMvQixDQUFDLEVBQUUsQ0FBQzRpQyxlQUFlLENBQUM1aUMsU0FBUyxDQUFDMHlCLE1BQU0sQ0FBQyxDQUFDO01BQzFDO01BQ0EsT0FBTyxJQUFJO0lBQ2YsQ0FBQyxNQUFNO01BQ0gsT0FBTyxLQUFLO0lBQ2hCO0VBQ0o7RUFDQSxPQUFPLElBQUk7QUFDZjtBQUVBLFNBQVN3USxlQUFlQSxDQUFDdjdCLE1BQTRCLEVBQUU7RUFDbkQsT0FBQXFXLG9CQUFBLENBQUFBLG9CQUFBLEtBQ09yVyxNQUFNO0lBQ1Q0bUIsV0FBVyxFQUFBdlEsb0JBQUEsQ0FBQUEsb0JBQUEsS0FDSnJXLE1BQU0sQ0FBQzRtQixXQUFXO01BQ3JCbHpCLE1BQU0sRUFBRTtJQUFJO0VBQ2Y7QUFFVDs7QUFFQTtBQUNBLFNBQVM4bkMsZUFBZUEsQ0FBQ0MsT0FBTyxFQUFFO0VBQzlCLElBQUlBLE9BQU8sRUFBRTtJQUNULElBQUlDLE1BQU0sR0FBR0QsT0FBTyxDQUFDLENBQUMsV0FBUTtJQUM5QixJQUFJLENBQUNDLE1BQU0sRUFBRTtNQUNyQjtNQUNZcHBCLElBQUksQ0FBQytvQixXQUFXLENBQUM7UUFBRSxPQUFPLEVBQUUsT0FBTztRQUFFTSxPQUFPLEVBQUU7TUFBOEIsQ0FBQyxDQUFDO01BQzlFO0lBQ0o7RUFDSjtFQUNKO0VBQ0ksSUFBSXhqQyxZQUFZOztFQUVwQjtFQUNJLFNBQVN5akMsV0FBV0EsQ0FBQzMvQixNQUFNLEVBQUU7SUFDekJxVyxJQUFJLENBQUMrb0IsV0FBVyxDQUFDO01BQ2IsT0FBTyxFQUFFLFdBQVc7TUFDaEM7TUFDWWhqQyxTQUFTLEVBQUVGLFlBQVksQ0FBQ0csSUFBSTtNQUM1QjJELE1BQU0sRUFBRUE7TUFDcEI7SUFDUSxDQUFDLEVBQUUsQ0FBQzlELFlBQVksQ0FBQ0csSUFBSSxDQUFDeXlCLE1BQU0sQ0FBQyxDQUFDO0VBQ2xDO0VBRUEsU0FBUzhRLG9CQUFvQkEsQ0FBQSxFQUFHO0lBQzVCdnBCLElBQUksQ0FBQytvQixXQUFXLENBQUM7TUFDYixPQUFPLEVBQUUsYUFBYTtNQUNsQztNQUNZaGpDLFNBQVMsRUFBRUYsWUFBWSxDQUFDRztNQUNwQztJQUNRLENBQUMsRUFBRSxDQUFDSCxZQUFZLENBQUNHLElBQUksQ0FBQ3l5QixNQUFNLENBQUMsQ0FBQztFQUNsQzs7RUFFSjtFQUNJelksSUFBSSxDQUFDd3BCLFNBQVMsR0FBRyxVQUFVdGMsQ0FBQyxFQUFFO0lBQzFCLElBQUlBLENBQUMsQ0FBQ2xuQixJQUFJLENBQUNnakMsR0FBRyxLQUFLLE1BQU0sRUFBRTtNQUN2QixJQUFJdDdCLE1BQU0sR0FBR3dmLENBQUMsQ0FBQ2xuQixJQUFJLENBQUMwSCxNQUFNO01BQzFCQSxNQUFNLENBQUNnbkIsWUFBWSxHQUFHLENBQUM7TUFDdkI3dUIsWUFBWSxHQUFHLElBQUl1akMsTUFBTSxDQUFDMzJCLFlBQVksQ0FBQztRQUNuQ3BOLENBQUMsRUFBRTZuQixDQUFDLENBQUNsbkIsSUFBSSxDQUFDRSxJQUFJLENBQUNiLENBQUM7UUFDaEJDLENBQUMsRUFBRTRuQixDQUFDLENBQUNsbkIsSUFBSSxDQUFDRSxJQUFJLENBQUNaO01BQ25CLENBQUMsRUFBRSxJQUFJa0osVUFBVSxDQUFDMGUsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQ0QsU0FBUyxDQUFDLENBQUM7TUFDcENxakMsTUFBTSxDQUFDcm5DLElBQUksQ0FBQzJMLE1BQU0sRUFBRTY3QixvQkFBb0IsRUFBRTFqQyxZQUFZLENBQUM7TUFDdkR1akMsTUFBTSxDQUFDRSxXQUFXLENBQUNBLFdBQVcsQ0FBQztJQUNuQyxDQUFDLE1BQU0sSUFBSXBjLENBQUMsQ0FBQ2xuQixJQUFJLENBQUNnakMsR0FBRyxLQUFLLFNBQVMsRUFBRTtNQUM3QztNQUNZbmpDLFlBQVksQ0FBQ0csSUFBSSxHQUFHLElBQUl3SSxVQUFVLENBQUMwZSxDQUFDLENBQUNsbkIsSUFBSSxDQUFDRCxTQUFTLENBQUM7TUFDcERxakMsTUFBTSxDQUFDenhCLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLENBQUMsTUFBTSxJQUFJdVYsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQ2dqQyxHQUFHLEtBQUssWUFBWSxFQUFFO01BQ3BDSSxNQUFNLENBQUNsYixVQUFVLENBQUNoQixDQUFDLENBQUNsbkIsSUFBSSxDQUFDaWtCLE9BQU8sQ0FBQztJQUNyQyxDQUFDLE1BQU0sSUFBSWlELENBQUMsQ0FBQ2xuQixJQUFJLENBQUNnakMsR0FBRyxLQUFLLGdCQUFnQixFQUFFO01BQ3hDSSxNQUFNLENBQUNyZ0IsY0FBYyxDQUFDbUUsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQ2dqQixJQUFJLEVBQUVrRSxDQUFDLENBQUNsbkIsSUFBSSxDQUFDaWpCLE1BQU0sQ0FBQztJQUNyRDtFQUNKLENBQUM7QUFDTDtBQUVBLFNBQVN3Z0Isa0JBQWtCQSxDQUFBLEVBQUc7RUFDMUIsSUFBSXRRLElBQUksRUFDSnVRLGFBQWE7O0VBRWpCO0VBQ0E7RUFDQSxJQUFJLE9BQU9DLGlCQUFpQixLQUFLLFdBQVcsRUFBRTtJQUMxQztJQUNBRCxhQUFhLEdBQUdDLGlCQUFpQixDQUFDLENBQUM7RUFDdkM7RUFDQTs7RUFFQXhRLElBQUksR0FBRyxJQUFJeVEsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHVixlQUFlLENBQUNsTCxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRzBMLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFDNUU7SUFBRW5WLElBQUksRUFBRTtFQUFrQixDQUFDLENBQUM7RUFFaEMsT0FBT3IwQixNQUFNLENBQUMycEMsR0FBRyxDQUFDQyxlQUFlLENBQUMzUSxJQUFJLENBQUM7QUFDM0M7QUFFTyxTQUFTNFEsVUFBVUEsQ0FBQ3I4QixNQUE0QixFQUFFNG1CLFdBQWdCLEVBQUUwVixFQUFZLEVBQUU7RUFDckYsSUFBTUMsT0FBTyxHQUFHUixrQkFBa0IsQ0FBQyxDQUFDO0VBQ3BDLElBQU1YLE1BQU0sR0FBRyxJQUFJb0IsTUFBTSxDQUFDRCxPQUFPLENBQUM7RUFFbEMsSUFBTXJCLFlBQTJCLEdBQUc7SUFDaENFLE1BQU0sRUFBTkEsTUFBTTtJQUNOL2lDLFNBQVMsRUFBRSxJQUFJeUksVUFBVSxDQUFDOGxCLFdBQVcsQ0FBQ3VDLFFBQVEsQ0FBQyxDQUFDLEdBQUd2QyxXQUFXLENBQUN3QyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzNFK1IsSUFBSSxFQUFFO0VBQ1YsQ0FBQztFQUVERCxZQUFZLENBQUNFLE1BQU0sQ0FBQ1UsU0FBUyxHQUFHLFVBQVV0YyxDQUFDLEVBQUU7SUFDekMsSUFBSUEsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQzZvQixLQUFLLEtBQUssYUFBYSxFQUFFO01BQ2hDZ2IsR0FBRyxDQUFDTSxlQUFlLENBQUNGLE9BQU8sQ0FBQztNQUM1QnJCLFlBQVksQ0FBQ0MsSUFBSSxHQUFHLEtBQUs7TUFDekJELFlBQVksQ0FBQzdpQyxTQUFTLEdBQUcsSUFBSXlJLFVBQVUsQ0FBQzBlLENBQUMsQ0FBQ2xuQixJQUFJLENBQUNELFNBQVMsQ0FBQztNQUN6RCxJQUFJc2MsSUFBZSxFQUFFO1FBQ2pCaFUsT0FBTyxDQUFDaVUsR0FBRyxDQUFDLG9CQUFvQixDQUFDO01BQ3JDO01BQ0EwbkIsRUFBRSxDQUFDcEIsWUFBWSxDQUFDO0lBQ3BCLENBQUMsTUFBTSxJQUFJMWIsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQzZvQixLQUFLLEtBQUssV0FBVyxFQUFFO01BQ3JDK1osWUFBWSxDQUFDN2lDLFNBQVMsR0FBRyxJQUFJeUksVUFBVSxDQUFDMGUsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQ0QsU0FBUyxDQUFDO01BQ3pENmlDLFlBQVksQ0FBQ0MsSUFBSSxHQUFHLEtBQUs7TUFDekI7TUFDQTtNQUNBLElBQUksT0FBT3VCLGFBQWEsS0FBSyxXQUFXLEVBQUU7UUFDdEM7UUFDQUEsYUFBYSxDQUFDbGQsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQzJELE1BQU0sRUFBRWkvQixZQUFZLENBQUM3aUMsU0FBUyxDQUFDO01BQ3hEO0lBQ0osQ0FBQyxNQUFNLElBQUltbkIsQ0FBQyxDQUFDbG5CLElBQUksQ0FBQzZvQixLQUFLLEtBQUssT0FBTyxFQUFFO01BQ2pDLElBQUl4TSxJQUFlLEVBQUU7UUFDakJoVSxPQUFPLENBQUNpVSxHQUFHLENBQUMsZ0JBQWdCLEdBQUc0SyxDQUFDLENBQUNsbkIsSUFBSSxDQUFDcWpDLE9BQU8sQ0FBQztNQUNsRDtJQUNKO0VBQ0osQ0FBQztFQUVEVCxZQUFZLENBQUNFLE1BQU0sQ0FBQ0MsV0FBVyxDQUFDO0lBQzVCQyxHQUFHLEVBQUUsTUFBTTtJQUNYOWlDLElBQUksRUFBRTtNQUFFYixDQUFDLEVBQUVpdkIsV0FBVyxDQUFDdUMsUUFBUSxDQUFDLENBQUM7TUFBRXZ4QixDQUFDLEVBQUVndkIsV0FBVyxDQUFDd0MsU0FBUyxDQUFDO0lBQUUsQ0FBQztJQUMvRC93QixTQUFTLEVBQUU2aUMsWUFBWSxDQUFDN2lDLFNBQVM7SUFDakMySCxNQUFNLEVBQUV1N0IsZUFBZSxDQUFDdjdCLE1BQU07RUFDbEMsQ0FBQyxFQUFFLENBQUNrN0IsWUFBWSxDQUFDN2lDLFNBQVMsQ0FBQzB5QixNQUFNLENBQUMsQ0FBQztBQUN2QztBQUVPLFNBQVM0UixnQkFBZ0JBLENBQUN4VyxRQUFnQixFQUFFbm1CLE1BQTZCLEVBQUU0bUIsV0FBaUIsRUFBRTBWLEVBQWEsRUFBRTtFQUNoSCxJQUFNTSxVQUFVLEdBQUd6VyxRQUFRLEdBQUcyVSxVQUFVLENBQUMvbUMsTUFBTTtFQUMvQyxJQUFJNm9DLFVBQVUsS0FBSyxDQUFDLElBQUlOLEVBQUUsRUFBRTtJQUN4QkEsRUFBRSxDQUFDLENBQUM7RUFDUixDQUFDLE1BQU0sSUFBSU0sVUFBVSxHQUFHLENBQUMsRUFBRTtJQUN2QixJQUFNQyxrQkFBa0IsR0FBRy9CLFVBQVUsQ0FBQ3ptQixLQUFLLENBQUN1b0IsVUFBVSxDQUFDO0lBQ3ZEQyxrQkFBa0IsQ0FBQ25zQixPQUFPLENBQUMsVUFBVXdxQixZQUFZLEVBQUU7TUFDL0NBLFlBQVksQ0FBQ0UsTUFBTSxDQUFDMEIsU0FBUyxDQUFDLENBQUM7TUFDL0IsSUFBSW5vQixJQUFlLEVBQUU7UUFDakJoVSxPQUFPLENBQUNpVSxHQUFHLENBQUMsb0JBQW9CLENBQUM7TUFDckM7SUFDSixDQUFDLENBQUM7SUFDRmttQixVQUFVLEdBQUdBLFVBQVUsQ0FBQ3ptQixLQUFLLENBQUMsQ0FBQyxFQUFFdW9CLFVBQVUsQ0FBQztJQUM1QyxJQUFJTixFQUFFLEVBQUU7TUFDSkEsRUFBRSxDQUFDLENBQUM7SUFDUjtFQUNKLENBQUMsTUFBTTtJQUNILElBQU1TLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUk3QixZQUEyQixFQUFLO01BQ3ZESixVQUFVLENBQUN2bEMsSUFBSSxDQUFDMmxDLFlBQVksQ0FBQztNQUM3QixJQUFJSixVQUFVLENBQUMvbUMsTUFBTSxJQUFJb3lCLFFBQVEsSUFBSW1XLEVBQUUsRUFBRTtRQUNyQ0EsRUFBRSxDQUFDLENBQUM7TUFDUjtJQUNKLENBQUM7SUFFRCxJQUFJdDhCLE1BQU0sRUFBRTtNQUNSLEtBQUssSUFBSXRMLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2tvQyxVQUFVLEVBQUVsb0MsQ0FBQyxFQUFFLEVBQUU7UUFDakMybkMsVUFBVSxDQUFDcjhCLE1BQU0sRUFBRTRtQixXQUFXLEVBQUVtVyxpQkFBaUIsQ0FBQztNQUN0RDtJQUNKO0VBQ0o7QUFDSjtBQUVPLFNBQVN2YyxrQkFBVUEsQ0FBQ2pFLE9BQW9DLEVBQUU7RUFDN0R1ZSxVQUFVLENBQUNwcUIsT0FBTyxDQUFDLFVBQUN3cUIsWUFBWTtJQUFBLE9BQUtBLFlBQVksQ0FBQ0UsTUFBTSxDQUFDQyxXQUFXLENBQUM7TUFBRUMsR0FBRyxFQUFFLFlBQVk7TUFBRS9lLE9BQU8sRUFBUEE7SUFBUSxDQUFDLENBQUM7RUFBQSxFQUFDO0FBQ3pHO0FBRU8sU0FBU2xCLHNCQUFjQSxDQUFDQyxJQUFZLEVBQUVDLE1BQVcsRUFBRTtFQUN0RHVmLFVBQVUsQ0FBQ3BxQixPQUFPLENBQUMsVUFBQ3dxQixZQUFZO0lBQUEsT0FBS0EsWUFBWSxDQUFDRSxNQUFNLENBQUNDLFdBQVcsQ0FBQztNQUFFQyxHQUFHLEVBQUUsZ0JBQWdCO01BQUVoZ0IsSUFBSSxFQUFKQSxJQUFJO01BQUVDLE1BQU0sRUFBTkE7SUFBTyxDQUFDLENBQUM7RUFBQSxFQUFDO0FBQ2xILEM7O0FDeE1BO0FBQ2UsU0FBU3loQixnQkFBZ0JBLENBQUEsRUFBeUc7RUFBQSxJQUF4R25XLElBQXFCLEdBQUEveUIsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQWtHLFNBQUEsR0FBQWxHLFNBQUEsTUFBRyxZQUFZO0VBQUEsSUFBRThtQyxRQUF3QixHQUFBOW1DLFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFrRyxTQUFBO0VBQUEsSUFBRW8xQixrQkFBc0MsR0FBQXQ3QixTQUFBLENBQUFDLE1BQUEsT0FBQUQsU0FBQSxNQUFBa0csU0FBQTtFQUMzSSxRQUFRNnNCLElBQUk7SUFDUixLQUFLLGFBQWE7TUFBRTtRQUNoQixJQUFNckUsS0FBSyxHQUFHbGlCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxPQUFPO1VBQ0hpaUIsS0FBSyxFQUFMQSxLQUFLO1VBQ0xvRSxXQUFXLEVBQUV3SSxrQkFBa0IsQ0FBQ0MsaUJBQWlCLENBQUM3TSxLQUFLO1FBQzNELENBQUM7TUFDTDtJQUNBLEtBQUssYUFBYTtNQUNkLE9BQU87UUFBRW9FLFdBQVcsRUFBRXdJLGtCQUFrQixDQUFDNEIsaUJBQWlCLENBQUM7TUFBRSxDQUFDO0lBQ2xFLEtBQUssWUFBWTtNQUFFO1FBQ2YsSUFBSXhPLE1BQThCLEdBQUcsSUFBSTtRQUN6QyxJQUFJb1ksUUFBUSxFQUFFO1VBQ1ZwWSxNQUFLLEdBQUdvWSxRQUFRLENBQUMxZSxhQUFhLENBQUMsT0FBTyxDQUFDO1VBQ3ZDLElBQUksQ0FBQ3NHLE1BQUssRUFBRTtZQUNSQSxNQUFLLEdBQUdsaUIsUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ3ZDcTZCLFFBQVEsQ0FBQ3hlLFdBQVcsQ0FBQ29HLE1BQUssQ0FBQztVQUMvQjtRQUNKO1FBQ0EsT0FBTztVQUNIQSxLQUFLLEVBQUxBLE1BQUs7VUFDTG9FLFdBQVcsRUFBRXdJLGtCQUFrQixDQUFDMkIsZ0JBQWdCLENBQUN2TyxNQUF5QjtRQUM5RSxDQUFDO01BQ0w7SUFDQTtNQUNJN2hCLE9BQU8sQ0FBQzRKLEtBQUssb0NBQUFsVixNQUFBLENBQW9Dd3hCLElBQUksQ0FBRSxDQUFDO01BQ3hELE9BQU87UUFBRXJFLEtBQUssRUFBRSxJQUFJO1FBQUVvRSxXQUFXLEVBQUU7TUFBSyxDQUFDO0VBQ2pEO0FBQ0osQzs7QUNqQ0E7O0FBT08sU0FBU3FXLE9BQU9BLENBQUNyZixHQUFRLEVBQUVzZixPQUFlLEVBQUVDLE9BQWUsRUFBUTtFQUN0RSxJQUFJQyxNQUFNLEdBQUd4ZixHQUFHLENBQUM3cEIsTUFBTTtFQUN2QixPQUFPcXBDLE1BQU0sRUFBRSxFQUFFO0lBQ2J4ZixHQUFHLENBQUN3ZixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSUYsT0FBTztJQUN6QnRmLEdBQUcsQ0FBQ3dmLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJRCxPQUFPO0VBQzdCO0FBQ0o7QUFFTyxTQUFTRSxRQUFRQSxDQUFDempDLElBQVUsRUFBRXNqQyxPQUFlLEVBQUVDLE9BQWUsRUFBUTtFQUN6RXZqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNqQyxDQUFDLElBQUl1bEMsT0FBTztFQUNwQnRqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNoQyxDQUFDLElBQUl1bEMsT0FBTztFQUNwQnZqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNqQyxDQUFDLElBQUl1bEMsT0FBTztFQUNwQnRqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUNoQyxDQUFDLElBQUl1bEMsT0FBTztBQUN4QixDOzs7Ozs7O0FDcEJpQztBQUVLO0FBRWtCO0FBQ047QUFDRztBQUNRO0FBQ0w7QUFDUDtBQUVSO0FBQ0E7QUFDRjtBQUNEO0FBQ1k7QUFDRjtBQUFBLElBRTNCekIsYUFBTTtFQUFBLFNBQUFBLE9BQUE7SUFBQSxJQUFBN3VCLEtBQUE7SUFBQTNILHdCQUFBLE9BQUF3MkIsTUFBQTtJQUFBdjJCLHdCQUFBLGtCQUNFLElBQUlrMEIsMkJBQWEsQ0FBQyxDQUFDO0lBQUFsMEIsd0JBQUEsb0JBZ0RoQyxVQUFDclMsUUFBb0IsRUFBVztNQUFBLElBQUF3cUMsb0JBQUE7TUFDeEMsSUFBSSxDQUFDendCLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQzlELE1BQU0sRUFBRTtRQUN0QjtNQUNKO01BQ0E4NUIsZUFBYyxDQUFDWCxxQkFBcUIsQ0FBQ3RzQixLQUFJLENBQUMvSSxPQUFPLENBQUM4aUIsV0FBVyxHQUFBMFcsb0JBQUEsR0FBRXp3QixLQUFJLENBQUMvSSxPQUFPLENBQUM5RCxNQUFNLGNBQUFzOUIsb0JBQUEsdUJBQW5CQSxvQkFBQSxDQUFxQnBXLE9BQU8sQ0FBQztNQUM1RnJhLEtBQUksQ0FBQ2dQLFVBQVUsQ0FBQyxDQUFDO01BQ2pCaFAsS0FBSSxDQUFDL0ksT0FBTyxDQUFDeTVCLFlBQVksR0FBR2hWLHFCQUFZLENBQUN0eUIsTUFBTSxDQUMzQzRXLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQzhpQixXQUFXLEVBQ3hCL1osS0FBSSxDQUFDL0ksT0FBTyxDQUFDMDVCLGVBQWUsQ0FBQzdoQixHQUFHLENBQUNpVCxLQUNyQyxDQUFDO01BRUQsSUFBSS9oQixLQUFJLENBQUMvSSxPQUFPLENBQUM5RCxNQUFNLENBQUNnbkIsWUFBWSxLQUFLaHRCLFNBQVMsRUFBRTtRQUNoRDZTLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQzlELE1BQU0sQ0FBQ2duQixZQUFZLEdBQUcsQ0FBQztNQUN4QztNQUVBeVcsZ0JBQXlCLENBQ3JCNXdCLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQzlELE1BQU0sQ0FBQ2duQixZQUFZLEVBQ2hDbmEsS0FBSSxDQUFDL0ksT0FBTyxDQUFDOUQsTUFBTSxFQUNuQjZNLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQzhpQixXQUFXLEVBQ3hCLFlBQU07UUFBQSxJQUFBOFcscUJBQUE7UUFDRixJQUFJLEVBQUFBLHFCQUFBLEdBQUE3d0IsS0FBSSxDQUFDL0ksT0FBTyxDQUFDOUQsTUFBTSxjQUFBMDlCLHFCQUFBLHVCQUFuQkEscUJBQUEsQ0FBcUIxVyxZQUFZLE1BQUssQ0FBQyxFQUFFO1VBQ3pDbmEsS0FBSSxDQUFDOHdCLGNBQWMsQ0FBQyxDQUFDO1FBQ3pCO1FBQ0E5d0IsS0FBSSxDQUFDK3dCLEtBQUssQ0FBQzlxQyxRQUFRLENBQUM7TUFDeEIsQ0FDSixDQUFDO0lBQ0wsQ0FBQztJQUFBcVMsd0JBQUEsaUJBMkhRLFlBQVk7TUFDakIsSUFBSTBILEtBQUksQ0FBQy9JLE9BQU8sQ0FBQys1QixVQUFVLEVBQUU7UUFDekIsSUFBTUMsY0FBYyxHQUFHTCxhQUFzQixDQUFDNXdCLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQ3k1QixZQUFZLENBQUM7UUFDeEUsSUFBSSxDQUFDTyxjQUFjLEVBQUU7VUFBQSxJQUFBQyxxQkFBQTtVQUNqQmx4QixLQUFJLENBQUMvSSxPQUFPLENBQUN5NUIsWUFBWSxDQUFDMVQsVUFBVSxFQUFBa1UscUJBQUEsR0FBQ2x4QixLQUFJLENBQUMvSSxPQUFPLENBQUMwWCxpQkFBaUIsY0FBQXVpQixxQkFBQSx1QkFBOUJBLHFCQUFBLENBQWdDemxDLElBQUksQ0FBQztVQUMxRSxJQUFJdVUsS0FBSSxDQUFDL0ksT0FBTyxDQUFDeTVCLFlBQVksQ0FBQ3hULElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDK1QsY0FBYyxFQUFFO2NBQ2pCanhCLEtBQUksQ0FBQ214QixlQUFlLENBQUMsQ0FBQztZQUMxQjtVQUNKO1FBQ0o7TUFDSixDQUFDLE1BQU07UUFBQSxJQUFBQyxzQkFBQTtRQUNIcHhCLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQ3k1QixZQUFZLENBQUMxVCxVQUFVLEVBQUFvVSxzQkFBQSxHQUFDcHhCLEtBQUksQ0FBQy9JLE9BQU8sQ0FBQzBYLGlCQUFpQixjQUFBeWlCLHNCQUFBLHVCQUE5QkEsc0JBQUEsQ0FBZ0MzbEMsSUFBSSxDQUFDO1FBQzFFdVUsS0FBSSxDQUFDL0ksT0FBTyxDQUFDeTVCLFlBQVksQ0FBQ3hULElBQUksQ0FBQyxDQUFDO1FBQ2hDbGQsS0FBSSxDQUFDbXhCLGVBQWUsQ0FBQyxDQUFDO01BQzFCO0lBQ0osQ0FBQztFQUFBO0VBQUEsT0FBQTU0QixxQkFBQSxDQUFBczJCLE1BQUE7SUFBQXAzQixHQUFBO0lBQUFkLEtBQUEsRUFuTkQsU0FBQWl6QixXQUFXQSxDQUFDdCtCLFlBQTJCLEVBQVE7TUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQzJMLE9BQU8sQ0FBQzlELE1BQU0sRUFBRTtRQUN0QjtNQUNKO01BQ0EsSUFBQWsrQixhQUFBLEdBQXVDQyx1QkFBWSxDQUMvQyxJQUFJLENBQUNyNkIsT0FBTyxDQUFDOGlCLFdBQVcsRUFDeEJ6dUIsWUFBWSxFQUNaLElBQUksQ0FBQzJMLE9BQU8sQ0FBQzlELE1BQU0sQ0FBQ2tuQixPQUN4QixDQUFDO1FBSk8xTCxpQkFBaUIsR0FBQTBpQixhQUFBLENBQWpCMWlCLGlCQUFpQjtRQUFFcWUsT0FBTyxHQUFBcUUsYUFBQSxDQUFQckUsT0FBTztNQUtsQyxJQUFJLENBQUMvMUIsT0FBTyxDQUFDMFgsaUJBQWlCLEdBQUdBLGlCQUFpQjtNQUNsRCxJQUFJLENBQUMxWCxPQUFPLENBQUMrMUIsT0FBTyxHQUFHQSxPQUFPO0lBQ2xDO0VBQUM7SUFBQXYxQixHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFBbTZCLGNBQWNBLENBQUN4bEMsWUFBMkIsRUFBUTtNQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDMkwsT0FBTyxDQUFDOUQsTUFBTSxFQUFFO1FBQ3RCO01BQ0o7TUFDQSxJQUFJLENBQUN5MkIsV0FBVyxDQUFDdCtCLFlBQVksQ0FBQztNQUM5QixJQUFJLENBQUMyTCxPQUFPLENBQUNtakIsT0FBTyxHQUFHbVgsZUFBYyxDQUFDbm9DLE1BQU0sQ0FBQyxJQUFJLENBQUM2TixPQUFPLENBQUM5RCxNQUFNLENBQUNpbkIsT0FBTyxFQUFFLElBQUksQ0FBQ25qQixPQUFPLENBQUMwWCxpQkFBaUIsQ0FBQztJQUM3RztFQUFDO0lBQUFsWCxHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFBZzJCLFdBQVdBLENBQUEsRUFBbUI7TUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQzExQixPQUFPLENBQUM5RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUM4RCxPQUFPLENBQUM5RCxNQUFNLENBQUM0bUIsV0FBVyxFQUFFO1FBQzFELE9BQU8sSUFBSTtNQUNmO01BQ0EsSUFBUWx6QixNQUFNLEdBQUssSUFBSSxDQUFDb1EsT0FBTyxDQUFDOUQsTUFBTSxDQUFDNG1CLFdBQVcsQ0FBMUNsekIsTUFBTTtNQUNkLE9BQU8ycUMsdUJBQVksQ0FBQzNxQyxNQUFNLENBQUM7SUFDL0I7RUFBQztJQUFBNFEsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBQW82QixLQUFLQSxDQUFDOXFDLFFBQW9CLEVBQVE7TUFDOUIsSUFBSSxDQUFDZ1IsT0FBTyxDQUFDOGlCLFdBQVcsQ0FBQ3JELElBQUksQ0FBQyxDQUFDO01BQy9CendCLFFBQVEsQ0FBQyxDQUFDO0lBQ2Q7RUFBQztJQUFBd1IsR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBQXFZLFVBQVVBLENBQUEsRUFBUztNQUNmLElBQU1nZixTQUFTLEdBQUd5RCxxQkFBVyxDQUFDLElBQUksQ0FBQ3g2QixPQUFPLENBQUM7TUFDM0MsSUFBSSxDQUFDKzJCLFNBQVMsRUFBRTtRQUNaO01BQ0o7TUFDQSxJQUFROTdCLEdBQUcsR0FBVTg3QixTQUFTLENBQXRCOTdCLEdBQUc7UUFBRTRjLEdBQUcsR0FBS2tmLFNBQVMsQ0FBakJsZixHQUFHO01BQ2hCLElBQUksQ0FBQzdYLE9BQU8sQ0FBQzA1QixlQUFlLENBQUM3aEIsR0FBRyxDQUFDaVQsS0FBSyxHQUFHalQsR0FBRyxDQUFDaVQsS0FBSztNQUNsRCxJQUFJLENBQUM5cUIsT0FBTyxDQUFDMDVCLGVBQWUsQ0FBQzdoQixHQUFHLENBQUN4VCxPQUFPLEdBQUd3VCxHQUFHLENBQUN4VCxPQUFPO01BQ3RELElBQUksQ0FBQ3JFLE9BQU8sQ0FBQzA1QixlQUFlLENBQUN6K0IsR0FBRyxDQUFDNnZCLEtBQUssR0FBRzd2QixHQUFHLENBQUM2dkIsS0FBSztNQUNsRCxJQUFJLENBQUM5cUIsT0FBTyxDQUFDMDVCLGVBQWUsQ0FBQ3orQixHQUFHLENBQUNvSixPQUFPLEdBQUdwSixHQUFHLENBQUNvSixPQUFPO0lBQzFEO0VBQUM7SUFBQTdELEdBQUE7SUFBQWQsS0FBQSxFQThCRCxTQUFBKzZCLGVBQWVBLENBQUN6ckMsUUFBK0IsRUFBUTtNQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDZ1IsT0FBTyxDQUFDOUQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDOEQsT0FBTyxDQUFDOUQsTUFBTSxDQUFDNG1CLFdBQVcsRUFBRTtRQUMxRDtNQUNKO01BQ0EsSUFBQTRYLHFCQUFBLEdBQXlDLElBQUksQ0FBQzE2QixPQUFPLENBQUM5RCxNQUFNLENBQUM0bUIsV0FBVztRQUExRDZYLFNBQVMsR0FBQUQscUJBQUEsQ0FBZjNYLElBQUk7UUFBYXhFLFdBQVcsR0FBQW1jLHFCQUFBLENBQVhuYyxXQUFXO01BQ3BDLElBQUFxYyxpQkFBQSxHQUErQjFCLGdCQUFnQixDQUFDeUIsU0FBUyxFQUFFLElBQUksQ0FBQ2pGLFdBQVcsQ0FBQyxDQUFDLEVBQUVtRixvQkFBVyxDQUFDO1FBQW5GbmMsS0FBSyxHQUFBa2MsaUJBQUEsQ0FBTGxjLEtBQUs7UUFBRW9FLFdBQVcsR0FBQThYLGlCQUFBLENBQVg5WCxXQUFXO01BRTFCLElBQUk2WCxTQUFTLEtBQUssWUFBWSxJQUFJamMsS0FBSyxFQUFFO1FBQ3JDb2MsYUFBWSxDQUFDL1osT0FBTyxDQUFDckMsS0FBSyxFQUFFSCxXQUFXLENBQUMsQ0FDbkN3SSxJQUFJLENBQUM7VUFBQSxPQUFNakUsV0FBVyxDQUFDZ0ssT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUFBLEVBQUMsU0FDdkMsQ0FBQyxVQUFDbGEsR0FBRztVQUFBLE9BQUs1akIsUUFBUSxDQUFDNGpCLEdBQUcsQ0FBQztRQUFBLEVBQUM7TUFDdEM7TUFFQSxJQUFJa1EsV0FBVyxFQUFFO1FBQ2JBLFdBQVcsQ0FBQ3hELFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO1FBQzNDd0QsV0FBVyxDQUFDcUosY0FBYyxDQUFDLElBQUksQ0FBQ25zQixPQUFPLENBQUM5RCxNQUFNLENBQUM0bUIsV0FBVyxDQUFDO1FBQzNEQSxXQUFXLENBQUN0RCxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDdWIsU0FBUyxDQUFDQyxJQUFJLENBQUM5a0MsU0FBUyxFQUFFbEgsUUFBUSxDQUFDLENBQUM7TUFDdkY7TUFFQSxJQUFJLENBQUNnUixPQUFPLENBQUM4aUIsV0FBVyxHQUFHQSxXQUFXO0lBQzFDO0VBQUM7SUFBQXRpQixHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFBdTdCLGdCQUFnQkEsQ0FBQSxFQUF1QztNQUFBLElBQUFDLHFCQUFBO01BQ25ELE9BQU8sQ0FBQUEscUJBQUEsT0FBSSxDQUFDbDdCLE9BQU8sQ0FBQzlELE1BQU0sY0FBQWcvQixxQkFBQSxlQUFuQkEscUJBQUEsQ0FBcUJqWSxNQUFNLEdBQUcrUyxlQUFjLENBQUMvUyxNQUFNLENBQUMsQ0FBQyxHQUN0RCxDQUFDLENBQ0N4d0Isb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLElBQUksQ0FBQ3NOLE9BQU8sQ0FBQysxQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkN0akMsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLElBQUksQ0FBQ3NOLE9BQU8sQ0FBQysxQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkN0akMsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLElBQUksQ0FBQ3NOLE9BQU8sQ0FBQysxQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkN0akMsb0JBQUksQ0FBQ0MsS0FBSyxDQUFDLElBQUksQ0FBQ3NOLE9BQU8sQ0FBQysxQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEMsQ0FBMkM7SUFDcEQ7O0lBRUE7SUFDQTtFQUFBO0lBQUF2MUIsR0FBQTtJQUFBZCxLQUFBLEVBQ0EsU0FBQXk3QixlQUFlQSxDQUFDaGpDLE1BQVcsRUFBUTtNQUFBLElBQUFzVixNQUFBO01BQy9CLElBQU04WCxRQUFRLEdBQUcsSUFBSSxDQUFDdmxCLE9BQU8sQ0FBQzhpQixXQUFXLENBQUMwQyxXQUFXLENBQUMsQ0FBQztNQUN2RCxJQUFNNFQsT0FBTyxHQUFHN1QsUUFBUSxDQUFDMXhCLENBQUM7TUFDMUIsSUFBTXdsQyxPQUFPLEdBQUc5VCxRQUFRLENBQUN6eEIsQ0FBQztNQUUxQixJQUFJc2xDLE9BQU8sS0FBSyxDQUFDLElBQUlDLE9BQU8sS0FBSyxDQUFDLEVBQUU7UUFDaEM7TUFDSjtNQUVBLElBQUlsaEMsTUFBTSxDQUFDa2tCLFFBQVEsRUFBRTtRQUNqQjtRQUNBbGtCLE1BQU0sQ0FBQ2trQixRQUFRLENBQUN6UCxPQUFPLENBQUMsVUFBQ3d1QixPQUFvQjtVQUFBLE9BQUszdEIsTUFBSSxDQUFDMHRCLGVBQWUsQ0FBQ0MsT0FBTyxDQUFDO1FBQUEsRUFBQztNQUNwRjtNQUVBLElBQUlqakMsTUFBTSxDQUFDckMsSUFBSSxJQUFJcUMsTUFBTSxDQUFDckMsSUFBSSxDQUFDN0YsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN6Q3NwQyxRQUFRLENBQUNwaEMsTUFBTSxDQUFDckMsSUFBSSxFQUFFc2pDLE9BQU8sRUFBRUMsT0FBTyxDQUFDO01BQzNDO01BRUEsSUFBSWxoQyxNQUFNLENBQUMyaEIsR0FBRyxFQUFFO1FBQ1pxZixPQUFPLENBQUNoaEMsTUFBTSxDQUFDMmhCLEdBQUcsRUFBRXNmLE9BQU8sRUFBRUMsT0FBTyxDQUFDO01BQ3pDO01BRUEsSUFBSWxoQyxNQUFNLENBQUNpa0IsS0FBSyxJQUFJamtCLE1BQU0sQ0FBQ2lrQixLQUFLLENBQUNuc0IsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QyxLQUFLLElBQUlXLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VILE1BQU0sQ0FBQ2lrQixLQUFLLENBQUNuc0IsTUFBTSxFQUFFVyxDQUFDLEVBQUUsRUFBRTtVQUMxQ3VvQyxPQUFPLENBQUNoaEMsTUFBTSxDQUFDaWtCLEtBQUssQ0FBQ3hyQixDQUFDLENBQUMsRUFBRXdvQyxPQUFPLEVBQUVDLE9BQU8sQ0FBQztRQUM5QztNQUNKO0lBQ0o7RUFBQztJQUFBNzRCLEdBQUE7SUFBQWQsS0FBQSxFQUVELFNBQUEraUIsU0FBU0EsQ0FBQ3RxQixNQUE0QixFQUFFNUQsU0FBd0IsRUFBUTtNQUFBLElBQUE4bUMsTUFBQTtNQUNwRSxJQUFJLENBQUM5bUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDeUwsT0FBTyxDQUFDczdCLGVBQWUsRUFBRTtRQUM3QztNQUNKOztNQUVBO01BQ0EsSUFBSW5qQyxNQUFNLENBQUNra0IsUUFBUSxFQUFFO1FBQ2pCbGtCLE1BQU0sQ0FBQ2trQixRQUFRLENBQUNtQixNQUFNLENBQUMsVUFBQzRkLE9BQTZCO1VBQUEsT0FBS0EsT0FBTyxDQUFDbGhCLFVBQVU7UUFBQSxFQUFDLENBQ3hFdE4sT0FBTyxDQUFDLFVBQUN3dUIsT0FBNkI7VUFBQSxPQUFLQyxNQUFJLENBQUM1WSxTQUFTLENBQUMyWSxPQUFPLEVBQUU3bUMsU0FBUyxDQUFDO1FBQUEsRUFBQztNQUN2RixDQUFDLE1BQU0sSUFBSTRELE1BQU0sQ0FBQytoQixVQUFVLEVBQUU7UUFDMUIsSUFBSSxDQUFDbGEsT0FBTyxDQUFDczdCLGVBQWUsQ0FBQzdZLFNBQVMsQ0FDbENsdUIsU0FBUyxFQUNULElBQUksQ0FBQ3lMLE9BQU8sQ0FBQzhpQixXQUFXLENBQUNxQyxhQUFhLENBQUMsQ0FBQyxFQUN4Q2h0QixNQUFNLENBQUMraEIsVUFDWCxDQUFDO01BQ0w7SUFDSjs7SUFFQTtFQUFBO0lBQUExWixHQUFBO0lBQUFkLEtBQUEsRUFDQSxTQUFBNjdCLGFBQWFBLENBQUNwakMsTUFBNEIsRUFBVztNQUNqRCxPQUFPLENBQUMsRUFBRUEsTUFBTSxLQUFLQSxNQUFNLENBQUNra0IsUUFBUSxHQUM5QmxrQixNQUFNLENBQUNra0IsUUFBUSxDQUFDMEYsSUFBSSxDQUFDLFVBQUNxWixPQUFPO1FBQUEsT0FBS0EsT0FBTyxDQUFDbGhCLFVBQVU7TUFBQSxFQUFDLEdBQ3JEL2hCLE1BQU0sQ0FBQytoQixVQUFVLENBQUMsQ0FBQztJQUM3Qjs7SUFFQTtFQUFBO0lBQUExWixHQUFBO0lBQUFkLEtBQUEsRUFDQSxTQUFBazVCLGFBQWFBLENBQUEsRUFBb0U7TUFBQSxJQUFuRXpnQyxNQUFtQyxHQUFBbkksU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQWtHLFNBQUEsR0FBQWxHLFNBQUEsTUFBRyxJQUFJO01BQUEsSUFBRXVFLFNBQWUsR0FBQXZFLFNBQUEsQ0FBQUMsTUFBQSxPQUFBRCxTQUFBLE1BQUFrRyxTQUFBO01BQ3JFLElBQUlzbEMsZUFBMEUsR0FBR3JqQyxNQUFNO01BRXZGLElBQUlBLE1BQU0sSUFBSSxJQUFJLENBQUM2SCxPQUFPLENBQUMrNUIsVUFBVSxFQUFFO1FBQUEsSUFBQTBCLGdCQUFBO1FBQ25DLElBQUksQ0FBQ04sZUFBZSxDQUFDaGpDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUNzcUIsU0FBUyxDQUFDdHFCLE1BQU0sRUFBRTVELFNBQVMsQ0FBQztRQUNqQztRQUNBaW5DLGVBQWUsR0FBRyxDQUFBcmpDLE1BQU0sYUFBTkEsTUFBTSx3QkFBQXNqQyxnQkFBQSxHQUFOdGpDLE1BQU0sQ0FBRWtrQixRQUFRLGNBQUFvZixnQkFBQSx1QkFBaEJBLGdCQUFBLENBQWtCeHJDLE1BQU0sSUFBRyxDQUFDLEdBQUdrSSxNQUFNLENBQUNra0IsUUFBUSxHQUFHbGtCLE1BQU07TUFDN0U7TUFFQXVqQyxNQUFNLENBQUNuZSxPQUFPLENBQUMsV0FBVyxFQUFFaWUsZUFBd0IsQ0FBQztNQUNyRCxJQUFJLElBQUksQ0FBQ0QsYUFBYSxDQUFDcGpDLE1BQThCLENBQUMsRUFBRTtRQUNwRHVqQyxNQUFNLENBQUNuZSxPQUFPLENBQUMsVUFBVSxFQUFFaWUsZUFBd0IsQ0FBQztNQUN4RDtJQUNKO0VBQUM7SUFBQWg3QixHQUFBO0lBQUFkLEtBQUE7TUFBQSxJQUFBaThCLGdCQUFBLEdBQUE3Z0IsMEJBQUEsY0FBQUMscUJBQUEsQ0FBQUMsSUFBQSxDQUVELFNBQUF3QixRQUFBO1FBQUEsSUFBQUosS0FBQSxFQUFBd2Ysc0JBQUEsRUFBQUMsWUFBQSxFQUFBQyxXQUFBLEVBQUFDLHNCQUFBLEVBQUEzZ0IsRUFBQTtRQUFBLE9BQUFMLHFCQUFBLENBQUFNLElBQUEsV0FBQW9CLFFBQUE7VUFBQSxrQkFBQUEsUUFBQSxDQUFBNXFCLElBQUEsR0FBQTRxQixRQUFBLENBQUEzcUIsSUFBQTtZQUFBO2NBQ1VzcUIsS0FBSyxHQUFHLElBQUksQ0FBQzZlLGdCQUFnQixDQUFDLENBQUM7Y0FBQSxLQUNqQzdlLEtBQUs7Z0JBQUFLLFFBQUEsQ0FBQTNxQixJQUFBO2dCQUFBO2NBQUE7Y0FBQTJxQixRQUFBLENBQUEzcUIsSUFBQTtjQUFBLE9BQ3VCLElBQUksQ0FBQ2tPLE9BQU8sQ0FBQ21qQixPQUFPLENBQUNoSCx1QkFBdUIsQ0FBQ0MsS0FBSyxDQUFDO1lBQUE7Y0FBQWhCLEVBQUEsR0FBQXFCLFFBQUEsQ0FBQWpCLElBQUE7Y0FBQSxJQUFBSixFQUFBO2dCQUFBcUIsUUFBQSxDQUFBM3FCLElBQUE7Z0JBQUE7Y0FBQTtjQUFBc3BCLEVBQUEsR0FBSyxDQUFDLENBQUM7WUFBQTtjQUFoRnlnQixZQUFZLEdBQUF6Z0IsRUFBQTtjQUNsQnlnQixZQUFZLENBQUN6ZixLQUFLLEdBQUdBLEtBQUs7Y0FDMUIsSUFBSSxDQUFDd2MsYUFBYSxDQUFDaUQsWUFBWSxHQUFBRCxzQkFBQSxHQUFFLElBQUksQ0FBQzU3QixPQUFPLENBQUMwWCxpQkFBaUIsY0FBQWtrQixzQkFBQSx1QkFBOUJBLHNCQUFBLENBQWdDcG5DLElBQUksQ0FBQztjQUFDaW9CLFFBQUEsQ0FBQTNxQixJQUFBO2NBQUE7WUFBQTtjQUFBMnFCLFFBQUEsQ0FBQTNxQixJQUFBO2NBQUEsT0FFN0MsSUFBSSxDQUFDa08sT0FBTyxDQUFDbWpCLE9BQU8sQ0FBQ3hJLGVBQWUsQ0FBQyxJQUFJLENBQUMzYSxPQUFPLENBQUMwWCxpQkFBaUIsQ0FBQztZQUFBO2NBQXhGb2tCLFdBQVcsR0FBQXJmLFFBQUEsQ0FBQWpCLElBQUE7Y0FDakIsSUFBSXNnQixXQUFXLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDbEQsYUFBYSxDQUFDa0QsV0FBVyxHQUFBQyxzQkFBQSxHQUFFLElBQUksQ0FBQy83QixPQUFPLENBQUMwWCxpQkFBaUIsY0FBQXFrQixzQkFBQSx1QkFBOUJBLHNCQUFBLENBQWdDdm5DLElBQUksQ0FBQztjQUN6RSxDQUFDLE1BQU07Z0JBQ0gsSUFBSSxDQUFDb2tDLGFBQWEsQ0FBQyxDQUFDO2NBQ3hCO1lBQUM7WUFBQTtjQUFBLE9BQUFuYyxRQUFBLENBQUFaLElBQUE7VUFBQTtRQUFBLEdBQUFXLE9BQUE7TUFBQSxDQUVSO01BQUEsU0FkSzBkLGVBQWVBLENBQUE7UUFBQSxPQUFBeUIsZ0JBQUEsQ0FBQTVwQyxLQUFBLE9BQUEvQixTQUFBO01BQUE7TUFBQSxPQUFma3FDLGVBQWU7SUFBQTtFQUFBO0lBQUExNUIsR0FBQTtJQUFBZCxLQUFBLEVBa0NyQixTQUFBczhCLHFCQUFxQkEsQ0FBQSxFQUFTO01BQUEsSUFBQUMscUJBQUE7UUFBQUMsTUFBQTtNQUMxQixJQUFJcHFDLElBQW1CLEdBQUcsSUFBSTtNQUM5QixJQUFNcXFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBQUYscUJBQUEsT0FBSSxDQUFDajhCLE9BQU8sQ0FBQzlELE1BQU0sY0FBQSsvQixxQkFBQSx1QkFBbkJBLHFCQUFBLENBQXFCcmtCLFNBQVMsS0FBSSxFQUFFLENBQUM7TUFFM0QsSUFBSSxDQUFDNVgsT0FBTyxDQUFDbzhCLE9BQU8sR0FBRyxLQUFLO01BQzVCLElBQVFwOEIsT0FBTyxHQUFLLElBQUksQ0FBaEJBLE9BQU87TUFFZixJQUFNa0UsU0FBUSxHQUFHLFNBQVhBLFFBQVFBLENBQUltNEIsU0FBaUIsRUFBSztRQUNwQ3ZxQyxJQUFJLEdBQUdBLElBQUksSUFBSXVxQyxTQUFTO1FBQ3hCLElBQUksQ0FBQ3I4QixPQUFPLENBQUNvOEIsT0FBTyxFQUFFO1VBQ2xCLElBQUlDLFNBQVMsSUFBSXZxQyxJQUFJLEVBQUU7WUFDbkJBLElBQUksSUFBSXFxQyxLQUFLO1lBQ2JELE1BQUksQ0FBQ0ksTUFBTSxDQUFDLENBQUM7VUFDakI7VUFDQTV0QyxNQUFNLENBQUNDLHFCQUFxQixDQUFDdVYsU0FBUSxDQUFDO1FBQzFDO01BQ0osQ0FBQztNQUVEQSxTQUFRLENBQUNxNEIsV0FBVyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9CO0VBQUM7SUFBQWg4QixHQUFBO0lBQUFkLEtBQUEsRUFFRCxTQUFBeUcsS0FBS0EsQ0FBQSxFQUFTO01BQUEsSUFBQXMyQixxQkFBQSxFQUFBQyxxQkFBQTtNQUNWLElBQUksSUFBSSxDQUFDMThCLE9BQU8sQ0FBQys1QixVQUFVLElBQUksRUFBQTBDLHFCQUFBLE9BQUksQ0FBQ3o4QixPQUFPLENBQUM5RCxNQUFNLGNBQUF1Z0MscUJBQUEsd0JBQUFDLHFCQUFBLEdBQW5CRCxxQkFBQSxDQUFxQjNaLFdBQVcsY0FBQTRaLHFCQUFBLHVCQUFoQ0EscUJBQUEsQ0FBa0MzWixJQUFJLE1BQUssWUFBWSxFQUFFO1FBQ3BGLElBQUksQ0FBQ2laLHFCQUFxQixDQUFDLENBQUM7TUFDaEMsQ0FBQyxNQUFNO1FBQ0gsSUFBSSxDQUFDTSxNQUFNLENBQUMsQ0FBQztNQUNqQjtJQUNKO0VBQUM7SUFBQTk3QixHQUFBO0lBQUFkLEtBQUE7TUFBQSxJQUFBaTlCLEtBQUEsR0FBQTdoQiwwQkFBQSxjQUFBQyxxQkFBQSxDQUFBQyxJQUFBLENBRUQsU0FBQUMsU0FBQTtRQUFBLElBQUEyaEIscUJBQUE7UUFBQSxPQUFBN2hCLHFCQUFBLENBQUFNLElBQUEsV0FBQUMsU0FBQTtVQUFBLGtCQUFBQSxTQUFBLENBQUF6cEIsSUFBQSxHQUFBeXBCLFNBQUEsQ0FBQXhwQixJQUFBO1lBQUE7Y0FDSSxJQUFJLENBQUNrTyxPQUFPLENBQUNvOEIsT0FBTyxHQUFHLElBQUk7Y0FDM0J6QyxnQkFBeUIsQ0FBQyxDQUFDLENBQUM7Y0FBQyxNQUN6QixDQUFBaUQscUJBQUEsT0FBSSxDQUFDNThCLE9BQU8sQ0FBQzlELE1BQU0sY0FBQTBnQyxxQkFBQSxlQUFuQkEscUJBQUEsQ0FBcUI5WixXQUFXLElBQUksSUFBSSxDQUFDOWlCLE9BQU8sQ0FBQzlELE1BQU0sQ0FBQzRtQixXQUFXLENBQUNDLElBQUksS0FBSyxZQUFZO2dCQUFBekgsU0FBQSxDQUFBeHBCLElBQUE7Z0JBQUE7Y0FBQTtjQUFBd3BCLFNBQUEsQ0FBQXhwQixJQUFBO2NBQUEsT0FDbkZncEMsYUFBWSxDQUFDN1osT0FBTyxDQUFDLENBQUM7WUFBQTtjQUM1QixJQUFJLENBQUNqaEIsT0FBTyxDQUFDOGlCLFdBQVcsQ0FBQzRKLGtCQUFrQixDQUFDLENBQUM7WUFBQztZQUFBO2NBQUEsT0FBQXBSLFNBQUEsQ0FBQU8sSUFBQTtVQUFBO1FBQUEsR0FBQVosUUFBQTtNQUFBLENBRXJEO01BQUEsU0FQS1ksSUFBSUEsQ0FBQTtRQUFBLE9BQUE4Z0IsS0FBQSxDQUFBNXFDLEtBQUEsT0FBQS9CLFNBQUE7TUFBQTtNQUFBLE9BQUo2ckIsSUFBSTtJQUFBO0VBQUE7SUFBQXJiLEdBQUE7SUFBQWQsS0FBQSxFQVNWLFNBQUFnZCxVQUFVQSxDQUFDakUsT0FBb0MsRUFBUTtNQUNuRCxJQUFJLElBQUksQ0FBQ3pZLE9BQU8sQ0FBQ21qQixPQUFPLEVBQUU7UUFDdEIsSUFBSSxDQUFDbmpCLE9BQU8sQ0FBQ21qQixPQUFPLENBQUN6RyxVQUFVLENBQUNqRSxPQUFPLENBQUM7TUFDNUM7TUFDQWtoQixrQkFBbUIsQ0FBQ2xoQixPQUFPLENBQUM7SUFDaEM7RUFBQztJQUFBalksR0FBQTtJQUFBZCxLQUFBLEVBRUQsU0FBQTZYLGNBQWNBLENBQUNDLElBQVksRUFBRUMsTUFBNEIsRUFBUTtNQUM3RDZpQixlQUFjLENBQUMvaUIsY0FBYyxDQUFDQyxJQUFJLEVBQUVDLE1BQU0sQ0FBQztNQUMzQyxJQUFJLElBQUksQ0FBQ3pYLE9BQU8sQ0FBQ21qQixPQUFPLEVBQUU7UUFDdEIsSUFBSSxDQUFDbmpCLE9BQU8sQ0FBQ21qQixPQUFPLENBQUM1TCxjQUFjLENBQUNDLElBQUksRUFBRUMsTUFBTSxDQUFDO01BQ3JEO01BQ0FraUIsc0JBQXVCLENBQUNuaUIsSUFBSSxFQUFFQyxNQUFNLENBQUM7SUFDekM7RUFBQztBQUFBOzs7O0FDN1I0QjtBQUNRLENBQUM7QUFDUTtBQUNLO0FBQ2I7QUFDTDtBQUNZO0FBQ0g7QUFDYTtBQUN0QjtBQUVBO0FBRXJDLElBQU1vbEIsUUFBUSxHQUFHLElBQUlqRixhQUFNLENBQUMsQ0FBQztBQUM3QixJQUFNbmIsUUFBUSxHQUFHb2dCLFFBQVEsQ0FBQzc4QixPQUFPO0FBRWpDLElBQU04OEIsdUJBQXVCLEdBQUc7RUFDNUJ2c0MsSUFBSSxFQUFFLFNBQU5BLElBQUlBLENBQVkyTCxNQUFNLEVBQUVzOEIsRUFBRSxFQUFFbmtDLFlBQVksRUFBNkI7SUFBQSxJQUEzQjBvQyxjQUFjLEdBQUEvc0MsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQWtHLFNBQUEsR0FBQWxHLFNBQUEsTUFBRzZzQyxRQUFRO0lBQy9ELElBQUlHLE9BQU87SUFDWCxJQUFJLENBQUN4RSxFQUFFLEVBQUU7TUFDTHdFLE9BQU8sR0FBRyxJQUFJNWUsT0FBTyxDQUFDLFVBQUNPLE9BQU8sRUFBRU4sTUFBTSxFQUFLO1FBQ3ZDbWEsRUFBRSxHQUFHLFNBQUxBLEVBQUVBLENBQUk1bEIsR0FBRyxFQUFLO1VBQUVBLEdBQUcsR0FBR3lMLE1BQU0sQ0FBQ3pMLEdBQUcsQ0FBQyxHQUFHK0wsT0FBTyxDQUFDLENBQUM7UUFBRSxDQUFDO01BQ3BELENBQUMsQ0FBQztJQUNOO0lBQ0FvZSxjQUFjLENBQUMvOEIsT0FBTyxDQUFDOUQsTUFBTSxHQUFHK1YsZUFBSyxDQUFDLENBQUMsQ0FBQyxFQUFFZ3JCLGFBQU0sRUFBRS9nQyxNQUFNLENBQUM7SUFDekQ7SUFDQSxJQUFJNmdDLGNBQWMsQ0FBQy84QixPQUFPLENBQUM5RCxNQUFNLENBQUNnbkIsWUFBWSxHQUFHLENBQUMsRUFBRTtNQUNoRDZaLGNBQWMsQ0FBQy84QixPQUFPLENBQUM5RCxNQUFNLENBQUNnbkIsWUFBWSxHQUFHLENBQUM7SUFDbEQ7SUFDQSxJQUFJN3VCLFlBQVksRUFBRTtNQUNkMG9DLGNBQWMsQ0FBQy84QixPQUFPLENBQUMrNUIsVUFBVSxHQUFHLEtBQUs7TUFDekNnRCxjQUFjLENBQUNsRCxjQUFjLENBQUN4bEMsWUFBWSxDQUFDO01BQzNDLElBQUlta0MsRUFBRSxFQUFFO1FBQ0pBLEVBQUUsQ0FBQyxDQUFDO01BQ1I7SUFDSixDQUFDLE1BQU07TUFDSHVFLGNBQWMsQ0FBQ3RDLGVBQWUsQ0FBQ2pDLEVBQUUsQ0FBQztJQUN0QztJQUNBLE9BQU93RSxPQUFPO0VBQ2xCLENBQUM7RUFDRDcyQixLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBQSxFQUFjO0lBQ2YsT0FBTzAyQixRQUFRLENBQUMxMkIsS0FBSyxDQUFDLENBQUM7RUFDM0IsQ0FBQztFQUNEMFYsSUFBSSxFQUFFLFNBQU5BLElBQUlBLENBQUEsRUFBYztJQUNkLE9BQU9naEIsUUFBUSxDQUFDaGhCLElBQUksQ0FBQyxDQUFDO0VBQzFCLENBQUM7RUFDRHFGLEtBQUssRUFBRSxTQUFQQSxLQUFLQSxDQUFBLEVBQWM7SUFDZnpFLFFBQVEsQ0FBQzJmLE9BQU8sR0FBRyxJQUFJO0VBQzNCLENBQUM7RUFDRGMsVUFBVSxFQUFFLFNBQVpBLFVBQVVBLENBQVlsdUMsUUFBUSxFQUFFO0lBQzVCLElBQUksQ0FBQ0EsUUFBUSxJQUFLLE9BQU9BLFFBQVEsS0FBSyxVQUFVLEtBQUs2cEIsZ0JBQUEsQ0FBTzdwQixRQUFRLE1BQUssUUFBUSxJQUFJLENBQUNBLFFBQVEsQ0FBQ0EsUUFBUSxDQUFFLEVBQUU7TUFDdkc2TixPQUFPLENBQUM5RSxLQUFLLENBQUMscUVBQXFFLENBQUM7TUFDcEY7SUFDSjtJQUNBMmpDLE1BQU0sQ0FBQ3BlLFNBQVMsQ0FBQyxVQUFVLEVBQUV0dUIsUUFBUSxDQUFDO0VBQzFDLENBQUM7RUFDRG11QyxXQUFXLEVBQUUsU0FBYkEsV0FBV0EsQ0FBWW51QyxRQUFRLEVBQUU7SUFDN0Iwc0MsTUFBTSxDQUFDL2QsV0FBVyxDQUFDLFVBQVUsRUFBRTN1QixRQUFRLENBQUM7RUFDNUMsQ0FBQztFQUNEOG9DLFdBQVcsRUFBRSxTQUFiQSxXQUFXQSxDQUFZOW9DLFFBQVEsRUFBRTtJQUM3QixJQUFJLENBQUNBLFFBQVEsSUFBSyxPQUFPQSxRQUFRLEtBQUssVUFBVSxLQUFLNnBCLGdCQUFBLENBQU83cEIsUUFBUSxNQUFLLFFBQVEsSUFBSSxDQUFDQSxRQUFRLENBQUNBLFFBQVEsQ0FBRSxFQUFFO01BQ3ZHNk4sT0FBTyxDQUFDOUUsS0FBSyxDQUFDLHNFQUFzRSxDQUFDO01BQ3JGO0lBQ0o7SUFDQTJqQyxNQUFNLENBQUNwZSxTQUFTLENBQUMsV0FBVyxFQUFFdHVCLFFBQVEsQ0FBQztFQUMzQyxDQUFDO0VBQ0RvdUMsWUFBWSxFQUFFLFNBQWRBLFlBQVlBLENBQVlwdUMsUUFBUSxFQUFFO0lBQzlCMHNDLE1BQU0sQ0FBQy9kLFdBQVcsQ0FBQyxXQUFXLEVBQUUzdUIsUUFBUSxDQUFDO0VBQzdDLENBQUM7RUFDRDB0QixVQUFVLEVBQUUsU0FBWkEsVUFBVUEsQ0FBWWpFLE9BQU8sRUFBRTtJQUMzQixJQUFJLENBQUNBLE9BQU8sRUFBRTtNQUNWNWIsT0FBTyxDQUFDOUUsS0FBSyxDQUFDLCtEQUErRCxDQUFDO01BQzlFO0lBQ0o7SUFDQThrQyxRQUFRLENBQUNuZ0IsVUFBVSxDQUFDakUsT0FBTyxDQUFDO0VBQ2hDLENBQUM7RUFDRGxCLGNBQWMsRUFBRSxTQUFoQkEsY0FBY0EsQ0FBWUMsSUFBSSxFQUFFQyxNQUFNLEVBQUU7SUFDcEMsSUFBSSxDQUFDRCxJQUFJLEVBQUU7TUFDUDNhLE9BQU8sQ0FBQzlFLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQztNQUMvRTtJQUNKO0lBQ0EsSUFBSSxDQUFDMGYsTUFBTSxFQUFFO01BQ1Q1YSxPQUFPLENBQUM5RSxLQUFLLENBQUMsa0VBQWtFLENBQUM7TUFDakY7SUFDSjtJQUNBOGtDLFFBQVEsQ0FBQ3RsQixjQUFjLENBQUNDLElBQUksRUFBRUMsTUFBTSxDQUFDO0VBQ3pDLENBQUM7RUFDRDRsQix1QkFBdUIsRUFBRSxTQUF6QkEsdUJBQXVCQSxDQUFZL0IsZUFBZSxFQUFFO0lBQ2hELElBQUlBLGVBQWUsSUFBSSxPQUFPQSxlQUFlLENBQUM3WSxTQUFTLEtBQUssVUFBVSxFQUFFO01BQ3BFaEcsUUFBUSxDQUFDNmUsZUFBZSxHQUFHQSxlQUFlO0lBQzlDO0VBQ0osQ0FBQztFQUNELElBQUkvK0IsTUFBTUEsQ0FBQSxFQUFHO0lBQ1QsT0FBT2tnQixRQUFRLENBQUNpZCxlQUFlO0VBQ25DLENBQUM7RUFDRDRELFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFZcGhDLE1BQU0sRUFBRXFoQyxjQUFjLEVBQUU7SUFBQSxJQUFBeDBCLEtBQUE7SUFDNUMsSUFBTWcwQixjQUFjLEdBQUcsSUFBSW5GLGFBQU0sQ0FBQyxDQUFDO0lBQ25DMTdCLE1BQU0sR0FBRytWLGVBQUssQ0FBQztNQUNYNlEsV0FBVyxFQUFFO1FBQ1RDLElBQUksRUFBRSxhQUFhO1FBQ25CbUIsUUFBUSxFQUFFLEtBQUs7UUFDZnh2QixJQUFJLEVBQUUsR0FBRztRQUNUNEgsR0FBRyxFQUFFSixNQUFNLENBQUNJO01BQ2hCLENBQUM7TUFDRDRtQixZQUFZLEVBQUdyUyxLQUFlLElBQUkzVSxNQUFNLENBQUNpYSxLQUFLLEdBQUksQ0FBQyxHQUFHLENBQUM7TUFDdkRpTixPQUFPLEVBQUU7UUFDTGxtQixVQUFVLEVBQUU7TUFDaEI7SUFDSixDQUFDLEVBQUVoQixNQUFNLENBQUM7SUFDVjtJQUNBO0lBQ0EsSUFBSUEsTUFBTSxDQUFDZ25CLFlBQVksR0FBRyxDQUFDLEVBQUU7TUFDekJobkIsTUFBTSxDQUFDZ25CLFlBQVksR0FBRyxDQUFDO0lBQzNCO0lBQ0E7SUFDQTtJQUNBLElBQUlobkIsTUFBTSxDQUFDZ25CLFlBQVksR0FBRyxDQUFDLEtBQUssT0FBT2tWLElBQUksS0FBSyxXQUFXLElBQUksT0FBT00sTUFBTSxLQUFLLFdBQVcsQ0FBQyxFQUFFO01BQzNGNzdCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLDZEQUE2RCxDQUFDO01BQzNFWixNQUFNLENBQUNnbkIsWUFBWSxHQUFHLENBQUM7SUFDM0I7SUFDQSxPQUFPLElBQUk5RSxPQUFPLENBQUMsVUFBQ08sT0FBTyxFQUFFTixNQUFNLEVBQUs7TUFDcEMsSUFBSTtRQUNBdFYsS0FBSSxDQUFDeFksSUFBSSxDQUFDMkwsTUFBTSxFQUFFLFlBQU07VUFDcEJ3L0IsTUFBTSxDQUFDaGUsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFDdmxCLE1BQU0sRUFBSztZQUNqQzRrQyxjQUFjLENBQUNsaEIsSUFBSSxDQUFDLENBQUM7WUFDckIsSUFBSTBoQixjQUFjLEVBQUU7Y0FDaEJBLGNBQWMsQ0FBQ2p0QyxJQUFJLENBQUMsSUFBSSxFQUFFNkgsTUFBTSxDQUFDO1lBQ3JDO1lBQ0F3bUIsT0FBTyxDQUFDeG1CLE1BQU0sQ0FBQztVQUNuQixDQUFDLEVBQUUsSUFBSSxDQUFDO1VBQ1I0a0MsY0FBYyxDQUFDNTJCLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUMsRUFBRSxJQUFJLEVBQUU0MkIsY0FBYyxDQUFDO01BQzVCLENBQUMsQ0FBQyxPQUFPbnFCLEdBQUcsRUFBRTtRQUNWeUwsTUFBTSxDQUFDekwsR0FBRyxDQUFDO01BQ2Y7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDO0VBQ0Q7RUFDQTtFQUNBLElBQUk0cUIsT0FBT0EsQ0FBQSxFQUFHO0lBQ1YsT0FBT1YsdUJBQXVCO0VBQ2xDLENBQUM7RUFDRFcsT0FBTyxFQUFQQSxzQkFBTztFQUNQM0MsWUFBWSxFQUFaQSxhQUFZO0VBQ1o3Z0IsVUFBVSxFQUFWQSxXQUFVO0VBQ1ZoWixZQUFZLEVBQVpBLGFBQVk7RUFDWnk4QixlQUFlLEVBQWZBLGdCQUFlQTtBQUNuQixDQUFDO0FBRWNaLG1HQUF1QixFQUFDO0FBQ3ZDIiwiZmlsZSI6InF1YWdnYS5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlF1YWdnYVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJRdWFnZ2FcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL1wiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNjcpO1xuIiwidmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKFwiLi90b1Byb3BlcnR5S2V5LmpzXCIpO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHQpIHtcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhhLCBuKSB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBuKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKFwiLi90b1Byb3BlcnR5S2V5LmpzXCIpO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHRvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IHJlcXVpcmUoXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qc1wiKTtcbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gX3R5cGVvZihlKSB8fCBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUpKSByZXR1cm4gZTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mLmpzXCIpO1xuZnVuY3Rpb24gX2luaGVyaXRzKHQsIGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiB0LFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgIH1cbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlICYmIHNldFByb3RvdHlwZU9mKHQsIGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvLyBUT0RPKEJhYmVsIDgpOiBSZW1vdmUgdGhpcyBmaWxlLlxuXG52YXIgcnVudGltZSA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZVwiKSgpO1xubW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuXG4vLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PVxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbiAgfSBlbHNlIHtcbiAgICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xuICB9XG59XG4iLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAobiwgdCwgZSwgciwgbywgYSwgYykge1xuICB0cnkge1xuICAgIHZhciBpID0gblthXShjKSxcbiAgICAgIHUgPSBpLnZhbHVlO1xuICB9IGNhdGNoIChuKSB7XG4gICAgcmV0dXJuIHZvaWQgZShuKTtcbiAgfVxuICBpLmRvbmUgPyB0KHUpIDogUHJvbWlzZS5yZXNvbHZlKHUpLnRoZW4ociwgbyk7XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHQgPSB0aGlzLFxuICAgICAgZSA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIG8pIHtcbiAgICAgIHZhciBhID0gbi5hcHBseSh0LCBlKTtcbiAgICAgIGZ1bmN0aW9uIF9uZXh0KG4pIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGEsIHIsIG8sIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCBuKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhuKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChhLCByLCBvLCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIG4pO1xuICAgICAgfVxuICAgICAgX25leHQodm9pZCAwKTtcbiAgICB9KTtcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3IsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgX3R5cGVvZihvKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwidmFyIHN1cGVyUHJvcEJhc2UgPSByZXF1aXJlKFwiLi9zdXBlclByb3BCYXNlLmpzXCIpO1xuZnVuY3Rpb24gX2dldCgpIHtcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFJlZmxlY3QgJiYgUmVmbGVjdC5nZXQgPyBSZWZsZWN0LmdldC5iaW5kKCkgOiBmdW5jdGlvbiAoZSwgdCwgcikge1xuICAgIHZhciBwID0gc3VwZXJQcm9wQmFzZShlLCB0KTtcbiAgICBpZiAocCkge1xuICAgICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHAsIHQpO1xuICAgICAgcmV0dXJuIG4uZ2V0ID8gbi5nZXQuY2FsbChhcmd1bWVudHMubGVuZ3RoIDwgMyA/IGUgOiByKSA6IG4udmFsdWU7XG4gICAgfVxuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIF9nZXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2dldCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJ2YXIgYmFzZU1lcmdlID0gcmVxdWlyZSgnLi9fYmFzZU1lcmdlJyksXG4gICAgY3JlYXRlQXNzaWduZXIgPSByZXF1aXJlKCcuL19jcmVhdGVBc3NpZ25lcicpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC41LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHtcbiAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAqIH07XG4gKlxuICogdmFyIG90aGVyID0ge1xuICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICogfTtcbiAqXG4gKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICovXG52YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZTtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc29jSW5kZXhPZjtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iLCJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuIiwidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCJ2YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzS2V5ID0gcmVxdWlyZSgnLi9faXNLZXknKSxcbiAgICBzdHJpbmdUb1BhdGggPSByZXF1aXJlKCcuL19zdHJpbmdUb1BhdGgnKSxcbiAgICB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0UGF0aDtcbiIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkocikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMocikgfHwgaXRlcmFibGVUb0FycmF5KHIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnblZhbHVlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3ltYm9sO1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgbWFwQ2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX21hcENhY2hlQ2xlYXInKSxcbiAgICBtYXBDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX21hcENhY2hlRGVsZXRlJyksXG4gICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZUdldCcpLFxuICAgIG1hcENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVIYXMnKSxcbiAgICBtYXBDYWNoZVNldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcENhY2hlO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZVByb3BlcnR5O1xuIiwidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiIsInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2FmZUdldChvYmplY3QsIGtleSkge1xuICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZUdldDtcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7XG4gIGlmIChyKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIsIGEpO1xuICAgIHZhciB0ID0ge30udG9TdHJpbmcuY2FsbChyKS5zbGljZSg4LCAtMSk7XG4gICAgcmV0dXJuIFwiT2JqZWN0XCIgPT09IHQgJiYgci5jb25zdHJ1Y3RvciAmJiAodCA9IHIuY29uc3RydWN0b3IubmFtZSksIFwiTWFwXCIgPT09IHQgfHwgXCJTZXRcIiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiBcIkFyZ3VtZW50c1wiID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpID8gYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7XG4gIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07XG4gIHJldHVybiBuO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfT3ZlcmxvYWRZaWVsZChlLCBkKSB7XG4gIHRoaXMudiA9IGUsIHRoaXMuayA9IGQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9PdmVybG9hZFlpZWxkLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIHJlZ2VuZXJhdG9yRGVmaW5lID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JEZWZpbmUuanNcIik7XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3IoKSB7XG4gIC8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvYmxvYi9tYWluL3BhY2thZ2VzL2JhYmVsLWhlbHBlcnMvTElDRU5TRSAqL1xuICB2YXIgZSxcbiAgICB0LFxuICAgIHIgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgIG4gPSByLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiLFxuICAgIG8gPSByLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuICBmdW5jdGlvbiBpKHIsIG4sIG8sIGkpIHtcbiAgICB2YXIgYyA9IG4gJiYgbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBuIDogR2VuZXJhdG9yLFxuICAgICAgdSA9IE9iamVjdC5jcmVhdGUoYy5wcm90b3R5cGUpO1xuICAgIHJldHVybiByZWdlbmVyYXRvckRlZmluZSh1LCBcIl9pbnZva2VcIiwgZnVuY3Rpb24gKHIsIG4sIG8pIHtcbiAgICAgIHZhciBpLFxuICAgICAgICBjLFxuICAgICAgICB1LFxuICAgICAgICBmID0gMCxcbiAgICAgICAgcCA9IG8gfHwgW10sXG4gICAgICAgIHkgPSAhMSxcbiAgICAgICAgRyA9IHtcbiAgICAgICAgICBwOiAwLFxuICAgICAgICAgIG46IDAsXG4gICAgICAgICAgdjogZSxcbiAgICAgICAgICBhOiBkLFxuICAgICAgICAgIGY6IGQuYmluZChlLCA0KSxcbiAgICAgICAgICBkOiBmdW5jdGlvbiBkKHQsIHIpIHtcbiAgICAgICAgICAgIHJldHVybiBpID0gdCwgYyA9IDAsIHUgPSBlLCBHLm4gPSByLCBhO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGQociwgbikge1xuICAgICAgICBmb3IgKGMgPSByLCB1ID0gbiwgdCA9IDA7ICF5ICYmIGYgJiYgIW8gJiYgdCA8IHAubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICB2YXIgbyxcbiAgICAgICAgICAgIGkgPSBwW3RdLFxuICAgICAgICAgICAgZCA9IEcucCxcbiAgICAgICAgICAgIGwgPSBpWzJdO1xuICAgICAgICAgIHIgPiAzID8gKG8gPSBsID09PSBuKSAmJiAodSA9IGlbKGMgPSBpWzRdKSA/IDUgOiAoYyA9IDMsIDMpXSwgaVs0XSA9IGlbNV0gPSBlKSA6IGlbMF0gPD0gZCAmJiAoKG8gPSByIDwgMiAmJiBkIDwgaVsxXSkgPyAoYyA9IDAsIEcudiA9IG4sIEcubiA9IGlbMV0pIDogZCA8IGwgJiYgKG8gPSByIDwgMyB8fCBpWzBdID4gbiB8fCBuID4gbCkgJiYgKGlbNF0gPSByLCBpWzVdID0gbiwgRy5uID0gbCwgYyA9IDApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobyB8fCByID4gMSkgcmV0dXJuIGE7XG4gICAgICAgIHRocm93IHkgPSAhMCwgbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiAobywgcCwgbCkge1xuICAgICAgICBpZiAoZiA+IDEpIHRocm93IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICAgIGZvciAoeSAmJiAxID09PSBwICYmIGQocCwgbCksIGMgPSBwLCB1ID0gbDsgKHQgPSBjIDwgMiA/IGUgOiB1KSB8fCAheTspIHtcbiAgICAgICAgICBpIHx8IChjID8gYyA8IDMgPyAoYyA+IDEgJiYgKEcubiA9IC0xKSwgZChjLCB1KSkgOiBHLm4gPSB1IDogRy52ID0gdSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMiwgaSkge1xuICAgICAgICAgICAgICBpZiAoYyB8fCAobyA9IFwibmV4dFwiKSwgdCA9IGlbb10pIHtcbiAgICAgICAgICAgICAgICBpZiAoISh0ID0gdC5jYWxsKGksIHUpKSkgdGhyb3cgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKCF0LmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHUgPSB0LnZhbHVlLCBjIDwgMiAmJiAoYyA9IDApO1xuICAgICAgICAgICAgICB9IGVsc2UgMSA9PT0gYyAmJiAodCA9IGlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbChpKSwgYyA8IDIgJiYgKHUgPSBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG8gKyBcIicgbWV0aG9kXCIpLCBjID0gMSk7XG4gICAgICAgICAgICAgIGkgPSBlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9ICh5ID0gRy5uIDwgMCkgPyB1IDogci5jYWxsKG4sIEcpKSAhPT0gYSkgYnJlYWs7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaSA9IGUsIGMgPSAxLCB1ID0gdDtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgZiA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgZG9uZTogeVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9KHIsIG8sIGkpLCAhMCksIHU7XG4gIH1cbiAgdmFyIGEgPSB7fTtcbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG4gIHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBjID0gW11bbl0gPyB0KHQoW11bbl0oKSkpIDogKHJlZ2VuZXJhdG9yRGVmaW5lKHQgPSB7fSwgbiwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSksIHQpLFxuICAgIHUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShjKTtcbiAgZnVuY3Rpb24gZihlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihlLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZS5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgcmVnZW5lcmF0b3JEZWZpbmUoZSwgbywgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh1KSwgZTtcbiAgfVxuICByZXR1cm4gR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHJlZ2VuZXJhdG9yRGVmaW5lKHUsIFwiY29uc3RydWN0b3JcIiwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpLCByZWdlbmVyYXRvckRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvbiksIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiLCByZWdlbmVyYXRvckRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgbywgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSwgcmVnZW5lcmF0b3JEZWZpbmUodSksIHJlZ2VuZXJhdG9yRGVmaW5lKHUsIG8sIFwiR2VuZXJhdG9yXCIpLCByZWdlbmVyYXRvckRlZmluZSh1LCBuLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCByZWdlbmVyYXRvckRlZmluZSh1LCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSksIChtb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvciA9IGZ1bmN0aW9uIF9yZWdlbmVyYXRvcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdzogaSxcbiAgICAgIG06IGZcbiAgICB9O1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMpKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9yZWdlbmVyYXRvckRlZmluZShlLCByLCBuLCB0KSB7XG4gIHZhciBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICB0cnkge1xuICAgIGkoe30sIFwiXCIsIHt9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGkgPSAwO1xuICB9XG4gIG1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yRGVmaW5lID0gZnVuY3Rpb24gcmVnZW5lcmF0b3JEZWZpbmUoZSwgciwgbiwgdCkge1xuICAgIGZ1bmN0aW9uIG8ociwgbikge1xuICAgICAgX3JlZ2VuZXJhdG9yRGVmaW5lKGUsIHIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UociwgbiwgZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgciA/IGkgPyBpKGUsIHIsIHtcbiAgICAgIHZhbHVlOiBuLFxuICAgICAgZW51bWVyYWJsZTogIXQsXG4gICAgICBjb25maWd1cmFibGU6ICF0LFxuICAgICAgd3JpdGFibGU6ICF0XG4gICAgfSkgOiBlW3JdID0gbiA6IChvKFwibmV4dFwiLCAwKSwgbyhcInRocm93XCIsIDEpLCBvKFwicmV0dXJuXCIsIDIpKTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfcmVnZW5lcmF0b3JEZWZpbmUoZSwgciwgbiwgdCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvckRlZmluZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciByZWdlbmVyYXRvciA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yLmpzXCIpO1xudmFyIHJlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvciA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvci5qc1wiKTtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvckFzeW5jR2VuKHIsIGUsIHQsIG8sIG4pIHtcbiAgcmV0dXJuIG5ldyByZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IocmVnZW5lcmF0b3IoKS53KHIsIGUsIHQsIG8pLCBuIHx8IFByb21pc2UpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JBc3luY0dlbiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBPdmVybG9hZFlpZWxkID0gcmVxdWlyZShcIi4vT3ZlcmxvYWRZaWVsZC5qc1wiKTtcbnZhciByZWdlbmVyYXRvckRlZmluZSA9IHJlcXVpcmUoXCIuL3JlZ2VuZXJhdG9yRGVmaW5lLmpzXCIpO1xuZnVuY3Rpb24gQXN5bmNJdGVyYXRvcih0LCBlKSB7XG4gIGZ1bmN0aW9uIG4ociwgbywgaSwgZikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgYyA9IHRbcl0obyksXG4gICAgICAgIHUgPSBjLnZhbHVlO1xuICAgICAgcmV0dXJuIHUgaW5zdGFuY2VvZiBPdmVybG9hZFlpZWxkID8gZS5yZXNvbHZlKHUudikudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICBuKFwibmV4dFwiLCB0LCBpLCBmKTtcbiAgICAgIH0sIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIG4oXCJ0aHJvd1wiLCB0LCBpLCBmKTtcbiAgICAgIH0pIDogZS5yZXNvbHZlKHUpLnRoZW4oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgYy52YWx1ZSA9IHQsIGkoYyk7XG4gICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gbihcInRocm93XCIsIHQsIGksIGYpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAodCkge1xuICAgICAgZih0KTtcbiAgICB9XG4gIH1cbiAgdmFyIHI7XG4gIHRoaXMubmV4dCB8fCAocmVnZW5lcmF0b3JEZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCByZWdlbmVyYXRvckRlZmluZShBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSwgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAYXN5bmNJdGVyYXRvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pKSwgcmVnZW5lcmF0b3JEZWZpbmUodGhpcywgXCJfaW52b2tlXCIsIGZ1bmN0aW9uICh0LCBvLCBpKSB7XG4gICAgZnVuY3Rpb24gZigpIHtcbiAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgcikge1xuICAgICAgICBuKHQsIGksIGUsIHIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByID0gciA/IHIudGhlbihmLCBmKSA6IGYoKTtcbiAgfSwgITApO1xufVxubW9kdWxlLmV4cG9ydHMgPSBBc3luY0l0ZXJhdG9yLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGFycmF5V2l0aEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRoSG9sZXMuanNcIik7XG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qc1wiKTtcbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiKTtcbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKHIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGUpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBiYXNlUGljayA9IHJlcXVpcmUoJy4vX2Jhc2VQaWNrJyksXG4gICAgZmxhdFJlc3QgPSByZXF1aXJlKCcuL19mbGF0UmVzdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICpcbiAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbnZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGljaztcbiIsInZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2YuanNcIik7XG52YXIgaXNOYXRpdmVGdW5jdGlvbiA9IHJlcXVpcmUoXCIuL2lzTmF0aXZlRnVuY3Rpb24uanNcIik7XG52YXIgY29uc3RydWN0ID0gcmVxdWlyZShcIi4vY29uc3RydWN0LmpzXCIpO1xuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcih0KSB7XG4gIHZhciByID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBNYXAgPyBuZXcgTWFwKCkgOiB2b2lkIDA7XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKHQpIHtcbiAgICBpZiAobnVsbCA9PT0gdCB8fCAhaXNOYXRpdmVGdW5jdGlvbih0KSkgcmV0dXJuIHQ7XG4gICAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgdCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgIGlmIChyLmhhcyh0KSkgcmV0dXJuIHIuZ2V0KHQpO1xuICAgICAgci5zZXQodCwgV3JhcHBlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0KHQsIGFyZ3VtZW50cywgZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfVxuICAgIH0pLCBzZXRQcm90b3R5cGVPZihXcmFwcGVyLCB0KTtcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBfd3JhcE5hdGl2ZVN1cGVyKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfd3JhcE5hdGl2ZVN1cGVyLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgc3RhY2tDbGVhciA9IHJlcXVpcmUoJy4vX3N0YWNrQ2xlYXInKSxcbiAgICBzdGFja0RlbGV0ZSA9IHJlcXVpcmUoJy4vX3N0YWNrRGVsZXRlJyksXG4gICAgc3RhY2tHZXQgPSByZXF1aXJlKCcuL19zdGFja0dldCcpLFxuICAgIHN0YWNrSGFzID0gcmVxdWlyZSgnLi9fc3RhY2tIYXMnKSxcbiAgICBzdGFja1NldCA9IHJlcXVpcmUoJy4vX3N0YWNrU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcblN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcblN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGFjaztcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiIsInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc01hc2tlZCA9IHJlcXVpcmUoJy4vX2lzTWFza2VkJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9Tb3VyY2UgPSByZXF1aXJlKCcuL190b1NvdXJjZScpO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hdGl2ZTtcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iLCJ2YXIgSGFzaCA9IHJlcXVpcmUoJy4vX0hhc2gnKSxcbiAgICBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlQ2xlYXI7XG4iLCJ2YXIgaGFzaENsZWFyID0gcmVxdWlyZSgnLi9faGFzaENsZWFyJyksXG4gICAgaGFzaERlbGV0ZSA9IHJlcXVpcmUoJy4vX2hhc2hEZWxldGUnKSxcbiAgICBoYXNoR2V0ID0gcmVxdWlyZSgnLi9faGFzaEdldCcpLFxuICAgIGhhc2hIYXMgPSByZXF1aXJlKCcuL19oYXNoSGFzJyksXG4gICAgaGFzaFNldCA9IHJlcXVpcmUoJy4vX2hhc2hTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaENsZWFyO1xuIiwiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoRGVsZXRlO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEdldDtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hIYXM7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hTZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVEZWxldGU7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXlhYmxlO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUdldDtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlSGFzO1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcbiIsInZhciBjcmVhdGVCYXNlRm9yID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUZvcicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvcjtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJhc2VGb3I7XG4iLCJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iLCJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjbG9uZVR5cGVkQXJyYXkodHlwZWRBcnJheSwgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZVR5cGVkQXJyYXk7XG4iLCJ2YXIgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQXJyYXlCdWZmZXI7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuIiwiLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weUFycmF5O1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLCJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xudmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbnR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbnR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbnR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbnR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbnR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbnR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbnR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3NbYmFzZUdldFRhZyh2YWx1ZSldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG4iLCJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAqL1xuZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9QbGFpbk9iamVjdDtcbiIsInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUaW1lcztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5c0luID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgfVxuICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXNJbjtcbiIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcbiIsInZhciBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmFzc2lnbmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbmVyIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKSB7XG4gIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsXG4gICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgIGN1c3RvbWl6ZXIgPSAoYXNzaWduZXIubGVuZ3RoID4gMyAmJiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nKVxuICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgIGxlbmd0aCA9IDE7XG4gICAgfVxuICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFzc2lnbmVyO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpLFxuICAgIG92ZXJSZXN0ID0gcmVxdWlyZSgnLi9fb3ZlclJlc3QnKSxcbiAgICBzZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX3NldFRvU3RyaW5nJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZXN0O1xuIiwiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIiwidmFyIGNvbnN0YW50ID0gcmVxdWlyZSgnLi9jb25zdGFudCcpLFxuICAgIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCIvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG52YXIgSE9UX0NPVU5UID0gODAwLFxuICAgIEhPVF9TUEFOID0gMTY7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVOb3cgPSBEYXRlLm5vdztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAqIG9mIGBmdW5jYCB3aGVuIGl0J3MgY2FsbGVkIGBIT1RfQ09VTlRgIG9yIG1vcmUgdGltZXMgaW4gYEhPVF9TUEFOYFxuICogbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICB2YXIgY291bnQgPSAwLFxuICAgICAgbGFzdENhbGxlZCA9IDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvcnRPdXQ7XG4iLCJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICkge1xuICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSXRlcmF0ZWVDYWxsO1xuIiwiLypcbiAqIHR5cGVkZWZzLmpzXG4gKiBOb3JtYWxpemVzIGJyb3dzZXItc3BlY2lmaWMgcHJlZml4ZXMgYW5kIHByb3ZpZGUgc29tZSBiYXNpYyBwb2x5ZmlsbHNcbiAqL1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICB8fCB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHx8IHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHx8IGZ1bmN0aW9uICgvKiBmdW5jdGlvbiBGcmFtZVJlcXVlc3RDYWxsYmFjayAqLyBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChjYWxsYmFjaywgMTAwMCAvIDYwKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9KCkpO1xuICAgIH1cbn1cblxuaWYgKHR5cGVvZiBNYXRoLmltdWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG4gICAgTWF0aC5pbXVsID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgY29uc3QgYWggPSAoYSA+Pj4gMTYpICYgMHhmZmZmO1xuICAgICAgICBjb25zdCBhbCA9IGEgJiAweGZmZmY7XG4gICAgICAgIGNvbnN0IGJoID0gKGIgPj4+IDE2KSAmIDB4ZmZmZjtcbiAgICAgICAgY29uc3QgYmwgPSBiICYgMHhmZmZmO1xuICAgICAgICAvLyB0aGUgc2hpZnQgYnkgMCBmaXhlcyB0aGUgc2lnbiBvbiB0aGUgaGlnaCBwYXJ0XG4gICAgICAgIC8vIHRoZSBmaW5hbCB8MCBjb252ZXJ0cyB0aGUgdW5zaWduZWQgdmFsdWUgaW50byBhIHNpZ25lZCB2YWx1ZVxuICAgICAgICByZXR1cm4gKChhbCAqIGJsKSArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApIHwgMCk7XG4gICAgfTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWJpdHdpc2UgKi9cbn1cblxuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHsgLy8gLmxlbmd0aCBvZiBmdW5jdGlvbiBpcyAyXG5cbid1c2Ugc3RyaWN0JztcblxuICAgICAgICBpZiAodGFyZ2V0ID09PSBudWxsKSB7IC8vIFR5cGVFcnJvciBpZiB1bmRlZmluZWQgb3IgbnVsbFxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0byA9IE9iamVjdCh0YXJnZXQpO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgICAgICBjb25zdCBuZXh0U291cmNlID0gYXJndW1lbnRzW2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKG5leHRTb3VyY2UgIT09IG51bGwpIHsgLy8gU2tpcCBvdmVyIGlmIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZXh0S2V5IGluIG5leHRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWQgYnVncyB3aGVuIGhhc093blByb3BlcnR5IGlzIHNoYWRvd2VkXG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV4dFNvdXJjZSwgbmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG87XG4gICAgfTtcbn1cbiIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHRbXCJyZXR1cm5cIl0gJiYgKHUgPSB0W1wicmV0dXJuXCJdKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvKSB0aHJvdyBuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfaXRlcmFibGVUb0FycmF5TGltaXQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gdG9QcmltaXRpdmUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgT3ZlcmxvYWRZaWVsZCA9IHJlcXVpcmUoXCIuL092ZXJsb2FkWWllbGQuanNcIik7XG52YXIgcmVnZW5lcmF0b3IgPSByZXF1aXJlKFwiLi9yZWdlbmVyYXRvci5qc1wiKTtcbnZhciByZWdlbmVyYXRvckFzeW5jID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JBc3luYy5qc1wiKTtcbnZhciByZWdlbmVyYXRvckFzeW5jR2VuID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JBc3luY0dlbi5qc1wiKTtcbnZhciByZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IgPSByZXF1aXJlKFwiLi9yZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IuanNcIik7XG52YXIgcmVnZW5lcmF0b3JLZXlzID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JLZXlzLmpzXCIpO1xudmFyIHJlZ2VuZXJhdG9yVmFsdWVzID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JWYWx1ZXMuanNcIik7XG5mdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgciA9IHJlZ2VuZXJhdG9yKCksXG4gICAgZSA9IHIubShfcmVnZW5lcmF0b3JSdW50aW1lKSxcbiAgICB0ID0gKE9iamVjdC5nZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSA6IGUuX19wcm90b19fKS5jb25zdHJ1Y3RvcjtcbiAgZnVuY3Rpb24gbihyKSB7XG4gICAgdmFyIGUgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHIgJiYgci5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gISFlICYmIChlID09PSB0IHx8IFwiR2VuZXJhdG9yRnVuY3Rpb25cIiA9PT0gKGUuZGlzcGxheU5hbWUgfHwgZS5uYW1lKSk7XG4gIH1cbiAgdmFyIG8gPSB7XG4gICAgXCJ0aHJvd1wiOiAxLFxuICAgIFwicmV0dXJuXCI6IDIsXG4gICAgXCJicmVha1wiOiAzLFxuICAgIFwiY29udGludWVcIjogM1xuICB9O1xuICBmdW5jdGlvbiBhKHIpIHtcbiAgICB2YXIgZSwgdDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHtcbiAgICAgIGUgfHwgKGUgPSB7XG4gICAgICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICAgICAgcmV0dXJuIHQobi5hLCAyKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYXRjaFwiOiBmdW5jdGlvbiBfY2F0Y2goKSB7XG4gICAgICAgICAgcmV0dXJuIG4udjtcbiAgICAgICAgfSxcbiAgICAgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQociwgZSkge1xuICAgICAgICAgIHJldHVybiB0KG4uYSwgb1tyXSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQociwgbywgYSkge1xuICAgICAgICAgIHJldHVybiBlLnJlc3VsdE5hbWUgPSBvLCB0KG4uZCwgcmVnZW5lcmF0b3JWYWx1ZXMociksIGEpO1xuICAgICAgICB9LFxuICAgICAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChyKSB7XG4gICAgICAgICAgcmV0dXJuIHQobi5mLCByKTtcbiAgICAgICAgfVxuICAgICAgfSwgdCA9IGZ1bmN0aW9uIHQociwgX3QsIG8pIHtcbiAgICAgICAgbi5wID0gZS5wcmV2LCBuLm4gPSBlLm5leHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHIoX3QsIG8pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGUubmV4dCA9IG4ubjtcbiAgICAgICAgfVxuICAgICAgfSksIGUucmVzdWx0TmFtZSAmJiAoZVtlLnJlc3VsdE5hbWVdID0gbi52LCBlLnJlc3VsdE5hbWUgPSB2b2lkIDApLCBlLnNlbnQgPSBuLnYsIGUubmV4dCA9IG4ubjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByLmNhbGwodGhpcywgZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBuLnAgPSBlLnByZXYsIG4ubiA9IGUubmV4dDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd3JhcDogZnVuY3Rpb24gd3JhcChlLCB0LCBuLCBvKSB7XG4gICAgICAgIHJldHVybiByLncoYShlKSwgdCwgbiwgbyAmJiBvLnJldmVyc2UoKSk7XG4gICAgICB9LFxuICAgICAgaXNHZW5lcmF0b3JGdW5jdGlvbjogbixcbiAgICAgIG1hcms6IHIubSxcbiAgICAgIGF3cmFwOiBmdW5jdGlvbiBhd3JhcChyLCBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlcmxvYWRZaWVsZChyLCBlKTtcbiAgICAgIH0sXG4gICAgICBBc3luY0l0ZXJhdG9yOiByZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IsXG4gICAgICBhc3luYzogZnVuY3Rpb24gYXN5bmMociwgZSwgdCwgbywgdSkge1xuICAgICAgICByZXR1cm4gKG4oZSkgPyByZWdlbmVyYXRvckFzeW5jR2VuIDogcmVnZW5lcmF0b3JBc3luYykoYShyKSwgZSwgdCwgbywgdSk7XG4gICAgICB9LFxuICAgICAga2V5czogcmVnZW5lcmF0b3JLZXlzLFxuICAgICAgdmFsdWVzOiByZWdlbmVyYXRvclZhbHVlc1xuICAgIH07XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cykoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciByZWdlbmVyYXRvckFzeW5jR2VuID0gcmVxdWlyZShcIi4vcmVnZW5lcmF0b3JBc3luY0dlbi5qc1wiKTtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvckFzeW5jKG4sIGUsIHIsIHQsIG8pIHtcbiAgdmFyIGEgPSByZWdlbmVyYXRvckFzeW5jR2VuKG4sIGUsIHIsIHQsIG8pO1xuICByZXR1cm4gYS5uZXh0KCkudGhlbihmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBuLmRvbmUgPyBuLnZhbHVlIDogYS5uZXh0KCk7XG4gIH0pO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JBc3luYywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9yZWdlbmVyYXRvcktleXMoZSkge1xuICB2YXIgbiA9IE9iamVjdChlKSxcbiAgICByID0gW107XG4gIGZvciAodmFyIHQgaW4gbikgci51bnNoaWZ0KHQpO1xuICByZXR1cm4gZnVuY3Rpb24gZSgpIHtcbiAgICBmb3IgKDsgci5sZW5ndGg7KSBpZiAoKHQgPSByLnBvcCgpKSBpbiBuKSByZXR1cm4gZS52YWx1ZSA9IHQsIGUuZG9uZSA9ICExLCBlO1xuICAgIHJldHVybiBlLmRvbmUgPSAhMCwgZTtcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yS2V5cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIF9yZWdlbmVyYXRvclZhbHVlcyhlKSB7XG4gIGlmIChudWxsICE9IGUpIHtcbiAgICB2YXIgdCA9IGVbXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiXSxcbiAgICAgIHIgPSAwO1xuICAgIGlmICh0KSByZXR1cm4gdC5jYWxsKGUpO1xuICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGUubmV4dCkgcmV0dXJuIGU7XG4gICAgaWYgKCFpc05hTihlLmxlbmd0aCkpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICByZXR1cm4gZSAmJiByID49IGUubGVuZ3RoICYmIChlID0gdm9pZCAwKSwge1xuICAgICAgICAgIHZhbHVlOiBlICYmIGVbcisrXSxcbiAgICAgICAgICBkb25lOiAhZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihfdHlwZW9mKGUpICsgXCIgaXMgbm90IGl0ZXJhYmxlXCIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JWYWx1ZXMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpIHtcbiAgaWYgKHZvaWQgMCA9PT0gZSkgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICByZXR1cm4gZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL2dldFByb3RvdHlwZU9mLmpzXCIpO1xuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2UodCwgbykge1xuICBmb3IgKDsgIXt9Lmhhc093blByb3BlcnR5LmNhbGwodCwgbykgJiYgbnVsbCAhPT0gKHQgPSBnZXRQcm90b3R5cGVPZih0KSk7KTtcbiAgcmV0dXJuIHQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9zdXBlclByb3BCYXNlLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCIpO1xuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KHIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHIpIHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiBudWxsICE9IHJbU3ltYm9sLml0ZXJhdG9yXSB8fCBudWxsICE9IHJbXCJAQGl0ZXJhdG9yXCJdKSByZXR1cm4gQXJyYXkuZnJvbShyKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVNwcmVhZCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBiYXNlUGlja0J5ID0gcmVxdWlyZSgnLi9fYmFzZVBpY2tCeScpLFxuICAgIGhhc0luID0gcmVxdWlyZSgnLi9oYXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVBpY2s7XG4iLCJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlU2V0ID0gcmVxdWlyZSgnLi9fYmFzZVNldCcpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgIHZhbHVlID0gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVBpY2tCeTtcbiIsInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iLCJ2YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXk7XG4iLCJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiIsInZhciBtZW1vaXplID0gcmVxdWlyZSgnLi9tZW1vaXplJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbnZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xuXG4gIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplQ2FwcGVkO1xuIiwidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxubWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemU7XG4iLCJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvU3RyaW5nYCB3aGljaCBkb2Vzbid0IGNvbnZlcnQgbnVsbGlzaFxuICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUb1N0cmluZztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiIsInZhciBiYXNlSGFzSW4gPSByZXF1aXJlKCcuL19iYXNlSGFzSW4nKSxcbiAgICBoYXNQYXRoID0gcmVxdWlyZSgnLi9faGFzUGF0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzSW47XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSGFzSW47XG4iLCJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgfVxuICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUGF0aDtcbiIsInZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi9mbGF0dGVuJyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCBmbGF0dGVucyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBmbGF0UmVzdChmdW5jKSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXRSZXN0O1xuIiwidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiIsIi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVB1c2g7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZsYXR0ZW5hYmxlO1xuIiwiZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24odCkge1xuICB0cnkge1xuICAgIHJldHVybiAtMSAhPT0gRnVuY3Rpb24udG9TdHJpbmcuY2FsbCh0KS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKTtcbiAgfSBjYXRjaCAobikge1xuICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHQ7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzTmF0aXZlRnVuY3Rpb24sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gcmVxdWlyZShcIi4vaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2YuanNcIik7XG5mdW5jdGlvbiBfY29uc3RydWN0KHQsIGUsIHIpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgdmFyIG8gPSBbbnVsbF07XG4gIG8ucHVzaC5hcHBseShvLCBlKTtcbiAgdmFyIHAgPSBuZXcgKHQuYmluZC5hcHBseSh0LCBvKSkoKTtcbiAgcmV0dXJuIHIgJiYgc2V0UHJvdG90eXBlT2YocCwgci5wcm90b3R5cGUpLCBwO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gIH0gY2F0Y2ggKHQpIHt9XG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICByZXR1cm4gISF0O1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMpKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIvKipcbiAqIENvbW1vbiB1dGlsaXRpZXNcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcbiAqL1xuXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSBcInVuZGVmaW5lZFwiID8gRmxvYXQzMkFycmF5IDogQXJyYXk7XG5leHBvcnQgdmFyIFJBTkRPTSA9IE1hdGgucmFuZG9tO1xuZXhwb3J0IHZhciBBTkdMRV9PUkRFUiA9IFwienl4XCI7XG5cbi8qKlxuICogU3ltbWV0cmljIHJvdW5kXG4gKiBzZWUgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvcm91bmQtaGFsZi11cC1zeW1tZXRyaWMjdXNlci1jb250ZW50LWRldGFpbGVkLWJhY2tncm91bmRcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYSB2YWx1ZSB0byByb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQoYSkge1xuICBpZiAoYSA+PSAwKSByZXR1cm4gTWF0aC5yb3VuZChhKTtcbiAgcmV0dXJuIGEgJSAwLjUgPT09IDAgPyBNYXRoLmZsb29yKGEpIDogTWF0aC5yb3VuZChhKTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcbiAqXG4gKiBAcGFyYW0ge0Zsb2F0MzJBcnJheUNvbnN0cnVjdG9yIHwgQXJyYXlDb25zdHJ1Y3Rvcn0gdHlwZSBBcnJheSB0eXBlLCBzdWNoIGFzIEZsb2F0MzJBcnJheSBvciBBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF0cml4QXJyYXlUeXBlKHR5cGUpIHtcbiAgQVJSQVlfVFlQRSA9IHR5cGU7XG59XG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcbnZhciByYWRpYW4gPSAxODAgLyBNYXRoLlBJO1xuXG4vKipcbiAqIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIEFuZ2xlIGluIERlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUmFkaWFuKGEpIHtcbiAgcmV0dXJuIGEgKiBkZWdyZWU7XG59XG5cbi8qKlxuICogQ29udmVydCBSYWRpYW4gVG8gRGVncmVlXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQW5nbGUgaW4gUmFkaWFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EZWdyZWUoYSkge1xuICByZXR1cm4gYSAqIHJhZGlhbjtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJndW1lbnRzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB2YWx1ZSwgd2l0aGluIGFuIGFic29sdXRlXG4gKiBvciByZWxhdGl2ZSB0b2xlcmFuY2Ugb2YgZ2xNYXRyaXguRVBTSUxPTiAoYW4gYWJzb2x1dGUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIHZhbHVlcyBsZXNzXG4gKiB0aGFuIG9yIGVxdWFsIHRvIDEuMCwgYW5kIGEgcmVsYXRpdmUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIGxhcmdlciB2YWx1ZXMpXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgICAgICAgICAgVGhlIGZpcnN0IG51bWJlciB0byB0ZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgICAgICAgICAgVGhlIHNlY29uZCBudW1iZXIgdG8gdGVzdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b2xlcmFuY2UgIEFic29sdXRlIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSAoZGVmYXVsdCBnbE1hdHJpeC5FUFNJTE9OKVxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG51bWJlcnMgYXJlIGFwcHJveGltYXRlbHkgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciB0b2xlcmFuY2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IEVQU0lMT047XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gdG9sZXJhbmNlICogTWF0aC5tYXgoMSwgTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn0iLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcblxuLyoqXG4gKiAyeDIgTWF0cml4XG4gKiBAbW9kdWxlIG1hdDJcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxuICpcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG4gIG91dFswXSA9IDE7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG1hdDIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHJldHVybnMge21hdDJ9IG91dCBBIG5ldyAyeDIgbWF0cml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMTAsIG0xMSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZVxuICAvLyBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGExID0gYVsxXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGExO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhWzFdO1xuICAgIG91dFszXSA9IGFbM107XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDIgfCBudWxsfSBvdXQsIG9yIG51bGwgaWYgc291cmNlIG1hdHJpeCBpcyBub3QgaW52ZXJ0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgIGExID0gYVsxXSxcbiAgICBhMiA9IGFbMl0sXG4gICAgYTMgPSBhWzNdO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgdmFyIGRldCA9IGEwICogYTMgLSBhMiAqIGExO1xuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYTMgKiBkZXQ7XG4gIG91dFsxXSA9IC1hMSAqIGRldDtcbiAgb3V0WzJdID0gLWEyICogZGV0O1xuICBvdXRbM10gPSBhMCAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZWNlc3NhcnkgaWYgb3V0ID09IGFcbiAgdmFyIGEwID0gYVswXTtcbiAgb3V0WzBdID0gYVszXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhMDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzJdICogYVsxXTtcbn1cblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQyJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgYTEgPSBhWzFdLFxuICAgIGEyID0gYVsyXSxcbiAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgYjEgPSBiWzFdLFxuICAgIGIyID0gYlsyXSxcbiAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgIGExID0gYVsxXSxcbiAgICBhMiA9IGFbMl0sXG4gICAgYTMgPSBhWzNdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKiovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgYTEgPSBhWzFdLFxuICAgIGEyID0gYVsyXSxcbiAgICBhMyA9IGFbM107XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSBjO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSB2WzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG5cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5zcXJ0KGFbMF0gKiBhWzBdICsgYVsxXSAqIGFbMV0gKyBhWzJdICogYVsyXSArIGFbM10gKiBhWzNdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEwsIEQgYW5kIFUgbWF0cmljZXMgKExvd2VyIHRyaWFuZ3VsYXIsIERpYWdvbmFsIGFuZCBVcHBlciB0cmlhbmd1bGFyKSBieSBmYWN0b3JpemluZyB0aGUgaW5wdXQgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gTCB0aGUgbG93ZXIgdHJpYW5ndWxhciBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBEIHRoZSBkaWFnb25hbCBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBVIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGlucHV0IG1hdHJpeCB0byBmYWN0b3JpemVcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gTERVKEwsIEQsIFUsIGEpIHtcbiAgTFsyXSA9IGFbMl0gLyBhWzBdO1xuICBVWzBdID0gYVswXTtcbiAgVVsxXSA9IGFbMV07XG4gIFVbM10gPSBhWzNdIC0gTFsyXSAqIFVbMV07XG4gIHJldHVybiBbTCwgRCwgVV07XG59XG5cbi8qKlxuICogQWRkcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgIGExID0gYVsxXSxcbiAgICBhMiA9IGFbMl0sXG4gICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgIGIxID0gYlsxXSxcbiAgICBiMiA9IGJbMl0sXG4gICAgYjMgPSBiWzNdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpO1xufVxuXG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQWRkcyB0d28gbWF0MidzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5cbi8qKlxuICogMiBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBtb2R1bGUgdmVjMlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxuICpcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBzeW1tZXRyaWMgcm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IGdsTWF0cml4LnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBnbE1hdHJpeC5yb3VuZChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgIHkgPSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5O1xuICBpZiAobGVuID4gMCkge1xuICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIHogPSBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdO1xuICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgYXkgPSBhWzFdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSA9PT0gdW5kZWZpbmVkID8gMS4wIDogc2NhbGU7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MihvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyZChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0M1xuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzRdICogeSArIG1bN107XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0NFxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMCdcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSb3RhdGUgYSAyRCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIHZlYzIgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgYiwgcmFkKSB7XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgdmFyIHAwID0gYVswXSAtIGJbMF0sXG4gICAgcDEgPSBhWzFdIC0gYlsxXSxcbiAgICBzaW5DID0gTWF0aC5zaW4ocmFkKSxcbiAgICBjb3NDID0gTWF0aC5jb3MocmFkKTtcblxuICAvL3BlcmZvcm0gcm90YXRpb24gYW5kIHRyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIG91dFswXSA9IHAwICogY29zQyAtIHAxICogc2luQyArIGJbMF07XG4gIG91dFsxXSA9IHAwICogc2luQyArIHAxICogY29zQyArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzbWFsbGVzdCBhbmdsZSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgIGF5ID0gYVsxXSxcbiAgICBieCA9IGJbMF0sXG4gICAgYnkgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoTWF0aC5hdGFuMihheSAqIGJ4IC0gYXggKiBieSwgYXggKiBieCArIGF5ICogYnkpKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNpZ25lZCBhbmdsZSBpbiB0aGUgaW50ZXJ2YWwgWy1waSxwaV0gYmV0d2VlbiB0d28gMkQgdmVjdG9ycyAocG9zaXRpdmUgaWYgYGFgIGlzIHRvIHRoZSByaWdodCBvZiBgYmApXG4gKiBcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc2lnbmVkIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25lZEFuZ2xlKGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICBheSA9IGFbMV0sXG4gICAgYnggPSBiWzBdLFxuICAgIGJ5ID0gYlsxXTtcbiAgcmV0dXJuIE1hdGguYXRhbjIoYXggKiBieSAtIGF5ICogYngsIGF4ICogYnggKyBheSAqIGJ5KTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHplcm9cbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIilcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGV4YWN0bHkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgYTEgPSBhWzFdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgIGIxID0gYlsxXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSk7XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBmb3JFYWNoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdmVjID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYSwgc3RyaWRlLCBvZmZzZXQsIGNvdW50LCBmbiwgYXJnKSB7XG4gICAgdmFyIGksIGw7XG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDI7XG4gICAgfVxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGwgPSBNYXRoLm1pbihjb3VudCAqIHN0cmlkZSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsID0gYS5sZW5ndGg7XG4gICAgfVxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5cbi8qKlxuICogMyBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBtb2R1bGUgdmVjM1xuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHksIHopIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMyB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHopIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogc3ltbWV0cmljIHJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBnbE1hdHJpeC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gZ2xNYXRyaXgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IGdsTWF0cml4LnJvdW5kKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgIGF5ID0gYVsxXSxcbiAgICBheiA9IGFbMl07XG4gIHZhciBieCA9IGJbMF0sXG4gICAgYnkgPSBiWzFdLFxuICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGFuZ2xlID0gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGRvdChhLCBiKSwgLTEpLCAxKSk7XG4gIHZhciBzaW5Ub3RhbCA9IE1hdGguc2luKGFuZ2xlKTtcbiAgdmFyIHJhdGlvQSA9IE1hdGguc2luKCgxIC0gdCkgKiBhbmdsZSkgLyBzaW5Ub3RhbDtcbiAgdmFyIHJhdGlvQiA9IE1hdGguc2luKHQgKiBhbmdsZSkgLyBzaW5Ub3RhbDtcbiAgb3V0WzBdID0gcmF0aW9BICogYVswXSArIHJhdGlvQiAqIGJbMF07XG4gIG91dFsxXSA9IHJhdGlvQSAqIGFbMV0gKyByYXRpb0IgKiBiWzFdO1xuICBvdXRbMl0gPSByYXRpb0EgKiBhWzJdICsgcmF0aW9CICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZXJtaXRlKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gZmFjdG9yVGltZXMyICogKDIgKiB0IC0gMykgKyAxO1xuICB2YXIgZmFjdG9yMiA9IGZhY3RvclRpbWVzMiAqICh0IC0gMikgKyB0O1xuICB2YXIgZmFjdG9yMyA9IGZhY3RvclRpbWVzMiAqICh0IC0gMSk7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogKDMgLSAyICogdCk7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgYSBiZXppZXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBpbnZlcnNlRmFjdG9yID0gMSAtIHQ7XG4gIHZhciBpbnZlcnNlRmFjdG9yVGltZXNUd28gPSBpbnZlcnNlRmFjdG9yICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGludmVyc2VGYWN0b3JUaW1lc1R3byAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3IyID0gMyAqIHQgKiBpbnZlcnNlRmFjdG9yVGltZXNUd287XG4gIHZhciBmYWN0b3IzID0gMyAqIGZhY3RvclRpbWVzMiAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogdDtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlID09PSB1bmRlZmluZWQgPyAxLjAgOiBzY2FsZTtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIHZhciB6ID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgLSAxLjA7XG4gIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wIC0geiAqIHopICogc2NhbGU7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHpTY2FsZTtcbiAgb3V0WzJdID0geiAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDQuXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgeSA9IGFbMV0sXG4gICAgeiA9IGFbMl07XG4gIHZhciB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICB3ID0gdyB8fCAxLjA7XG4gIG91dFswXSA9IChtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSkgLyB3O1xuICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgb3V0WzJdID0gKG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSkgLyB3O1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgIHkgPSBhWzFdLFxuICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcbiAqIENhbiBhbHNvIGJlIHVzZWQgZm9yIGR1YWwgcXVhdGVybmlvbnMuIChNdWx0aXBseSBpdCB3aXRoIHRoZSByZWFsIHBhcnQpXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBub3JtYWxpemVkIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIC8vIEZhc3QgVmVjdG9yIFJvdGF0aW9uIHVzaW5nIFF1YXRlcm5pb25zIGJ5IFJvYmVydCBFaXNlbGVcbiAgLy8gaHR0cHM6Ly9yYXcub3JnL3Byb29mL3ZlY3Rvci1yb3RhdGlvbi11c2luZy1xdWF0ZXJuaW9ucy9cblxuICB2YXIgcXggPSBxWzBdLFxuICAgIHF5ID0gcVsxXSxcbiAgICBxeiA9IHFbMl0sXG4gICAgcXcgPSBxWzNdO1xuICB2YXIgdnggPSBhWzBdLFxuICAgIHZ5ID0gYVsxXSxcbiAgICB2eiA9IGFbMl07XG5cbiAgLy8gdCA9IHEgeCB2XG4gIHZhciB0eCA9IHF5ICogdnogLSBxeiAqIHZ5O1xuICB2YXIgdHkgPSBxeiAqIHZ4IC0gcXggKiB2ejtcbiAgdmFyIHR6ID0gcXggKiB2eSAtIHF5ICogdng7XG5cbiAgLy8gdCA9IDJ0XG4gIHR4ID0gdHggKyB0eDtcbiAgdHkgPSB0eSArIHR5O1xuICB0eiA9IHR6ICsgdHo7XG5cbiAgLy8gdiArIHcgdCArIHEgeCB0XG4gIG91dFswXSA9IHZ4ICsgcXcgKiB0eCArIHF5ICogdHogLSBxeiAqIHR5O1xuICBvdXRbMV0gPSB2eSArIHF3ICogdHkgKyBxeiAqIHR4IC0gcXggKiB0ejtcbiAgb3V0WzJdID0gdnogKyBxdyAqIHR6ICsgcXggKiB0eSAtIHF5ICogdHg7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeC1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICByID0gW107XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTtcblxuICAvL3BlcmZvcm0gcm90YXRpb25cbiAgclswXSA9IHBbMF07XG4gIHJbMV0gPSBwWzFdICogTWF0aC5jb3MocmFkKSAtIHBbMl0gKiBNYXRoLnNpbihyYWQpO1xuICByWzJdID0gcFsxXSAqIE1hdGguc2luKHJhZCkgKyBwWzJdICogTWF0aC5jb3MocmFkKTtcblxuICAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeS1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICByID0gW107XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTtcblxuICAvL3BlcmZvcm0gcm90YXRpb25cbiAgclswXSA9IHBbMl0gKiBNYXRoLnNpbihyYWQpICsgcFswXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMV0gPSBwWzFdO1xuICByWzJdID0gcFsyXSAqIE1hdGguY29zKHJhZCkgLSBwWzBdICogTWF0aC5zaW4ocmFkKTtcblxuICAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgei1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICByID0gW107XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTtcblxuICAvL3BlcmZvcm0gcm90YXRpb25cbiAgclswXSA9IHBbMF0gKiBNYXRoLmNvcyhyYWQpIC0gcFsxXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMV0gPSBwWzBdICogTWF0aC5zaW4ocmFkKSArIHBbMV0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzJdID0gcFsyXTtcblxuICAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgIGF5ID0gYVsxXSxcbiAgICBheiA9IGFbMl0sXG4gICAgYnggPSBiWzBdLFxuICAgIGJ5ID0gYlsxXSxcbiAgICBieiA9IGJbMl0sXG4gICAgbWFnID0gTWF0aC5zcXJ0KChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopICogKGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieikpLFxuICAgIGNvc2luZSA9IG1hZyAmJiBkb3QoYSwgYikgLyBtYWc7XG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHplcm9cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIilcIjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICBhMSA9IGFbMV0sXG4gICAgYTIgPSBhWzJdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgIGIxID0gYlsxXSxcbiAgICBiMiA9IGJbMl07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKTtcbn1cblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjM3MuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMy4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzNzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcbiAgICBpZiAoIXN0cmlkZSkge1xuICAgICAgc3RyaWRlID0gMztcbiAgICB9XG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG4gICAgZm9yIChpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgIHZlY1swXSA9IGFbaV07XG4gICAgICB2ZWNbMV0gPSBhW2kgKyAxXTtcbiAgICAgIHZlY1syXSA9IGFbaSArIDJdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQyIGZyb20gXCIuL21hdDIuanNcIjtcbmltcG9ydCAqIGFzIG1hdDJkIGZyb20gXCIuL21hdDJkLmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQzIGZyb20gXCIuL21hdDMuanNcIjtcbmltcG9ydCAqIGFzIG1hdDQgZnJvbSBcIi4vbWF0NC5qc1wiO1xuaW1wb3J0ICogYXMgcXVhdCBmcm9tIFwiLi9xdWF0LmpzXCI7XG5pbXBvcnQgKiBhcyBxdWF0MiBmcm9tIFwiLi9xdWF0Mi5qc1wiO1xuaW1wb3J0ICogYXMgdmVjMiBmcm9tIFwiLi92ZWMyLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWMzIGZyb20gXCIuL3ZlYzMuanNcIjtcbmltcG9ydCAqIGFzIHZlYzQgZnJvbSBcIi4vdmVjNC5qc1wiO1xuZXhwb3J0IHsgZ2xNYXRyaXgsIG1hdDIsIG1hdDJkLCBtYXQzLCBtYXQ0LCBxdWF0LCBxdWF0MiwgdmVjMiwgdmVjMywgdmVjNCB9OyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5pbXBvcnQgeyBUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgaW5pdChhcnI6IFR5cGVkQXJyYXkgfCBBcnJheTxudW1iZXI+LCB2YWw6IG51bWJlcikge1xuICAgICAgICBhcnIuZmlsbCh2YWwpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJTi1QTEFDRSBTaHVmZmxlcyB0aGUgY29udGVudCBvZiBhbiBhcnJheVxuICAgICAqL1xuICAgIHNodWZmbGUoYXJyOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIC8vIER1cnN0ZW5mZWxkIHNodWZmbGUgYWxnb3JpdGhtXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0NTA5NTQvaG93LXRvLXJhbmRvbWl6ZS1zaHVmZmxlLWEtamF2YXNjcmlwdC1hcnJheVxuICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICAgIFthcnJbaV0sIGFycltqXV0gPSBbYXJyW2pdLCBhcnJbaV1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHRvUG9pbnRMaXN0KGFycjogQXJyYXk8QXJyYXk8bnVtYmVyPj4pIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IGFyci5yZWR1Y2UoKHAsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGBbJHtuLmpvaW4oJywnKX1dYDtcbiAgICAgICAgICAgIHAucHVzaChyb3cpO1xuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgIH0sIFtdIGFzIEFycmF5PHN0cmluZz4pO1xuICAgICAgICByZXR1cm4gYFske3Jvd3Muam9pbignLFxcclxcbicpfV1gO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIHRoZSBlbGVtZW50cyB3aGljaCdzIHNjb3JlIGlzIGJpZ2dlciB0aGFuIHRoZSB0aHJlc2hvbGRcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB0aHJlc2hvbGQoYXJyOiBBcnJheTxudW1iZXI+LCB0aHJlc2hvbGQ6IG51bWJlciwgc2NvcmVGdW5jOiAoKHNjb3JlOiBudW1iZXIpID0+IG51bWJlcikpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBhcnIucmVkdWNlKChwcmV2OiBBcnJheTxudW1iZXI+LCBuZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NvcmVGdW5jLmFwcGx5KGFyciwgW25leHRdKSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBwcmV2LnB1c2gobmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwgW10pO1xuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfSxcblxuICAgIG1heEluZGV4KGFycjogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBsZXQgbWF4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcnJbaV0gPiBhcnJbbWF4XSkge1xuICAgICAgICAgICAgICAgIG1heCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9LFxuXG4gICAgbWF4KGFycjogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBsZXQgbWF4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhcnJbaV0gPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSBhcnJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9LFxuXG4gICAgc3VtKGFycjogQXJyYXk8bnVtYmVyPiB8IFR5cGVkQXJyYXkpOiBudW1iZXIge1xuICAgICAgICBsZXQgeyBsZW5ndGggfSA9IGFycjtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBzdW0gKz0gYXJyW2xlbmd0aF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9LFxufTtcbiIsIi8vIFRPRE86IGNsdXN0ZXIuanMgYW5kIGN2X3V0aWxzLmpzIGFyZSBwcmV0dHkgdGlnaHRseSBpbnRlcnR3aW5lZCwgbWFraW5nIGZvciBhIGNvbXBsZXggY29udmVyc2lvblxuLy8gaW50byB0eXBlc2NyaXB0LiBiZSB3YXJuZWQuIDotKVxuXG5pbXBvcnQgeyB2ZWMyIH0gZnJvbSAnZ2wtbWF0cml4JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2x1c3RlciBmb3IgZ3JvdXBpbmcgc2ltaWxhciBvcmllbnRhdGlvbnMgb2YgZGF0YXBvaW50c1xuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgY3JlYXRlKHBvaW50LCB0aHJlc2hvbGQpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHtcbiAgICAgICAgICAgIHJhZDogMCxcbiAgICAgICAgICAgIHZlYzogdmVjMi5jbG9uZShbMCwgMF0pLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwb2ludE1hcCA9IHt9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGFkZChwb2ludFRvQWRkKSB7XG4gICAgICAgICAgICBwb2ludE1hcFtwb2ludFRvQWRkLmlkXSA9IHBvaW50VG9BZGQ7XG4gICAgICAgICAgICBwb2ludHMucHVzaChwb2ludFRvQWRkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUNlbnRlcigpIHtcbiAgICAgICAgICAgIGxldCBpOyBsZXRcbiAgICAgICAgICAgICAgICBzdW0gPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1bSArPSBwb2ludHNbaV0ucmFkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2VudGVyLnJhZCA9IHN1bSAvIHBvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICBjZW50ZXIudmVjID0gdmVjMi5jbG9uZShbTWF0aC5jb3MoY2VudGVyLnJhZCksIE1hdGguc2luKGNlbnRlci5yYWQpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgYWRkKHBvaW50KTtcbiAgICAgICAgICAgIHVwZGF0ZUNlbnRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5pdCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGQocG9pbnRUb0FkZCkge1xuICAgICAgICAgICAgICAgIGlmICghcG9pbnRNYXBbcG9pbnRUb0FkZC5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkKHBvaW50VG9BZGQpO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZml0cyhvdGhlclBvaW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgY29zaW5lIHNpbWlsYXJpdHkgdG8gY2VudGVyLWFuZ2xlXG4gICAgICAgICAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IE1hdGguYWJzKHZlYzIuZG90KG90aGVyUG9pbnQucG9pbnQudmVjLCBjZW50ZXIudmVjKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNpbWlsYXJpdHkgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRQb2ludHMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDZW50ZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlbnRlcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVQb2ludChuZXdQb2ludCwgaWQsIHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYWQ6IG5ld1BvaW50W3Byb3BlcnR5XSxcbiAgICAgICAgICAgIHBvaW50OiBuZXdQb2ludCxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwiLyogZXNsaW50LWRpc2FibGUgbm8tbWl4ZWQtb3BlcmF0b3JzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5pbXBvcnQgeyB2ZWMyLCB2ZWMzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBBcnJheUhlbHBlciBmcm9tICcuL2FycmF5X2hlbHBlcic7XG5pbXBvcnQgQ2x1c3RlcjIgZnJvbSAnLi9jbHVzdGVyJztcblxuLyoqXG4gKiBAcGFyYW0geCB4LWNvb3JkaW5hdGVcbiAqIEBwYXJhbSB5IHktY29vcmRpbmF0ZVxuICogQHJldHVybiBJbWFnZVJlZmVyZW5jZSB7eCx5fSBDb29yZGluYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZVJlZih4LCB5KSB7XG4gICAgY29uc3QgdGhhdCA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgdG9WZWMyKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZlYzIuY2xvbmUoW3RoaXMueCwgdGhpcy55XSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRvVmVjMygpIHtcbiAgICAgICAgICAgIHJldHVybiB2ZWMzLmNsb25lKFt0aGlzLngsIHRoaXMueSwgMV0pO1xuICAgICAgICB9LFxuICAgICAgICByb3VuZCgpIHtcbiAgICAgICAgICAgIHRoaXMueCA9IHRoaXMueCA+IDAuMCA/IE1hdGguZmxvb3IodGhpcy54ICsgMC41KSA6IE1hdGguZmxvb3IodGhpcy54IC0gMC41KTtcbiAgICAgICAgICAgIHRoaXMueSA9IHRoaXMueSA+IDAuMCA/IE1hdGguZmxvb3IodGhpcy55ICsgMC41KSA6IE1hdGguZmxvb3IodGhpcy55IC0gMC41KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIHRoYXQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYW4gaW50ZWdyYWwgaW1hZ2Ugb2YgYSBnaXZlbiBncmF5c2NhbGUgaW1hZ2UuXG4gKiBAcGFyYW0gaW1hZ2VEYXRhQ29udGFpbmVyIHtJbWFnZURhdGFDb250YWluZXJ9IHRoZSBpbWFnZSB0byBiZSBpbnRlZ3JhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSW50ZWdyYWxJbWFnZTIoaW1hZ2VXcmFwcGVyLCBpbnRlZ3JhbFdyYXBwZXIpIHtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICBjb25zdCBpbnRlZ3JhbEltYWdlRGF0YSA9IGludGVncmFsV3JhcHBlci5kYXRhO1xuICAgIGxldCBzdW0gPSAwOyBsZXQgcG9zQSA9IDA7IGxldCBwb3NCID0gMDsgbGV0IHBvc0MgPSAwOyBsZXQgcG9zRCA9IDA7IGxldCB4OyBsZXRcbiAgICAgICAgeTtcblxuICAgIC8vIHN1bSB1cCBmaXJzdCBjb2x1bW5cbiAgICBwb3NCID0gd2lkdGg7XG4gICAgc3VtID0gMDtcbiAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgc3VtICs9IGltYWdlRGF0YVtwb3NBXTtcbiAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbcG9zQl0gKz0gc3VtO1xuICAgICAgICBwb3NBICs9IHdpZHRoO1xuICAgICAgICBwb3NCICs9IHdpZHRoO1xuICAgIH1cblxuICAgIHBvc0EgPSAwO1xuICAgIHBvc0IgPSAxO1xuICAgIHN1bSA9IDA7XG4gICAgZm9yICh4ID0gMTsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgc3VtICs9IGltYWdlRGF0YVtwb3NBXTtcbiAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbcG9zQl0gKz0gc3VtO1xuICAgICAgICBwb3NBKys7XG4gICAgICAgIHBvc0IrKztcbiAgICB9XG5cbiAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgcG9zQSA9IHkgKiB3aWR0aCArIDE7XG4gICAgICAgIHBvc0IgPSAoeSAtIDEpICogd2lkdGggKyAxO1xuICAgICAgICBwb3NDID0geSAqIHdpZHRoO1xuICAgICAgICBwb3NEID0gKHkgLSAxKSAqIHdpZHRoO1xuICAgICAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbcG9zQV1cbiAgICAgICAgICAgICAgICArPSBpbWFnZURhdGFbcG9zQV0gKyBpbnRlZ3JhbEltYWdlRGF0YVtwb3NCXSArIGludGVncmFsSW1hZ2VEYXRhW3Bvc0NdIC0gaW50ZWdyYWxJbWFnZURhdGFbcG9zRF07XG4gICAgICAgICAgICBwb3NBKys7XG4gICAgICAgICAgICBwb3NCKys7XG4gICAgICAgICAgICBwb3NDKys7XG4gICAgICAgICAgICBwb3NEKys7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSW50ZWdyYWxJbWFnZShpbWFnZVdyYXBwZXIsIGludGVncmFsV3JhcHBlcikge1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IGludGVncmFsSW1hZ2VEYXRhID0gaW50ZWdyYWxXcmFwcGVyLmRhdGE7XG4gICAgbGV0IHN1bSA9IDA7XG5cbiAgICAvLyBzdW0gdXAgZmlyc3Qgcm93XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgIHN1bSArPSBpbWFnZURhdGFbaV07XG4gICAgICAgIGludGVncmFsSW1hZ2VEYXRhW2ldID0gc3VtO1xuICAgIH1cblxuICAgIGZvciAobGV0IHYgPSAxOyB2IDwgaGVpZ2h0OyB2KyspIHtcbiAgICAgICAgc3VtID0gMDtcbiAgICAgICAgZm9yIChsZXQgdSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7XG4gICAgICAgICAgICBzdW0gKz0gaW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdO1xuICAgICAgICAgICAgaW50ZWdyYWxJbWFnZURhdGFbKCh2KSAqIHdpZHRoKSArIHVdID0gc3VtICsgaW50ZWdyYWxJbWFnZURhdGFbKHYgLSAxKSAqIHdpZHRoICsgdV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJlc2hvbGRJbWFnZShpbWFnZVdyYXBwZXIsIHRocmVzaG9sZCwgdGFyZ2V0V3JhcHBlcikge1xuICAgIGlmICghdGFyZ2V0V3JhcHBlcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdGFyZ2V0V3JhcHBlciA9IGltYWdlV3JhcHBlcjtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7IGxldCB7IGxlbmd0aCB9ID0gaW1hZ2VEYXRhOyBjb25zdFxuICAgICAgICB0YXJnZXREYXRhID0gdGFyZ2V0V3JhcHBlci5kYXRhO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHRhcmdldERhdGFbbGVuZ3RoXSA9IGltYWdlRGF0YVtsZW5ndGhdIDwgdGhyZXNob2xkID8gMSA6IDA7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUhpc3RvZ3JhbShpbWFnZVdyYXBwZXIsIGJpdHNQZXJQaXhlbCkge1xuICAgIGlmICghYml0c1BlclBpeGVsKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBiaXRzUGVyUGl4ZWwgPSA4O1xuICAgIH1cbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBsZXQgeyBsZW5ndGggfSA9IGltYWdlRGF0YTtcbiAgICBjb25zdCBiaXRTaGlmdCA9IDggLSBiaXRzUGVyUGl4ZWw7XG4gICAgY29uc3QgYnVja2V0Q250ID0gMSA8PCBiaXRzUGVyUGl4ZWw7XG4gICAgY29uc3QgaGlzdCA9IG5ldyBJbnQzMkFycmF5KGJ1Y2tldENudCk7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaGlzdFtpbWFnZURhdGFbbGVuZ3RoXSA+PiBiaXRTaGlmdF0rKztcbiAgICB9XG4gICAgcmV0dXJuIGhpc3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFycGVuTGluZShsaW5lKSB7XG4gICAgbGV0IGk7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGxpbmU7XG4gICAgbGV0IGxlZnQgPSBsaW5lWzBdO1xuICAgIGxldCBjZW50ZXIgPSBsaW5lWzFdO1xuICAgIGxldCByaWdodDtcblxuICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgcmlnaHQgPSBsaW5lW2kgKyAxXTtcbiAgICAgICAgLy8gIC0xIDQgLTEga2VybmVsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBsaW5lW2kgLSAxXSA9ICgoKGNlbnRlciAqIDIpIC0gbGVmdCAtIHJpZ2h0KSkgJiAyNTU7XG4gICAgICAgIGxlZnQgPSBjZW50ZXI7XG4gICAgICAgIGNlbnRlciA9IHJpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gbGluZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluZU90c3VUaHJlc2hvbGQoaW1hZ2VXcmFwcGVyLCBiaXRzUGVyUGl4ZWwgPSA4KSB7XG4gICAgbGV0IGhpc3Q7XG4gICAgY29uc3QgYml0U2hpZnQgPSA4IC0gYml0c1BlclBpeGVsO1xuXG4gICAgZnVuY3Rpb24gcHgoaW5pdCwgZW5kKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gaW5pdDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICAgICAgc3VtICs9IGhpc3RbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBteChpbml0LCBlbmQpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGluaXQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBpICogaGlzdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGV0ZXJtaW5lVGhyZXNob2xkKCkge1xuICAgICAgICBjb25zdCB2ZXQgPSBbMF07XG4gICAgICAgIGxldCBwMTtcbiAgICAgICAgbGV0IHAyO1xuICAgICAgICBsZXQgcDEyO1xuICAgICAgICBsZXQgbTE7XG4gICAgICAgIGxldCBtMjtcbiAgICAgICAgbGV0IG0xMjtcbiAgICAgICAgY29uc3QgbWF4ID0gKDEgPDwgYml0c1BlclBpeGVsKSAtIDE7XG5cbiAgICAgICAgaGlzdCA9IGNvbXB1dGVIaXN0b2dyYW0oaW1hZ2VXcmFwcGVyLCBiaXRzUGVyUGl4ZWwpO1xuICAgICAgICBmb3IgKGxldCBrID0gMTsgayA8IG1heDsgaysrKSB7XG4gICAgICAgICAgICBwMSA9IHB4KDAsIGspO1xuICAgICAgICAgICAgcDIgPSBweChrICsgMSwgbWF4KTtcbiAgICAgICAgICAgIHAxMiA9IHAxICogcDI7XG4gICAgICAgICAgICBpZiAocDEyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcDEyID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG0xID0gbXgoMCwgaykgKiBwMjtcbiAgICAgICAgICAgIG0yID0gbXgoayArIDEsIG1heCkgKiBwMTtcbiAgICAgICAgICAgIG0xMiA9IG0xIC0gbTI7XG4gICAgICAgICAgICB2ZXRba10gPSBtMTIgKiBtMTIgLyBwMTI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5SGVscGVyLm1heEluZGV4KHZldCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGhyZXNob2xkID0gZGV0ZXJtaW5lVGhyZXNob2xkKCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCA8PCBiaXRTaGlmdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG90c3VUaHJlc2hvbGQoaW1hZ2VXcmFwcGVyLCB0YXJnZXRXcmFwcGVyKSB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gZGV0ZXJtaW5lT3RzdVRocmVzaG9sZChpbWFnZVdyYXBwZXIpO1xuXG4gICAgdGhyZXNob2xkSW1hZ2UoaW1hZ2VXcmFwcGVyLCB0aHJlc2hvbGQsIHRhcmdldFdyYXBwZXIpO1xuICAgIHJldHVybiB0aHJlc2hvbGQ7XG59XG5cbi8vIGxvY2FsIHRocmVzaG9sZGluZ1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVCaW5hcnlJbWFnZShpbWFnZVdyYXBwZXIsIGludGVncmFsV3JhcHBlciwgdGFyZ2V0V3JhcHBlcikge1xuICAgIGNvbXB1dGVJbnRlZ3JhbEltYWdlKGltYWdlV3JhcHBlciwgaW50ZWdyYWxXcmFwcGVyKTtcblxuICAgIGlmICghdGFyZ2V0V3JhcHBlcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdGFyZ2V0V3JhcHBlciA9IGltYWdlV3JhcHBlcjtcbiAgICB9XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgdGFyZ2V0RGF0YSA9IHRhcmdldFdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCB3aWR0aCA9IGltYWdlV3JhcHBlci5zaXplLng7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICBjb25zdCBpbnRlZ3JhbEltYWdlRGF0YSA9IGludGVncmFsV3JhcHBlci5kYXRhO1xuICAgIGxldCBzdW0gPSAwOyBsZXQgdjsgbGV0IHU7IGNvbnN0IGtlcm5lbCA9IDM7IGxldCBBOyBsZXQgQjsgbGV0IEM7IGxldCBEOyBsZXQgYXZnOyBjb25zdFxuICAgICAgICBzaXplID0gKGtlcm5lbCAqIDIgKyAxKSAqIChrZXJuZWwgKiAyICsgMSk7XG5cbiAgICAvLyBjbGVhciBvdXQgdG9wICYgYm90dG9tLWJvcmRlclxuICAgIGZvciAodiA9IDA7IHYgPD0ga2VybmVsOyB2KyspIHtcbiAgICAgICAgZm9yICh1ID0gMDsgdSA8IHdpZHRoOyB1KyspIHtcbiAgICAgICAgICAgIHRhcmdldERhdGFbKCh2KSAqIHdpZHRoKSArIHVdID0gMDtcbiAgICAgICAgICAgIHRhcmdldERhdGFbKCgoaGVpZ2h0IC0gMSkgLSB2KSAqIHdpZHRoKSArIHVdID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNsZWFyIG91dCBsZWZ0ICYgcmlnaHQgYm9yZGVyXG4gICAgZm9yICh2ID0ga2VybmVsOyB2IDwgaGVpZ2h0IC0ga2VybmVsOyB2KyspIHtcbiAgICAgICAgZm9yICh1ID0gMDsgdSA8PSBrZXJuZWw7IHUrKykge1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKHYpICogd2lkdGgpICsgdV0gPSAwO1xuICAgICAgICAgICAgdGFyZ2V0RGF0YVsoKHYpICogd2lkdGgpICsgKHdpZHRoIC0gMSAtIHUpXSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHYgPSBrZXJuZWwgKyAxOyB2IDwgaGVpZ2h0IC0ga2VybmVsIC0gMTsgdisrKSB7XG4gICAgICAgIGZvciAodSA9IGtlcm5lbCArIDE7IHUgPCB3aWR0aCAtIGtlcm5lbDsgdSsrKSB7XG4gICAgICAgICAgICBBID0gaW50ZWdyYWxJbWFnZURhdGFbKHYgLSBrZXJuZWwgLSAxKSAqIHdpZHRoICsgKHUgLSBrZXJuZWwgLSAxKV07XG4gICAgICAgICAgICBCID0gaW50ZWdyYWxJbWFnZURhdGFbKHYgLSBrZXJuZWwgLSAxKSAqIHdpZHRoICsgKHUgKyBrZXJuZWwpXTtcbiAgICAgICAgICAgIEMgPSBpbnRlZ3JhbEltYWdlRGF0YVsodiArIGtlcm5lbCkgKiB3aWR0aCArICh1IC0ga2VybmVsIC0gMSldO1xuICAgICAgICAgICAgRCA9IGludGVncmFsSW1hZ2VEYXRhWyh2ICsga2VybmVsKSAqIHdpZHRoICsgKHUgKyBrZXJuZWwpXTtcbiAgICAgICAgICAgIHN1bSA9IEQgLSBDIC0gQiArIEE7XG4gICAgICAgICAgICBhdmcgPSBzdW0gLyAoc2l6ZSk7XG4gICAgICAgICAgICB0YXJnZXREYXRhW3YgKiB3aWR0aCArIHVdID0gaW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID4gKGF2ZyArIDUpID8gMCA6IDE7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbHVzdGVyKHBvaW50cywgdGhyZXNob2xkLCBwcm9wZXJ0eSkge1xuICAgIGxldCBpOyBsZXQgazsgbGV0IHRoaXNDbHVzdGVyOyBsZXQgcG9pbnQ7IGNvbnN0XG4gICAgICAgIGNsdXN0ZXJzID0gW107XG5cbiAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBwcm9wZXJ0eSA9ICdyYWQnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRvQ2x1c3RlcihuZXdQb2ludCkge1xuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGNsdXN0ZXJzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICB0aGlzQ2x1c3RlciA9IGNsdXN0ZXJzW2tdO1xuICAgICAgICAgICAgaWYgKHRoaXNDbHVzdGVyLmZpdHMobmV3UG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpc0NsdXN0ZXIuYWRkKG5ld1BvaW50KTtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgb3ZlciBlYWNoIGNsb3VkXG4gICAgZm9yIChpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwb2ludCA9IENsdXN0ZXIyLmNyZWF0ZVBvaW50KHBvaW50c1tpXSwgaSwgcHJvcGVydHkpO1xuICAgICAgICBpZiAoIWFkZFRvQ2x1c3Rlcihwb2ludCkpIHtcbiAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goQ2x1c3RlcjIuY3JlYXRlKHBvaW50LCB0aHJlc2hvbGQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2x1c3RlcnM7XG59XG5cbmV4cG9ydCBjb25zdCBUcmFjZXIgPSB7XG4gICAgdHJhY2UocG9pbnRzLCB2ZWMpIHtcbiAgICAgICAgbGV0IGl0ZXJhdGlvbjtcbiAgICAgICAgY29uc3QgbWF4SXRlcmF0aW9ucyA9IDEwO1xuICAgICAgICBsZXQgdG9wID0gW107XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgbGV0IGNlbnRlclBvcyA9IDA7XG4gICAgICAgIGxldCBjdXJyZW50UG9zID0gMDtcblxuICAgICAgICBmdW5jdGlvbiB0cmFjZShpZHgsIGZvcndhcmQpIHtcbiAgICAgICAgICAgIGxldCB0bztcbiAgICAgICAgICAgIGxldCB0b0lkeDtcbiAgICAgICAgICAgIGxldCBwcmVkaWN0ZWRQb3M7XG4gICAgICAgICAgICBjb25zdCB0aHJlc2hvbGRYID0gMTtcbiAgICAgICAgICAgIGNvbnN0IHRocmVzaG9sZFkgPSBNYXRoLmFicyh2ZWNbMV0gLyAxMCk7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gbWF0Y2gocG9zLCBwcmVkaWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zLnggPiAocHJlZGljdGVkLnggLSB0aHJlc2hvbGRYKVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9zLnggPCAocHJlZGljdGVkLnggKyB0aHJlc2hvbGRYKVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9zLnkgPiAocHJlZGljdGVkLnkgLSB0aHJlc2hvbGRZKVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9zLnkgPCAocHJlZGljdGVkLnkgKyB0aHJlc2hvbGRZKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgbmV4dCBpbmRleCBpcyB3aXRoaW4gdGhlIHZlYyBzcGVjaWZpY2F0aW9uc1xuICAgICAgICAgICAgLy8gaWYgbm90LCBjaGVjayBhcyBsb25nIGFzIHRoZSB0aHJlc2hvbGQgaXMgbWV0XG5cbiAgICAgICAgICAgIGNvbnN0IGZyb20gPSBwb2ludHNbaWR4XTtcbiAgICAgICAgICAgIGlmIChmb3J3YXJkKSB7XG4gICAgICAgICAgICAgICAgcHJlZGljdGVkUG9zID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiBmcm9tLnggKyB2ZWNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHk6IGZyb20ueSArIHZlY1sxXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVkaWN0ZWRQb3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGZyb20ueCAtIHZlY1swXSxcbiAgICAgICAgICAgICAgICAgICAgeTogZnJvbS55IC0gdmVjWzFdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvSWR4ID0gZm9yd2FyZCA/IGlkeCArIDEgOiBpZHggLSAxO1xuICAgICAgICAgICAgdG8gPSBwb2ludHNbdG9JZHhdO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgICAgICAgICB3aGlsZSAodG8gJiYgKGZvdW5kID0gbWF0Y2godG8sIHByZWRpY3RlZFBvcykpICE9PSB0cnVlICYmIChNYXRoLmFicyh0by55IC0gZnJvbS55KSA8IHZlY1sxXSkpIHtcbiAgICAgICAgICAgICAgICB0b0lkeCA9IGZvcndhcmQgPyB0b0lkeCArIDEgOiB0b0lkeCAtIDE7XG4gICAgICAgICAgICAgICAgdG8gPSBwb2ludHNbdG9JZHhdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQgPyB0b0lkeCA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IG1heEl0ZXJhdGlvbnM7IGl0ZXJhdGlvbisrKSB7XG4gICAgICAgICAgICAvLyByYW5kb21seSBzZWxlY3QgcG9pbnQgdG8gc3RhcnQgd2l0aFxuICAgICAgICAgICAgY2VudGVyUG9zID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9pbnRzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIC8vIHRyYWNlIGZvcndhcmRcbiAgICAgICAgICAgIHRvcCA9IFtdO1xuICAgICAgICAgICAgY3VycmVudFBvcyA9IGNlbnRlclBvcztcbiAgICAgICAgICAgIHRvcC5wdXNoKHBvaW50c1tjdXJyZW50UG9zXSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uZC1hc3NpZ25cbiAgICAgICAgICAgIHdoaWxlICgoY3VycmVudFBvcyA9IHRyYWNlKGN1cnJlbnRQb3MsIHRydWUpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRvcC5wdXNoKHBvaW50c1tjdXJyZW50UG9zXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2VudGVyUG9zID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQb3MgPSBjZW50ZXJQb3M7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmQtYXNzaWduXG4gICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50UG9zID0gdHJhY2UoY3VycmVudFBvcywgZmFsc2UpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0b3AucHVzaChwb2ludHNbY3VycmVudFBvc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRvcC5sZW5ndGggPiByZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBESUxBVEUgPSAxO1xuZXhwb3J0IGNvbnN0IEVST0RFID0gMjtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpbGF0ZShpbkltYWdlV3JhcHBlciwgb3V0SW1hZ2VXcmFwcGVyKSB7XG4gICAgbGV0IHY7XG4gICAgbGV0IHU7XG4gICAgY29uc3QgaW5JbWFnZURhdGEgPSBpbkltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IG91dEltYWdlRGF0YSA9IG91dEltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGhlaWdodCA9IGluSW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICBjb25zdCB3aWR0aCA9IGluSW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBsZXQgc3VtO1xuICAgIGxldCB5U3RhcnQxO1xuICAgIGxldCB5U3RhcnQyO1xuICAgIGxldCB4U3RhcnQxO1xuICAgIGxldCB4U3RhcnQyO1xuXG4gICAgZm9yICh2ID0gMTsgdiA8IGhlaWdodCAtIDE7IHYrKykge1xuICAgICAgICBmb3IgKHUgPSAxOyB1IDwgd2lkdGggLSAxOyB1KyspIHtcbiAgICAgICAgICAgIHlTdGFydDEgPSB2IC0gMTtcbiAgICAgICAgICAgIHlTdGFydDIgPSB2ICsgMTtcbiAgICAgICAgICAgIHhTdGFydDEgPSB1IC0gMTtcbiAgICAgICAgICAgIHhTdGFydDIgPSB1ICsgMTtcbiAgICAgICAgICAgIHN1bSA9IGluSW1hZ2VEYXRhW3lTdGFydDEgKiB3aWR0aCArIHhTdGFydDFdICsgaW5JbWFnZURhdGFbeVN0YXJ0MSAqIHdpZHRoICsgeFN0YXJ0Ml1cbiAgICAgICAgICAgICsgaW5JbWFnZURhdGFbdiAqIHdpZHRoICsgdV1cbiAgICAgICAgICAgICsgaW5JbWFnZURhdGFbeVN0YXJ0MiAqIHdpZHRoICsgeFN0YXJ0MV0gKyBpbkltYWdlRGF0YVt5U3RhcnQyICogd2lkdGggKyB4U3RhcnQyXTtcbiAgICAgICAgICAgIG91dEltYWdlRGF0YVt2ICogd2lkdGggKyB1XSA9IHN1bSA+IDAgPyAxIDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVyb2RlKGluSW1hZ2VXcmFwcGVyLCBvdXRJbWFnZVdyYXBwZXIpIHtcbiAgICBsZXQgdjtcbiAgICBsZXQgdTtcbiAgICBjb25zdCBpbkltYWdlRGF0YSA9IGluSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3Qgb3V0SW1hZ2VEYXRhID0gb3V0SW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgIGNvbnN0IHdpZHRoID0gaW5JbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgIGxldCBzdW07XG4gICAgbGV0IHlTdGFydDE7XG4gICAgbGV0IHlTdGFydDI7XG4gICAgbGV0IHhTdGFydDE7XG4gICAgbGV0IHhTdGFydDI7XG5cbiAgICBmb3IgKHYgPSAxOyB2IDwgaGVpZ2h0IC0gMTsgdisrKSB7XG4gICAgICAgIGZvciAodSA9IDE7IHUgPCB3aWR0aCAtIDE7IHUrKykge1xuICAgICAgICAgICAgeVN0YXJ0MSA9IHYgLSAxO1xuICAgICAgICAgICAgeVN0YXJ0MiA9IHYgKyAxO1xuICAgICAgICAgICAgeFN0YXJ0MSA9IHUgLSAxO1xuICAgICAgICAgICAgeFN0YXJ0MiA9IHUgKyAxO1xuICAgICAgICAgICAgc3VtID0gaW5JbWFnZURhdGFbeVN0YXJ0MSAqIHdpZHRoICsgeFN0YXJ0MV0gKyBpbkltYWdlRGF0YVt5U3RhcnQxICogd2lkdGggKyB4U3RhcnQyXVxuICAgICAgICAgICAgKyBpbkltYWdlRGF0YVt2ICogd2lkdGggKyB1XVxuICAgICAgICAgICAgKyBpbkltYWdlRGF0YVt5U3RhcnQyICogd2lkdGggKyB4U3RhcnQxXSArIGluSW1hZ2VEYXRhW3lTdGFydDIgKiB3aWR0aCArIHhTdGFydDJdO1xuICAgICAgICAgICAgb3V0SW1hZ2VEYXRhW3YgKiB3aWR0aCArIHVdID0gc3VtID09PSA1ID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChhSW1hZ2VXcmFwcGVyLCBiSW1hZ2VXcmFwcGVyLCByZXN1bHRJbWFnZVdyYXBwZXIpIHtcbiAgICBpZiAoIXJlc3VsdEltYWdlV3JhcHBlcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgcmVzdWx0SW1hZ2VXcmFwcGVyID0gYUltYWdlV3JhcHBlcjtcbiAgICB9XG4gICAgbGV0IHsgbGVuZ3RoIH0gPSBhSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgYUltYWdlRGF0YSA9IGFJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBiSW1hZ2VEYXRhID0gYkltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGNJbWFnZURhdGEgPSByZXN1bHRJbWFnZVdyYXBwZXIuZGF0YTtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBjSW1hZ2VEYXRhW2xlbmd0aF0gPSBhSW1hZ2VEYXRhW2xlbmd0aF0gLSBiSW1hZ2VEYXRhW2xlbmd0aF07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYml0d2lzZU9yKGFJbWFnZVdyYXBwZXIsIGJJbWFnZVdyYXBwZXIsIHJlc3VsdEltYWdlV3JhcHBlcikge1xuICAgIGlmICghcmVzdWx0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICByZXN1bHRJbWFnZVdyYXBwZXIgPSBhSW1hZ2VXcmFwcGVyO1xuICAgIH1cbiAgICBsZXQgeyBsZW5ndGggfSA9IGFJbWFnZVdyYXBwZXIuZGF0YTtcbiAgICBjb25zdCBhSW1hZ2VEYXRhID0gYUltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGJJbWFnZURhdGEgPSBiSW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgY0ltYWdlRGF0YSA9IHJlc3VsdEltYWdlV3JhcHBlci5kYXRhO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGNJbWFnZURhdGFbbGVuZ3RoXSA9IGFJbWFnZURhdGFbbGVuZ3RoXSB8fCBiSW1hZ2VEYXRhW2xlbmd0aF07XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY291bnROb25aZXJvKGltYWdlV3JhcHBlcikge1xuICAgIGxldCB7IGxlbmd0aCB9ID0gaW1hZ2VXcmFwcGVyLmRhdGE7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBpbWFnZVdyYXBwZXI7XG4gICAgbGV0IHN1bSA9IDA7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgc3VtICs9IGRhdGFbbGVuZ3RoXTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvcEdlbmVyaWMobGlzdCwgdG9wLCBzY29yZUZ1bmMpIHtcbiAgICBsZXQgaTsgbGV0IG1pbklkeCA9IDA7IGxldCBtaW4gPSAwOyBjb25zdCBxdWV1ZSA9IFtdOyBsZXQgc2NvcmU7IGxldCBoaXQ7IGxldFxuICAgICAgICBwb3M7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdG9wOyBpKyspIHtcbiAgICAgICAgcXVldWVbaV0gPSB7XG4gICAgICAgICAgICBzY29yZTogMCxcbiAgICAgICAgICAgIGl0ZW06IG51bGwsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2NvcmUgPSBzY29yZUZ1bmMuYXBwbHkodGhpcywgW2xpc3RbaV1dKTtcbiAgICAgICAgaWYgKHNjb3JlID4gbWluKSB7XG4gICAgICAgICAgICBoaXQgPSBxdWV1ZVttaW5JZHhdO1xuICAgICAgICAgICAgaGl0LnNjb3JlID0gc2NvcmU7XG4gICAgICAgICAgICBoaXQuaXRlbSA9IGxpc3RbaV07XG4gICAgICAgICAgICBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgZm9yIChwb3MgPSAwOyBwb3MgPCB0b3A7IHBvcysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlW3Bvc10uc2NvcmUgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbWluID0gcXVldWVbcG9zXS5zY29yZTtcbiAgICAgICAgICAgICAgICAgICAgbWluSWR4ID0gcG9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYXlBcnJheUZyb21JbWFnZShodG1sSW1hZ2UsIG9mZnNldFgsIGN0eCwgYXJyYXkpIHtcbiAgICBjdHguZHJhd0ltYWdlKGh0bWxJbWFnZSwgb2Zmc2V0WCwgMCwgaHRtbEltYWdlLndpZHRoLCBodG1sSW1hZ2UuaGVpZ2h0KTtcbiAgICBjb25zdCBjdHhEYXRhID0gY3R4LmdldEltYWdlRGF0YShvZmZzZXRYLCAwLCBodG1sSW1hZ2Uud2lkdGgsIGh0bWxJbWFnZS5oZWlnaHQpLmRhdGE7XG4gICAgY29tcHV0ZUdyYXkoY3R4RGF0YSwgYXJyYXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JheUFycmF5RnJvbUNvbnRleHQoY3R4LCBzaXplLCBvZmZzZXQsIGFycmF5KSB7XG4gICAgY29uc3QgY3R4RGF0YSA9IGN0eC5nZXRJbWFnZURhdGEob2Zmc2V0LngsIG9mZnNldC55LCBzaXplLngsIHNpemUueSkuZGF0YTtcbiAgICBjb21wdXRlR3JheShjdHhEYXRhLCBhcnJheSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmF5QW5kSGFsZlNhbXBsZUZyb21DYW52YXNEYXRhKGNhbnZhc0RhdGEsIHNpemUsIG91dEFycmF5KSB7XG4gICAgbGV0IHRvcFJvd0lkeCA9IDA7XG4gICAgbGV0IGJvdHRvbVJvd0lkeCA9IHNpemUueDtcbiAgICBjb25zdCBlbmRJZHggPSBNYXRoLmZsb29yKGNhbnZhc0RhdGEubGVuZ3RoIC8gNCk7XG4gICAgY29uc3Qgb3V0V2lkdGggPSBzaXplLnggLyAyO1xuICAgIGxldCBvdXRJbWdJZHggPSAwO1xuICAgIGNvbnN0IGluV2lkdGggPSBzaXplLng7XG4gICAgbGV0IGk7XG5cbiAgICB3aGlsZSAoYm90dG9tUm93SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRXaWR0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIG91dEFycmF5W291dEltZ0lkeF0gPSAoXG4gICAgICAgICAgICAgICAgKDAuMjk5ICogY2FudmFzRGF0YVt0b3BSb3dJZHggKiA0ICsgMF1cbiAgICAgICAgICAgICAgICAgKyAwLjU4NyAqIGNhbnZhc0RhdGFbdG9wUm93SWR4ICogNCArIDFdXG4gICAgICAgICAgICAgICAgICsgMC4xMTQgKiBjYW52YXNEYXRhW3RvcFJvd0lkeCAqIDQgKyAyXSlcbiAgICAgICAgICAgICAgICArICgwLjI5OSAqIGNhbnZhc0RhdGFbKHRvcFJvd0lkeCArIDEpICogNCArIDBdXG4gICAgICAgICAgICAgICAgICsgMC41ODcgKiBjYW52YXNEYXRhWyh0b3BSb3dJZHggKyAxKSAqIDQgKyAxXVxuICAgICAgICAgICAgICAgICArIDAuMTE0ICogY2FudmFzRGF0YVsodG9wUm93SWR4ICsgMSkgKiA0ICsgMl0pXG4gICAgICAgICAgICAgICAgKyAoMC4yOTkgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHgpICogNCArIDBdXG4gICAgICAgICAgICAgICAgICsgMC41ODcgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHgpICogNCArIDFdXG4gICAgICAgICAgICAgICAgICsgMC4xMTQgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHgpICogNCArIDJdKVxuICAgICAgICAgICAgICAgICsgKDAuMjk5ICogY2FudmFzRGF0YVsoYm90dG9tUm93SWR4ICsgMSkgKiA0ICsgMF1cbiAgICAgICAgICAgICAgICAgKyAwLjU4NyAqIGNhbnZhc0RhdGFbKGJvdHRvbVJvd0lkeCArIDEpICogNCArIDFdXG4gICAgICAgICAgICAgICAgICsgMC4xMTQgKiBjYW52YXNEYXRhWyhib3R0b21Sb3dJZHggKyAxKSAqIDQgKyAyXSkpIC8gNDtcbiAgICAgICAgICAgIG91dEltZ0lkeCsrO1xuICAgICAgICAgICAgdG9wUm93SWR4ICs9IDI7XG4gICAgICAgICAgICBib3R0b21Sb3dJZHggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICB0b3BSb3dJZHggKz0gaW5XaWR0aDtcbiAgICAgICAgYm90dG9tUm93SWR4ICs9IGluV2lkdGg7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUdyYXkoaW1hZ2VEYXRhLCBvdXRBcnJheSwgY29uZmlnKSB7XG4gICAgY29uc3QgbCA9IChpbWFnZURhdGEubGVuZ3RoIC8gNCkgfCAwO1xuICAgIGNvbnN0IHNpbmdsZUNoYW5uZWwgPSBjb25maWcgJiYgY29uZmlnLnNpbmdsZUNoYW5uZWwgPT09IHRydWU7XG5cbiAgICBpZiAoc2luZ2xlQ2hhbm5lbCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBvdXRBcnJheVtpXSA9IGltYWdlRGF0YVtpICogNCArIDBdO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgb3V0QXJyYXlbaV0gPSAwLjI5OSAqIGltYWdlRGF0YVtpICogNCArIDBdICsgMC41ODcgKiBpbWFnZURhdGFbaSAqIDQgKyAxXSArIDAuMTE0ICogaW1hZ2VEYXRhW2kgKiA0ICsgMl07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2VBcnJheShzcmMsIGNhbGxiYWNrLCBjYW52YXMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSkge1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjYW52YXMud2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICBjb25zb2xlLndhcm4oJyogbG9hZEltYWdlQXJyYXkgZ2V0Q29udGV4dCAyZCcpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLCAwLCAwKTtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQpO1xuICAgICAgICBjdHguZHJhd0ltYWdlKHRoaXMsIDAsIDApO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgICAgICBjb21wdXRlR3JheShkYXRhLCBhcnJheSk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soYXJyYXksIHtcbiAgICAgICAgICAgIHg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICB5OiB0aGlzLmhlaWdodCxcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfTtcbiAgICBpbWcuc3JjID0gc3JjO1xufVxuXG4vKipcbiAqIEBwYXJhbSBpbkltZyB7SW1hZ2VXcmFwcGVyfSBpbnB1dCBpbWFnZSB0byBiZSBzYW1wbGVkXG4gKiBAcGFyYW0gb3V0SW1nIHtJbWFnZVdyYXBwZXJ9IHRvIGJlIHN0b3JlZCBpblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFsZlNhbXBsZShpbkltZ1dyYXBwZXIsIG91dEltZ1dyYXBwZXIpIHtcbiAgICBjb25zdCBpbkltZyA9IGluSW1nV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IGluV2lkdGggPSBpbkltZ1dyYXBwZXIuc2l6ZS54O1xuICAgIGNvbnN0IG91dEltZyA9IG91dEltZ1dyYXBwZXIuZGF0YTtcbiAgICBsZXQgdG9wUm93SWR4ID0gMDtcbiAgICBsZXQgYm90dG9tUm93SWR4ID0gaW5XaWR0aDtcbiAgICBjb25zdCBlbmRJZHggPSBpbkltZy5sZW5ndGg7XG4gICAgY29uc3Qgb3V0V2lkdGggPSBpbldpZHRoIC8gMjtcbiAgICBsZXQgb3V0SW1nSWR4ID0gMDtcbiAgICB3aGlsZSAoYm90dG9tUm93SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0V2lkdGg7IGkrKykge1xuICAgICAgICAgICAgb3V0SW1nW291dEltZ0lkeF0gPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgIChpbkltZ1t0b3BSb3dJZHhdICsgaW5JbWdbdG9wUm93SWR4ICsgMV0gKyBpbkltZ1tib3R0b21Sb3dJZHhdICsgaW5JbWdbYm90dG9tUm93SWR4ICsgMV0pIC8gNCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvdXRJbWdJZHgrKztcbiAgICAgICAgICAgIHRvcFJvd0lkeCArPSAyO1xuICAgICAgICAgICAgYm90dG9tUm93SWR4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgdG9wUm93SWR4ICs9IGluV2lkdGg7XG4gICAgICAgIGJvdHRvbVJvd0lkeCArPSBpbldpZHRoO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzdjJyZ2IoaHN2LCByZ2IgPSBbMCwgMCwgMF0pIHtcbiAgICBjb25zdCBoID0gaHN2WzBdO1xuICAgIGNvbnN0IHMgPSBoc3ZbMV07XG4gICAgY29uc3QgdiA9IGhzdlsyXTtcbiAgICBjb25zdCBjID0gdiAqIHM7XG4gICAgY29uc3QgeCA9IGMgKiAoMSAtIE1hdGguYWJzKChoIC8gNjApICUgMiAtIDEpKTtcbiAgICBjb25zdCBtID0gdiAtIGM7XG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBnID0gMDtcbiAgICBsZXQgYiA9IDA7XG5cbiAgICBpZiAoaCA8IDYwKSB7XG4gICAgICAgIHIgPSBjO1xuICAgICAgICBnID0geDtcbiAgICB9IGVsc2UgaWYgKGggPCAxMjApIHtcbiAgICAgICAgciA9IHg7XG4gICAgICAgIGcgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDE4MCkge1xuICAgICAgICBnID0gYztcbiAgICAgICAgYiA9IHg7XG4gICAgfSBlbHNlIGlmIChoIDwgMjQwKSB7XG4gICAgICAgIGcgPSB4O1xuICAgICAgICBiID0gYztcbiAgICB9IGVsc2UgaWYgKGggPCAzMDApIHtcbiAgICAgICAgciA9IHg7XG4gICAgICAgIGIgPSBjO1xuICAgIH0gZWxzZSBpZiAoaCA8IDM2MCkge1xuICAgICAgICByID0gYztcbiAgICAgICAgYiA9IHg7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHJnYlswXSA9ICgociArIG0pICogMjU1KSB8IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgcmdiWzFdID0gKChnICsgbSkgKiAyNTUpIHwgMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICByZ2JbMl0gPSAoKGIgKyBtKSAqIDI1NSkgfCAwO1xuICAgIHJldHVybiByZ2I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY29tcHV0ZURpdmlzb3JzKG4pIHtcbiAgICBjb25zdCBsYXJnZURpdmlzb3JzID0gW107XG4gICAgY29uc3QgZGl2aXNvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgTWF0aC5zcXJ0KG4pICsgMTsgaSsrKSB7XG4gICAgICAgIGlmIChuICUgaSA9PT0gMCkge1xuICAgICAgICAgICAgZGl2aXNvcnMucHVzaChpKTtcbiAgICAgICAgICAgIGlmIChpICE9PSBuIC8gaSkge1xuICAgICAgICAgICAgICAgIGxhcmdlRGl2aXNvcnMudW5zaGlmdChNYXRoLmZsb29yKG4gLyBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpdmlzb3JzLmNvbmNhdChsYXJnZURpdmlzb3JzKTtcbn1cblxuZnVuY3Rpb24gX2NvbXB1dGVJbnRlcnNlY3Rpb24oYXJyMSwgYXJyMikge1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgaiA9IDA7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoaSA8IGFycjEubGVuZ3RoICYmIGogPCBhcnIyLmxlbmd0aCkge1xuICAgICAgICBpZiAoYXJyMVtpXSA9PT0gYXJyMltqXSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJyMVtpXSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgIH0gZWxzZSBpZiAoYXJyMVtpXSA+IGFycjJbal0pIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUGF0Y2hTaXplKHBhdGNoU2l6ZSwgaW1nU2l6ZSkge1xuICAgIGNvbnN0IGRpdmlzb3JzWCA9IF9jb21wdXRlRGl2aXNvcnMoaW1nU2l6ZS54KTtcbiAgICBjb25zdCBkaXZpc29yc1kgPSBfY29tcHV0ZURpdmlzb3JzKGltZ1NpemUueSk7XG4gICAgY29uc3Qgd2lkZVNpZGUgPSBNYXRoLm1heChpbWdTaXplLngsIGltZ1NpemUueSk7XG4gICAgY29uc3QgY29tbW9uID0gX2NvbXB1dGVJbnRlcnNlY3Rpb24oZGl2aXNvcnNYLCBkaXZpc29yc1kpO1xuICAgIGNvbnN0IG5yT2ZQYXRjaGVzTGlzdCA9IFs4LCAxMCwgMTUsIDIwLCAzMiwgNjAsIDgwXTtcbiAgICBjb25zdCBuck9mUGF0Y2hlc01hcCA9IHtcbiAgICAgICAgJ3gtc21hbGwnOiA1LFxuICAgICAgICBzbWFsbDogNCxcbiAgICAgICAgbWVkaXVtOiAzLFxuICAgICAgICBsYXJnZTogMixcbiAgICAgICAgJ3gtbGFyZ2UnOiAxLFxuICAgIH07XG4gICAgY29uc3QgbnJPZlBhdGNoZXNJZHggPSBuck9mUGF0Y2hlc01hcFtwYXRjaFNpemVdIHx8IG5yT2ZQYXRjaGVzTWFwLm1lZGl1bTtcbiAgICBjb25zdCBuck9mUGF0Y2hlcyA9IG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeF07XG4gICAgY29uc3QgZGVzaXJlZFBhdGNoU2l6ZSA9IE1hdGguZmxvb3Iod2lkZVNpZGUgLyBuck9mUGF0Y2hlcyk7XG4gICAgbGV0IG9wdGltYWxQYXRjaFNpemU7XG5cbiAgICBmdW5jdGlvbiBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoZGl2aXNvcnMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgZm91bmQgPSBkaXZpc29yc1tNYXRoLmZsb29yKGRpdmlzb3JzLmxlbmd0aCAvIDIpXTtcblxuICAgICAgICB3aGlsZSAoaSA8IChkaXZpc29ycy5sZW5ndGggLSAxKSAmJiBkaXZpc29yc1tpXSA8IGRlc2lyZWRQYXRjaFNpemUpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkaXZpc29yc1tpXSAtIGRlc2lyZWRQYXRjaFNpemUpID4gTWF0aC5hYnMoZGl2aXNvcnNbaSAtIDFdIC0gZGVzaXJlZFBhdGNoU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGRpdmlzb3JzW2kgLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBkaXZpc29yc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzaXJlZFBhdGNoU2l6ZSAvIGZvdW5kIDwgbnJPZlBhdGNoZXNMaXN0W25yT2ZQYXRjaGVzSWR4ICsgMV0gLyBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJZHhdXG4gICAgICAgICAgICAmJiBkZXNpcmVkUGF0Y2hTaXplIC8gZm91bmQgPiBuck9mUGF0Y2hlc0xpc3RbbnJPZlBhdGNoZXNJZHggLSAxXSAvIG5yT2ZQYXRjaGVzTGlzdFtuck9mUGF0Y2hlc0lkeF0pIHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IGZvdW5kLCB5OiBmb3VuZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIG9wdGltYWxQYXRjaFNpemUgPSBmaW5kUGF0Y2hTaXplRm9yRGl2aXNvcnMoY29tbW9uKTtcbiAgICBpZiAoIW9wdGltYWxQYXRjaFNpemUpIHtcbiAgICAgICAgb3B0aW1hbFBhdGNoU2l6ZSA9IGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycyhfY29tcHV0ZURpdmlzb3JzKHdpZGVTaWRlKSk7XG4gICAgICAgIGlmICghb3B0aW1hbFBhdGNoU2l6ZSkge1xuICAgICAgICAgICAgb3B0aW1hbFBhdGNoU2l6ZSA9IGZpbmRQYXRjaFNpemVGb3JEaXZpc29ycygoX2NvbXB1dGVEaXZpc29ycyhkZXNpcmVkUGF0Y2hTaXplICogbnJPZlBhdGNoZXMpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wdGltYWxQYXRjaFNpemU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcGFyc2VDU1NEaW1lbnNpb25WYWx1ZXModmFsdWUpIHtcbiAgICBjb25zdCBkaW1lbnNpb24gPSB7XG4gICAgICAgIHZhbHVlOiBwYXJzZUZsb2F0KHZhbHVlKSxcbiAgICAgICAgdW5pdDogdmFsdWUuaW5kZXhPZignJScpID09PSB2YWx1ZS5sZW5ndGggLSAxID8gJyUnIDogJyUnLFxuICAgIH07XG5cbiAgICByZXR1cm4gZGltZW5zaW9uO1xufVxuXG5leHBvcnQgY29uc3QgX2RpbWVuc2lvbnNDb252ZXJ0ZXJzID0ge1xuICAgIHRvcChkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGRpbWVuc2lvbi51bml0ID09PSAnJScgPyBNYXRoLmZsb29yKGNvbnRleHQuaGVpZ2h0ICogKGRpbWVuc2lvbi52YWx1ZSAvIDEwMCkpIDogbnVsbDtcbiAgICB9LFxuICAgIHJpZ2h0KGRpbWVuc2lvbiwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZGltZW5zaW9uLnVuaXQgPT09ICclJyA/IE1hdGguZmxvb3IoY29udGV4dC53aWR0aCAtIChjb250ZXh0LndpZHRoICogKGRpbWVuc2lvbi52YWx1ZSAvIDEwMCkpKSA6IG51bGw7XG4gICAgfSxcbiAgICBib3R0b20oZGltZW5zaW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBkaW1lbnNpb24udW5pdCA9PT0gJyUnID8gTWF0aC5mbG9vcihjb250ZXh0LmhlaWdodCAtIChjb250ZXh0LmhlaWdodCAqIChkaW1lbnNpb24udmFsdWUgLyAxMDApKSkgOiBudWxsO1xuICAgIH0sXG4gICAgbGVmdChkaW1lbnNpb24sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGRpbWVuc2lvbi51bml0ID09PSAnJScgPyBNYXRoLmZsb29yKGNvbnRleHQud2lkdGggKiAoZGltZW5zaW9uLnZhbHVlIC8gMTAwKSkgOiBudWxsO1xuICAgIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUltYWdlQXJlYShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgYXJlYSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHdpZHRoOiBpbnB1dFdpZHRoLCBoZWlnaHQ6IGlucHV0SGVpZ2h0IH07XG5cbiAgICBjb25zdCBwYXJzZWRBcmVhID0gT2JqZWN0LmtleXMoYXJlYSkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZWFba2V5XTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gX3BhcnNlQ1NTRGltZW5zaW9uVmFsdWVzKHZhbHVlKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZCA9IF9kaW1lbnNpb25zQ29udmVydGVyc1trZXldKHBhcnNlZCwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHJlc3VsdFtrZXldID0gY2FsY3VsYXRlZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzeDogcGFyc2VkQXJlYS5sZWZ0LFxuICAgICAgICBzeTogcGFyc2VkQXJlYS50b3AsXG4gICAgICAgIHN3OiBwYXJzZWRBcmVhLnJpZ2h0IC0gcGFyc2VkQXJlYS5sZWZ0LFxuICAgICAgICBzaDogcGFyc2VkQXJlYS5ib3R0b20gLSBwYXJzZWRBcmVhLnRvcCxcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgdmVjMiB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge1xuICAgIFhZU2l6ZSxcbiAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gICAgVHlwZWRBcnJheSxcbiAgICBXcmFwcGVySW5kZXhNYXBwaW5nLFxuICAgIE1vbWVudCxcbiAgICBTcGFyc2VJbWFnZVdyYXBwZXIsXG59IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuaW1wb3J0IEFycmF5SGVscGVyIGZyb20gJy4vYXJyYXlfaGVscGVyJztcbmltcG9ydCB7IGhzdjJyZ2IgfSBmcm9tICcuL2N2X3V0aWxzJztcblxudHlwZSBQb3NpdGl2ZU51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGFzc2VydE51bWJlclBvc2l0aXZlKHZhbDogbnVtYmVyKTogYXNzZXJ0cyB2YWwgaXMgUG9zaXRpdmVOdW1iZXIge1xuICAgIGlmICh2YWwgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgcG9zaXRpdmUgbnVtYmVyLCByZWNlaXZlZCAke3ZhbH1gKTtcbiAgICB9XG59XG5cbmNsYXNzIEltYWdlV3JhcHBlciBpbXBsZW1lbnRzIFNwYXJzZUltYWdlV3JhcHBlciB7XG4gICAgZGF0YTogVHlwZWRBcnJheSB8IEFycmF5PG51bWJlcj47XG5cbiAgICBzaXplOiBYWVNpemU7XG5cbiAgICBpbmRleE1hcHBpbmc/OiBXcmFwcGVySW5kZXhNYXBwaW5nO1xuXG4gICAgLy8gUmVwcmVzZW50cyBhIGJhc2ljIGltYWdlIGNvbWJpbmluZyB0aGUgZGF0YSBhbmQgc2l6ZS4gSW4gYWRkaXRpb24sIHNvbWUgbWV0aG9kcyBmb3JcbiAgICAvLyBtYW5pcHVsYXRpb24gYXJlIGNvbnRhaW5lZCB3aXRoaW4uXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNpemU6IFhZU2l6ZSxcbiAgICAgICAgZGF0YT86IFR5cGVkQXJyYXkgfCBBcnJheTxudW1iZXI+LFxuICAgICAgICBBcnJheVR5cGU6IFR5cGVkQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3IgPSBVaW50OEFycmF5LFxuICAgICAgICBpbml0aWFsaXplPzogYm9vbGVhbixcbiAgICApIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgKEFycmF5VHlwZSkoc2l6ZS54ICogc2l6ZS55KTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgQXJyYXlIZWxwZXIuaW5pdCh0aGlzLmRhdGEsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8vIHRlc3RzIGlmIGEgcG9zaXRpb24gaXMgd2l0aGluIHRoZSBpbWFnZSwgZXh0ZW5kZWQgb3V0IGJ5IGEgYm9yZGVyIG9uIGVhY2ggc2lkZVxuICAgIGluSW1hZ2VXaXRoQm9yZGVyKGltZ1JlZjogWFlTaXplLCBib3JkZXI6IFBvc2l0aXZlTnVtYmVyID0gMCk6IGJvb2xlYW4ge1xuICAgICAgICBhc3NlcnROdW1iZXJQb3NpdGl2ZShib3JkZXIpO1xuICAgICAgICByZXR1cm4gKGltZ1JlZi54ID49IDApXG4gICAgICAgICAgICAmJiAoaW1nUmVmLnkgPj0gMClcbiAgICAgICAgICAgICYmIChpbWdSZWYueCA8ICh0aGlzLnNpemUueCArIChib3JkZXIgKiAyKSkpXG4gICAgICAgICAgICAmJiAoaW1nUmVmLnkgPCAodGhpcy5zaXplLnkgKyAoYm9yZGVyICogMikpKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IGZyb20gVEhJUyBJbWFnZVdyYXBwZXIgdG8gdGhlIG5ldyBpbWFnZVdyYXBwZXIgcGFyYW1ldGVyLCBzdGFydGluZyBhdCBmcm9tLCBzdG9wcGluZyBhdFxuICAgIC8vIGVuZCBvZiBuZXcgaW1hZ2VXcmFwcGVyIHNpemUuXG4gICAgc3ViSW1hZ2VBc0NvcHkoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIsIGZyb206IFhZU2l6ZSk6IEltYWdlV3JhcHBlciB7XG4gICAgICAgIGFzc2VydE51bWJlclBvc2l0aXZlKGZyb20ueCk7XG4gICAgICAgIGFzc2VydE51bWJlclBvc2l0aXZlKGZyb20ueSk7XG4gICAgICAgIGNvbnN0IHsgeDogc2l6ZVgsIHk6IHNpemVZIH0gPSBpbWFnZVdyYXBwZXIuc2l6ZTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzaXplWDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHNpemVZOyB5KyspIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbWFnZVdyYXBwZXIuZGF0YVt5ICogc2l6ZVggKyB4XSA9IHRoaXMuZGF0YVsoZnJvbS55ICsgeSkgKiB0aGlzLnNpemUueCArIGZyb20ueCArIHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbWFnZVdyYXBwZXI7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgZnVuY3Rpb24gcmVhbGx5IHByb2JhYmx5IHNob3VsZCBjYWxsIGludG8gSW1hZ2VXcmFwcGVyIHNvbWV3aGVyZSB0byBtYWtlXG4gICAgICAgIC8vIHN1cmUgdGhhdCBhbGwgb2YgaXQncyBwYXJhbWV0ZXJzIGFyZSBzZXQgcHJvcGVybHksIHNvbWV0aGluZyBsaWtlXG4gICAgICAgIC8vIEltYWdlV3JhcHBlci5VcGRhdGVGcm9tKClcbiAgICAgICAgLy8gdGhhdCBtaWdodCB0YWtlIGEgcHJvdmlkZWQgZGF0YSBhbmQgc2l6ZSwgYW5kIG1ha2Ugc3VyZSB0aGVyZSdzIG5vIGludmFsaWQgaW5kZXhNYXBwaW5nXG4gICAgICAgIC8vIGhhbmdpbmcgYXJvdW5kLCBhbmQgc3VjaC5cbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhIGdyYXlzY2FsZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGltYWdlXG4gICAgZ2V0KHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt5ICogdGhpcy5zaXplLnggKyB4XTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhIGdyYXlzY2FsZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGltYWdlIChzYWZlLCB3aGF0ZXZlciB0aGF0XG4gICAgLy8gbWVhbnMpXG4gICAgZ2V0U2FmZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIC8vIGNhY2hlIGluZGV4TWFwcGluZyBiZWNhdXNlIGlmIHdlJ3JlIHVzaW5nIGl0IG9uY2UsIHdlJ2xsIHByb2JhYmx5IG5lZWQgaXQgYSBidW5jaCBtb3JlXG4gICAgICAgIC8vIHRvb1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXhNYXBwaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZyA9IHtcbiAgICAgICAgICAgICAgICB4OiBbXSxcbiAgICAgICAgICAgICAgICB5OiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2l6ZS54OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZy54W2ldID0gaTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4TWFwcGluZy54W2kgKyB0aGlzLnNpemUueF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemUueTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueVtpXSA9IGk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleE1hcHBpbmcueVtpICsgdGhpcy5zaXplLnldID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhWyh0aGlzLmluZGV4TWFwcGluZy55W3kgKyB0aGlzLnNpemUueV0pICogdGhpcy5zaXplLnggKyB0aGlzLmluZGV4TWFwcGluZy54W3ggKyB0aGlzLnNpemUueF1dO1xuICAgIH1cblxuICAgIC8vIFNldHMgYSBnaXZlbiBwaXhlbCBwb3NpdGlvbiBpbiB0aGUgaW1hZ2UgdG8gdGhlIGdpdmVuIGdyYXlzY2FsZSB2YWx1ZVxuICAgIHNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgdmFsdWU6IG51bWJlcik6IEltYWdlV3JhcHBlciB7XG4gICAgICAgIHRoaXMuZGF0YVt5ICogdGhpcy5zaXplLnggKyB4XSA9IHZhbHVlO1xuICAgICAgICBkZWxldGUgdGhpcy5pbmRleE1hcHBpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIGJvcmRlciBvZiB0aGUgaW1hZ2UgKDEgcGl4ZWwpIHRvIHplcm9cbiAgICB6ZXJvQm9yZGVyKCk6IEltYWdlV3JhcHBlciB7XG4gICAgICAgIGNvbnN0IHsgeDogd2lkdGgsIHk6IGhlaWdodCB9ID0gdGhpcy5zaXplO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tdWx0aS1hc3NpZ25cbiAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IHRoaXMuZGF0YVsoaGVpZ2h0IC0gMSkgKiB3aWR0aCArIGldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhlaWdodCAtIDE7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW11bHRpLWFzc2lnblxuICAgICAgICAgICAgdGhpcy5kYXRhW2kgKiB3aWR0aF0gPSB0aGlzLmRhdGFbaSAqIHdpZHRoICsgKHdpZHRoIC0gMSldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5pbmRleE1hcHBpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHRoaXMgZnVuY3Rpb24gaXMgZW50aXJlbHkgdG9vIGxhcmdlIGZvciBtZSB0byByZWFzb24gb3V0IHJpZ2h0IGF0IHRoaXMgbW9tZW50IHRoYXQgaSdtIGhhbmRsaW5nXG4gICAgLy8gYWxsIHRoZSByZXN0IG9mIGl0LCBzbyB0aGlzIGlzIGEgdmVyYmF0aW0gY29weSBvZiB0aGUgamF2YXNjcmlwdCBzb3VyY2UsIHdpdGggb25seSB0d2Vha3NcbiAgICAvLyBuZWNlc3NhcnkgdG8gZ2V0IGl0IHRvIHJ1biwgbm8gdGhvdWdodCBwdXQgaW50byBpdCB5ZXQuXG4gICAgbW9tZW50cyhsYWJlbENvdW50OiBudW1iZXIpOiBBcnJheTxNb21lbnQ+IHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeDtcbiAgICAgICAgbGV0IHk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuc2l6ZS55O1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2l6ZS54O1xuICAgICAgICBsZXQgdmFsO1xuICAgICAgICBsZXQgeXNxO1xuICAgICAgICBjb25zdCBsYWJlbFN1bTogQXJyYXk8TW9tZW50PiA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGxhYmVsO1xuICAgICAgICBsZXQgbXUxMTtcbiAgICAgICAgbGV0IG11MDI7XG4gICAgICAgIGxldCBtdTIwO1xuICAgICAgICBsZXQgeF87XG4gICAgICAgIGxldCB5XztcbiAgICAgICAgbGV0IHRtcDtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxNb21lbnQ+ID0gW107XG4gICAgICAgIGNvbnN0IHsgUEkgfSA9IE1hdGg7XG4gICAgICAgIGNvbnN0IFBJXzQgPSBQSSAvIDQ7XG5cbiAgICAgICAgaWYgKGxhYmVsQ291bnQgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYWJlbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxhYmVsU3VtW2ldID0ge1xuICAgICAgICAgICAgICAgIG0wMDogMCxcbiAgICAgICAgICAgICAgICBtMDE6IDAsXG4gICAgICAgICAgICAgICAgbTEwOiAwLFxuICAgICAgICAgICAgICAgIG0xMTogMCxcbiAgICAgICAgICAgICAgICBtMDI6IDAsXG4gICAgICAgICAgICAgICAgbTIwOiAwLFxuICAgICAgICAgICAgICAgIHRoZXRhOiAwLFxuICAgICAgICAgICAgICAgIHJhZDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIHlzcSA9IHkgKiB5O1xuICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBkYXRhW3kgKiB3aWR0aCArIHhdO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWxTdW1bdmFsIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0wMCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5tMDEgKz0geTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTEwICs9IHg7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLm0xMSArPSB4ICogeTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTAyICs9IHlzcTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubTIwICs9IHggKiB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYWJlbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxhYmVsID0gbGFiZWxTdW1baV07XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxhYmVsLm0wMCkgJiYgbGFiZWwubTAwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgeF8gPSBsYWJlbC5tMTAgLyBsYWJlbC5tMDA7XG4gICAgICAgICAgICAgICAgeV8gPSBsYWJlbC5tMDEgLyBsYWJlbC5tMDA7XG4gICAgICAgICAgICAgICAgbXUxMSA9IGxhYmVsLm0xMSAvIGxhYmVsLm0wMCAtIHhfICogeV87XG4gICAgICAgICAgICAgICAgbXUwMiA9IGxhYmVsLm0wMiAvIGxhYmVsLm0wMCAtIHlfICogeV87XG4gICAgICAgICAgICAgICAgbXUyMCA9IGxhYmVsLm0yMCAvIGxhYmVsLm0wMCAtIHhfICogeF87XG4gICAgICAgICAgICAgICAgdG1wID0gKG11MDIgLSBtdTIwKSAvICgyICogbXUxMSk7XG4gICAgICAgICAgICAgICAgdG1wID0gMC41ICogTWF0aC5hdGFuKHRtcCkgKyAobXUxMSA+PSAwID8gUElfNCA6IC1QSV80KSArIFBJO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1taXhlZC1vcGVyYXRvcnNcbiAgICAgICAgICAgICAgICBsYWJlbC50aGV0YSA9ICh0bXAgKiAxODAgLyBQSSArIDkwKSAlIDE4MCAtIDkwO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC50aGV0YSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwudGhldGEgKz0gMTgwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYWJlbC5yYWQgPSB0bXAgPiBQSSA/IHRtcCAtIFBJIDogdG1wO1xuICAgICAgICAgICAgICAgIGxhYmVsLnZlYyA9IHZlYzIuY2xvbmUoW01hdGguY29zKHRtcCksIE1hdGguc2luKHRtcCldKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gYSBVaW50OENsYW1wZWRBcnJheSBjb250YWluaW5nIHRoaXMgZ3JheXNjYWxlIGltYWdlIGNvbnZlcnRlZCB0byBSR0JBIGZvcm1cbiAgICBnZXRBc1JHQkEoc2NhbGUgPSAxLjApOiBVaW50OENsYW1wZWRBcnJheSB7XG4gICAgICAgIGNvbnN0IHJldCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSg0ICogdGhpcy5zaXplLnggKiB0aGlzLnNpemUueSk7XG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zaXplLnk7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNpemUueDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB5ICogdGhpcy5zaXplLnggKyB4O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldCh4LCB5KSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHJldFtwaXhlbCAqIDQgKyAwXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgcmV0W3BpeGVsICogNCArIDFdID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICByZXRbcGl4ZWwgKiA0ICsgMl0gPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIHJldFtwaXhlbCAqIDQgKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgdGhpcyBJbWFnZVdyYXBwZXIgaW4gYSBnaXZlbiBDYW52YXMgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHNjYWxlXG4gICAgc2hvdyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBzY2FsZSA9IDEuMCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLndhcm4oJyogaW1hZ2V3cmFwcGVyIHNob3cgZ2V0Y29udGV4dCAyZCcpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjdHgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBjYW52YXMgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyYW1lID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRBc1JHQkEoc2NhbGUpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy5zaXplLng7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5zaXplLnk7XG4gICAgICAgIGNvbnN0IG5ld0ZyYW1lID0gbmV3IEltYWdlRGF0YShkYXRhIGFzIFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyPiwgZnJhbWUud2lkdGgsIGZyYW1lLmhlaWdodCk7XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEobmV3RnJhbWUsIDAsIDApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXlzIGEgc3BlY2lmaWVkIFN1YkltYWdlIGFyZWEgaW4gYSBnaXZlbiBjYW52YXMuIFRoaXMgZGlmZmVycyBkcmFzdGljYWxseSBmcm9tXG4gICAgLy8gY3JlYXRpbmcgYSBuZXcgU3ViSW1hZ2UgYW5kIHVzaW5nIGl0J3Mgc2hvdygpIG1ldGhvZC4gV2h5PyBJIGRvbid0IGhhdmUgdGhlIGFuc3dlciB0byB0aGF0XG4gICAgLy8geWV0LiAgSSBzdXNwZWN0IHRoZSBIU1YvUkdCIG9wZXJhdGlvbnMgaW52b2x2ZWQgaGVyZSBhcmUgbWFraW5nIGl0IHNpZ25pZmljYW50bHkgZGlmZmVyZW50LFxuICAgIC8vIGJ1dCB1bnRpbCBJIGNhbiB2aXN1YWxpemUgdGhlc2UgZnVuY3Rpb25zIHNpZGUgYnkgc2lkZSwgSSdtIGp1c3QgZ29pbmcgdG8gY29weSB0aGUgZXhpc3RpbmdcbiAgICAvLyBpbXBsZW1lbnRhdGlvbi5cbiAgICBvdmVybGF5KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGluU2NhbGU6IG51bWJlciwgZnJvbTogWFlTaXplKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkU2NhbGUgPSAoaW5TY2FsZSA8IDAgfHwgaW5TY2FsZSA+IDM2MCkgPyAzNjAgOiBpblNjYWxlO1xuICAgICAgICBjb25zdCBoc3YgPSBbMCwgMSwgMV07XG4gICAgICAgIGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcbiAgICAgICAgY29uc3Qgd2hpdGVSZ2IgPSBbMjU1LCAyNTUsIDI1NV07XG4gICAgICAgIGNvbnN0IGJsYWNrUmdiID0gWzAsIDAsIDBdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnNvbGUud2FybignKiBpbWFnZXdyYXBwZXIgb3ZlcmxheSBnZXRjb250ZXh0IDJkJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IGNhbnZhcyBjb250ZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnJhbWUgPSBjdHguZ2V0SW1hZ2VEYXRhKGZyb20ueCwgZnJvbS55LCB0aGlzLnNpemUueCwgdGhpcy5zaXplLnkpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGZyYW1lO1xuICAgICAgICBsZXQgeyBsZW5ndGggfSA9IHRoaXMuZGF0YTtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBoc3ZbMF0gPSB0aGlzLmRhdGFbbGVuZ3RoXSAqIGFkanVzdGVkU2NhbGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIHJlc3VsdCA9IGhzdlswXSA8PSAwID8gd2hpdGVSZ2IgOiBoc3ZbMF0gPj0gMzYwID8gYmxhY2tSZ2IgOiBoc3YycmdiKGhzdiwgcmdiKTtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGxlbmd0aCAqIDQ7XG4gICAgICAgICAgICBbZGF0YVtwb3NdLCBkYXRhW3BvcyArIDFdLCBkYXRhW3BvcyArIDJdXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGRhdGFbcG9zICsgM10gPSAyNTU7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShmcmFtZSwgZnJvbS54LCBmcm9tLnkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VXcmFwcGVyO1xuIiwiaW1wb3J0IHsgWFlTaXplIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbi8vIFRPRE86IFhZUG9zaXRpb24gc2hvdWxkIGJlIGFuIFhZT2JqZWN0LCBidXQgdGhhdCBicmVha3MgWFlEZWZpbml0aW9uLCB3aGljaCBicmVha3MgZHJhd1BhdGgoKSBiZWxvdy5cbmRlY2xhcmUgaW50ZXJmYWNlIFhZUG9zaXRpb24ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIENhbnZhc1N0eWxlIHtcbiAgICBjb2xvcjogc3RyaW5nO1xuICAgIGxpbmVXaWR0aDogbnVtYmVyO1xufVxuXG4vLyBYWURlZmluaXRpb24gdGVsbHMgdXMgd2hpY2ggY29tcG9uZW50IG9mIGEgZ2l2ZW4gYXJyYXkgb3Igb2JqZWN0IGlzIHRoZSBcIlhcIiBhbmQgd2hpY2ggaXMgdGhlIFwiWVwiLlxuLy8gVXN1YWxseSB0aGlzIGlzIDAgZm9yIFggYW5kIDEgZm9yIFksIGJ1dCBtaWdodCBiZSB1c2VkIGFzICd4JyBmb3IgeCBhbmQgJ3knIGZvciBZLlxuZGVjbGFyZSBpbnRlcmZhY2UgWFlEZWZpbml0aW9uIHtcbiAgICB4OiBrZXlvZiBYWVBvc2l0aW9uO1xuICAgIHk6IGtleW9mIFhZUG9zaXRpb247XG59XG5cbmRlY2xhcmUgdHlwZSBQYXRoID0gQXJyYXk8WFlQb3NpdGlvbj47XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBkcmF3UmVjdChwb3M6IFhZUG9zaXRpb24sIHNpemU6IFhZU2l6ZSwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHN0eWxlOiBDYW52YXNTdHlsZSk6IHZvaWQge1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gc3R5bGUubGluZVdpZHRoIHx8IDE7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LnN0cm9rZVJlY3QocG9zLngsIHBvcy55LCBzaXplLngsIHNpemUueSk7XG4gICAgfSxcbiAgICBkcmF3UGF0aChwYXRoOiBQYXRoLCBkZWY6IFhZRGVmaW5pdGlvbiwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHN0eWxlOiBDYW52YXNTdHlsZSk6IHZvaWQge1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHN0eWxlLmNvbG9yO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gc3R5bGUubGluZVdpZHRoO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8ocGF0aFswXVtkZWYueF0sIHBhdGhbMF1bZGVmLnldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBwYXRoLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKHBhdGhbal1bZGVmLnhdLCBwYXRoW2pdW2RlZi55XSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfSxcbiAgICBkcmF3SW1hZ2UoaW1hZ2VEYXRhOiBBcnJheTxudW1iZXI+LCBzaXplOiBYWVNpemUsIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNhbnZhc0RhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHNpemUueCwgc2l6ZS55KTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBjYW52YXNEYXRhO1xuICAgICAgICBsZXQgY2FudmFzRGF0YVBvcyA9IGRhdGEubGVuZ3RoO1xuICAgICAgICBsZXQgaW1hZ2VEYXRhUG9zID0gaW1hZ2VEYXRhLmxlbmd0aDtcblxuICAgICAgICBpZiAoY2FudmFzRGF0YVBvcyAvIGltYWdlRGF0YVBvcyAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbWFnZURhdGFQb3MtLSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbWFnZURhdGFbaW1hZ2VEYXRhUG9zXTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IDI1NTtcbiAgICAgICAgICAgIGRhdGFbLS1jYW52YXNEYXRhUG9zXSA9IHZhbHVlO1xuICAgICAgICAgICAgZGF0YVstLWNhbnZhc0RhdGFQb3NdID0gdmFsdWU7XG4gICAgICAgICAgICBkYXRhWy0tY2FudmFzRGF0YVBvc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNhbnZhc0RhdGEsIDAsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWN5Y2xlXG5pbXBvcnQgeyBJbWFnZVdyYXBwZXIgfSBmcm9tICdxdWFnZ2EnO1xuaW1wb3J0IHsgUXVhZ2dhSlNSZXN1bHRPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYSc7XG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5cbi8vIGZvciBzb21lIHJlYXNvbiB0aGlzIHRocm93cyBhIHNoYWRvdyBlcnJvciBvbiBpdHNlbGY/IVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuZXhwb3J0IGVudW0gQmFyY29kZURpcmVjdGlvbiB7XG4gICAgRm9yd2FyZCA9IDEsXG4gICAgUmV2ZXJzZSA9IC0xXG59XG5cbmV4cG9ydCB0eXBlIEJhcmNvZGVSZWFkZXJUeXBlID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgQmFyY29kZUZvcm1hdCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlUmVhZGVyQ29uZmlnIHtcbiAgICBub3JtYWxpemVCYXJTcGFjZVdpZHRoPzogYm9vbGVhbixcbiAgICBzdXBwbGVtZW50cz86IEFycmF5PEJhcmNvZGVSZWFkZXJUeXBlPixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlQ29ycmVjdGlvbiB7XG4gICAgYmFyOiBudW1iZXIsXG4gICAgc3BhY2U6IG51bWJlcixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlUG9zaXRpb24ge1xuICAgIGVuZDogbnVtYmVyLFxuICAgIGVuZENvdW50ZXI/OiBudW1iZXIsXG4gICAgZXJyb3I/OiBudW1iZXIsXG4gICAgc3RhcnQ6IG51bWJlcixcbiAgICBzdGFydENvdW50ZXI/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlSW5mbyBleHRlbmRzIEJhcmNvZGVQb3NpdGlvbiB7XG4gICAgY29kZTogbnVtYmVyLFxuICAgIGNvcnJlY3Rpb24/OiBCYXJjb2RlQ29ycmVjdGlvbixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJjb2RlIHtcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgY29kZXNldD86IG51bWJlcixcbiAgICBjb3JyZWN0aW9uPzogQmFyY29kZUNvcnJlY3Rpb24sXG4gICAgZGVjb2RlZENvZGVzPzogQXJyYXk8c3RyaW5nIHwgQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24+LFxuICAgIGRpcmVjdGlvbj86IEJhcmNvZGVEaXJlY3Rpb24sXG4gICAgZW5kOiBudW1iZXIsXG4gICAgZW5kSW5mbz86IEJhcmNvZGVQb3NpdGlvbixcbiAgICBmb3JtYXQ6IEJhcmNvZGVGb3JtYXQsXG4gICAgc3RhcnQ6IG51bWJlcixcbiAgICBzdGFydEluZm86IEJhcmNvZGVQb3NpdGlvbixcbiAgICBzdXBwbGVtZW50PzogQmFyY29kZSxcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhcmNvZGVSZWFkZXIge1xuICAgIF9yb3c6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICAgIGNvbmZpZzogQmFyY29kZVJlYWRlckNvbmZpZyA9IHt9O1xuXG4gICAgc3VwcGxlbWVudHM6IEFycmF5PEJhcmNvZGVSZWFkZXI+ID0gW107XG5cbiAgICBTSU5HTEVfQ09ERV9FUlJPUiA9IDA7XG5cbiAgICBGT1JNQVQ6IEJhcmNvZGVGb3JtYXQgPSAndW5rbm93bic7XG5cbiAgICBDT05GSUdfS0VZUzogQmFyY29kZVJlYWRlckNvbmZpZyA9IHt9O1xuICAgIC8vIFRPRE86IHNob3VsZCBhZGQgQUxQSEFCRVRIX1NUUklORywgQUxQSEFCRVQsIENIQVJBQ1RFUl9FTkNPRElOR1MgdG8gYmFzZSBjbGFzcywgaWYgdGhleVxuICAgIC8vIGFyZSB1c2VmdWwgaW4gbW9zdCByZWFkZXJzLlxuXG4gICAgcHVibGljIGFic3RyYWN0IGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlcik6IEJhcmNvZGUgfCBudWxsO1xuXG4gICAgc3RhdGljIGdldCBFeGNlcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBTdGFydE5vdEZvdW5kRXhjZXB0aW9uOiAnU3RhcnQtSW5mbyB3YXMgbm90IGZvdW5kIScsXG4gICAgICAgICAgICBDb2RlTm90Rm91bmRFeGNlcHRpb246ICdDb2RlIGNvdWxkIG5vdCBiZSBmb3VuZCEnLFxuICAgICAgICAgICAgUGF0dGVybk5vdEZvdW5kRXhjZXB0aW9uOiAnUGF0dGVybiBjb3VsZCBub3QgYmUgZm91bmQhJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgdGhpcy5fcm93ID0gW107XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgICBpZiAoc3VwcGxlbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcGxlbWVudHMgPSBzdXBwbGVtZW50cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbmV4dFVuc2V0KGxpbmU6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgc3RhcnQgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFsaW5lW2ldKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFBhdHRlcm4oY291bnRlcjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBjb2RlOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG1heFNpbmdsZUVycm9yID0gdGhpcy5TSU5HTEVfQ09ERV9FUlJPUiB8fCAxKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGVycm9yID0gMDtcbiAgICAgICAgbGV0IHNpbmdsZUVycm9yID0gMDtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGxldCBtb2R1bG8gPSAwO1xuICAgICAgICBsZXQgYmFyV2lkdGggPSAwO1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgc2NhbGVkID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSBjb3VudGVyW2ldO1xuICAgICAgICAgICAgbW9kdWxvICs9IGNvZGVbaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1bSA8IG1vZHVsbykge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cblxuICAgICAgICBiYXJXaWR0aCA9IHN1bSAvIG1vZHVsbztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIG1heFNpbmdsZUVycm9yICo9IGJhcldpZHRoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvdW50ID0gY291bnRlcltpXTtcbiAgICAgICAgICAgIHNjYWxlZCA9IGNvZGVbaV0gKiBiYXJXaWR0aDtcbiAgICAgICAgICAgIHNpbmdsZUVycm9yID0gTWF0aC5hYnMoY291bnQgLSBzY2FsZWQpIC8gc2NhbGVkO1xuICAgICAgICAgICAgaWYgKHNpbmdsZUVycm9yID4gbWF4U2luZ2xlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9yICs9IHNpbmdsZUVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvciAvIG1vZHVsbztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25leHRTZXQobGluZTogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGluZVtpXSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY29ycmVjdEJhcnMoY291bnRlcjogQXJyYXk8bnVtYmVyPiwgY29ycmVjdGlvbjogbnVtYmVyLCBpbmRpY2VzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCB7IGxlbmd0aCB9ID0gaW5kaWNlcztcbiAgICAgICAgbGV0IHRtcCA9IDA7XG4gICAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICAgICAgdG1wID0gY291bnRlcltpbmRpY2VzW2xlbmd0aF1dICogKDEgLSAoKDEgLSBjb3JyZWN0aW9uKSAvIDIpKTtcbiAgICAgICAgICAgIGlmICh0bXAgPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgY291bnRlcltpbmRpY2VzW2xlbmd0aF1dID0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZVBhdHRlcm4ocGF0dGVybjogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF0dGVybicsIHBhdHRlcm4pO1xuICAgICAgICB0aGlzLl9yb3cgPSBwYXR0ZXJuO1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF0dGVybiBjYWxsaW5nIGRlY29kZScsIHR5cGVvZiB0aGlzLCB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLkZPUk1BVCwgSlNPTi5zdHJpbmdpZnkodGhpcykpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5kZWNvZGUoKTtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpcnN0IHJlc3VsdD0nLCByZXN1bHQpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yb3cucmV2ZXJzZSgpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kZWNvZGUoKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXZlcnNlZCByZXN1bHQ9JywgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGlyZWN0aW9uID0gQmFyY29kZURpcmVjdGlvbi5SZXZlcnNlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydCA9IHRoaXMuX3Jvdy5sZW5ndGggLSByZXN1bHQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVuZCA9IHRoaXMuX3Jvdy5sZW5ndGggLSByZXN1bHQuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmRpcmVjdGlvbiA9IEJhcmNvZGVEaXJlY3Rpb24uRm9yd2FyZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQuZm9ybWF0ID0gdGhpcy5GT1JNQVQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybmluZycsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFJhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBzdGFydCA9IHN0YXJ0IDwgMCA/IDAgOiBzdGFydDtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmlsbENvdW50ZXJzKG9mZnNldDogbnVtYmVyID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3JvdyksIGVuZDogbnVtYmVyID0gdGhpcy5fcm93Lmxlbmd0aCwgaXNXaGl0ZSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgY291bnRlcnM6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICBjb3VudGVyc1tjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudGVycztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3RvQ291bnRlcnMoc3RhcnQ6IG51bWJlciwgY291bnRlcnM6IFVpbnQxNkFycmF5IHwgQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBjb25zdCBudW1Db3VudGVycyA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5fcm93Lmxlbmd0aDtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSAhdGhpcy5fcm93W3N0YXJ0XTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIEFycmF5SGVscGVyLmluaXQoY291bnRlcnMsIDApO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gbnVtQ291bnRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnRlcnM7XG4gICAgfVxuXG4gICAgLy8gb3ZlcnJpZGUvaW1wbGVtZW50IHRoaXMgaW4geW91ciBjdXN0b20gcmVhZGVycy5cbiAgICBwcm90ZWN0ZWQgZGVjb2RlSW1hZ2UoaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIpOiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCB8IG51bGwge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICAgICAgICB2b2lkIGltYWdlV3JhcHBlcjtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXJjb2RlUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZSwgQmFyY29kZUluZm8sIEJhcmNvZGVQb3NpdGlvbiB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jb25zdCBOID0gMTtcbmNvbnN0IFcgPSAzO1xuY29uc3QgU1RBUlRfUEFUVEVSTiA9IFtXLCBOLCBXLCBOLCBOLCBOXTtcbmNvbnN0IFNUT1BfUEFUVEVSTiA9IFtXLCBOLCBOLCBOLCBXXTtcbmNvbnN0IENPREVfUEFUVEVSTiA9IFtcbiAgICBbTiwgTiwgVywgVywgTl0sXG4gICAgW1csIE4sIE4sIE4sIFddLFxuICAgIFtOLCBXLCBOLCBOLCBXXSxcbiAgICBbVywgVywgTiwgTiwgTl0sXG4gICAgW04sIE4sIFcsIE4sIFddLFxuICAgIFtXLCBOLCBXLCBOLCBOXSxcbiAgICBbTiwgVywgVywgTiwgTl0sXG4gICAgW04sIE4sIE4sIFcsIFddLFxuICAgIFtXLCBOLCBOLCBXLCBOXSxcbiAgICBbTiwgVywgTiwgVywgTl0sXG5dO1xuY29uc3QgU1RBUlRfUEFUVEVSTl9MRU5HVEggPSBTVEFSVF9QQVRURVJOLnJlZHVjZSgoc3VtLCB2YWwpID0+IHN1bSArIHZhbCwgMCk7XG5cbmNsYXNzIFR3b09mRml2ZVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIGJhclNwYWNlUmF0aW8gPSBbMSwgMV07XG5cbiAgICBGT1JNQVQgPSAnMm9mNSc7XG5cbiAgICBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzg7XG5cbiAgICBBVkdfQ09ERV9FUlJPUiA9IDAuMzA7XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRQYXR0ZXJuKHBhdHRlcm46IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgb2Zmc2V0OiBudW1iZXIsIGlzV2hpdGUgPSBmYWxzZSwgdHJ5SGFyZGVyID0gZmFsc2UpOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gW107XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgbGV0IGVycm9yID0gMDtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZHX0NPREVfRVJST1I7XG5cbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY291bnRlcltpXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcm93W2ldIF4gKGlzV2hpdGUgPyAxIDogMCkpIHtcbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyUG9zID09PSBjb3VudGVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3VudGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY291bnRlcltqXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9maW5kU3RhcnQoKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGxldCBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgbmFycm93QmFyV2lkdGggPSAxO1xuICAgICAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUQVJUX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gTWF0aC5mbG9vcigoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCkgLyBTVEFSVF9QQVRURVJOX0xFTkdUSCk7XG4gICAgICAgICAgICBsZWFkaW5nV2hpdGVzcGFjZVN0YXJ0ID0gc3RhcnRJbmZvLnN0YXJ0IC0gbmFycm93QmFyV2lkdGggKiA1O1xuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcnRJbmZvO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVJbmZvKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgLy8gVE9ETzogcmV2ZXJzZSwgZm9sbG93ZWQgYnkgc29tZSBjYWxjcywgZm9sbG93ZWQgYnkgYW5vdGhlciByZXZlcnNlPyByZWFsbHk/XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRQYXR0ZXJuKFNUT1BfUEFUVEVSTiwgb2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHRtcCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgICAgIGVuZEluZm8uc3RhcnQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgICAgIGVuZEluZm8uZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHRtcDtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiAoY291bnRlcnMubGVuZ3RoICUgMTAgPT09IDApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBSZWFkb25seUFycmF5PG51bWJlcj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBlcHNpbG9uID0gdGhpcy5BVkdfQ09ERV9FUlJPUjtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBDT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yISkge1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdE1hdGNoLmVycm9yISA8IGVwc2lsb24pIHtcbiAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8c3RyaW5nPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgY29uc3QgY291bnRlckxlbmd0aCA9IGNvdW50ZXJzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgY291bnRlciA9IFswLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltpXSA9IGNvdW50ZXJzW3Bvc10gKiB0aGlzLmJhclNwYWNlUmF0aW9bMF07XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShjb3VudGVyKTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYCR7Y29kZS5jb2RlfWApO1xuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kU3RhcnQoKTtcbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5kSW5mbyA9IHRoaXMuX2ZpbmRFbmQoKTtcbiAgICAgICAgaWYgKCFlbmRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50ZXJzID0gdGhpcy5fZmlsbENvdW50ZXJzKHN0YXJ0SW5mby5lbmQsIGVuZEluZm8uc3RhcnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKHN0YXJ0SW5mbyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPCA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGVuZEluZm8pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogZW5kSW5mby5lbmQsXG4gICAgICAgICAgICBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHdvT2ZGaXZlUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZSwgQmFyY29kZVBvc2l0aW9uIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbi8vIGNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OS0kOi8uK0FCQ0QnO1xuY29uc3QgQUxQSEFCRVQgPSBbNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDQ1LCAzNiwgNTgsIDQ3LCA0NiwgNDMsIDY1LCA2NiwgNjcsIDY4XTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPVxuICAgIFsweDAwMywgMHgwMDYsIDB4MDA5LCAweDA2MCwgMHgwMTIsIDB4MDQyLCAweDAyMSwgMHgwMjQsIDB4MDMwLCAweDA0OCwgMHgwMGMsIDB4MDE4LFxuICAgICAgICAweDA0NSwgMHgwNTEsIDB4MDU0LCAweDAxNSwgMHgwMUEsIDB4MDI5LCAweDAwQiwgMHgwMEVdO1xuY29uc3QgU1RBUlRfRU5EID0gWzB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFXTtcbmNvbnN0IE1JTl9FTkNPREVEX0NIQVJTID0gNDtcbmNvbnN0IE1BWF9BQ0NFUFRBQkxFID0gMi4wO1xuY29uc3QgUEFERElORyA9IDEuNTtcblxuaW50ZXJmYWNlIFRocmVzaG9sZFNpemUge1xuICAgIHNpemU6IG51bWJlcixcbiAgICBjb3VudHM6IG51bWJlcixcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbn07XG5cbmludGVyZmFjZSBUaHJlc2hvbGQge1xuICAgIHNwYWNlOiB7XG4gICAgICAgIG5hcnJvdzogVGhyZXNob2xkU2l6ZSxcbiAgICAgICAgd2lkZTogVGhyZXNob2xkU2l6ZSxcbiAgICB9LFxuICAgIGJhcjoge1xuICAgICAgICBuYXJyb3c6IFRocmVzaG9sZFNpemUsXG4gICAgICAgIHdpZGU6IFRocmVzaG9sZFNpemUsXG4gICAgfSxcbn07XG5cbmNsYXNzIE5ld0NvZGFiYXJSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBfY291bnRlcnM6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICBGT1JNQVQgPSAnY29kYWJhcic7XG5cbiAgICBwcm90ZWN0ZWQgX2NvbXB1dGVBbHRlcm5hdGluZ1RocmVzaG9sZChvZmZzZXQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IGVuZDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb3VudGVyID0gdGhpcy5fY291bnRlcnNbaV07XG4gICAgICAgICAgICBpZiAoY291bnRlciA+IG1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IGNvdW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY291bnRlciA8IG1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IGNvdW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKChtaW4gKyBtYXgpIC8gMi4wKSB8IDA7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdG9QYXR0ZXJuKG9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG51bUNvdW50ZXJzID0gNztcbiAgICAgICAgY29uc3QgZW5kID0gb2Zmc2V0ICsgbnVtQ291bnRlcnM7XG5cbiAgICAgICAgaWYgKGVuZCA+IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFyVGhyZXNob2xkID0gdGhpcy5fY29tcHV0ZUFsdGVybmF0aW5nVGhyZXNob2xkKG9mZnNldCwgZW5kKTtcbiAgICAgICAgY29uc3Qgc3BhY2VUaHJlc2hvbGQgPSB0aGlzLl9jb21wdXRlQWx0ZXJuYXRpbmdUaHJlc2hvbGQob2Zmc2V0ICsgMSwgZW5kKTtcblxuICAgICAgICBsZXQgYml0bWFzayA9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSk7XG4gICAgICAgIGxldCB0aHJlc2hvbGQgPSAwO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGQgPSAoaSAmIDEpID09PSAwID8gYmFyVGhyZXNob2xkIDogc3BhY2VUaHJlc2hvbGQ7XG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlcnNbb2Zmc2V0ICsgaV0gPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuIHw9IGJpdG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaXRtYXNrID4+PSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfaXNTdGFydEVuZChwYXR0ZXJuOiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBTVEFSVF9FTkQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChTVEFSVF9FTkRbaV0gPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfc3VtQ291bnRlcnMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHN1bSA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2NvdW50ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fdG9QYXR0ZXJuKGkpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT09IC0xICYmIHRoaXMuX2lzU3RhcnRFbmQocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBMb29rIGZvciB3aGl0ZXNwYWNlIGFoZWFkXG4gICAgICAgICAgICAgICAgc3RhcnQgKz0gdGhpcy5fc3VtQ291bnRlcnMoMCwgaSk7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyB0aGlzLl9zdW1Db3VudGVycyhpLCBpICsgOCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGVuZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRDb3VudGVyOiBpLFxuICAgICAgICAgICAgICAgICAgICBlbmRDb3VudGVyOiBpICsgOCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfcGF0dGVyblRvQ2hhcihwYXR0ZXJuOiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSA9PT0gcGF0dGVybikge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKEFMUEhBQkVUW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9jYWxjdWxhdGVQYXR0ZXJuTGVuZ3RoKG9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyA3OyBpKyspIHtcbiAgICAgICAgICAgIHN1bSArPSB0aGlzLl9jb3VudGVyc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5V2hpdGVzcGFjZShzdGFydENvdW50ZXI6IG51bWJlciwgZW5kQ291bnRlcjogbnVtYmVyKSB7XG4gICAgICAgIGlmICgoc3RhcnRDb3VudGVyIC0gMSA8PSAwKVxuICAgICAgICAgICAgfHwgdGhpcy5fY291bnRlcnNbc3RhcnRDb3VudGVyIC0gMV0gPj0gKHRoaXMuX2NhbGN1bGF0ZVBhdHRlcm5MZW5ndGgoc3RhcnRDb3VudGVyKSAvIDIuMCkpIHtcbiAgICAgICAgICAgIGlmICgoZW5kQ291bnRlciArIDggPj0gdGhpcy5fY291bnRlcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHx8IHRoaXMuX2NvdW50ZXJzW2VuZENvdW50ZXIgKyA3XSA+PSAodGhpcy5fY2FsY3VsYXRlUGF0dGVybkxlbmd0aChlbmRDb3VudGVyKSAvIDIuMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY2hhclRvUGF0dGVybihjaGFyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBTFBIQUJFVC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKEFMUEhBQkVUW2ldID09PSBjaGFyQ29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJfRU5DT0RJTkdTW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAweDA7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfdGhyZXNob2xkUmVzdWx0UGF0dGVybihyZXN1bHQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgc3RhcnRDb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2F0ZWdvcml6YXRpb246IFRocmVzaG9sZCA9IHtcbiAgICAgICAgICAgICAgICBzcGFjZToge1xuICAgICAgICAgICAgICAgICAgICBuYXJyb3c6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgICAgICB3aWRlOiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJhcjoge1xuICAgICAgICAgICAgICAgICAgICBuYXJyb3c6IHsgc2l6ZTogMCwgY291bnRzOiAwLCBtaW46IDAsIG1heDogTnVtYmVyLk1BWF9WQUxVRSB9LFxuICAgICAgICAgICAgICAgICAgICB3aWRlOiB7IHNpemU6IDAsIGNvdW50czogMCwgbWluOiAwLCBtYXg6IE51bWJlci5NQVhfVkFMVUUgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvcyA9IHN0YXJ0Q291bnRlcjtcbiAgICAgICAgbGV0IHBhdHRlcm46IG51bWJlcjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuX2NoYXJUb1BhdHRlcm4ocmVzdWx0W2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSA2OyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbmQgPSAoaiAmIDEpID09PSAyID8gY2F0ZWdvcml6YXRpb24uYmFyIDogY2F0ZWdvcml6YXRpb24uc3BhY2U7XG4gICAgICAgICAgICAgICAgY29uc3QgY2F0ID0gKHBhdHRlcm4gJiAxKSA9PT0gMSA/IGtpbmQud2lkZSA6IGtpbmQubmFycm93O1xuICAgICAgICAgICAgICAgIGNhdC5zaXplICs9IHRoaXMuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgICAgIGNhdC5jb3VudHMrKztcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID4+PSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zICs9IDg7XG4gICAgICAgIH1cblxuICAgICAgICAoWydzcGFjZScsICdiYXInXSBhcyBjb25zdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdraW5kID0gY2F0ZWdvcml6YXRpb25ba2V5XTtcbiAgICAgICAgICAgIG5ld2tpbmQud2lkZS5taW4gPVxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKG5ld2tpbmQubmFycm93LnNpemUgLyBuZXdraW5kLm5hcnJvdy5jb3VudHMgKyBuZXdraW5kLndpZGUuc2l6ZSAvIG5ld2tpbmQud2lkZS5jb3VudHMpIC8gMik7XG4gICAgICAgICAgICBuZXdraW5kLm5hcnJvdy5tYXggPSBNYXRoLmNlaWwobmV3a2luZC53aWRlLm1pbik7XG4gICAgICAgICAgICBuZXdraW5kLndpZGUubWF4ID0gTWF0aC5jZWlsKChuZXdraW5kLndpZGUuc2l6ZSAqIE1BWF9BQ0NFUFRBQkxFICsgUEFERElORykgLyBuZXdraW5kLndpZGUuY291bnRzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNhdGVnb3JpemF0aW9uO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRlUmVzdWx0KHJlc3VsdDogUmVhZG9ubHlBcnJheTxzdHJpbmc+LCBzdGFydENvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRzID0gdGhpcy5fdGhyZXNob2xkUmVzdWx0UGF0dGVybihyZXN1bHQsIHN0YXJ0Q291bnRlcik7XG4gICAgICAgIGxldCBwb3MgPSBzdGFydENvdW50ZXI7XG4gICAgICAgIGxldCBwYXR0ZXJuOiBudW1iZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLl9jaGFyVG9QYXR0ZXJuKHJlc3VsdFtpXSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gNjsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBraW5kID0gKGogJiAxKSA9PT0gMCA/IHRocmVzaG9sZHMuYmFyIDogdGhyZXNob2xkcy5zcGFjZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSAocGF0dGVybiAmIDEpID09PSAxID8ga2luZC53aWRlIDoga2luZC5uYXJyb3c7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2NvdW50ZXJzW3BvcyArIGpdO1xuICAgICAgICAgICAgICAgIGlmIChzaXplIDwgY2F0Lm1pbiB8fCBzaXplID4gY2F0Lm1heCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlciB8IG51bGwpOiBCYXJjb2RlIHwgbnVsbCB7XG5cbiAgICAgICAgdGhpcy5fY291bnRlcnMgPSB0aGlzLl9maWxsQ291bnRlcnMoKTtcbiAgICAgICAgc3RhcnQgPSB0aGlzLl9maW5kU3RhcnQoKTtcbiAgICAgICAgaWYgKCFzdGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHN0YXJ0LnN0YXJ0Q291bnRlciBhcyBudW1iZXI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIGxldCBwYXR0ZXJuOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLl90b1BhdHRlcm4obmV4dFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVjb2RlZENoYXIgPSB0aGlzLl9wYXR0ZXJuVG9DaGFyKHBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKGRlY29kZWRDaGFyID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICBuZXh0U3RhcnQgKz0gODtcbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMSAmJiB0aGlzLl9pc1N0YXJ0RW5kKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG5leHRTdGFydCA8IHRoaXMuX2NvdW50ZXJzLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gdmVyaWZ5IGVuZFxuICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGggLSAyKSA8IE1JTl9FTkNPREVEX0NIQVJTIHx8ICF0aGlzLl9pc1N0YXJ0RW5kKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZlcmlmeSBlbmQgd2hpdGUgc3BhY2VcbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlXaGl0ZXNwYWNlKHN0YXJ0LnN0YXJ0Q291bnRlciBhcyBudW1iZXIsIG5leHRTdGFydCAtIDgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVSZXN1bHQocmVzdWx0LCBzdGFydC5zdGFydENvdW50ZXIgYXMgbnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0U3RhcnQgPSBuZXh0U3RhcnQgPiB0aGlzLl9jb3VudGVycy5sZW5ndGggPyB0aGlzLl9jb3VudGVycy5sZW5ndGggOiBuZXh0U3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0LnN0YXJ0ICsgdGhpcy5fc3VtQ291bnRlcnMoc3RhcnQuc3RhcnRDb3VudGVyIGFzIG51bWJlciwgbmV4dFN0YXJ0IC0gOCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogZW5kLFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCwgLy8gVE9ETzogaSB0aGluayBpdCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIHRvIHJldHVybiBmb3JtYXQgZnJvbSB0aGlzLCBhcyBiYXJjb2RlX3JlYWRlciBmb3JjZSBzZXRzIHRoZSBmb3JtYXQgYW55d2F5XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV3Q29kYWJhclJlYWRlcjtcbiIsImltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IEJhcmNvZGVDb3JyZWN0aW9uLCBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUsIEJhcmNvZGVJbmZvIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmNsYXNzIENvZGUxMjhSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBDT0RFX1NISUZUID0gOTg7XG4gICAgQ09ERV9DID0gOTk7XG4gICAgQ09ERV9CID0gMTAwO1xuICAgIENPREVfQSA9IDEwMTtcbiAgICBTVEFSVF9DT0RFX0EgPSAxMDM7XG4gICAgU1RBUlRfQ09ERV9CID0gMTA0O1xuICAgIFNUQVJUX0NPREVfQyA9IDEwNTtcbiAgICBTVE9QX0NPREUgPSAxMDY7XG4gICAgQ09ERV9QQVRURVJOID0gW1xuICAgICAgICAgICAgWzIsIDEsIDIsIDIsIDIsIDJdLFxuICAgICAgICAgICAgWzIsIDIsIDIsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzIsIDIsIDIsIDIsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDIsIDEsIDIsIDIsIDNdLFxuICAgICAgICAgICAgWzEsIDIsIDEsIDMsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDMsIDEsIDIsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDIsIDIsIDEsIDNdLFxuICAgICAgICAgICAgWzEsIDIsIDIsIDMsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDMsIDIsIDIsIDEsIDJdLFxuICAgICAgICAgICAgWzIsIDIsIDEsIDIsIDEsIDNdLFxuICAgICAgICAgICAgWzIsIDIsIDEsIDMsIDEsIDJdLFxuICAgICAgICAgICAgWzIsIDMsIDEsIDIsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDEsIDIsIDIsIDMsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDIsIDEsIDMsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDIsIDIsIDMsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDMsIDIsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDMsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDMsIDIsIDIsIDFdLFxuICAgICAgICAgICAgWzIsIDIsIDMsIDIsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDIsIDEsIDEsIDMsIDJdLFxuICAgICAgICAgICAgWzIsIDIsIDEsIDIsIDMsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDMsIDIsIDEsIDJdLFxuICAgICAgICAgICAgWzIsIDIsIDMsIDEsIDEsIDJdLFxuICAgICAgICAgICAgWzMsIDEsIDIsIDEsIDMsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDEsIDIsIDIsIDJdLFxuICAgICAgICAgICAgWzMsIDIsIDEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzMsIDIsIDEsIDIsIDIsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDIsIDIsIDEsIDJdLFxuICAgICAgICAgICAgWzMsIDIsIDIsIDEsIDEsIDJdLFxuICAgICAgICAgICAgWzMsIDIsIDIsIDIsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDIsIDEsIDIsIDNdLFxuICAgICAgICAgICAgWzIsIDEsIDIsIDMsIDIsIDFdLFxuICAgICAgICAgICAgWzIsIDMsIDIsIDEsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDEsIDMsIDIsIDNdLFxuICAgICAgICAgICAgWzEsIDMsIDEsIDEsIDIsIDNdLFxuICAgICAgICAgICAgWzEsIDMsIDEsIDMsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDIsIDMsIDEsIDNdLFxuICAgICAgICAgICAgWzEsIDMsIDIsIDEsIDEsIDNdLFxuICAgICAgICAgICAgWzEsIDMsIDIsIDMsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDEsIDMsIDEsIDNdLFxuICAgICAgICAgICAgWzIsIDMsIDEsIDEsIDEsIDNdLFxuICAgICAgICAgICAgWzIsIDMsIDEsIDMsIDEsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDIsIDEsIDMsIDNdLFxuICAgICAgICAgICAgWzEsIDEsIDIsIDMsIDMsIDFdLFxuICAgICAgICAgICAgWzEsIDMsIDIsIDEsIDMsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDMsIDEsIDIsIDNdLFxuICAgICAgICAgICAgWzEsIDEsIDMsIDMsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDMsIDMsIDEsIDIsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDMsIDEsIDIsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDEsIDMsIDMsIDFdLFxuICAgICAgICAgICAgWzIsIDMsIDEsIDEsIDMsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDMsIDEsIDEsIDNdLFxuICAgICAgICAgICAgWzIsIDEsIDMsIDMsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDMsIDEsIDMsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDEsIDEsIDIsIDNdLFxuICAgICAgICAgICAgWzMsIDEsIDEsIDMsIDIsIDFdLFxuICAgICAgICAgICAgWzMsIDMsIDEsIDEsIDIsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDIsIDEsIDEsIDNdLFxuICAgICAgICAgICAgWzMsIDEsIDIsIDMsIDEsIDFdLFxuICAgICAgICAgICAgWzMsIDMsIDIsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDQsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDIsIDEsIDQsIDEsIDFdLFxuICAgICAgICAgICAgWzQsIDMsIDEsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDEsIDIsIDIsIDRdLFxuICAgICAgICAgICAgWzEsIDEsIDEsIDQsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDEsIDEsIDIsIDRdLFxuICAgICAgICAgICAgWzEsIDIsIDEsIDQsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDQsIDEsIDEsIDIsIDJdLFxuICAgICAgICAgICAgWzEsIDQsIDEsIDIsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDIsIDIsIDEsIDRdLFxuICAgICAgICAgICAgWzEsIDEsIDIsIDQsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDIsIDEsIDEsIDRdLFxuICAgICAgICAgICAgWzEsIDIsIDIsIDQsIDEsIDFdLFxuICAgICAgICAgICAgWzEsIDQsIDIsIDEsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDQsIDIsIDIsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDQsIDEsIDIsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDIsIDEsIDEsIDEsIDRdLFxuICAgICAgICAgICAgWzQsIDEsIDMsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDQsIDEsIDEsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDMsIDQsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDEsIDIsIDQsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDEsIDEsIDQsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDEsIDIsIDQsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDQsIDIsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDQsIDEsIDEsIDJdLFxuICAgICAgICAgICAgWzEsIDIsIDQsIDIsIDEsIDFdLFxuICAgICAgICAgICAgWzQsIDEsIDEsIDIsIDEsIDJdLFxuICAgICAgICAgICAgWzQsIDIsIDEsIDEsIDEsIDJdLFxuICAgICAgICAgICAgWzQsIDIsIDEsIDIsIDEsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDIsIDEsIDQsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDQsIDEsIDIsIDFdLFxuICAgICAgICAgICAgWzQsIDEsIDIsIDEsIDIsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDEsIDEsIDQsIDNdLFxuICAgICAgICAgICAgWzEsIDEsIDEsIDMsIDQsIDFdLFxuICAgICAgICAgICAgWzEsIDMsIDEsIDEsIDQsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDQsIDEsIDEsIDNdLFxuICAgICAgICAgICAgWzEsIDEsIDQsIDMsIDEsIDFdLFxuICAgICAgICAgICAgWzQsIDEsIDEsIDEsIDEsIDNdLFxuICAgICAgICAgICAgWzQsIDEsIDEsIDMsIDEsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDMsIDEsIDQsIDFdLFxuICAgICAgICAgICAgWzEsIDEsIDQsIDEsIDMsIDFdLFxuICAgICAgICAgICAgWzMsIDEsIDEsIDEsIDQsIDFdLFxuICAgICAgICAgICAgWzQsIDEsIDEsIDEsIDMsIDFdLFxuICAgICAgICAgICAgWzIsIDEsIDEsIDQsIDEsIDJdLFxuICAgICAgICAgICAgWzIsIDEsIDEsIDIsIDEsIDRdLFxuICAgICAgICAgICAgWzIsIDEsIDEsIDIsIDMsIDJdLFxuICAgICAgICAgICAgWzIsIDMsIDMsIDEsIDEsIDEsIDJdLFxuICAgICAgICBdO1xuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMC42NDtcbiAgICBBVkdfQ09ERV9FUlJPUiA9IDAuMzA7XG4gICAgRk9STUFUID0gJ2NvZGVfMTI4JztcbiAgICBNT0RVTEVfSU5ESUNFUyA9IHsgYmFyOiBbMCwgMiwgNF0sIHNwYWNlOiBbMSwgMywgNV0gfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShzdGFydDogbnVtYmVyLCBjb3JyZWN0aW9uPzogQmFyY29kZUNvcnJlY3Rpb24pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2ggPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBzdGFydCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IDEsXG4gICAgICAgICAgICAgICAgc3BhY2U6IDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgY291bnRlciA9IFswLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIGxldCBpc1doaXRlID0gIXRoaXMuX3Jvd1tvZmZzZXRdO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3JyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb3JyZWN0KGNvdW50ZXIsIGNvcnJlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgdGhpcy5DT0RFX1BBVFRFUk4ubGVuZ3RoOyBjb2RlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIHRoaXMuQ09ERV9QQVRURVJOW2NvZGVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5jb2RlID09PSAtMSB8fCBiZXN0TWF0Y2guZXJyb3IgPiB0aGlzLkFWR19DT0RFX0VSUk9SKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29ycmVjdGlvbi5iYXIgPSB0aGlzLmNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuYmFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLnNwYWNlID0gdGhpcy5jYWxjdWxhdGVDb3JyZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXSwgY291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1PRFVMRV9JTkRJQ0VTLnNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2NvcnJlY3QoY291bnRlcjogQXJyYXk8bnVtYmVyPiwgY29ycmVjdGlvbjogQmFyY29kZUNvcnJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ycmVjdEJhcnMoY291bnRlciwgY29ycmVjdGlvbi5iYXIsIHRoaXMuTU9EVUxFX0lORElDRVMuYmFyKTtcbiAgICAgICAgdGhpcy5fY29ycmVjdEJhcnMoY291bnRlciwgY29ycmVjdGlvbi5zcGFjZSwgdGhpcy5NT0RVTEVfSU5ESUNFUy5zcGFjZSk7XG4gICAgfTtcblxuICAgIC8vIFRPRE86IF9maW5kU3RhcnQgYW5kIGRlY29kZUNvZGUgc2hhcmUgc2ltaWxhciBjb2RlLCBjYW4gd2UgcmUtdXNlIHNvbWU/XG4gICAgcHJvdGVjdGVkIF9maW5kU3RhcnQoKTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY291bnRlciA9IFswLCAwLCAwLCAwLCAwLCAwXTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2ggPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgICAgICBjb3JyZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgYmFyOiAxLFxuICAgICAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSBjb3VudGVyLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIDApO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2RlID0gdGhpcy5TVEFSVF9DT0RFX0E7IGNvZGUgPD0gdGhpcy5TVEFSVF9DT0RFX0M7IGNvZGUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLl9tYXRjaFBhdHRlcm4oY291bnRlciwgdGhpcy5DT0RFX1BBVFRFUk5bY29kZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgYmVzdE1hdGNoLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZXN0TWF0Y2guZXJyb3IgPCB0aGlzLkFWR19DT0RFX0VSUk9SKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29ycmVjdGlvbi5iYXIgPSB0aGlzLmNhbGN1bGF0ZUNvcnJlY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DT0RFX1BBVFRFUk5bYmVzdE1hdGNoLmNvZGVdLCBjb3VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU9EVUxFX0lORElDRVMuYmFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5jb3JyZWN0aW9uLnNwYWNlID0gdGhpcy5jYWxjdWxhdGVDb3JyZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ09ERV9QQVRURVJOW2Jlc3RNYXRjaC5jb2RlXSwgY291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1PRFVMRV9JTkRJQ0VTLnNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbNF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kU3RhcnQoKTtcbiAgICAgICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAvLyAgICAgZG9uZSA9IGZhbHNlLFxuICAgICAgICAvLyAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgIC8vICAgICBtdWx0aXBsaWVyID0gMCxcbiAgICAgICAgLy8gICAgIGNoZWNrc3VtID0gMCxcbiAgICAgICAgLy8gICAgIGNvZGVzZXQsXG4gICAgICAgIC8vICAgICByYXdSZXN1bHQgPSBbXSxcbiAgICAgICAgLy8gICAgIGRlY29kZWRDb2RlcyA9IFtdLFxuICAgICAgICAvLyAgICAgc2hpZnROZXh0ID0gZmFsc2UsXG4gICAgICAgIC8vICAgICB1bnNoaWZ0LFxuICAgICAgICAvLyAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IHRydWU7XG5cbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvIHwgbnVsbCA9IHtcbiAgICAgICAgICAgIGNvZGU6IHN0YXJ0SW5mby5jb2RlLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRJbmZvLmVuZCxcbiAgICAgICAgICAgIGNvcnJlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBiYXI6IHN0YXJ0SW5mby5jb3JyZWN0aW9uIS5iYXIsXG4gICAgICAgICAgICAgICAgc3BhY2U6IHN0YXJ0SW5mby5jb3JyZWN0aW9uIS5zcGFjZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IFtdO1xuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgbGV0IGNoZWNrc3VtID0gY29kZS5jb2RlO1xuICAgICAgICBsZXQgY29kZXNldCA9ICgoYzogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuU1RBUlRfQ09ERV9BOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DT0RFX0E7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLlNUQVJUX0NPREVfQjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ09ERV9CO1xuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVEFSVF9DT0RFX0M6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNPREVfQztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoY29kZS5jb2RlKTtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNoaWZ0TmV4dCA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5zaGlmdCA9IHNoaWZ0TmV4dDtcbiAgICAgICAgbGV0IHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSB0cnVlO1xuICAgICAgICBsZXQgbXVsdGlwbGllciA9IDA7XG4gICAgICAgIGxldCByYXdSZXN1bHQ6IEFycmF5PG51bWJlcj4gPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9IFtdOyAvLyBUT0RPOiBpIHRoaW5rIHRoaXMgc2hvdWxkIGJlIHN0cmluZyBvbmx5LCBidXQgaXQgY3JlYXRlcyBwcm9ibGVtcyBpZiBpdCBpc1xuXG4gICAgICAgIHdoaWxlICghZG9uZSkge1xuICAgICAgICAgICAgdW5zaGlmdCA9IHNoaWZ0TmV4dDtcbiAgICAgICAgICAgIHNoaWZ0TmV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZSEuZW5kLCBjb2RlIS5jb3JyZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gdGhpcy5TVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGFzdENoYXJhY3RlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gdGhpcy5TVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmF3UmVzdWx0LnB1c2goY29kZS5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllcisrO1xuICAgICAgICAgICAgICAgICAgICBjaGVja3N1bSArPSBtdWx0aXBsaWVyICogY29kZS5jb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZXNldCkge1xuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPCA2NCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgzMiArIGNvZGUuY29kZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUuY29kZSA8IDk2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUuY29kZSAtIDY0KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZS5jb2RlICE9PSB0aGlzLlNUT1BfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxhc3RDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9TSElGVDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX0I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9CO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuU1RPUF9DT0RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX0I6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPCA5Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgzMiArIGNvZGUuY29kZSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gdGhpcy5TVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX1NISUZUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5DT0RFX0E6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldCA9IHRoaXMuQ09ERV9DO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuU1RPUF9DT0RFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSA8IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29kZS5jb2RlIDwgMTAgPyAnMCcgKyBjb2RlLmNvZGUgOiBjb2RlLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuY29kZSAhPT0gdGhpcy5TVE9QX0NPREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMYXN0Q2hhcmFjdGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLkNPREVfQTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0ID0gdGhpcy5DT0RFX0E7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuQ09ERV9COlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQgPSB0aGlzLkNPREVfQjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5TVE9QX0NPREU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnNoaWZ0KSB7XG4gICAgICAgICAgICAgICAgY29kZXNldCA9IGNvZGVzZXQgPT09IHRoaXMuQ09ERV9BID8gdGhpcy5DT0RFX0IgOiB0aGlzLkNPREVfQTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUuZW5kID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3JvdywgY29kZS5lbmQpO1xuICAgICAgICBpZiAoIXRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShjb2RlKSl7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrc3VtIC09IG11bHRpcGxpZXIgKiByYXdSZXN1bHRbcmF3UmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2hlY2tzdW0gJSAxMDMgIT09IHJhd1Jlc3VsdFtyYXdSZXN1bHQubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBsYXN0IGNvZGUgZnJvbSByZXN1bHQgKGNoZWNrc3VtKVxuICAgICAgICBpZiAocmVtb3ZlTGFzdENoYXJhY3Rlcikge1xuICAgICAgICAgICAgcmVzdWx0LnNwbGljZShyZXN1bHQubGVuZ3RoIC0gMSwgMSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBjb2RlLmVuZCxcbiAgICAgICAgICAgIGNvZGVzZXQ6IGNvZGVzZXQgYXMgbnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXM6IGRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgIGVuZEluZm86IGNvZGUsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvOiBCYXJjb2RlSW5mbyk6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG5cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kO1xuXG4gICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCBzZWxmLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cblxuICAgIHB1YmxpYyBjYWxjdWxhdGVDb3JyZWN0aW9uKGV4cGVjdGVkOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG5vcm1hbGl6ZWQ6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPiwgaW5kaWNlczogUmVhZG9ubHlBcnJheTxudW1iZXI+KTogbnVtYmVyIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGluZGljZXMubGVuZ3RoLFxuICAgICAgICAgICAgc3VtTm9ybWFsaXplZCA9IDAsXG4gICAgICAgICAgICBzdW1FeHBlY3RlZCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBzdW1FeHBlY3RlZCArPSBleHBlY3RlZFtpbmRpY2VzW2xlbmd0aF1dO1xuICAgICAgICAgICAgc3VtTm9ybWFsaXplZCArPSBub3JtYWxpemVkW2luZGljZXNbbGVuZ3RoXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bUV4cGVjdGVkIC8gc3VtTm9ybWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvZGUxMjhSZWFkZXI7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5pbXBvcnQgQmFyY29kZVJlYWRlciwgeyB0eXBlIEJhcmNvZGVQb3NpdGlvbiwgdHlwZSBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gKiQvKyUnO1xuY29uc3QgQUxQSEFCRVQgPSBuZXcgVWludDE2QXJyYXkoWy4uLkFMUEhBQkVUSF9TVFJJTkddLm1hcCgoY2hhcikgPT4gY2hhci5jaGFyQ29kZUF0KDApKSk7XG5jb25zdCBDSEFSQUNURVJfRU5DT0RJTkdTID0gbmV3IFVpbnQxNkFycmF5KFtcbiAgICAweDAzNCwgMHgxMjEsIDB4MDYxLCAweDE2MCwgMHgwMzEsIDB4MTMwLCAweDA3MCwgMHgwMjUsIDB4MTI0LCAweDA2NCwgMHgxMDksIDB4MDQ5LFxuICAgIDB4MTQ4LCAweDAxOSwgMHgxMTgsIDB4MDU4LCAweDAwRCwgMHgxMEMsIDB4MDRDLCAweDAxQywgMHgxMDMsIDB4MDQzLCAweDE0MiwgMHgwMTMsIDB4MTEyLCAweDA1MiwgMHgwMDcsIDB4MTA2LFxuICAgIDB4MDQ2LCAweDAxNiwgMHgxODEsIDB4MEMxLCAweDFDMCwgMHgwOTEsIDB4MTkwLCAweDBEMCwgMHgwODUsIDB4MTg0LCAweDBDNCwgMHgwOTQsIDB4MEE4LCAweDBBMiwgMHgwOEEsIDB4MDJBLFxuXSk7XG5jb25zdCBBU1RFUklTSyA9IDB4MDk0O1xuXG5jbGFzcyBDb2RlMzlSZWFkZXIgZXh0ZW5kcyBCYXJjb2RlUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnY29kZV8zOSc7XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgcGF0dGVyblN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQxNkFycmF5KFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSk7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgbGV0IGlzV2hpdGUgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gb2Zmc2V0OyBpIDwgdGhpcy5fcm93Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgc3RhcnQgcGF0dGVyblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdG9QYXR0ZXJuKGNvdW50ZXIpID09PSBBU1RFUklTSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2hpdGVTcGFjZU11c3RTdGFydCA9IE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgcGF0dGVyblN0YXJ0IC0gKChpIC0gcGF0dGVyblN0YXJ0KSAvIDQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZSh3aGl0ZVNwYWNlTXVzdFN0YXJ0LCBwYXR0ZXJuU3RhcnQsIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHBhdHRlcm5TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlclswXSArIGNvdW50ZXJbMV07XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY291bnRlcls3XSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbOF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyUG9zLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF90b1BhdHRlcm4oY291bnRlcnM6IFVpbnQxNkFycmF5KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGxldCBtYXhOYXJyb3dXaWR0aCA9IDA7XG4gICAgICAgIGxldCBudW1XaWRlQmFycyA9IG51bUNvdW50ZXJzO1xuICAgICAgICBsZXQgd2lkZUJhcldpZHRoID0gMDtcblxuICAgICAgICB3aGlsZSAobnVtV2lkZUJhcnMgPiAzKSB7XG4gICAgICAgICAgICBtYXhOYXJyb3dXaWR0aCA9IHRoaXMuX2ZpbmROZXh0V2lkdGgoY291bnRlcnMsIG1heE5hcnJvd1dpZHRoKTtcbiAgICAgICAgICAgIG51bVdpZGVCYXJzID0gMDtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudGVyc1tpXSA+IG1heE5hcnJvd1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gfD0gMSA8PCAobnVtQ291bnRlcnMgLSAxIC0gaSk7XG4gICAgICAgICAgICAgICAgICAgIG51bVdpZGVCYXJzKys7XG4gICAgICAgICAgICAgICAgICAgIHdpZGVCYXJXaWR0aCArPSBjb3VudGVyc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1XaWRlQmFycyA9PT0gMykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ291bnRlcnMgJiYgbnVtV2lkZUJhcnMgPiAwOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJzW2ldID4gbWF4TmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVdpZGVCYXJzLS07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNvdW50ZXJzW2ldICogMikgPj0gd2lkZUJhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmROZXh0V2lkdGgoY291bnRlcnM6IFVpbnQxNkFycmF5LCBjdXJyZW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgbWluV2lkdGggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyc1tpXSA8IG1pbldpZHRoICYmIGNvdW50ZXJzW2ldID4gY3VycmVudCkge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoID0gY291bnRlcnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWluV2lkdGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9wYXR0ZXJuVG9DaGFyKHBhdHRlcm46IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENIQVJBQ1RFUl9FTkNPRElOR1MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChDSEFSQUNURVJfRU5DT0RJTkdTW2ldID09PSBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoQUxQSEFCRVRbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGxhc3RTdGFydDogbnVtYmVyLCBuZXh0U3RhcnQ6IG51bWJlciwgY291bnRlcnM6IFVpbnQxNkFycmF5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5TaXplID0gQXJyYXlIZWxwZXIuc3VtKGNvdW50ZXJzKTtcblxuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBuZXh0U3RhcnQgLSBsYXN0U3RhcnQgLSBwYXR0ZXJuU2l6ZTtcbiAgICAgICAgaWYgKCh0cmFpbGluZ1doaXRlc3BhY2VFbmQgKiAzKSA+PSBwYXR0ZXJuU2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvZGUoKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBsZXQgY291bnRlcnMgPSBuZXcgVWludDE2QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRTdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBzdGFydC5lbmQpO1xuXG4gICAgICAgIGxldCBkZWNvZGVkQ2hhcjtcbiAgICAgICAgbGV0IGxhc3RTdGFydDogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb3VudGVycyA9IHRoaXMuX3RvQ291bnRlcnMobmV4dFN0YXJ0LCBjb3VudGVycykgYXMgVWludDE2QXJyYXk8QXJyYXlCdWZmZXI+O1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihjb3VudGVycyk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY29kZWRDaGFyID0gdGhpcy5fcGF0dGVyblRvQ2hhcihwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0O1xuICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IEFycmF5SGVscGVyLnN1bShjb3VudGVycyk7XG4gICAgICAgICAgICBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgbmV4dFN0YXJ0KTtcbiAgICAgICAgfSB3aGlsZSAoZGVjb2RlZENoYXIgIT09ICcqJyk7XG4gICAgICAgIHJlc3VsdC5wb3AoKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UobGFzdFN0YXJ0LCBuZXh0U3RhcnQsIGNvdW50ZXJzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBuZXh0U3RhcnQsXG4gICAgICAgICAgICBzdGFydEluZm86IHN0YXJ0LFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiByZXN1bHQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTM5UmVhZGVyO1xuIiwiaW1wb3J0IENvZGUzOVJlYWRlciBmcm9tICcuL2NvZGVfMzlfcmVhZGVyJztcblxuY29uc3QgcGF0dGVybnMgPSB7XG4gICAgQUVJTzogL1tBRUlPXS9nLFxuICAgIEFaMDk6IC9bQS1aMC05XS8sXG59O1xuXG5jb25zdCBjb2RlMzJzZXQgPSAnMDEyMzQ1Njc4OUJDREZHSEpLTE1OUFFSU1RVVldYWVonO1xuXG5jbGFzcyBDb2RlMzJSZWFkZXIgZXh0ZW5kcyBDb2RlMzlSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdjb2RlXzMyX3JlYWRlcic7XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZUNvZGUzMihjb2RlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKC9bXjAtOUJDREZHSEpLTE1OUFFSU1RVVldYWVpdLy50ZXN0KGNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXMgPSByZXMgKiAzMiArIGNvZGUzMnNldC5pbmRleE9mKGNvZGVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb2RlMzIgPSBgJHtyZXN9YDtcbiAgICAgICAgaWYgKGNvZGUzMi5sZW5ndGggPCA5KSB7XG4gICAgICAgICAgICBjb2RlMzIgPSAoJzAwMDAwMDAwMCcgKyBjb2RlMzIpLnNsaWNlKC05KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ0EnICsgY29kZTMyO1xuICAgIH1cblxuICAgIC8vIFRPRE8gKHRoaXMgd2FzIHRvZG8gaW4gb3JpZ2luYWwgcmVwbywgbm8gdGV4dCB3YXMgdGhlcmUuIHNvcnJ5LilcbiAgICBwcm90ZWN0ZWQgX2NoZWNrQ2hlY2tzdW0oY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIWNvZGU7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVjb2RlKCk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2RlID0gcmVzdWx0LmNvZGU7XG5cbiAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UocGF0dGVybnMuQUVJTywgJycpO1xuXG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tDaGVja3N1bShjb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2RlMzIgPSB0aGlzLl9kZWNvZGVDb2RlMzIoY29kZSk7XG5cbiAgICAgICAgaWYgKCFjb2RlMzIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlMzI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2RlMzJSZWFkZXI7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5pbXBvcnQgeyBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgQ29kZTM5UmVhZGVyIGZyb20gJy4vY29kZV8zOV9yZWFkZXInO1xuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgICBJT1E6IC9bSU9RXS9nLFxuICAgIEFaMDk6IC9bQS1aMC05XXsxN30vLFxufTtcblxuY2xhc3MgQ29kZTM5VklOUmVhZGVyIGV4dGVuZHMgQ29kZTM5UmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnY29kZV8zOV92aW4nO1xuXG4gICAgLy8gVE9ETyAodGhpcyB3YXMgdG9kbyBpbiBvcmlnaW5hbCByZXBvLCBubyB0ZXh0IHdhcyB0aGVyZS4gc29ycnkuKVxuICAgIHByb3RlY3RlZCBfY2hlY2tDaGVja3N1bShjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhY29kZTtcbiAgICB9XG5cbiAgICAvLyBDcmliYmVkIGZyb206XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3p4aW5nL3p4aW5nL2Jsb2IvbWFzdGVyL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3p4aW5nL2NsaWVudC9yZXN1bHQvVklOUmVzdWx0UGFyc2VyLmphdmFcbiAgICBwdWJsaWMgZGVjb2RlKCk6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVjb2RlKCk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB7IGNvZGUgfSA9IHJlc3VsdDtcblxuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZShwYXR0ZXJucy5JT1EsICcnKTtcblxuICAgICAgICBpZiAoIWNvZGUubWF0Y2gocGF0dGVybnMuQVowOSkpIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIEFaMDkgcGF0dGVybiBjb2RlOicsIGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrQ2hlY2tzdW0oY29kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTM5VklOUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlIH0gZnJvbSAnLi9iYXJjb2RlX3JlYWRlcic7XG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5cbmNvbnN0IEFMUEhBQkVUSF9TVFJJTkcgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLS4gJC8rJWFiY2QqJztcbmNvbnN0IEFMUEhBQkVUID0gbmV3IFVpbnQxNkFycmF5KFsuLi5BTFBIQUJFVEhfU1RSSU5HXS5tYXAoY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpKTtcbmNvbnN0IENIQVJBQ1RFUl9FTkNPRElOR1MgPSBuZXcgVWludDE2QXJyYXkoW1xuICAgIDB4MTE0LCAweDE0OCwgMHgxNDQsIDB4MTQyLCAweDEyOCwgMHgxMjQsIDB4MTIyLCAweDE1MCwgMHgxMTIsIDB4MTBBLFxuICAgIDB4MUE4LCAweDFBNCwgMHgxQTIsIDB4MTk0LCAweDE5MiwgMHgxOEEsIDB4MTY4LCAweDE2NCwgMHgxNjIsIDB4MTM0LFxuICAgIDB4MTFBLCAweDE1OCwgMHgxNEMsIDB4MTQ2LCAweDEyQywgMHgxMTYsIDB4MUI0LCAweDFCMiwgMHgxQUMsIDB4MUE2LFxuICAgIDB4MTk2LCAweDE5QSwgMHgxNkMsIDB4MTY2LCAweDEzNiwgMHgxM0EsIDB4MTJFLCAweDFENCwgMHgxRDIsIDB4MUNBLFxuICAgIDB4MTZFLCAweDE3NiwgMHgxQUUsIDB4MTI2LCAweDFEQSwgMHgxRDYsIDB4MTMyLCAweDE1RSxcbl0pO1xuY29uc3QgQVNURVJJU0sgPSAweDE1RTtcblxuY2xhc3MgQ29kZTkzUmVhZGVyIGV4dGVuZHMgQmFyY29kZVJlYWRlciB7XG4gICAgRk9STUFUID0gJ2NvZGVfOTMnO1xuICAgIHByb3RlY3RlZCBfcGF0dGVyblRvQ2hhcihwYXR0ZXJuOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDSEFSQUNURVJfRU5DT0RJTkdTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSA9PT0gcGF0dGVybikge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKEFMUEhBQkVUW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF90b1BhdHRlcm4oY291bnRlcnM6IFVpbnQxNkFycmF5KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHN1bSA9IGNvdW50ZXJzLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIDApO1xuICAgICAgICBsZXQgcGF0dGVybiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZCA9IE1hdGgucm91bmQoY291bnRlcnNbaV0gKiA5IC8gc3VtKTtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkIDwgMSB8fCBub3JtYWxpemVkID4gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoaSAmIDEpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBub3JtYWxpemVkOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IChwYXR0ZXJuIDw8IDEpIHwgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhdHRlcm4gPDw9IG5vcm1hbGl6ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBwYXR0ZXJuU3RhcnQgPSBvZmZzZXQ7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDE2QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDBdKTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHN0YXJ0IHBhdHRlcm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RvUGF0dGVybihjb3VudGVyKSA9PT0gQVNURVJJU0spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdoaXRlU3BhY2VNdXN0U3RhcnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIHBhdHRlcm5TdGFydCAtICgoaSAtIHBhdHRlcm5TdGFydCkgLyA0KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hdGNoUmFuZ2Uod2hpdGVTcGFjZU11c3RTdGFydCwgcGF0dGVyblN0YXJ0LCAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwYXR0ZXJuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0ICs9IGNvdW50ZXJbMF0gKyBjb3VudGVyWzFdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltqXSA9IGNvdW50ZXJbaiArIDJdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJbNF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyWzVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcy0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3ZlcmlmeUVuZChsYXN0U3RhcnQ6IG51bWJlciwgbmV4dFN0YXJ0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGxhc3RTdGFydCA9PT0gbmV4dFN0YXJ0IHx8ICF0aGlzLl9yb3dbbmV4dFN0YXJ0XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RlY29kZUV4dGVuZGVkKGNoYXJBcnJheTogQXJyYXk8c3RyaW5nPik6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGNoYXJBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gY2hhckFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKGNoYXIgPj0gJ2EnICYmIGNoYXIgPD0gJ2QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAobGVuZ3RoIC0gMikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2hhckFycmF5WysraV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dENoYXJDb2RlID0gbmV4dENoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVjb2RlZENoYXI7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID49ICdBJyAmJiBuZXh0Q2hhciA8PSAnWicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlIC0gNjQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ0UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ0YnICYmIG5leHRDaGFyIDw9ICdKJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhckNvZGUgLSAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRDaGFyID49ICdLJyAmJiBuZXh0Q2hhciA8PSAnTycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlICsgMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA+PSAnUCcgJiYgbmV4dENoYXIgPD0gJ1MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDQzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPj0gJ1QnICYmIG5leHRDaGFyIDw9ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ08nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSAtIDMyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dENoYXIgPT09ICdaJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDaGFyID0gJzonO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ1onKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSArIDMyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBjb2RlXzkzX3JlYWRlciBfZGVjb2RlRXh0ZW5kZWQgaGl0IGRlZmF1bHQgY2FzZSwgdGhpcyBtYXkgYmUgYW4gZXJyb3InLCBkZWNvZGVkQ2hhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGFyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX21hdGNoQ2hlY2tDaGFyKGNoYXJBcnJheTogQXJyYXk8c3RyaW5nPiwgaW5kZXg6IG51bWJlciwgbWF4V2VpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYXJyYXlUb0NoZWNrID0gY2hhckFycmF5LnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gYXJyYXlUb0NoZWNrLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgd2VpZ2h0ZWRTdW1zID0gYXJyYXlUb0NoZWNrLnJlZHVjZSgoc3VtLCBjaGFyLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSAoKChpICogLTEpICsgKGxlbmd0aCAtIDEpKSAlIG1heFdlaWdodCkgKyAxO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBTFBIQUJFVC5pbmRleE9mKGNoYXIuY2hhckNvZGVBdCgwKSk7XG4gICAgICAgICAgICByZXR1cm4gc3VtICsgKHdlaWdodCAqIHZhbHVlKTtcbiAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgY29uc3QgY2hlY2tDaGFyID0gQUxQSEFCRVRbKHdlaWdodGVkU3VtcyAlIDQ3KV07XG4gICAgICAgIHJldHVybiBjaGVja0NoYXIgPT09IGNoYXJBcnJheVtpbmRleF0uY2hhckNvZGVBdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDaGVja3N1bXMoY2hhckFycmF5OiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXRjaENoZWNrQ2hhcihjaGFyQXJyYXksIGNoYXJBcnJheS5sZW5ndGggLSAyLCAyMClcbiAgICAgICAgICAgICYmIHRoaXMuX21hdGNoQ2hlY2tDaGFyKGNoYXJBcnJheSwgY2hhckFycmF5Lmxlbmd0aCAtIDEsIDE1KTtcbiAgICB9O1xuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlciB8IG51bGwpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5fZmluZFN0YXJ0KCk7XG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ZXJzID0gbmV3IFVpbnQxNkFycmF5KFswLCAwLCAwLCAwLCAwLCAwXSk7XG4gICAgICAgIGxldCByZXN1bHQ6IEFycmF5PHN0cmluZz4gfCBudWxsID0gW107XG4gICAgICAgIGxldCBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdywgc3RhcnQuZW5kKTtcbiAgICAgICAgbGV0IGxhc3RTdGFydDtcbiAgICAgICAgbGV0IGRlY29kZWRDaGFyOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb3VudGVycyA9IHRoaXMuX3RvQ291bnRlcnMobmV4dFN0YXJ0LCBjb3VudGVycykgYXMgVWludDE2QXJyYXk8QXJyYXlCdWZmZXI+O1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX3RvUGF0dGVybihjb3VudGVycyk7XG4gICAgICAgICAgICBpZiAocGF0dGVybiA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY29kZWRDaGFyID0gdGhpcy5fcGF0dGVyblRvQ2hhcihwYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb2RlZENoYXIpO1xuICAgICAgICAgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0O1xuICAgICAgICAgICAgbmV4dFN0YXJ0ICs9IEFycmF5SGVscGVyLnN1bShjb3VudGVycyk7XG4gICAgICAgICAgICBuZXh0U3RhcnQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgbmV4dFN0YXJ0KTtcbiAgICAgICAgfSB3aGlsZSAoZGVjb2RlZENoYXIgIT09ICcqJyk7XG4gICAgICAgIHJlc3VsdC5wb3AoKTtcblxuICAgICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl92ZXJpZnlFbmQobGFzdFN0YXJ0LCBuZXh0U3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5Q2hlY2tzdW1zKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIHJlc3VsdC5sZW5ndGggLSAyKTtcbiAgICAgICAgLy8geWVzLCB0aGlzIGlzIGFuIGFzc2lnbiBpbnNpZGUgYW4gaWYuXG4gICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5fZGVjb2RlRXh0ZW5kZWQocmVzdWx0KSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5qb2luKCcnKSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydC5zdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV4dFN0YXJ0LFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydCxcbiAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcblxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29kZTkzUmVhZGVyO1xuIiwiaW1wb3J0IEJhcmNvZGVSZWFkZXIsIHsgQmFyY29kZVJlYWRlckNvbmZpZywgQmFyY29kZUluZm8sIEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC9tZXJnZSc7XG5cbi8vIGNvbnN0IENPREVfTF9TVEFSVCA9IDA7XG5jb25zdCBDT0RFX0dfU1RBUlQgPSAxMDtcbmV4cG9ydCB7IENPREVfR19TVEFSVCB9O1xuY29uc3QgU1RBUlRfUEFUVEVSTiA9IFsxLCAxLCAxXTtcbmNvbnN0IE1JRERMRV9QQVRURVJOID0gWzEsIDEsIDEsIDEsIDFdO1xuZXhwb3J0IHsgTUlERExFX1BBVFRFUk4gfTtcbmNvbnN0IEVYVEVOU0lPTl9TVEFSVF9QQVRURVJOID0gWzEsIDEsIDJdO1xuY29uc3QgQ09ERV9QQVRURVJOID0gW1xuICAgIFszLCAyLCAxLCAxXSxcbiAgICBbMiwgMiwgMiwgMV0sXG4gICAgWzIsIDEsIDIsIDJdLFxuICAgIFsxLCA0LCAxLCAxXSxcbiAgICBbMSwgMSwgMywgMl0sXG4gICAgWzEsIDIsIDMsIDFdLFxuICAgIFsxLCAxLCAxLCA0XSxcbiAgICBbMSwgMywgMSwgMl0sXG4gICAgWzEsIDIsIDEsIDNdLFxuICAgIFszLCAxLCAxLCAyXSxcbiAgICBbMSwgMSwgMiwgM10sXG4gICAgWzEsIDIsIDIsIDJdLFxuICAgIFsyLCAyLCAxLCAyXSxcbiAgICBbMSwgMSwgNCwgMV0sXG4gICAgWzIsIDMsIDEsIDFdLFxuICAgIFsxLCAzLCAyLCAxXSxcbiAgICBbNCwgMSwgMSwgMV0sXG4gICAgWzIsIDEsIDMsIDFdLFxuICAgIFszLCAxLCAyLCAxXSxcbiAgICBbMiwgMSwgMSwgM10sXG5dO1xuY29uc3QgQ09ERV9GUkVRVUVOQ1kgPSBbMCwgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl07XG4vLyBjb25zdCBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzA7XG5jb25zdCBBVkdfQ09ERV9FUlJPUiA9IDAuNDg7XG5cbmNsYXNzIEVBTlJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIEZPUk1BVCA9ICdlYW5fMTMnO1xuICAgIFNJTkdMRV9DT0RFX0VSUk9SID0gMC43MDtcbiAgICBTVE9QX1BBVFRFUk4gPSBbMSwgMSwgMV07IC8vIFRPRE86IGRvZXMgdGhpcyBuZWVkIHRvIGJlIGluIHRoZSBjbGFzcz9cblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZz86IEJhcmNvZGVSZWFkZXJDb25maWcsIHN1cHBsZW1lbnRzPzogQXJyYXk8QmFyY29kZVJlYWRlcj4pIHtcbiAgICAgICAgc3VwZXIobWVyZ2UoeyBzdXBwbGVtZW50czogW10gfSwgY29uZmlnKSwgc3VwcGxlbWVudHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZFBhdHRlcm4ocGF0dGVybjogUmVhZG9ubHlBcnJheTxudW1iZXI+LCBvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbiwgdHJ5SGFyZGVyOiBib29sZWFuKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgQXJyYXk8bnVtYmVyPihwYXR0ZXJuLmxlbmd0aCkuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSBBVkdfQ09ERV9FUlJPUjtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpbmRQYXR0ZXJuJywgcGF0dGVybiwgb2Zmc2V0LCBpc1doaXRlLCB0cnlIYXJkZXIsIGVwc2lsb24pO1xuICAgICAgICBsZXQgY291bnRlclBvcyA9IDA7XG4gICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgKiBsb29wIGk9JHtvZmZzZXR9IGxlbj0ke3RoaXMuX3Jvdy5sZW5ndGh9IGlzV2hpdGU9JHtpc1doaXRlfSBjb3VudGVyUG9zPSR7Y291bnRlclBvc31gKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10gKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIG1hdGNoUGF0dGVybicsIGVycm9yLCBjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbiAmJiBiZXN0TWF0Y2guZXJyb3IgJiYgZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLnN0YXJ0ID0gaSAtIGNvdW50ZXIucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gYmVzdE1hdGNoJywgSlNPTi5zdHJpbmdpZnkoYmVzdE1hdGNoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSA9IDE7XG4gICAgICAgICAgICAgICAgaXNXaGl0ZSA9ICFpc1doaXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBiZXN0TWF0Y2gnLCBKU09OLnN0cmluZ2lmeShiZXN0TWF0Y2gpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gbnVsbCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZCA/IGJlc3RNYXRjaCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluZFBhdHRlcm4gYW5kIGRlY29kZUNvZGUgYXBwZWFyIHRvIHNoYXJlIHF1aXRlIHNpbWlsYXIgY29kZSwgY2FuIGl0IGJlIHJlZHVjZWQ/XG4gICAgcHJvdGVjdGVkIF9kZWNvZGVDb2RlKHN0YXJ0OiBudW1iZXIsIGNvZGVyYW5nZT86IG51bWJlcik6IEJhcmNvZGVJbmZvIHwgbnVsbCB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlJywgc3RhcnQsIGNvZGVyYW5nZSk7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBiZXN0TWF0Y2g6IEJhcmNvZGVJbmZvID0ge1xuICAgICAgICAgICAgZXJyb3I6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgICAgICBjb2RlOiAtMSxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogc3RhcnRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IEFWR19DT0RFX0VSUk9SO1xuICAgICAgICBsZXQgaXNXaGl0ZSA9ICF0aGlzLl9yb3dbb2Zmc2V0XTtcbiAgICAgICAgbGV0IGNvdW50ZXJQb3MgPSAwO1xuXG4gICAgICAgIGlmICghY29kZXJhbmdlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlQ29kZSBiZWZvcmUgbGVuZ3RoJyk7XG4gICAgICAgICAgICBjb2RlcmFuZ2UgPSBDT0RFX1BBVFRFUk4ubGVuZ3RoO1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGRlY29kZUNvZGUgYWZ0ZXIgbGVuZ3RoJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3Jvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd1tpXSBeIChpc1doaXRlID8gMSA6IDApKSB7XG4gICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyUG9zXSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnRlclBvcyA9PT0gY291bnRlci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvZGUgPSAwOyBjb2RlIDwgY29kZXJhbmdlOyBjb2RlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fbWF0Y2hQYXR0ZXJuKGNvdW50ZXIsIENPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RNYXRjaC5lcnJvciEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guY29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlc3RNYXRjaC5lcnJvciEgPiBlcHNpbG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuIG51bGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm4gYmVzdE1hdGNoJywgSlNPTi5zdHJpbmdpZnkoYmVzdE1hdGNoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kID8gYmVzdE1hdGNoIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRTdGFydCgpOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGZpbmRTdGFydCcpO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5fbmV4dFNldCh0aGlzLl9yb3cpO1xuICAgICAgICBsZXQgc3RhcnRJbmZvOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoIXN0YXJ0SW5mbykge1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gdGhpcy5fZmluZFBhdHRlcm4oU1RBUlRfUEFUVEVSTiwgb2Zmc2V0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogc3RhcnRJbmZvPScsIEpTT04uc3RyaW5naWZ5KHN0YXJ0SW5mbykpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IHN0YXJ0SW5mby5zdGFydCAtIChzdGFydEluZm8uZW5kIC0gc3RhcnRJbmZvLnN0YXJ0KTtcblxuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybmluZyBzdGFydEluZm8nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCA9IHN0YXJ0SW5mby5lbmQ7XG4gICAgICAgICAgICBzdGFydEluZm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm5pbmcgbnVsbCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVGaXJzdERpZ2l0KGNvZGVGcmVxdWVuY3k6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogY2FsY3VsYXRlRmlyc3REaWdpdCcsIGNvZGVGcmVxdWVuY3kpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENPREVfRlJFUVVFTkNZLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29kZUZyZXF1ZW5jeSA9PT0gQ09ERV9GUkVRVUVOQ1lbaV0pIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuaW5nJywgaSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZGVjb2RlUGF5bG9hZChpbkNvZGU6IEJhcmNvZGVQb3NpdGlvbiwgcmVzdWx0OiBBcnJheTxudW1iZXI+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlUGF5bG9hZCcsIGluQ29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuICAgICAgICBsZXQgb3V0Q29kZTogQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0geyAuLi5pbkNvZGUgfTtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAweDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG91dENvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKG91dENvZGUuZW5kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlPScsIG91dENvZGUpO1xuICAgICAgICAgICAgaWYgKCFvdXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgPj0gQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgLT0gQ09ERV9HX1NUQVJUO1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoNSAtIGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2RlRnJlcXVlbmN5IHw9IDAgPDwgKDUgLSBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG91dENvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3REaWdpdCA9IHRoaXMuX2NhbGN1bGF0ZUZpcnN0RGlnaXQoY29kZUZyZXF1ZW5jeSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBmaXJzdERpZ2l0PScsIGZpcnN0RGlnaXQpO1xuICAgICAgICBpZiAoZmlyc3REaWdpdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KGZpcnN0RGlnaXQpO1xuXG4gICAgICAgIGxldCBtaWRkbGVQYXR0ZXJuID0gdGhpcy5fZmluZFBhdHRlcm4oTUlERExFX1BBVFRFUk4sIG91dENvZGUuZW5kLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBmaW5kUGF0dGVybj0nLCBKU09OLnN0cmluZ2lmeShtaWRkbGVQYXR0ZXJuKSk7XG5cbiAgICAgICAgaWYgKG1pZGRsZVBhdHRlcm4gPT09IG51bGwgfHwgIW1pZGRsZVBhdHRlcm4uZW5kKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogcmV0dXJuIG51bGwnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2gobWlkZGxlUGF0dGVybik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG1pZGRsZVBhdHRlcm4gPSB0aGlzLl9kZWNvZGVDb2RlKG1pZGRsZVBhdHRlcm4hLmVuZCwgQ09ERV9HX1NUQVJUKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVDb2RlPScsIEpTT04uc3RyaW5naWZ5KG1pZGRsZVBhdHRlcm4pKTtcblxuICAgICAgICAgICAgaWYgKCFtaWRkbGVQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG1pZGRsZVBhdHRlcm4pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKG1pZGRsZVBhdHRlcm4gYXMgQmFyY29kZUluZm8pLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGVuZCBjb2RlPScsIEpTT04uc3RyaW5naWZ5KG1pZGRsZVBhdHRlcm4pKTtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGVuZCByZXN1bHQ9JywgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBlbmQgZGVjb2RlZENvZGVzPScsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIHJldHVybiBtaWRkbGVQYXR0ZXJuIGFzIEJhcmNvZGVJbmZvO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm86IEJhcmNvZGVQb3NpdGlvbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlJywgSlNPTi5zdHJpbmdpZnkoZW5kSW5mbykpO1xuICAgICAgICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VFbmQgPSBlbmRJbmZvLmVuZCArIChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpO1xuXG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiByZXR1cm5pbmcnLCBKU09OLnN0cmluZ2lmeShlbmRJbmZvKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZEluZm87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHJldHVybiBudWxsJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZmluZEVuZChvZmZzZXQ6IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbik6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZmluZEVuZCcsIG9mZnNldCwgaXNXaGl0ZSk7XG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUT1BfUEFUVEVSTiwgb2Zmc2V0LCBpc1doaXRlLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGVuZEluZm8gIT09IG51bGwgPyB0aGlzLl92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbykgOiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBfY2hlY2tzdW0nLCByZXN1bHQpO1xuICAgICAgICBsZXQgc3VtID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gcmVzdWx0Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VtICo9IDM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgc3VtICs9IHJlc3VsdFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBlbmQgY2hlY2tzdW0nLCBzdW0gJSAxMCA9PT0gMCk7XG4gICAgICAgIHJldHVybiBzdW0gJSAxMCA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvZGVFeHRlbnNpb25zKG9mZnNldDogbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBvZmZzZXQpO1xuICAgICAgICBjb25zdCBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybihFWFRFTlNJT05fU1RBUlRfUEFUVEVSTiwgc3RhcnQsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZGVjb2RlRXh0ZW5zaW9ucycsIHRoaXMuc3VwcGxlbWVudHMpO1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogdGhlcmUgYXJlICcsIHRoaXMuc3VwcGxlbWVudHMubGVuZ3RoLCAnIHN1cHBsZW1lbnRzJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdXBwbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGV4dGVuc2lvbnMgbG9vcCcsIGksIHRoaXMuc3VwcGxlbWVudHNbaV0sIHRoaXMuc3VwcGxlbWVudHNbaV0uX2RlY29kZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnN1cHBsZW1lbnRzW2ldLmRlY29kZSh0aGlzLl9yb3csIHN0YXJ0SW5mby5lbmQpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGUgcmVzdWx0PScsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogcmVzdWx0LmVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRDb2RlczogcmVzdWx0LmRlY29kZWRDb2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogdGhpcy5zdXBwbGVtZW50c1tpXS5GT1JNQVQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignKiBkZWNvZGVFeHRlbnNpb25zIGVycm9yIGluICcsIHRoaXMuc3VwcGxlbWVudHNbaV0sICc6ICcsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLndhcm4oJyogZW5kIGRlY29kZUV4dGVuc2lvbnMnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIGRlY29kZScsIHJvdyk7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGUnLCBzdGFydCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgICAgIGNvbnN0IGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4oKTtcbiAgICAgICAgbGV0IHJlc3VsdEluZm86IEJhcmNvZGUgfCB7fSA9IHt9O1xuICAgICAgICBsZXQgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG5cbiAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVQb3NpdGlvbiB8IEJhcmNvZGVJbmZvIHwgbnVsbCA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEluZm8uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0SW5mby5lbmRcbiAgICAgICAgfTtcbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZVBheWxvYWQoY29kZSwgcmVzdWx0LCBkZWNvZGVkQ29kZXMpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RlID0gdGhpcy5fZmluZEVuZChjb2RlLmVuZCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcblxuICAgICAgICAvLyBDaGVja3N1bVxuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrc3VtKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS53YXJuKCcqIHRoaXMuc3VwcGxlbWVudHM9JywgdGhpcy5zdXBwbGVtZW50cyk7XG4gICAgICAgIGlmICh0aGlzLnN1cHBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHN1cHBsZW1lbnQgPSB0aGlzLl9kZWNvZGVFeHRlbnNpb25zKGNvZGUuZW5kKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignKiBkZWNvZGVFeHRlbnNpb25zIHJldHVybnMnLCBzdXBwbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghc3VwcGxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN1cHBsZW1lbnQuZGVjb2RlZENvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3RDb2RlID0gc3VwcGxlbWVudC5kZWNvZGVkQ29kZXNbc3VwcGxlbWVudC5kZWNvZGVkQ29kZXMubGVuZ3RoIC0gMV0gYXMgQmFyY29kZUluZm87XG4gICAgICAgICAgICBjb25zdCBlbmRJbmZvID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBsYXN0Q29kZS5zdGFydCArICgoKGxhc3RDb2RlLmVuZCAtIGxhc3RDb2RlLnN0YXJ0KSAvIDIpIHwgMCksXG4gICAgICAgICAgICAgICAgZW5kOiBsYXN0Q29kZS5lbmRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5fdmVyaWZ5VHJhaWxpbmdXaGl0ZXNwYWNlKGVuZEluZm8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc3VwcGxlbWVudCxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJykgKyBzdXBwbGVtZW50LmNvZGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogcmVzdWx0LmpvaW4oJycpLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0SW5mby5zdGFydCxcbiAgICAgICAgICAgIGVuZDogY29kZS5lbmQsXG4gICAgICAgICAgICBzdGFydEluZm8sXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICAuLi5yZXN1bHRJbmZvLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLkZPUk1BVCxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVBTlJlYWRlcjtcbiIsImltcG9ydCBFQU5SZWFkZXIsIHsgQ09ERV9HX1NUQVJUIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZSwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuXG5jbGFzcyBFQU4yUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAnZWFuXzInO1xuICAgIHB1YmxpYyBkZWNvZGUocm93PzogQXJyYXk8bnVtYmVyPiwgc3RhcnQ/OiBudW1iZXIpOiBCYXJjb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIHRoaXMuX3JvdyA9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2RlRnJlcXVlbmN5ID0gMDtcbiAgICAgICAgbGV0IG9mZnNldCA9IHN0YXJ0O1xuICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl9yb3cubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMiAmJiBvZmZzZXQgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUob2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjb2RlLmNvZGUgJSAxMCk7XG4gICAgICAgICAgICBpZiAoY29kZS5jb2RlID49IENPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgICAgIGNvZGVGcmVxdWVuY3kgfD0gMSA8PCAoMSAtIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3JvdywgY29kZS5lbmQpO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRVbnNldCh0aGlzLl9yb3csIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCAocGFyc2VJbnQocmVzdWx0LmpvaW4oJycpKSAlIDQpICE9PSBjb2RlRnJlcXVlbmN5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IChjb2RlIGFzIEJhcmNvZGVJbmZvKS5lbmQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IChzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uKS5zdGFydCxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU4yUmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQgfSBmcm9tICcuL2Vhbl9yZWFkZXInO1xuaW1wb3J0IHsgQmFyY29kZSwgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlSW5mbyB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jb25zdCBDSEVDS19ESUdJVF9FTkNPRElOR1MgPSBbMjQsIDIwLCAxOCwgMTcsIDEyLCA2LCAzLCAxMCwgOSwgNV07XG5cbmZ1bmN0aW9uIGRldGVybWluZUNoZWNrRGlnaXQoY29kZUZyZXF1ZW5jeTogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSBDSEVDS19ESUdJVF9FTkNPRElOR1NbaV0pIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHRlbnNpb25DaGVja3N1bShyZXN1bHQ6IEFycmF5PG51bWJlcj4pIHtcbiAgICBjb25zdCBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgIGxldCBzdW0gPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IGxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIHN1bSArPSByZXN1bHRbaV07XG4gICAgfVxuICAgIHN1bSAqPSAzO1xuICAgIGZvciAobGV0IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMikge1xuICAgICAgICBzdW0gKz0gcmVzdWx0W2ldO1xuICAgIH1cbiAgICBzdW0gKj0gMztcbiAgICByZXR1cm4gc3VtICUgMTA7XG59XG5cbmNsYXNzIEVBTjVSZWFkZXIgZXh0ZW5kcyBFQU5SZWFkZXIge1xuICAgIEZPUk1BVCA9ICdlYW5fNSc7XG4gICAgcHVibGljIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgdGhpcy5fcm93ID0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAwO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gc3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX3Jvdy5sZW5ndGg7XG4gICAgICAgIGxldCBjb2RlOiBCYXJjb2RlSW5mbyB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENvZGVzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1ICYmIG9mZnNldCA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBjb2RlID0gdGhpcy5fZGVjb2RlQ29kZShvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGUuY29kZSAlIDEwKTtcbiAgICAgICAgICAgIGlmIChjb2RlLmNvZGUgPj0gQ09ERV9HX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAxIDw8ICg0IC0gaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gNCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93LCBjb2RlLmVuZCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5fbmV4dFVuc2V0KHRoaXMuX3Jvdywgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHRlbnNpb25DaGVja3N1bShyZXN1bHQpICE9PSBkZXRlcm1pbmVDaGVja0RpZ2l0KGNvZGVGcmVxdWVuY3kpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5mbyA9IHRoaXMuX2ZpbmRTdGFydCgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBlbmQ6IChjb2RlIGFzIEJhcmNvZGVJbmZvKS5lbmQsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICAgICAgc3RhcnRJbmZvOiBzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnQ6IChzdGFydEluZm8gYXMgQmFyY29kZVBvc2l0aW9uKS5zdGFydCxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFQU41UmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQsIE1JRERMRV9QQVRURVJOIH0gZnJvbSAnLi9lYW5fcmVhZGVyJztcbmltcG9ydCB7IEJhcmNvZGVQb3NpdGlvbiwgQmFyY29kZUluZm8gfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgRUFOOFJlYWRlciBleHRlbmRzIEVBTlJlYWRlciB7XG4gICAgRk9STUFUID0gJ2Vhbl84JztcbiAgICBwcm90ZWN0ZWQgX2RlY29kZVBheWxvYWQoaW5Db2RlOiBCYXJjb2RlUG9zaXRpb24sIHJlc3VsdDogQXJyYXk8bnVtYmVyPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlUG9zaXRpb24+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgbGV0IGNvZGU6IEJhcmNvZGVJbmZvIHwgQmFyY29kZVBvc2l0aW9uIHwgbnVsbCA9IGluQ29kZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgY29kZSA9IHRoaXMuX2RlY29kZUNvZGUoY29kZS5lbmQsIENPREVfR19TVEFSVCk7XG4gICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZSA9IHRoaXMuX2ZpbmRQYXR0ZXJuKE1JRERMRV9QQVRURVJOLCBjb2RlLmVuZCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvZGUuZW5kLCBDT0RFX0dfU1RBUlQpO1xuICAgICAgICAgICAgaWYgKCFjb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2RlIGFzIEJhcmNvZGVJbmZvO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVBTjhSZWFkZXI7XG4iLCIvLyBUT0RPOiBpMm9mNV9yZWFkZXIgYW5kIDJvZjVfcmVhZGVyIHNoYXJlIHZlcnkgc2ltaWxhciBjb2RlLCBtYWtlIHVzZSBvZiB0aGF0XG5cbmltcG9ydCBCYXJjb2RlUmVhZGVyLCB7IEJhcmNvZGVSZWFkZXJDb25maWcsIEJhcmNvZGVJbmZvLCBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcbmltcG9ydCBtZXJnZSBmcm9tICdsb2Rhc2gvbWVyZ2UnO1xuXG5jb25zdCBOID0gMTtcbmNvbnN0IFcgPSAzO1xuXG5jbGFzcyBJMm9mNVJlYWRlciBleHRlbmRzIEJhcmNvZGVSZWFkZXIge1xuICAgIHByaXZhdGUgYmFyU3BhY2VSYXRpbyA9IFsxLCAxXTtcbiAgICBTSU5HTEVfQ09ERV9FUlJPUiA9IDAuNzg7XG4gICAgQVZHX0NPREVfRVJST1IgPSAwLjM4O1xuXG4gICAgU1RBUlRfUEFUVEVSTiA9IFtOLCBOLCBOLCBOXTtcbiAgICBTVE9QX1BBVFRFUk4gPSBbTiwgTiwgV107XG4gICAgQ09ERV9QQVRURVJOID0gW1xuICAgICAgICBbTiwgTiwgVywgVywgTl0sXG4gICAgICAgIFtXLCBOLCBOLCBOLCBXXSxcbiAgICAgICAgW04sIFcsIE4sIE4sIFddLFxuICAgICAgICBbVywgVywgTiwgTiwgTl0sXG4gICAgICAgIFtOLCBOLCBXLCBOLCBXXSxcbiAgICAgICAgW1csIE4sIFcsIE4sIE5dLFxuICAgICAgICBbTiwgVywgVywgTiwgTl0sXG4gICAgICAgIFtOLCBOLCBOLCBXLCBXXSxcbiAgICAgICAgW1csIE4sIE4sIFcsIE5dLFxuICAgICAgICBbTiwgVywgTiwgVywgTl0sXG4gICAgXTtcbiAgICBNQVhfQ09SUkVDVElPTl9GQUNUT1IgPSA1O1xuICAgIEZPUk1BVCA9ICdpMm9mNSc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRzOiBCYXJjb2RlUmVhZGVyQ29uZmlnKSB7XG4gICAgICAgIHN1cGVyKG1lcmdlKHsgbm9ybWFsaXplQmFyU3BhY2VXaWR0aDogZmFsc2UgfSwgb3B0cykpO1xuICAgICAgICBpZiAob3B0cy5ub3JtYWxpemVCYXJTcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLlNJTkdMRV9DT0RFX0VSUk9SID0gMC4zODtcbiAgICAgICAgICAgIHRoaXMuQVZHX0NPREVfRVJST1IgPSAwLjA5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29uZmlnID0gb3B0cztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9tYXRjaFBhdHRlcm4oY291bnRlcjogQXJyYXk8bnVtYmVyPiwgY29kZTogUmVhZG9ubHlBcnJheTxudW1iZXI+KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm5vcm1hbGl6ZUJhclNwYWNlV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXJTdW0gPSBbMCwgMF07XG4gICAgICAgICAgICBjb25zdCBjb2RlU3VtID0gWzAsIDBdO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvbiA9IFswLCAwXTtcbiAgICAgICAgICAgIGNvbnN0IGNvcnJlY3Rpb25SYXRpbyA9IHRoaXMuTUFYX0NPUlJFQ1RJT05fRkFDVE9SO1xuICAgICAgICAgICAgY29uc3QgY29ycmVjdGlvblJhdGlvSW52ZXJzZSA9IDEgLyBjb3JyZWN0aW9uUmF0aW87XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJTdW1baSAlIDJdICs9IGNvdW50ZXJbaV07XG4gICAgICAgICAgICAgICAgY29kZVN1bVtpICUgMl0gKz0gY29kZVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMF0gPSBjb2RlU3VtWzBdIC8gY291bnRlclN1bVswXTtcbiAgICAgICAgICAgIGNvcnJlY3Rpb25bMV0gPSBjb2RlU3VtWzFdIC8gY291bnRlclN1bVsxXTtcblxuICAgICAgICAgICAgY29ycmVjdGlvblswXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMF0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICAgICAgY29ycmVjdGlvblsxXSA9IE1hdGgubWF4KE1hdGgubWluKGNvcnJlY3Rpb25bMV0sIGNvcnJlY3Rpb25SYXRpbyksIGNvcnJlY3Rpb25SYXRpb0ludmVyc2UpO1xuICAgICAgICAgICAgdGhpcy5iYXJTcGFjZVJhdGlvID0gY29ycmVjdGlvbjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbaV0gKj0gdGhpcy5iYXJTcGFjZVJhdGlvW2kgJSAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuX21hdGNoUGF0dGVybihjb3VudGVyLCBjb2RlKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9maW5kUGF0dGVybihwYXR0ZXJuOiBSZWFkb25seUFycmF5PG51bWJlcj4sIG9mZnNldD86IG51bWJlciwgaXNXaGl0ZTogYm9vbGVhbiA9IGZhbHNlLCB0cnlIYXJkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3VudGVyID0gbmV3IEFycmF5PG51bWJlcj4ocGF0dGVybi5sZW5ndGgpLmZpbGwoMCk7XG4gICAgICAgIGxldCBjb3VudGVyUG9zID0gMDtcbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBlcnJvcjogTnVtYmVyLk1BWF9WQUxVRSxcbiAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSB0aGlzLkFWR19DT0RFX0VSUk9SO1xuXG4gICAgICAgIGlzV2hpdGUgPSBpc1doaXRlIHx8IGZhbHNlO1xuICAgICAgICB0cnlIYXJkZXIgPSB0cnlIYXJkZXIgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMuX25leHRTZXQodGhpcy5fcm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBvZmZzZXQ7IGkgPCB0aGlzLl9yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dbaV0gXiAoaXNXaGl0ZSA/IDEgOiAwKSkge1xuICAgICAgICAgICAgICAgIGNvdW50ZXJbY291bnRlclBvc10rKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJQb3MgPT09IGNvdW50ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSBjb3VudGVyLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0TWF0Y2guc3RhcnQgPSBpIC0gc3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE1hdGNoLmVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVzdE1hdGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cnlIYXJkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnRlci5sZW5ndGggLSAyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2pdID0gY291bnRlcltqICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXIubGVuZ3RoIC0gMl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcltjb3VudGVyLmxlbmd0aCAtIDFdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlclBvcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyW2NvdW50ZXJQb3NdID0gMTtcbiAgICAgICAgICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZmluZFN0YXJ0KCk6IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwge1xuICAgICAgICBsZXQgbGVhZGluZ1doaXRlc3BhY2VTdGFydCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLl9uZXh0U2V0KHRoaXMuX3Jvdyk7XG4gICAgICAgIGxldCBzdGFydEluZm86IEJhcmNvZGVQb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgbmFycm93QmFyV2lkdGggPSAxO1xuXG4gICAgICAgIHdoaWxlICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICBzdGFydEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUQVJUX1BBVFRFUk4sIG9mZnNldCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgaWYgKCFzdGFydEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hcnJvd0JhcldpZHRoID0gTWF0aC5mbG9vcigoc3RhcnRJbmZvLmVuZCAtIHN0YXJ0SW5mby5zdGFydCkgLyA0KTtcbiAgICAgICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPSBzdGFydEluZm8uc3RhcnQgLSBuYXJyb3dCYXJXaWR0aCAqIDEwO1xuICAgICAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXRjaFJhbmdlKGxlYWRpbmdXaGl0ZXNwYWNlU3RhcnQsIHN0YXJ0SW5mby5zdGFydCwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBzdGFydEluZm8uZW5kO1xuICAgICAgICAgICAgc3RhcnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQoKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kUGF0dGVybih0aGlzLlNUT1BfUEFUVEVSTik7XG4gICAgICAgIHRoaXMuX3Jvdy5yZXZlcnNlKCk7XG5cbiAgICAgICAgaWYgKGVuZEluZm8gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV2ZXJzZSBudW1iZXJzXG4gICAgICAgIGNvbnN0IHRtcCA9IGVuZEluZm8uc3RhcnQ7XG4gICAgICAgIGVuZEluZm8uc3RhcnQgPSB0aGlzLl9yb3cubGVuZ3RoIC0gZW5kSW5mby5lbmQ7XG4gICAgICAgIGVuZEluZm8uZW5kID0gdGhpcy5fcm93Lmxlbmd0aCAtIHRtcDtcblxuICAgICAgICByZXR1cm4gZW5kSW5mbyAhPT0gbnVsbCA/IHRoaXMuX3ZlcmlmeVRyYWlsaW5nV2hpdGVzcGFjZShlbmRJbmZvKSA6IG51bGw7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlUGFpcihjb3VudGVyUGFpcjogQXJyYXk8QXJyYXk8bnVtYmVyPj4pOiBBcnJheTxCYXJjb2RlSW5mbz4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29kZXM6IEFycmF5PEJhcmNvZGVJbmZvPiA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnRlclBhaXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKGNvdW50ZXJQYWlyW2ldKTtcbiAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29kZXM7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfZGVjb2RlQ29kZShjb3VudGVyOiBBcnJheTxudW1iZXI+KTogQmFyY29kZUluZm8gfCBudWxsIHtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IHRoaXMuQVZHX0NPREVfRVJST1I7XG5cbiAgICAgICAgY29uc3QgYmVzdE1hdGNoOiBCYXJjb2RlSW5mbyA9IHtcbiAgICAgICAgICAgIGVycm9yOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBjb2RlID0gMDsgY29kZSA8IHRoaXMuQ09ERV9QQVRURVJOLmxlbmd0aDsgY29kZSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX21hdGNoUGF0dGVybihjb3VudGVyLCB0aGlzLkNPREVfUEFUVEVSTltjb2RlXSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2guZXJyb3IhKSB7XG4gICAgICAgICAgICAgICAgYmVzdE1hdGNoLmNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgIGJlc3RNYXRjaC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0TWF0Y2guZXJyb3IhIDwgZXBzaWxvbikge1xuICAgICAgICAgICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzOiBSZWFkb25seUFycmF5PG51bWJlcj4sIHJlc3VsdDogQXJyYXk8c3RyaW5nPiwgZGVjb2RlZENvZGVzOiBBcnJheTxCYXJjb2RlSW5mbyB8IEJhcmNvZGVQb3NpdGlvbj4pOiBBcnJheTxCYXJjb2RlSW5mbz4gfCBudWxsIHtcbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJMZW5ndGggPSBjb3VudGVycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJQYWlyID0gW1swLCAwLCAwLCAwLCAwXSwgWzAsIDAsIDAsIDAsIDBdXTtcbiAgICAgICAgbGV0IGNvZGVzOiBCYXJjb2RlSW5mb1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ZXJMZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY291bnRlclBhaXJbMF1baV0gPSBjb3VudGVyc1twb3NdICogdGhpcy5iYXJTcGFjZVJhdGlvWzBdO1xuICAgICAgICAgICAgICAgIGNvdW50ZXJQYWlyWzFdW2ldID0gY291bnRlcnNbcG9zICsgMV0gKiB0aGlzLmJhclNwYWNlUmF0aW9bMV07XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlcyA9IHRoaXMuX2RlY29kZVBhaXIoY291bnRlclBhaXIpO1xuICAgICAgICAgICAgaWYgKCFjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvZGVzW2ldLmNvZGUgKyAnJyk7XG4gICAgICAgICAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goY29kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2RlcztcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlDb3VudGVyTGVuZ3RoKGNvdW50ZXJzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiAoY291bnRlcnMubGVuZ3RoICUgMTAgPT09IDApO1xuICAgIH07XG5cbiAgICBwdWJsaWMgZGVjb2RlKHJvdz86IEFycmF5PG51bWJlcj4sIHN0YXJ0PzogQmFyY29kZVBvc2l0aW9uIHwgbnVtYmVyKTogQmFyY29kZSB8IG51bGwge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICAgICAgdmFyIGRlY29kZWRDb2RlcyA9IG5ldyBBcnJheTxCYXJjb2RlUG9zaXRpb24+KCk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmZvID0gdGhpcy5fZmluZFN0YXJ0KCk7XG4gICAgICAgIGlmICghc3RhcnRJbmZvKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWNvZGVkQ29kZXMucHVzaChzdGFydEluZm8pO1xuXG4gICAgICAgIGNvbnN0IGVuZEluZm8gPSB0aGlzLl9maW5kRW5kKCk7XG4gICAgICAgIGlmICghZW5kSW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3VudGVycyA9IHRoaXMuX2ZpbGxDb3VudGVycyhzdGFydEluZm8uZW5kLCBlbmRJbmZvLnN0YXJ0LCBmYWxzZSk7XG4gICAgICAgIGlmICghdGhpcy5fdmVyaWZ5Q291bnRlckxlbmd0aChjb3VudGVycykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9kZWNvZGVQYXlsb2FkKGNvdW50ZXJzLCByZXN1bHQsIGRlY29kZWRDb2Rlcyk7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggJSAyICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCA8IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlZENvZGVzLnB1c2goZW5kSW5mbyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQuam9pbignJyksXG4gICAgICAgICAgICBzdGFydDogc3RhcnRJbmZvLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBlbmRJbmZvLmVuZCxcbiAgICAgICAgICAgIHN0YXJ0SW5mbzogc3RhcnRJbmZvLFxuICAgICAgICAgICAgZGVjb2RlZENvZGVzOiBkZWNvZGVkQ29kZXMsXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuRk9STUFULFxuICAgICAgICB9O1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEkyb2Y1UmVhZGVyO1xuIiwiaW1wb3J0IEVBTlJlYWRlciwgeyBDT0RFX0dfU1RBUlQgfSBmcm9tICcuL2Vhbl9yZWFkZXInO1xuaW1wb3J0IHsgQmFyY29kZVBvc2l0aW9uLCBCYXJjb2RlSW5mbyB9IGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuXG5jbGFzcyBVUENFUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBDT0RFX0ZSRVFVRU5DWSA9IFtcbiAgICAgICAgWyA1NiwgNTIsIDUwLCA0OSwgNDQsIDM4LCAzNSwgNDIsIDQxLCAzNyBdLFxuICAgICAgICBbNywgMTEsIDEzLCAxNCwgMTksIDI1LCAyOCwgMjEsIDIyLCAyNl1dO1xuICAgIFNUT1BfUEFUVEVSTiA9IFsxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3LCAxIC8gNiAqIDcsIDEgLyA2ICogNywgMSAvIDYgKiA3XTtcbiAgICBGT1JNQVQgPSAndXBjX2UnO1xuICAgIHByb3RlY3RlZCBfZGVjb2RlUGF5bG9hZChpbkNvZGU6IEJhcmNvZGVQb3NpdGlvbiwgcmVzdWx0OiBBcnJheTxudW1iZXI+LCBkZWNvZGVkQ29kZXM6IEFycmF5PEJhcmNvZGVQb3NpdGlvbj4pOiBCYXJjb2RlSW5mbyB8IG51bGwge1xuICAgICAgICBsZXQgb3V0Q29kZTogQmFyY29kZUluZm8gfCBCYXJjb2RlUG9zaXRpb24gfCBudWxsID0geyAuLi5pbkNvZGUgfTtcbiAgICAgICAgbGV0IGNvZGVGcmVxdWVuY3kgPSAweDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgICAgIG91dENvZGUgPSB0aGlzLl9kZWNvZGVDb2RlKG91dENvZGUuZW5kKTtcbiAgICAgICAgICAgIGlmICghb3V0Q29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlID49IENPREVfR19TVEFSVCkge1xuICAgICAgICAgICAgICAgIChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlID0gKG91dENvZGUgYXMgQmFyY29kZUluZm8pLmNvZGUgLSBDT0RFX0dfU1RBUlQ7XG4gICAgICAgICAgICAgICAgY29kZUZyZXF1ZW5jeSB8PSAoMSA8PCAoNSAtIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChvdXRDb2RlIGFzIEJhcmNvZGVJbmZvKS5jb2RlKTtcbiAgICAgICAgICAgIGRlY29kZWRDb2Rlcy5wdXNoKG91dENvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZGV0ZXJtaW5lUGFyaXR5KGNvZGVGcmVxdWVuY3ksIHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRDb2RlIGFzIEJhcmNvZGVJbmZvO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RldGVybWluZVBhcml0eShjb2RlRnJlcXVlbmN5OiBudW1iZXIsIHJlc3VsdDogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICBmb3IgKGxldCBuclN5c3RlbSA9IDA7IG5yU3lzdGVtIDwgdGhpcy5DT0RFX0ZSRVFVRU5DWS5sZW5ndGg7IG5yU3lzdGVtKyspe1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkNPREVfRlJFUVVFTkNZW25yU3lzdGVtXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlRnJlcXVlbmN5ID09PSB0aGlzLkNPREVfRlJFUVVFTkNZW25yU3lzdGVtXVtpXSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdChuclN5c3RlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2NvbnZlcnRUb1VQQ0EocmVzdWx0OiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGxldCB1cGNhID0gW3Jlc3VsdFswXV07XG4gICAgICAgIGNvbnN0IGxhc3REaWdpdCA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMl07XG5cbiAgICAgICAgaWYgKGxhc3REaWdpdCA8PSAyKSB7XG4gICAgICAgICAgICB1cGNhID0gdXBjYS5jb25jYXQocmVzdWx0LnNsaWNlKDEsIDMpKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoW2xhc3REaWdpdCwgMCwgMCwgMCwgMF0pXG4gICAgICAgICAgICAgICAgLmNvbmNhdChyZXN1bHQuc2xpY2UoMywgNikpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMykge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA0KSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFswLCAwLCAwLCAwLCAwXSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHJlc3VsdC5zbGljZSg0LCA2KSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA0KSB7XG4gICAgICAgICAgICB1cGNhID0gdXBjYS5jb25jYXQocmVzdWx0LnNsaWNlKDEsIDUpKVxuICAgICAgICAgICAgICAgIC5jb25jYXQoWzAsIDAsIDAsIDAsIDAsIHJlc3VsdFs1XV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXBjYSA9IHVwY2EuY29uY2F0KHJlc3VsdC5zbGljZSgxLCA2KSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFswLCAwLCAwLCAwLCBsYXN0RGlnaXRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwY2EucHVzaChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgcmV0dXJuIHVwY2E7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBfY2hlY2tzdW0ocmVzdWx0OiBBcnJheTxudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdXBlci5fY2hlY2tzdW0odGhpcy5fY29udmVydFRvVVBDQShyZXN1bHQpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2ZpbmRFbmQob2Zmc2V0OiBudW1iZXIsIGlzV2hpdGU6IGJvb2xlYW4pOiBCYXJjb2RlUG9zaXRpb24gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLl9maW5kRW5kKG9mZnNldCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF92ZXJpZnlUcmFpbGluZ1doaXRlc3BhY2UoZW5kSW5mbzogQmFyY29kZVBvc2l0aW9uKTogQmFyY29kZVBvc2l0aW9uIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRyYWlsaW5nV2hpdGVzcGFjZUVuZCA9IGVuZEluZm8uZW5kICsgKChlbmRJbmZvLmVuZCAtIGVuZEluZm8uc3RhcnQpIC8gMik7XG4gICAgICAgIGlmICh0cmFpbGluZ1doaXRlc3BhY2VFbmQgPCB0aGlzLl9yb3cubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF0Y2hSYW5nZShlbmRJbmZvLmVuZCwgdHJhaWxpbmdXaGl0ZXNwYWNlRW5kLCAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRJbmZvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVQQ0VSZWFkZXI7XG4iLCJpbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4vZWFuX3JlYWRlcic7XG5pbXBvcnQgeyBCYXJjb2RlUG9zaXRpb24sIEJhcmNvZGUgfSBmcm9tICcuL2JhcmNvZGVfcmVhZGVyJztcblxuY2xhc3MgVVBDUmVhZGVyIGV4dGVuZHMgRUFOUmVhZGVyIHtcbiAgICBGT1JNQVQgPSAndXBjX2EnO1xuICAgIGRlY29kZShyb3c/OiBBcnJheTxudW1iZXI+LCBzdGFydD86IEJhcmNvZGVQb3NpdGlvbiB8IG51bWJlcik6IEJhcmNvZGUgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gRUFOUmVhZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jb2RlICYmIHJlc3VsdC5jb2RlLmxlbmd0aCA9PT0gMTMgJiYgcmVzdWx0LmNvZGUuY2hhckF0KDApID09PSAnMCcpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gcmVzdWx0LmNvZGUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVQQ1JlYWRlcjtcbiIsImNvbnN0IEJyZXNlbmhhbSA9IHt9O1xuXG5jb25zdCBTbG9wZSA9IHtcbiAgICBESVI6IHtcbiAgICAgICAgVVA6IDEsXG4gICAgICAgIERPV046IC0xLFxuICAgIH0sXG59O1xuLyoqXG4gKiBTY2FucyBhIGxpbmUgb2YgdGhlIGdpdmVuIGltYWdlIGZyb20gcG9pbnQgcDEgdG8gcDIgYW5kIHJldHVybnMgYSByZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmdcbiAqIGdyYXktc2NhbGUgdmFsdWVzICgwLTI1NSkgb2YgdGhlIHVuZGVybHlpbmcgcGl4ZWxzIGluIGFkZGl0aW9uIHRvIHRoZSBtaW5cbiAqIGFuZCBtYXggdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IGltYWdlV3JhcHBlclxuICogQHBhcmFtIHtPYmplY3R9IHAxIFRoZSBzdGFydCBwb2ludCB7eCx5fVxuICogQHBhcmFtIHtPYmplY3R9IHAyIFRoZSBlbmQgcG9pbnQge3gseX1cbiAqIEByZXR1cm5zIHtsaW5lLCBtaW4sIG1heH1cbiAqL1xuQnJlc2VuaGFtLmdldEJhcmNvZGVMaW5lID0gZnVuY3Rpb24gKGltYWdlV3JhcHBlciwgcDEsIHAyKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuICAgIGxldCB4MCA9IHAxLnggfCAwO1xuICAgIGxldCB5MCA9IHAxLnkgfCAwO1xuICAgIGxldCB4MSA9IHAyLnggfCAwO1xuICAgIGxldCB5MSA9IHAyLnkgfCAwO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgICBjb25zdCBzdGVlcCA9IE1hdGguYWJzKHkxIC0geTApID4gTWF0aC5hYnMoeDEgLSB4MCk7XG4gICAgbGV0IGVycm9yO1xuICAgIGxldCB5O1xuICAgIGxldCB0bXA7XG4gICAgbGV0IHg7XG4gICAgY29uc3QgbGluZSA9IFtdO1xuICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBsZXQgdmFsO1xuICAgIGxldCBtaW4gPSAyNTU7XG4gICAgbGV0IG1heCA9IDA7XG5cbiAgICBmdW5jdGlvbiByZWFkKGEsIGIpIHtcbiAgICAgICAgdmFsID0gaW1hZ2VEYXRhW2IgKiB3aWR0aCArIGFdO1xuICAgICAgICBtaW4gPSB2YWwgPCBtaW4gPyB2YWwgOiBtaW47XG4gICAgICAgIG1heCA9IHZhbCA+IG1heCA/IHZhbCA6IG1heDtcbiAgICAgICAgbGluZS5wdXNoKHZhbCk7XG4gICAgfVxuXG4gICAgaWYgKHN0ZWVwKSB7XG4gICAgICAgIHRtcCA9IHgwO1xuICAgICAgICB4MCA9IHkwO1xuICAgICAgICB5MCA9IHRtcDtcblxuICAgICAgICB0bXAgPSB4MTtcbiAgICAgICAgeDEgPSB5MTtcbiAgICAgICAgeTEgPSB0bXA7XG4gICAgfVxuICAgIGlmICh4MCA+IHgxKSB7XG4gICAgICAgIHRtcCA9IHgwO1xuICAgICAgICB4MCA9IHgxO1xuICAgICAgICB4MSA9IHRtcDtcblxuICAgICAgICB0bXAgPSB5MDtcbiAgICAgICAgeTAgPSB5MTtcbiAgICAgICAgeTEgPSB0bXA7XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhWCA9IHgxIC0geDA7XG4gICAgY29uc3QgZGVsdGFZID0gTWF0aC5hYnMoeTEgLSB5MCk7XG4gICAgZXJyb3IgPSAoZGVsdGFYIC8gMikgfCAwO1xuICAgIHkgPSB5MDtcbiAgICBjb25zdCB5U3RlcCA9IHkwIDwgeTEgPyAxIDogLTE7XG4gICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgIGlmIChzdGVlcCkge1xuICAgICAgICAgICAgcmVhZCh5LCB4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IgLT0gZGVsdGFZO1xuICAgICAgICBpZiAoZXJyb3IgPCAwKSB7XG4gICAgICAgICAgICB5ICs9IHlTdGVwO1xuICAgICAgICAgICAgZXJyb3IgKz0gZGVsdGFYO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZSxcbiAgICAgICAgbWluLFxuICAgICAgICBtYXgsXG4gICAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHJlc3VsdCBmcm9tIGdldEJhcmNvZGVMaW5lIGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb25cbiAqIGFsc28gY29uc2lkZXJpbmcgdGhlIGZyZXF1ZW5jeSBhbmQgc2xvcGUgb2YgdGhlIHNpZ25hbCBmb3IgbW9yZSByb2J1c3QgcmVzdWx0c1xuICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCB7bGluZSwgbWluLCBtYXh9XG4gKi9cbkJyZXNlbmhhbS50b0JpbmFyeUxpbmUgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgY29uc3QgeyBtaW4gfSA9IHJlc3VsdDtcbiAgICBjb25zdCB7IG1heCB9ID0gcmVzdWx0O1xuICAgIGNvbnN0IHsgbGluZSB9ID0gcmVzdWx0O1xuICAgIGxldCBzbG9wZTtcbiAgICBsZXQgc2xvcGUyO1xuICAgIGNvbnN0IGNlbnRlciA9IG1pbiArIChtYXggLSBtaW4pIC8gMjtcbiAgICBjb25zdCBleHRyZW1hID0gW107XG4gICAgbGV0IGN1cnJlbnREaXI7XG4gICAgbGV0IGRpcjtcbiAgICBsZXQgdGhyZXNob2xkID0gKG1heCAtIG1pbikgLyAxMjtcbiAgICBjb25zdCByVGhyZXNob2xkID0gLXRocmVzaG9sZDtcbiAgICBsZXQgaTtcbiAgICBsZXQgajtcblxuICAgIC8vIDEuIGZpbmQgZXh0cmVtYVxuICAgIGN1cnJlbnREaXIgPSBsaW5lWzBdID4gY2VudGVyID8gU2xvcGUuRElSLlVQIDogU2xvcGUuRElSLkRPV047XG4gICAgZXh0cmVtYS5wdXNoKHtcbiAgICAgICAgcG9zOiAwLFxuICAgICAgICB2YWw6IGxpbmVbMF0sXG4gICAgfSk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgIHNsb3BlID0gKGxpbmVbaSArIDFdIC0gbGluZVtpXSk7XG4gICAgICAgIHNsb3BlMiA9IChsaW5lW2kgKyAyXSAtIGxpbmVbaSArIDFdKTtcbiAgICAgICAgaWYgKChzbG9wZSArIHNsb3BlMikgPCByVGhyZXNob2xkICYmIGxpbmVbaSArIDFdIDwgKGNlbnRlciAqIDEuNSkpIHtcbiAgICAgICAgICAgIGRpciA9IFNsb3BlLkRJUi5ET1dOO1xuICAgICAgICB9IGVsc2UgaWYgKChzbG9wZSArIHNsb3BlMikgPiB0aHJlc2hvbGQgJiYgbGluZVtpICsgMV0gPiAoY2VudGVyICogMC41KSkge1xuICAgICAgICAgICAgZGlyID0gU2xvcGUuRElSLlVQO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlyID0gY3VycmVudERpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50RGlyICE9PSBkaXIpIHtcbiAgICAgICAgICAgIGV4dHJlbWEucHVzaCh7XG4gICAgICAgICAgICAgICAgcG9zOiBpLFxuICAgICAgICAgICAgICAgIHZhbDogbGluZVtpXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3VycmVudERpciA9IGRpcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBleHRyZW1hLnB1c2goe1xuICAgICAgICBwb3M6IGxpbmUubGVuZ3RoLFxuICAgICAgICB2YWw6IGxpbmVbbGluZS5sZW5ndGggLSAxXSxcbiAgICB9KTtcblxuICAgIGZvciAoaiA9IGV4dHJlbWFbMF0ucG9zOyBqIDwgZXh0cmVtYVsxXS5wb3M7IGorKykge1xuICAgICAgICBsaW5lW2pdID0gbGluZVtqXSA+IGNlbnRlciA/IDAgOiAxO1xuICAgIH1cblxuICAgIC8vIGl0ZXJhdGUgb3ZlciBleHRyZW1hIGFuZCBjb252ZXJ0IHRvIGJpbmFyeSBiYXNlZCBvbiBhdmcgYmV0d2VlbiBtaW5tYXhcbiAgICBmb3IgKGkgPSAxOyBpIDwgZXh0cmVtYS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKGV4dHJlbWFbaSArIDFdLnZhbCA+IGV4dHJlbWFbaV0udmFsKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGQgPSAoZXh0cmVtYVtpXS52YWwgKyAoKGV4dHJlbWFbaSArIDFdLnZhbCAtIGV4dHJlbWFbaV0udmFsKSAvIDMpICogMikgfCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyZXNob2xkID0gKGV4dHJlbWFbaSArIDFdLnZhbCArICgoZXh0cmVtYVtpXS52YWwgLSBleHRyZW1hW2kgKyAxXS52YWwpIC8gMykpIHwgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IGV4dHJlbWFbaV0ucG9zOyBqIDwgZXh0cmVtYVtpICsgMV0ucG9zOyBqKyspIHtcbiAgICAgICAgICAgIGxpbmVbal0gPSBsaW5lW2pdID4gdGhyZXNob2xkID8gMCA6IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsaW5lLFxuICAgICAgICB0aHJlc2hvbGQsXG4gICAgfTtcbn07XG5cbi8qKlxuICogVXNlZCBmb3IgZGV2ZWxvcG1lbnQgb25seVxuICovXG5CcmVzZW5oYW0uZGVidWcgPSB7XG4gICAgcHJpbnRGcmVxdWVuY3kobGluZSwgY2FudmFzKSB7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IDI1NjtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdibHVlJztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8oaSwgMjU1KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oaSwgMjU1IC0gbGluZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgfSxcblxuICAgIHByaW50UGF0dGVybihsaW5lLCBjYW52YXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7IGxldFxuICAgICAgICAgICAgaTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgY2FudmFzLndpZHRoID0gbGluZS5sZW5ndGg7XG4gICAgICAgIGN0eC5maWxsQ29sb3IgPSAnYmxhY2snO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpbmVbaV0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoaSwgMCwgMSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBCcmVzZW5oYW07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tY3ljbGUgKi9cblxuaW1wb3J0IEltYWdlRGVidWcgZnJvbSAnLi4vY29tbW9uL2ltYWdlX2RlYnVnJztcbmltcG9ydCBUd29PZkZpdmVSZWFkZXIgZnJvbSAnLi4vcmVhZGVyLzJvZjVfcmVhZGVyJztcbmltcG9ydCBDb2RhYmFyUmVhZGVyIGZyb20gJy4uL3JlYWRlci9jb2RhYmFyX3JlYWRlcic7XG5pbXBvcnQgQ29kZTEyOFJlYWRlciBmcm9tICcuLi9yZWFkZXIvY29kZV8xMjhfcmVhZGVyJztcbmltcG9ydCBDb2RlMzJSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfMzJfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfMzlfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlWSU5SZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2NvZGVfMzlfdmluX3JlYWRlcic7XG5pbXBvcnQgQ29kZTkzUmVhZGVyIGZyb20gJy4uL3JlYWRlci9jb2RlXzkzX3JlYWRlcic7XG5pbXBvcnQgRUFOMlJlYWRlciBmcm9tICcuLi9yZWFkZXIvZWFuXzJfcmVhZGVyJztcbmltcG9ydCBFQU41UmVhZGVyIGZyb20gJy4uL3JlYWRlci9lYW5fNV9yZWFkZXInO1xuaW1wb3J0IEVBTjhSZWFkZXIgZnJvbSAnLi4vcmVhZGVyL2Vhbl84X3JlYWRlcic7XG5pbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4uL3JlYWRlci9lYW5fcmVhZGVyJztcbmltcG9ydCBJMm9mNVJlYWRlciBmcm9tICcuLi9yZWFkZXIvaTJvZjVfcmVhZGVyJztcbmltcG9ydCBVUENFUmVhZGVyIGZyb20gJy4uL3JlYWRlci91cGNfZV9yZWFkZXInO1xuaW1wb3J0IFVQQ1JlYWRlciBmcm9tICcuLi9yZWFkZXIvdXBjX3JlYWRlcic7XG5pbXBvcnQgQnJlc2VuaGFtIGZyb20gJy4vYnJlc2VuaGFtJztcblxuY29uc3QgUkVBREVSUyA9IHtcbiAgICBjb2RlXzEyOF9yZWFkZXI6IENvZGUxMjhSZWFkZXIsXG4gICAgZWFuX3JlYWRlcjogRUFOUmVhZGVyLFxuICAgIGVhbl81X3JlYWRlcjogRUFONVJlYWRlcixcbiAgICBlYW5fMl9yZWFkZXI6IEVBTjJSZWFkZXIsXG4gICAgZWFuXzhfcmVhZGVyOiBFQU44UmVhZGVyLFxuICAgIGNvZGVfMzlfcmVhZGVyOiBDb2RlMzlSZWFkZXIsXG4gICAgY29kZV8zOV92aW5fcmVhZGVyOiBDb2RlMzlWSU5SZWFkZXIsXG4gICAgY29kYWJhcl9yZWFkZXI6IENvZGFiYXJSZWFkZXIsXG4gICAgdXBjX3JlYWRlcjogVVBDUmVhZGVyLFxuICAgIHVwY19lX3JlYWRlcjogVVBDRVJlYWRlcixcbiAgICBpMm9mNV9yZWFkZXI6IEkyb2Y1UmVhZGVyLFxuICAgICcyb2Y1X3JlYWRlcic6IFR3b09mRml2ZVJlYWRlcixcbiAgICBjb2RlXzkzX3JlYWRlcjogQ29kZTkzUmVhZGVyLFxuICAgIGNvZGVfMzJfcmVhZGVyOiBDb2RlMzJSZWFkZXIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgcmVnaXN0ZXJSZWFkZXI6IChuYW1lLCByZWFkZXIpID0+IHtcbiAgICAgICAgUkVBREVSU1tuYW1lXSA9IHJlYWRlcjtcbiAgICB9LFxuICAgIGNyZWF0ZShjb25maWcsIGlucHV0SW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgIGNvbnN0IF9jYW52YXMgPSB7XG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBmcmVxdWVuY3k6IG51bGwsXG4gICAgICAgICAgICAgICAgcGF0dGVybjogbnVsbCxcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvbToge1xuICAgICAgICAgICAgICAgIGZyZXF1ZW5jeTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuOiBudWxsLFxuICAgICAgICAgICAgICAgIG92ZXJsYXk6IG51bGwsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBfYmFyY29kZVJlYWRlcnMgPSBbXTtcblxuICAgICAgICBpbml0Q2FudmFzKCk7XG4gICAgICAgIGluaXRSZWFkZXJzKCk7XG4gICAgICAgIGluaXRDb25maWcoKTtcblxuICAgICAgICBmdW5jdGlvbiBpbml0Q2FudmFzKCkge1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgJGRlYnVnID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RlYnVnLmRldGVjdGlvbicpO1xuICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLmZyZXF1ZW5jeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5mcmVxdWVuY3knKTtcbiAgICAgICAgICAgICAgICBpZiAoIV9jYW52YXMuZG9tLmZyZXF1ZW5jeSkge1xuICAgICAgICAgICAgICAgICAgICBfY2FudmFzLmRvbS5mcmVxdWVuY3kgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5kb20uZnJlcXVlbmN5LmNsYXNzTmFtZSA9ICdmcmVxdWVuY3knO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZGVidWcuYXBwZW5kQ2hpbGQoX2NhbnZhcy5kb20uZnJlcXVlbmN5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIGNvbmZpZy5kZWJ1Zz8ucHJpbnRSZWFkZXJJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBiYXJjb2RlIGRlY29kZXIgaW5pdENhbnZhcyBnZXRjb250ZXh0IDJkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9jYW52YXMuY3R4LmZyZXF1ZW5jeSA9IF9jYW52YXMuZG9tLmZyZXF1ZW5jeS5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ucGF0dGVybiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5wYXR0ZXJuQnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2FudmFzLmRvbS5wYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jYW52YXMuZG9tLnBhdHRlcm4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ucGF0dGVybi5jbGFzc05hbWUgPSAncGF0dGVybkJ1ZmZlcic7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Zy5hcHBlbmRDaGlsZChfY2FudmFzLmRvbS5wYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfY2FudmFzLmN0eC5wYXR0ZXJuID0gX2NhbnZhcy5kb20ucGF0dGVybi5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgICAgICAgICAgX2NhbnZhcy5kb20ub3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcy5kcmF3aW5nQnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKF9jYW52YXMuZG9tLm92ZXJsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NhbnZhcy5jdHgub3ZlcmxheSA9IF9jYW52YXMuZG9tLm92ZXJsYXkuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbml0UmVhZGVycygpIHtcbiAgICAgICAgICAgIGNvbmZpZy5yZWFkZXJzLmZvckVhY2goKHJlYWRlckNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZWFkZXI7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICAgICAgICAgICAgICBsZXQgc3VwcGxlbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhZGVyQ29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSByZWFkZXJDb25maWcuZm9ybWF0O1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gcmVhZGVyQ29uZmlnLmNvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWFkZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IHJlYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWc/LnByaW50UmVhZGVySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQmVmb3JlIHJlZ2lzdGVyaW5nIHJlYWRlcjogJywgcmVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uc3VwcGxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwcGxlbWVudHMgPSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3VwcGxlbWVudHMubWFwKChzdXBwbGVtZW50KSA9PiBuZXcgUkVBREVSU1tzdXBwbGVtZW50XSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZGVyT2JqID0gbmV3IFJFQURFUlNbcmVhZGVyXShjb25maWd1cmF0aW9uLCBzdXBwbGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIF9iYXJjb2RlUmVhZGVycy5wdXNoKHJlYWRlck9iaik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJyogRXJyb3IgY29uc3RydWN0aW5nIHJlYWRlciAnLCByZWFkZXIsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnLmRlYnVnPy5wcmludFJlYWRlckluZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVnaXN0ZXJlZCBSZWFkZXJzOiAke19iYXJjb2RlUmVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChyZWFkZXIpID0+IEpTT04uc3RyaW5naWZ5KHsgZm9ybWF0OiByZWFkZXIuRk9STUFULCBjb25maWc6IHJlYWRlci5jb25maWcgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdENvbmZpZygpIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpcyA9IFt7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IF9jYW52YXMuZG9tLmZyZXF1ZW5jeSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogY29uZmlnLmRlYnVnLnNob3dGcmVxdWVuY3ksXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBfY2FudmFzLmRvbS5wYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiBjb25maWcuZGVidWcuc2hvd1BhdHRlcm4sXG4gICAgICAgICAgICAgICAgfV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aXNbaV0ucHJvcCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzW2ldLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNbaV0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGV4dGVuZCB0aGUgbGluZSBvbiBib3RoIGVuZHNcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gbGluZVxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldEV4dGVuZGVkTGluZShsaW5lLCBhbmdsZSwgZXh0KSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBleHRlbmRMaW5lKGFtb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeTogYW1vdW50ICogTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgICAgICAgICB4OiBhbW91bnQgKiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgICAgIGxpbmVbMF0ueSAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLng7XG4gICAgICAgICAgICAgICAgbGluZVsxXS55ICs9IGV4dGVuc2lvbi55O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueCArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGluc2lkZSBpbWFnZVxuICAgICAgICAgICAgZXh0ZW5kTGluZShleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGV4dCA+IDEgJiYgKCFpbnB1dEltYWdlV3JhcHBlci5pbkltYWdlV2l0aEJvcmRlcihsaW5lWzBdKVxuICAgICAgICAgICAgICAgICAgICB8fCAhaW5wdXRJbWFnZVdyYXBwZXIuaW5JbWFnZVdpdGhCb3JkZXIobGluZVsxXSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgZXh0IC09IE1hdGguY2VpbChleHQgLyAyKTtcbiAgICAgICAgICAgICAgICBleHRlbmRMaW5lKC1leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBnZXRMaW5lKGJveCkge1xuICAgICAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgICAgICAgeDogKGJveFsxXVswXSAtIGJveFswXVswXSkgLyAyICsgYm94WzBdWzBdLFxuICAgICAgICAgICAgICAgIHk6IChib3hbMV1bMV0gLSBib3hbMF1bMV0pIC8gMiArIGJveFswXVsxXSxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB4OiAoYm94WzNdWzBdIC0gYm94WzJdWzBdKSAvIDIgKyBib3hbMl1bMF0sXG4gICAgICAgICAgICAgICAgeTogKGJveFszXVsxXSAtIGJveFsyXVsxXSkgLyAyICsgYm94WzJdWzFdLFxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0cnlEZWNvZGUobGluZSkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaTtcbiAgICAgICAgICAgIGNvbnN0IGJhcmNvZGVMaW5lID0gQnJlc2VuaGFtLmdldEJhcmNvZGVMaW5lKGlucHV0SW1hZ2VXcmFwcGVyLCBsaW5lWzBdLCBsaW5lWzFdKTtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWcuc2hvd0ZyZXF1ZW5jeSkge1xuICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgobGluZSwgeyB4OiAneCcsIHk6ICd5JyB9LCBfY2FudmFzLmN0eC5vdmVybGF5LCB7IGNvbG9yOiAncmVkJywgbGluZVdpZHRoOiAzIH0pO1xuICAgICAgICAgICAgICAgIEJyZXNlbmhhbS5kZWJ1Zy5wcmludEZyZXF1ZW5jeShiYXJjb2RlTGluZS5saW5lLCBfY2FudmFzLmRvbS5mcmVxdWVuY3kpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBCcmVzZW5oYW0udG9CaW5hcnlMaW5lKGJhcmNvZGVMaW5lKTtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWcuc2hvd1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBCcmVzZW5oYW0uZGVidWcucHJpbnRQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUsIF9jYW52YXMuZG9tLnBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgX2JhcmNvZGVSZWFkZXJzLmxlbmd0aCAmJiByZXN1bHQgPT09IG51bGw7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9iYXJjb2RlUmVhZGVyc1tpXS5kZWNvZGVQYXR0ZXJuKGJhcmNvZGVMaW5lLmxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2RlUmVzdWx0OiByZXN1bHQsXG4gICAgICAgICAgICAgICAgYmFyY29kZUxpbmUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHNsaWNlcyB0aGUgZ2l2ZW4gYXJlYSBhcGFydCBhbmQgdHJpZXMgdG8gZGV0ZWN0IGEgYmFyY29kZS1wYXR0ZXJuXG4gICAgICAgICAqIGZvciBlYWNoIHNsaWNlLiBJdCByZXR1cm5zIHRoZSBkZWNvZGVkIGJhcmNvZGUsIG9yIG51bGwgaWYgbm90aGluZyB3YXMgZm91bmRcbiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYm94XG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbmVcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGxpbmVBbmdsZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gdHJ5RGVjb2RlQnJ1dGVGb3JjZShib3gsIGxpbmUsIGxpbmVBbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2lkZUxlbmd0aCA9IE1hdGguc3FydChNYXRoLnBvdyhib3hbMV1bMF0gLSBib3hbMF1bMF0sIDIpICsgTWF0aC5wb3coKGJveFsxXVsxXSAtIGJveFswXVsxXSksIDIpKTtcbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgY29uc3Qgc2xpY2VzID0gMTY7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBkaXI7XG4gICAgICAgICAgICBsZXQgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgY29uc3QgeGRpciA9IE1hdGguc2luKGxpbmVBbmdsZSk7XG4gICAgICAgICAgICBjb25zdCB5ZGlyID0gTWF0aC5jb3MobGluZUFuZ2xlKTtcblxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHNsaWNlcyAmJiByZXN1bHQgPT09IG51bGw7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIG1vdmUgbGluZSBwZXJwZW5kaWN1bGFyIHRvIGFuZ2xlXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1peGVkLW9wZXJhdG9yc1xuICAgICAgICAgICAgICAgIGRpciA9IHNpZGVMZW5ndGggLyBzbGljZXMgKiBpICogKGkgJSAyID09PSAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICBleHRlbnNpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHk6IGRpciAqIHhkaXIsXG4gICAgICAgICAgICAgICAgICAgIHg6IGRpciAqIHlkaXIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgICAgICAgICAgIGxpbmVbMF0ueSArPSBleHRlbnNpb24ueDtcbiAgICAgICAgICAgICAgICBsaW5lWzBdLnggLT0gZXh0ZW5zaW9uLnk7XG4gICAgICAgICAgICAgICAgbGluZVsxXS55ICs9IGV4dGVuc2lvbi54O1xuICAgICAgICAgICAgICAgIGxpbmVbMV0ueCAtPSBleHRlbnNpb24ueTtcbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG5cbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGUobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KFxuICAgICAgICAgICAgICAgIE1hdGgucG93KE1hdGguYWJzKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSksIDIpXG4gICAgICAgICAgICAgICAgKyBNYXRoLnBvdyhNYXRoLmFicyhsaW5lWzFdLnggLSBsaW5lWzBdLngpLCAyKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBkZWNvZGVGcm9tSW1hZ2UoaW1hZ2VXcmFwcGVyKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIF9iYXJjb2RlUmVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZGVjb2RlSW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLmRlY29kZUltYWdlKGltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2l0aCB0aGUgaGVscCBvZiB0aGUgY29uZmlndXJlZCByZWFkZXJzIChDb2RlMTI4IG9yIEVBTikgdGhpcyBmdW5jdGlvbiB0cmllcyB0byBkZXRlY3QgYVxuICAgICAgICAgKiB2YWxpZCBiYXJjb2RlIHBhdHRlcm4gd2l0aGluIHRoZSBnaXZlbiBhcmVhLlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYm94IFRoZSBhcmVhIHRvIHNlYXJjaCBpblxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgcmVzdWx0IHtjb2RlUmVzdWx0LCBsaW5lLCBhbmdsZSwgcGF0dGVybiwgdGhyZXNob2xkfVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb2RlRnJvbUJvdW5kaW5nQm94KGJveCkge1xuICAgICAgICAgICAgbGV0IGxpbmU7XG4gICAgICAgICAgICBjb25zdCBjdHggPSBfY2FudmFzLmN0eC5vdmVybGF5O1xuICAgICAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuZGVidWcuZHJhd0JvdW5kaW5nQm94ICYmIGN0eCkge1xuICAgICAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdQYXRoKGJveCwgeyB4OiAwLCB5OiAxIH0sIGN0eCwgeyBjb2xvcjogJ2JsdWUnLCBsaW5lV2lkdGg6IDIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lID0gZ2V0TGluZShib3gpO1xuICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IGdldExpbmVMZW5ndGgobGluZSk7XG4gICAgICAgICAgICBjb25zdCBsaW5lQW5nbGUgPSBNYXRoLmF0YW4yKGxpbmVbMV0ueSAtIGxpbmVbMF0ueSwgbGluZVsxXS54IC0gbGluZVswXS54KTtcbiAgICAgICAgICAgIGxpbmUgPSBnZXRFeHRlbmRlZExpbmUobGluZSwgbGluZUFuZ2xlLCBNYXRoLmZsb29yKGxpbmVMZW5ndGggKiAwLjEpKTtcbiAgICAgICAgICAgIGlmIChsaW5lID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IHRyeURlY29kZShsaW5lKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnlEZWNvZGVCcnV0ZUZvcmNlKGJveCwgbGluZSwgbGluZUFuZ2xlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIHJlc3VsdCAmJiBjb25maWcuZGVidWcuZHJhd1NjYW5saW5lICYmIGN0eCkge1xuICAgICAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgobGluZSwgeyB4OiAneCcsIHk6ICd5JyB9LCBjdHgsIHsgY29sb3I6ICdyZWQnLCBsaW5lV2lkdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZVJlc3VsdDogcmVzdWx0LmNvZGVSZXN1bHQsXG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBhbmdsZTogbGluZUFuZ2xlLFxuICAgICAgICAgICAgICAgIHBhdHRlcm46IHJlc3VsdC5iYXJjb2RlTGluZS5saW5lLFxuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogcmVzdWx0LmJhcmNvZGVMaW5lLnRocmVzaG9sZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjb2RlRnJvbUJvdW5kaW5nQm94KGJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWNvZGVGcm9tQm91bmRpbmdCb3hlcyhib3hlcykge1xuICAgICAgICAgICAgICAgIGxldCBpOyBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhcmNvZGVzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtdWx0aXBsZSB9ID0gY29uZmlnO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJveCA9IGJveGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWNvZGVGcm9tQm91bmRpbmdCb3goYm94KSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJveCA9IGJveDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhcmNvZGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuY29kZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJhcmNvZGVzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgZGVjb2RlRnJvbUltYWdlKGltYWdlV3JhcHBlckluKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVjb2RlRnJvbUltYWdlKGltYWdlV3JhcHBlckluKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZ2lzdGVyUmVhZGVyKG5hbWUsIHJlYWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChSRUFERVJTW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHJlZ2lzdGVyIGV4aXN0aW5nIHJlYWRlcicsIG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBSRUFERVJTW25hbWVdID0gcmVhZGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldFJlYWRlcnMocmVhZGVycykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGNvbmZpZy5yZWFkZXJzID0gcmVhZGVycztcbiAgICAgICAgICAgICAgICBfYmFyY29kZVJlYWRlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBpbml0UmVhZGVycygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufTtcbiIsImltcG9ydCBCYXJjb2RlUmVhZGVyIGZyb20gJy4vYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IFR3b09mRml2ZVJlYWRlciBmcm9tICcuLzJvZjVfcmVhZGVyJztcbmltcG9ydCBOZXdDb2RhYmFyUmVhZGVyIGZyb20gJy4vY29kYWJhcl9yZWFkZXInO1xuaW1wb3J0IENvZGUxMjhSZWFkZXIgZnJvbSAnLi9jb2RlXzEyOF9yZWFkZXInO1xuaW1wb3J0IENvZGUzMlJlYWRlciBmcm9tICcuL2NvZGVfMzJfcmVhZGVyJztcbmltcG9ydCBDb2RlMzlSZWFkZXIgZnJvbSAnLi9jb2RlXzM5X3JlYWRlcic7XG5pbXBvcnQgQ29kZTM5VklOUmVhZGVyIGZyb20gJy4vY29kZV8zOV92aW5fcmVhZGVyJztcbmltcG9ydCBDb2RlOTNSZWFkZXIgZnJvbSAnLi9jb2RlXzkzX3JlYWRlcic7XG5pbXBvcnQgRUFOMlJlYWRlciBmcm9tICcuL2Vhbl8yX3JlYWRlcic7XG5pbXBvcnQgRUFONVJlYWRlciBmcm9tICcuL2Vhbl81X3JlYWRlcic7XG5pbXBvcnQgRUFOOFJlYWRlciBmcm9tICcuL2Vhbl84X3JlYWRlcic7XG5pbXBvcnQgRUFOUmVhZGVyIGZyb20gJy4vZWFuX3JlYWRlcic7XG5pbXBvcnQgSTJvZjVSZWFkZXIgZnJvbSAnLi9pMm9mNV9yZWFkZXInO1xuaW1wb3J0IFVQQ0VSZWFkZXIgZnJvbSAnLi91cGNfZV9yZWFkZXInO1xuaW1wb3J0IFVQQ1JlYWRlciBmcm9tICcuL3VwY19yZWFkZXInO1xuXG5leHBvcnQge1xuICAgIEJhcmNvZGVSZWFkZXIsXG4gICAgVHdvT2ZGaXZlUmVhZGVyLFxuICAgIE5ld0NvZGFiYXJSZWFkZXIsXG4gICAgQ29kZTEyOFJlYWRlcixcbiAgICBDb2RlMzJSZWFkZXIsXG4gICAgQ29kZTM5UmVhZGVyLFxuICAgIENvZGUzOVZJTlJlYWRlcixcbiAgICBDb2RlOTNSZWFkZXIsXG4gICAgRUFOMlJlYWRlcixcbiAgICBFQU41UmVhZGVyLFxuICAgIEVBTjhSZWFkZXIsXG4gICAgRUFOUmVhZGVyLFxuICAgIEkyb2Y1UmVhZGVyLFxuICAgIFVQQ0VSZWFkZXIsXG4gICAgVVBDUmVhZGVyLCAgICBcbn1cbiIsInR5cGUgRXZlbnROYW1lID0gc3RyaW5nO1xuXG5pbnRlcmZhY2UgU3Vic2NyaXB0aW9uIHtcbiAgICBhc3luYz86IGJvb2xlYW47XG4gICAgY2FsbGJhY2s6IEZ1bmN0aW9uO1xuICAgIG9uY2U/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRXZlbnREYXRhIHtcbiAgICBzdWJzY3JpYmVyczogQXJyYXk8U3Vic2NyaXB0aW9uPjtcbn1cblxuaW50ZXJmYWNlIEV2ZW50cyB7XG4gICAgW2tleTogc3RyaW5nXTogRXZlbnREYXRhO1xufVxuXG5pbnRlcmZhY2UgRXZlbnRJbnRlcmZhY2Uge1xuICAgIHN1YnNjcmliZShldmVudDogRXZlbnROYW1lLCBjYWxsYmFjazogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24sIGFzeW5jPzogYm9vbGVhbik6IHZvaWQ7XG4gICAgcHVibGlzaChldmVudE5hbWU6IEV2ZW50TmFtZSwgZGF0YT86IG5ldmVyKTogdm9pZDtcbiAgICBvbmNlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZDtcbiAgICB1bnN1YnNjcmliZShldmVudE5hbWU/OiBFdmVudE5hbWUsIGNhbGxiYWNrPzogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24pOiB2b2lkO1xufVxuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gRXZlbnRJbnRlcmZhY2UoKTogRXZlbnRJbnRlcmZhY2Uge1xuICAgIGxldCBldmVudHM6IEV2ZW50cyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZ2V0RXZlbnQoZXZlbnROYW1lOiBFdmVudE5hbWUpOiBFdmVudERhdGEge1xuICAgICAgICBpZiAoIWV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICBldmVudHNbZXZlbnROYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudHNbZXZlbnROYW1lXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRzID0ge307XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiwgZGF0YTogbmV2ZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5hc3luYykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfSwgNCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfc3Vic2NyaWJlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiB8IFN1YnNjcmlwdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGFzeW5jLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxiYWNrIHdhcyBub3Qgc3BlY2lmaWVkIG9uIG9wdGlvbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdldEV2ZW50KGV2ZW50KS5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3Vic2NyaWJlKGV2ZW50OiBFdmVudE5hbWUsIGNhbGxiYWNrOiBGdW5jdGlvbiB8IFN1YnNjcmlwdGlvbiwgYXN5bmM/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgICAgICByZXR1cm4gX3N1YnNjcmliZShldmVudCwgY2FsbGJhY2ssIGFzeW5jKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGlzaChldmVudE5hbWU6IEV2ZW50TmFtZSwgZGF0YT86IG5ldmVyKTogdm9pZCB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCB7IHN1YnNjcmliZXJzIH0gPSBldmVudDtcblxuICAgICAgICAgICAgLy8gUHVibGlzaCBvbmUtdGltZSBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICBzdWJzY3JpYmVycy5maWx0ZXIoKHN1YnNjcmliZXIpID0+ICEhc3Vic2NyaWJlci5vbmNlKS5mb3JFYWNoKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcHVibGlzaFN1YnNjcmlwdGlvbihzdWJzY3JpYmVyLCBkYXRhIGFzIG5ldmVyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlbSBmcm9tIHRoZSBzdWJzY3JpYmVyXG4gICAgICAgICAgICBldmVudC5zdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzLmZpbHRlcigoc3Vic2NyaWJlcikgPT4gIXN1YnNjcmliZXIub25jZSk7XG5cbiAgICAgICAgICAgIC8vIHB1Ymxpc2ggdGhlIHJlc3RcbiAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoU3Vic2NyaXB0aW9uKHN1YnNjcmliZXIsIGRhdGEgYXMgbmV2ZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uY2UoZXZlbnQ6IEV2ZW50TmFtZSwgY2FsbGJhY2s6IEZ1bmN0aW9uLCBhc3luYyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgICAgICBfc3Vic2NyaWJlKGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgYXN5bmMsXG4gICAgICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB1bnN1YnNjcmliZShldmVudE5hbWU/OiBFdmVudE5hbWUsIGNhbGxiYWNrPzogRnVuY3Rpb24gfCBTdWJzY3JpcHRpb24pOiB2b2lkIHtcbiAgICAgICAgICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGdldEV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN1YnNjcmliZXJzID0gZXZlbnQuc3Vic2NyaWJlcnMuZmlsdGVyKChzdWJzY3JpYmVyKSA9PiBzdWJzY3JpYmVyLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3Vic2NyaWJlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsZWFyRXZlbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn0oKSk7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgY29kZT86IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG06IHN0cmluZywgY29kZT86IG51bWJlcikge1xuICAgICAgICBzdXBlcihtKTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICAgIH1cbn1cbiIsImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vcXVhZ2dhL0V4Y2VwdGlvbic7XG5cbmNvbnN0IEVSUk9SX0RFU0MgPSAnVGhpcyBtYXkgbWVhbiB0aGF0IHRoZSB1c2VyIGhhcyBkZWNsaW5lZCBjYW1lcmEgYWNjZXNzLCBvciB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IG1lZGlhIEFQSXMuIElmIHlvdSBhcmUgcnVubmluZyBpbiBpT1MsIHlvdSBtdXN0IHVzZSBTYWZhcmkuJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZURldmljZXMoKTogUHJvbWlzZTxBcnJheTxNZWRpYURldmljZUluZm8+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgRXhjZXB0aW9uKGBlbnVtZXJhdGVEZXZpY2VzIGlzIG5vdCBkZWZpbmVkLiAke0VSUk9SX0RFU0N9YCwgLTEpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJNZWRpYShjb25zdHJhaW50czogTWVkaWFTdHJlYW1Db25zdHJhaW50cyk6IFByb21pc2U8TWVkaWFTdHJlYW0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoY29uc3RyYWludHMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgRXhjZXB0aW9uKGBnZXRVc2VyTWVkaWEgaXMgbm90IGRlZmluZWQuICR7RVJST1JfREVTQ31gLCAtMSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxufVxuIiwiLy8gVE9ETzogd2hlbiB0aGlzIGZpbGUgd2FzIHdyaXR0ZW4geWVhcnMgYWdvLCBIVE1MTWVkaWFFbGVtZW50LnBsYXkoKSBkaWQgbm90IHJldHVybiBhIHVzZWZ1bCB2YWx1ZVxuLy8gdG8gbGV0IHVzIGtub3cgd2hlbiB0aGUgdmlkZW8gc3RhcnRlZCBwbGF5aW5nLiAgTm93LCBpdCBkb2VzLiAgU28sIHdlIHNob3VsZG4ndCBuZWVkIHRvIHJ1biB0aGlzXG4vLyBvZGQgd2FpdEZvclZpZGVvKCkgZnVuY3Rpb24gdGhhdCBwb2xscyB0byBzZWUgaWYgdGhlIHZpZGVvIGhhcyBzdGFydGVkLlxuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoL3BpY2snO1xuaW1wb3J0IHsgZ2V0VXNlck1lZGlhLCBlbnVtZXJhdGVEZXZpY2VzIH0gZnJvbSAnLi4vY29tbW9uL21lZGlhRGV2aWNlcyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4uL3F1YWdnYS9FeGNlcHRpb24nO1xuaW1wb3J0IHR5cGUge1xuICAgIE1lZGlhVHJhY2tDb25zdHJhaW50c1dpdGhEZXByZWNhdGVkLFxuICAgIFF1YWdnYUpTQ2FtZXJhQWNjZXNzIGFzIENhbWVyYUFjY2Vzc1R5cGUsXG59IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG5sZXQgc3RyZWFtUmVmOiBNZWRpYVN0cmVhbSB8IG51bGw7XG5cbmZ1bmN0aW9uIHdhaXRGb3JWaWRlbyh2aWRlbzogSFRNTFZpZGVvRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDEwO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVmlkZW8oKTogdm9pZCB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZGVvLnZpZGVvV2lkdGggPiAxMCAmJiB2aWRlby52aWRlb0hlaWdodCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAqIGRldjogY2hlY2tWaWRlbyBmb3VuZCAke3ZpZGVvLnZpZGVvV2lkdGh9cHggeCAke3ZpZGVvLnZpZGVvSGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGNoZWNrVmlkZW8sIDUwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEV4Y2VwdGlvbignVW5hYmxlIHRvIHBsYXkgdmlkZW8gc3RyZWFtLiBJcyB3ZWJjYW0gd29ya2luZz8nLCAtMSkpOyAvLyBUT0RPOiBhZGQgZXJyb3IgY29kZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0ZW1wdHMtLTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja1ZpZGVvKCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogVHJpZXMgdG8gYXR0YWNoIHRoZSBjYW1lcmEtc3RyZWFtIHRvIGEgZ2l2ZW4gdmlkZW8tZWxlbWVudFxuICogYW5kIGNhbGxzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIHRoZSBjb250ZW50IGlzIHJlYWR5XG4gKiBAcGFyYW0ge09iamVjdH0gY29uc3RyYWludHNcbiAqIEBwYXJhbSB7T2JqZWN0fSB2aWRlb1xuICovXG5hc3luYyBmdW5jdGlvbiBpbml0Q2FtZXJhKHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCwgY29uc3RyYWludHM6IE1lZGlhU3RyZWFtQ29uc3RyYWludHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBnZXRVc2VyTWVkaWEoY29uc3RyYWludHMpO1xuICAgIHN0cmVhbVJlZiA9IHN0cmVhbTtcbiAgICBpZiAodmlkZW8pIHtcbiAgICAgICAgdmlkZW8uc2V0QXR0cmlidXRlKCdhdXRvcGxheScsICd0cnVlJyk7XG4gICAgICAgIHZpZGVvLnNldEF0dHJpYnV0ZSgnbXV0ZWQnLCAndHJ1ZScpO1xuICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJ3RydWUnKTsgLy8gbm90IGxpc3RlZCBvbiBNRE4uLi5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCAoKSA9PiB7XG4gICAgICAgICAgICB2aWRlby5wbGF5KCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBFcnJvciB3aGlsZSB0cnlpbmcgdG8gcGxheSB2aWRlbyBzdHJlYW06JywgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdhaXRGb3JWaWRlbyh2aWRlbyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn1cblxuZnVuY3Rpb24gZGVwcmVjYXRlZENvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50c1dpdGhEZXByZWNhdGVkKTogTWVkaWFUcmFja0NvbnN0cmFpbnRzIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gcGljayh2aWRlb0NvbnN0cmFpbnRzLCBbJ3dpZHRoJywgJ2hlaWdodCcsICdmYWNpbmdNb2RlJyxcbiAgICAgICAgJ2FzcGVjdFJhdGlvJywgJ2RldmljZUlkJ10pO1xuXG4gICAgaWYgKHR5cGVvZiB2aWRlb0NvbnN0cmFpbnRzLm1pbkFzcGVjdFJhdGlvICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgJiYgdmlkZW9Db25zdHJhaW50cy5taW5Bc3BlY3RSYXRpbyA+IDApIHtcbiAgICAgICAgbm9ybWFsaXplZC5hc3BlY3RSYXRpbyA9IHZpZGVvQ29uc3RyYWludHMubWluQXNwZWN0UmF0aW87XG4gICAgICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBDb25zdHJhaW50IFxcJ21pbkFzcGVjdFJhdGlvXFwnIGlzIGRlcHJlY2F0ZWQ7IFVzZSBcXCdhc3BlY3RSYXRpb1xcJyBpbnN0ZWFkJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmlkZW9Db25zdHJhaW50cy5mYWNpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuZmFjaW5nTW9kZSA9IHZpZGVvQ29uc3RyYWludHMuZmFjaW5nO1xuICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogQ29uc3RyYWludCBcXCdmYWNpbmdcXCcgaXMgZGVwcmVjYXRlZC4gVXNlIFxcJ2ZhY2luZ01vZGVcXCcgaW5zdGVhZFxcJycpO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLy8gVE9ETzogIzE5MiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGdvb2QgcmVhc29uIHBpY2tDb25zdHJhaW50cyBzaG91bGQgcmV0dXJuIGEgUHJvbWlzZSxcbi8vIEkgdGhpbmsgaXQgd2FzIGp1c3QgdGhhdCB3YXkgc28gaXQgY291bGQgYmUgY2hhaW5lZCB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBkaWQgcmV0dXJuIGEgUHJvbWlzZS5cbi8vIFRoYXQncyBub3QgbmVjZXNzYXJ5IHdpdGggYXN5bmMgZnVuY3Rpb25zIGJlaW5nIGEgdGhpbmcsIHNvIHRoYXQgc2hvdWxkIGJlIGZpeGVkLlxuZXhwb3J0IGZ1bmN0aW9uIHBpY2tDb25zdHJhaW50cyh2aWRlb0NvbnN0cmFpbnRzOiBNZWRpYVRyYWNrQ29uc3RyYWludHNXaXRoRGVwcmVjYXRlZCA9IHt9KTogUHJvbWlzZTxNZWRpYVN0cmVhbUNvbnN0cmFpbnRzPiB7XG4gICAgY29uc3QgdmlkZW8gPSBkZXByZWNhdGVkQ29uc3RyYWludHModmlkZW9Db25zdHJhaW50cyk7XG5cbiAgICBpZiAodmlkZW8gJiYgdmlkZW8uZGV2aWNlSWQgJiYgdmlkZW8uZmFjaW5nTW9kZSkge1xuICAgICAgICBkZWxldGUgdmlkZW8uZmFjaW5nTW9kZTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGF1ZGlvOiBmYWxzZSwgdmlkZW8gfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVudW1lcmF0ZVZpZGVvRGV2aWNlcygpOiBQcm9taXNlPEFycmF5PE1lZGlhRGV2aWNlSW5mbz4+IHtcbiAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIHJldHVybiBkZXZpY2VzLmZpbHRlcigoZGV2aWNlOiBNZWRpYURldmljZUluZm8pID0+IGRldmljZS5raW5kID09PSAndmlkZW9pbnB1dCcpO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVUcmFjaygpOiBNZWRpYVN0cmVhbVRyYWNrIHwgbnVsbCB7XG4gICAgaWYgKCFzdHJlYW1SZWYpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHRyYWNrcyA9IHN0cmVhbVJlZi5nZXRWaWRlb1RyYWNrcygpO1xuICAgIHJldHVybiB0cmFja3MgJiYgdHJhY2tzPy5sZW5ndGggPyB0cmFja3NbMF0gOiBudWxsO1xufVxuXG4vKipcbiAqIFVzZWQgZm9yIGFjY2Vzc2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0aXZlIHN0cmVhbSB0cmFjayBhbmQgYXZhaWxhYmxlIHZpZGVvIGRldmljZXMuXG4gKi9cbmNvbnN0IFF1YWdnYUpTQ2FtZXJhQWNjZXNzOiBDYW1lcmFBY2Nlc3NUeXBlID0ge1xuICAgIHJlcXVlc3RlZFZpZGVvRWxlbWVudDogbnVsbCxcbiAgICBhc3luYyByZXF1ZXN0KHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCwgdmlkZW9Db25zdHJhaW50cz86IE1lZGlhVHJhY2tDb25zdHJhaW50c1dpdGhEZXByZWNhdGVkKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgUXVhZ2dhSlNDYW1lcmFBY2Nlc3MucmVxdWVzdGVkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgICAgIGNvbnN0IG5ld0NvbnN0cmFpbnRzID0gYXdhaXQgcGlja0NvbnN0cmFpbnRzKHZpZGVvQ29uc3RyYWludHMpO1xuICAgICAgICByZXR1cm4gaW5pdENhbWVyYSh2aWRlbywgbmV3Q29uc3RyYWludHMpO1xuICAgIH0sXG4gICAgcmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdHJhY2tzID0gc3RyZWFtUmVmICYmIHN0cmVhbVJlZi5nZXRWaWRlb1RyYWNrcygpO1xuICAgICAgICBpZiAoUXVhZ2dhSlNDYW1lcmFBY2Nlc3MucmVxdWVzdGVkVmlkZW9FbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBRdWFnZ2FKU0NhbWVyYUFjY2Vzcy5yZXF1ZXN0ZWRWaWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0cmFja3MgJiYgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmVhbVJlZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgUXVhZ2dhSlNDYW1lcmFBY2Nlc3MucmVxdWVzdGVkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBlbnVtZXJhdGVWaWRlb0RldmljZXMsXG4gICAgZ2V0QWN0aXZlU3RyZWFtTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSBnZXRBY3RpdmVUcmFjaygpO1xuICAgICAgICByZXR1cm4gdHJhY2sgPyB0cmFjay5sYWJlbCA6ICcnO1xuICAgIH0sXG4gICAgZ2V0QWN0aXZlVHJhY2ssXG4gICAgYXN5bmMgZGlzYWJsZVRvcmNoKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IGdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhY3F1aXJlIGNhbWVyYSBhY2Nlc3MgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgY2FtZXJhIG9wZW4/XG4gICAgICAgIC8vIFRPRE86IHdoYXQgaGFwcGVucyBvbiBpT1Mgb3IgYW5vdGhlciBkZXZpY2Ugd2hlcmUgdG9yY2ggaXNuJ3Qgc3VwcG9ydGVkIGF0IGFsbD8gU2hvdWxkIHdlIHRocm93IGFuIGVycm9yP1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhY2suYXBwbHlDb25zdHJhaW50cyh7IGFkdmFuY2VkOiBbeyB0b3JjaDogZmFsc2UgfV0gfSBhcyBNZWRpYVRyYWNrQ29uc3RyYWludFNldCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgT3ZlcmNvbnN0cmFpbmVkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdxdWFnZ2EyL0NhbWVyYUFjY2VzczogVG9yY2ggbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGVuYWJsZVRvcmNoKCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IGdldEFjdGl2ZVRyYWNrKCk7XG4gICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhY3F1aXJlIGNhbWVyYSBhY2Nlc3MgZXZlbiBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgY2FtZXJhIG9wZW4/XG4gICAgICAgIC8vIFRPRE86IHdoYXQgaGFwcGVucyBvbiBpT1Mgb3IgYW5vdGhlciBkZXZpY2Ugd2hlcmUgdG9yY2ggaXNuJ3Qgc3VwcG9ydGVkIGF0IGFsbD8gU2hvdWxkIHdlIHRocm93IGFuIGVycm9yP1xuICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhY2suYXBwbHlDb25zdHJhaW50cyh7IGFkdmFuY2VkOiBbeyB0b3JjaDogdHJ1ZSB9XSB9IGFzIE1lZGlhVHJhY2tDb25zdHJhaW50U2V0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBPdmVyY29uc3RyYWluZWRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3F1YWdnYTIvQ2FtZXJhQWNjZXNzOiBUb3JjaCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBRdWFnZ2FKU0NhbWVyYUFjY2VzcztcbiIsImltcG9ydCBJbWFnZURlYnVnIGZyb20gJy4uL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgUXVhZ2dhSlNDb2RlUmVzdWx0LFxuICAgIFF1YWdnYUpTUmVzdWx0Q29sbGVjdG9yLFxuICAgIFF1YWdnYUpTUmVzdWx0Q29sbGVjdG9yRmlsdGVyRnVuY3Rpb24sXG4gICAgWFlTaXplLFxuICAgIFF1YWdnYUltYWdlRGF0YSxcbn0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKGNvZGVSZXN1bHQ6IFF1YWdnYUpTQ29kZVJlc3VsdCwgbGlzdDogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsaXN0ICYmIGxpc3Quc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSkgYXMgQXJyYXk8a2V5b2YgUXVhZ2dhSlNDb2RlUmVzdWx0PjtcbiAgICAgICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gaXRlbVtrZXldID09PSBjb2RlUmVzdWx0W2tleV0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwYXNzZXNGaWx0ZXIoXG4gICAgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0LFxuICAgIGZpbHRlcjogUXVhZ2dhSlNSZXN1bHRDb2xsZWN0b3JGaWx0ZXJGdW5jdGlvbiB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nID8gZmlsdGVyKGNvZGVSZXN1bHQpIDogdHJ1ZTtcbn1cblxuaW50ZXJmYWNlIFJlc3VsdENvbGxlY3RvciB7XG4gICAgYWRkUmVzdWx0OiAoZGF0YTogUXVhZ2dhSW1hZ2VEYXRhLCBpbWFnZVNpemU6IFhZU2l6ZSwgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KSA9PiB2b2lkO1xuICAgIGdldFJlc3VsdHM6ICgpID0+IEFycmF5PFF1YWdnYUpTQ29kZVJlc3VsdD47XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBjcmVhdGUoY29uZmlnOiBRdWFnZ2FKU1Jlc3VsdENvbGxlY3Rvcik6IFJlc3VsdENvbGxlY3RvciB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogISFjb25maWcud2lsbFJlYWRGcmVxdWVudGx5IH0pIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgICAgICAgY29uc3QgcmVzdWx0czogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0PiA9IFtdO1xuICAgICAgICBsZXQgY2FwYWNpdHkgPSBjb25maWcuY2FwYWNpdHkgPz8gMjA7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBjb25maWcuY2FwdHVyZSA9PT0gdHJ1ZTtcblxuICAgICAgICBmdW5jdGlvbiBtYXRjaGVzQ29uc3RyYWludHMoY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gISFjYXBhY2l0eVxuICAgICAgICAgICAgICAgICYmIGNvZGVSZXN1bHRcbiAgICAgICAgICAgICAgICAmJiAhY29udGFpbnMoY29kZVJlc3VsdCwgY29uZmlnLmJsYWNrbGlzdCBhcyBBcnJheTxRdWFnZ2FKU0NvZGVSZXN1bHQ+KVxuICAgICAgICAgICAgICAgICYmIHBhc3Nlc0ZpbHRlcihjb2RlUmVzdWx0LCBjb25maWcuZmlsdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZGF0YTogUXVhZ2dhSW1hZ2VEYXRhLCBpbWFnZVNpemU6IFhZU2l6ZSwgY29kZVJlc3VsdDogUXVhZ2dhSlNDb2RlUmVzdWx0KTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7IH07IC8vIHRoaXMgaXMgJ2FueScgdG8gYXZvaWQgaGF2aW5nIHRvIGNvbnN0cnVjdCBhIHdob2xlIFF1YWdnYUpTQ29kZVJlc3VsdCA6fFxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzQ29uc3RyYWludHMoY29kZVJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHktLTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvZGVSZXN1bHQgPSBjb2RlUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2VTaXplLng7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2VTaXplLnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdJbWFnZShkYXRhLCBpbWFnZVNpemUsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWUgPSBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc3VsdHMoKTogQXJyYXk8UXVhZ2dhSlNDb2RlUmVzdWx0PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuY29uc3QgRGV2Q29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCA9IHtcbiAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICBuYW1lOiAnTGl2ZScsXG4gICAgICAgIHR5cGU6ICdMaXZlU3RyZWFtJyxcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIC8vIGFzcGVjdFJhdGlvOiA2NDAvNDgwLCAvLyBvcHRpb25hbFxuICAgICAgICAgICAgZmFjaW5nTW9kZTogJ2Vudmlyb25tZW50JywgLy8gb3IgdXNlclxuICAgICAgICAgICAgLy8gZGV2aWNlSWQ6IFwiMzg3NDU5ODM0NTczODc1OTgzNzU5ODM3NTk4MzRcIlxuICAgICAgICB9LFxuICAgICAgICBhcmVhOiB7XG4gICAgICAgICAgICB0b3A6ICcwJScsXG4gICAgICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgICAgIGxlZnQ6ICcwJScsXG4gICAgICAgICAgICBib3R0b206ICcwJScsXG4gICAgICAgIH0sXG4gICAgICAgIHNpbmdsZUNoYW5uZWw6IGZhbHNlLCAvLyB0cnVlOiBvbmx5IHRoZSByZWQgY29sb3ItY2hhbm5lbCBpcyByZWFkXG4gICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgICBzaG93SW1hZ2VEZXRhaWxzOiBmYWxzZSwgLy8gbG9ncyBmcmFtZSBncmFiYmVyIGluZm8sIGNhbnZhcyBzaXplIGFkanVzdG1lbnRzXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBsb2NhdGU6IHRydWUsXG4gICAgbnVtT2ZXb3JrZXJzOiAwLFxuICAgIGRlY29kZXI6IHtcbiAgICAgICAgcmVhZGVyczogW1xuICAgICAgICAgICAgJ2NvZGVfMTI4X3JlYWRlcicsXG4gICAgICAgIF0sXG4gICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgICBkcmF3Qm91bmRpbmdCb3g6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0ZyZXF1ZW5jeTogZmFsc2UsXG4gICAgICAgICAgICBkcmF3U2NhbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1BhdHRlcm46IGZhbHNlLFxuICAgICAgICAgICAgcHJpbnRSZWFkZXJJbmZvOiBmYWxzZSwgLy8gbG9ncyByZWFkZXIgcmVnaXN0cmF0aW9uIGFuZCBpbml0aWFsaXphdGlvblxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbG9jYXRvcjoge1xuICAgICAgICBoYWxmU2FtcGxlOiB0cnVlLFxuICAgICAgICBwYXRjaFNpemU6ICdtZWRpdW0nLCAvLyB4LXNtYWxsLCBzbWFsbCwgbWVkaXVtLCBsYXJnZSwgeC1sYXJnZVxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgc2hvd0NhbnZhczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UGF0Y2hlczogZmFsc2UsXG4gICAgICAgICAgICBzaG93Rm91bmRQYXRjaGVzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dTa2VsZXRvbjogZmFsc2UsXG4gICAgICAgICAgICBzaG93TGFiZWxzOiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dQYXRjaExhYmVsczogZmFsc2UsXG4gICAgICAgICAgICBzaG93UmVtYWluaW5nUGF0Y2hMYWJlbHM6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1BhdGNoU2l6ZTogZmFsc2UsIC8vIGxvZ3MgY2FsY3VsYXRlZCBwYXRjaCBzaXplXG4gICAgICAgICAgICBzaG93SW1hZ2VEZXRhaWxzOiBmYWxzZSwgLy8gbG9ncyBpbWFnZSB3cmFwcGVyIHNpemUsIGNhbnZhcyBkZXRhaWxzXG4gICAgICAgICAgICBib3hGcm9tUGF0Y2hlczoge1xuICAgICAgICAgICAgICAgIHNob3dUcmFuc2Zvcm1lZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2hvd1RyYW5zZm9ybWVkQm94OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93QkI6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRGV2Q29uZmlnO1xuIiwiaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYS5kJztcblxuY29uc3QgTm9kZUNvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3QgPSB7XG4gICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgdHlwZTogJ0ltYWdlU3RyZWFtJyxcbiAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICBzaXplOiA4MDAsXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogJzAlJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICAgICAgbGVmdDogJzAlJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAlJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2luZ2xlQ2hhbm5lbDogZmFsc2UsIC8vIHRydWU6IG9ubHkgdGhlIHJlZCBjb2xvci1jaGFubmVsIGlzIHJlYWRcbiAgICB9LFxuICAgIGxvY2F0ZTogdHJ1ZSxcbiAgICBudW1PZldvcmtlcnM6IDAsXG4gICAgZGVjb2Rlcjoge1xuICAgICAgICByZWFkZXJzOiBbXG4gICAgICAgICAgICAnY29kZV8xMjhfcmVhZGVyJyxcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGxvY2F0b3I6IHtcbiAgICAgICAgaGFsZlNhbXBsZTogdHJ1ZSxcbiAgICAgICAgcGF0Y2hTaXplOiAnbWVkaXVtJywgLy8geC1zbWFsbCwgc21hbGwsIG1lZGl1bSwgbGFyZ2UsIHgtbGFyZ2VcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgTm9kZUNvbmZpZztcbiIsImltcG9ydCB7IFF1YWdnYUpTQ29uZmlnT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmNvbnN0IFByb2RDb25maWc6IFF1YWdnYUpTQ29uZmlnT2JqZWN0ID0ge1xuICAgIGlucHV0U3RyZWFtOiB7XG4gICAgICAgIG5hbWU6ICdMaXZlJyxcbiAgICAgICAgdHlwZTogJ0xpdmVTdHJlYW0nLFxuICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgLy8gYXNwZWN0UmF0aW86IDY0MC80ODAsIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICBmYWNpbmdNb2RlOiAnZW52aXJvbm1lbnQnLCAvLyBvciB1c2VyXG4gICAgICAgICAgICAvLyBkZXZpY2VJZDogXCIzODc0NTk4MzQ1NzM4NzU5ODM3NTk4Mzc1OTgzNFwiXG4gICAgICAgIH0sXG4gICAgICAgIGFyZWE6IHtcbiAgICAgICAgICAgIHRvcDogJzAlJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnMCUnLFxuICAgICAgICAgICAgbGVmdDogJzAlJyxcbiAgICAgICAgICAgIGJvdHRvbTogJzAlJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2luZ2xlQ2hhbm5lbDogZmFsc2UsIC8vIHRydWU6IG9ubHkgdGhlIHJlZCBjb2xvci1jaGFubmVsIGlzIHJlYWRcbiAgICB9LFxuICAgIGxvY2F0ZTogdHJ1ZSxcbiAgICBudW1PZldvcmtlcnM6IDQsXG4gICAgZGVjb2Rlcjoge1xuICAgICAgICByZWFkZXJzOiBbXG4gICAgICAgICAgICAnY29kZV8xMjhfcmVhZGVyJyxcbiAgICAgICAgXSxcbiAgICB9LFxuICAgIGxvY2F0b3I6IHtcbiAgICAgICAgaGFsZlNhbXBsZTogdHJ1ZSxcbiAgICAgICAgcGF0Y2hTaXplOiAnbWVkaXVtJywgLy8geC1zbWFsbCwgc21hbGwsIG1lZGl1bSwgbGFyZ2UsIHgtbGFyZ2VcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvZENvbmZpZztcbiIsImltcG9ydCB7IFF1YWdnYUpTQ29uZmlnT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5pbXBvcnQgRGV2Q29uZmlnIGZyb20gJy4vY29uZmlnLmRldic7XG5pbXBvcnQgTm9kZUNvbmZpZyBmcm9tICcuL2NvbmZpZy5ub2RlJztcbmltcG9ydCBQcm9kQ29uZmlnIGZyb20gJy4vY29uZmlnLnByb2QnO1xuXG5jb25zdCBFeHBvcnRDb25maWc6IFF1YWdnYUpTQ29uZmlnT2JqZWN0ID0gKCgpID0+IHtcbiAgICBsZXQgUXVhZ2dhQ29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdDtcbiAgICBpZiAodHlwZW9mIEVOViA9PT0gJ3VuZGVmaW5lZCcgfHwgRU5WLmRldmVsb3BtZW50KSB7XG4gICAgICAgIFF1YWdnYUNvbmZpZyA9IERldkNvbmZpZztcbiAgICB9IGVsc2UgaWYgKEVOVi5ub2RlKSB7XG4gICAgICAgIFF1YWdnYUNvbmZpZyA9IE5vZGVDb25maWc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgUXVhZ2dhQ29uZmlnID0gUHJvZENvbmZpZztcbiAgICB9XG4gICAgcmV0dXJuIFF1YWdnYUNvbmZpZztcbn0pKCk7XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydENvbmZpZztcbiIsIi8vIE5PVEUgRk9SIEFOWU9ORSBJTiBIRVJFIElOIFRIRSBGVVRVUkU6XG4vLyB3ZWJwYWNrLmNvbmZpZy5qcyByZXBsYWNlcyB0aGUgZnJhbWVfZ3JhYmJlciBtb2R1bGUgd2l0aCBUSElTIG1vZHVsZSB3aGVuIGl0IGlzIGJ1aWxkaW5nIGZvciBhIEJyb3dzZXIgZW52aXJvbm1lbnQuXG5cbmltcG9ydCB7XG4gICAgaW1hZ2VSZWYsXG4gICAgZ3JheUFuZEhhbGZTYW1wbGVGcm9tQ2FudmFzRGF0YSxcbiAgICBjb21wdXRlR3JheSxcbn0gZnJvbSAnLi4vY29tbW9uL2N2X3V0aWxzJztcblxuY29uc3QgVE9fUkFESUFOUyA9IE1hdGguUEkgLyAxODA7XG5cbmZ1bmN0aW9uIGFkanVzdENhbnZhc1NpemUoY2FudmFzLCB0YXJnZXRTaXplLCBkZWJ1Zykge1xuICAgIGlmIChjYW52YXMud2lkdGggIT09IHRhcmdldFNpemUueCkge1xuICAgICAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIGRlYnVnPy5zaG93SW1hZ2VEZXRhaWxzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV0FSTklORzogY2FudmFzLXNpemUgbmVlZHMgdG8gYmUgYWRqdXN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXMud2lkdGggPSB0YXJnZXRTaXplLng7XG4gICAgfVxuICAgIGlmIChjYW52YXMuaGVpZ2h0ICE9PSB0YXJnZXRTaXplLnkpIHtcbiAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBkZWJ1Zz8uc2hvd0ltYWdlRGV0YWlscykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dBUk5JTkc6IGNhbnZhcy1zaXplIG5lZWRzIHRvIGJlIGFkanVzdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHRhcmdldFNpemUueTtcbiAgICB9XG59XG5cbmNvbnN0IEZyYW1lR3JhYmJlciA9IHt9O1xuXG5GcmFtZUdyYWJiZXIuY3JlYXRlID0gZnVuY3Rpb24gKGlucHV0U3RyZWFtLCBjYW52YXMpIHtcbiAgICAvLyBjb25zb2xlLndhcm4oJyoqKiBGcmFtZUdyYWJiZXJCcm93c2VyIGNyZWF0ZScpO1xuICAgIGNvbnN0IF90aGF0ID0ge307XG4gICAgY29uc3QgX3N0cmVhbUNvbmZpZyA9IGlucHV0U3RyZWFtLmdldENvbmZpZygpO1xuICAgIGNvbnN0IF92aWRlb1NpemUgPSBpbWFnZVJlZihpbnB1dFN0cmVhbS5nZXRSZWFsV2lkdGgoKSwgaW5wdXRTdHJlYW0uZ2V0UmVhbEhlaWdodCgpKTtcbiAgICBjb25zdCBfY2FudmFzU2l6ZSA9IGlucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKTtcbiAgICBjb25zdCBfc2l6ZSA9IGltYWdlUmVmKGlucHV0U3RyZWFtLmdldFdpZHRoKCksIGlucHV0U3RyZWFtLmdldEhlaWdodCgpKTtcbiAgICBjb25zdCB0b3BSaWdodCA9IGlucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCk7XG4gICAgY29uc3QgX3N4ID0gdG9wUmlnaHQueDtcbiAgICBjb25zdCBfc3kgPSB0b3BSaWdodC55O1xuICAgIGxldCBfY2FudmFzO1xuICAgIGxldCBfY3R4ID0gbnVsbDtcbiAgICBsZXQgX2RhdGEgPSBudWxsO1xuICAgIGNvbnN0IHsgd2lsbFJlYWRGcmVxdWVudGx5IH0gPSBfc3RyZWFtQ29uZmlnO1xuXG4gICAgX2NhbnZhcyA9IGNhbnZhcyB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBfY2FudmFzLndpZHRoID0gX2NhbnZhc1NpemUueDtcbiAgICBfY2FudmFzLmhlaWdodCA9IF9jYW52YXNTaXplLnk7XG4gICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBfc3RyZWFtQ29uZmlnLmRlYnVnPy5zaG93SW1hZ2VEZXRhaWxzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignKioqIGZyYW1lX2dyYWJiZXJfYnJvd3Nlcjogd2lsbFJlYWRGcmVxdWVudGx5PScsIHdpbGxSZWFkRnJlcXVlbnRseSwgJ2NhbnZhcz0nLCBfY2FudmFzKTtcbiAgICB9XG4gICAgX2N0eCA9IF9jYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogISF3aWxsUmVhZEZyZXF1ZW50bHkgfSk7IC8vIGRvdWJsZSBub3QgYmVjYXVzZSB3ZSBoYXZlIGFuIG9wdGlvbmFsIGJvb2wgdGhhdCBuZWVkcyB0byBwYXNzIGFzIGEgYm9vbFxuICAgIF9kYXRhID0gbmV3IFVpbnQ4QXJyYXkoX3NpemUueCAqIF9zaXplLnkpO1xuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX3N0cmVhbUNvbmZpZy5kZWJ1Zz8uc2hvd0ltYWdlRGV0YWlscykge1xuICAgICAgICBjb25zb2xlLmxvZygnRnJhbWVHcmFiYmVyJywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgc2l6ZTogX3NpemUsXG4gICAgICAgICAgICB0b3BSaWdodCxcbiAgICAgICAgICAgIHZpZGVvU2l6ZTogX3ZpZGVvU2l6ZSxcbiAgICAgICAgICAgIGNhbnZhc1NpemU6IF9jYW52YXNTaXplLFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlcyB0aGUgZ2l2ZW4gYXJyYXkgYXMgZnJhbWUtYnVmZmVyXG4gICAgICovXG4gICAgX3RoYXQuYXR0YWNoRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIF9kYXRhID0gZGF0YTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXNlZCBmcmFtZS1idWZmZXJcbiAgICAgKi9cbiAgICBfdGhhdC5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX2RhdGE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgYSBmcmFtZSBmcm9tIHRoZSBpbnB1dC1zdHJlYW0gYW5kIHB1dHMgaW50byB0aGUgZnJhbWUtYnVmZmVyLlxuICAgICAqIFRoZSBpbWFnZS1kYXRhIGlzIGNvbnZlcnRlZCB0byBncmF5LXNjYWxlIGFuZCB0aGVuIGhhbGYtc2FtcGxlZCBpZiBjb25maWd1cmVkLlxuICAgICAqL1xuICAgIF90aGF0LmdyYWIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRvSGFsZlNhbXBsZSA9IF9zdHJlYW1Db25maWcuaGFsZlNhbXBsZTtcbiAgICAgICAgY29uc3QgZnJhbWUgPSBpbnB1dFN0cmVhbS5nZXRGcmFtZSgpO1xuICAgICAgICBsZXQgZHJhd2FibGUgPSBmcmFtZTtcbiAgICAgICAgbGV0IGRyYXdBbmdsZSA9IDA7XG4gICAgICAgIGxldCBjdHhEYXRhO1xuICAgICAgICBpZiAoZHJhd2FibGUpIHtcbiAgICAgICAgICAgIGFkanVzdENhbnZhc1NpemUoX2NhbnZhcywgX2NhbnZhc1NpemUsIF9zdHJlYW1Db25maWcuZGVidWcpO1xuICAgICAgICAgICAgaWYgKF9zdHJlYW1Db25maWcudHlwZSA9PT0gJ0ltYWdlU3RyZWFtJykge1xuICAgICAgICAgICAgICAgIGRyYXdhYmxlID0gZnJhbWUuaW1nO1xuICAgICAgICAgICAgICAgIGlmIChmcmFtZS50YWdzICYmIGZyYW1lLnRhZ3Mub3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmcmFtZS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0FuZ2xlID0gOTAgKiBUT19SQURJQU5TO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdBbmdsZSA9IC05MCAqIFRPX1JBRElBTlM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkcmF3QW5nbGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICBfY3R4LnRyYW5zbGF0ZShfY2FudmFzU2l6ZS54IC8gMiwgX2NhbnZhc1NpemUueSAvIDIpO1xuICAgICAgICAgICAgICAgIF9jdHgucm90YXRlKGRyYXdBbmdsZSk7XG4gICAgICAgICAgICAgICAgX2N0eC5kcmF3SW1hZ2UoZHJhd2FibGUsIC1fY2FudmFzU2l6ZS55IC8gMiwgLV9jYW52YXNTaXplLnggLyAyLCBfY2FudmFzU2l6ZS55LCBfY2FudmFzU2l6ZS54KTtcbiAgICAgICAgICAgICAgICBfY3R4LnJvdGF0ZSgtZHJhd0FuZ2xlKTtcbiAgICAgICAgICAgICAgICBfY3R4LnRyYW5zbGF0ZSgtX2NhbnZhc1NpemUueCAvIDIsIC1fY2FudmFzU2l6ZS55IC8gMik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9jdHguZHJhd0ltYWdlKGRyYXdhYmxlLCAwLCAwLCBfY2FudmFzU2l6ZS54LCBfY2FudmFzU2l6ZS55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3R4RGF0YSA9IF9jdHguZ2V0SW1hZ2VEYXRhKF9zeCwgX3N5LCBfc2l6ZS54LCBfc2l6ZS55KS5kYXRhO1xuICAgICAgICAgICAgaWYgKGRvSGFsZlNhbXBsZSkge1xuICAgICAgICAgICAgICAgIGdyYXlBbmRIYWxmU2FtcGxlRnJvbUNhbnZhc0RhdGEoY3R4RGF0YSwgX3NpemUsIF9kYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZUdyYXkoY3R4RGF0YSwgX2RhdGEsIF9zdHJlYW1Db25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBfdGhhdC5nZXRTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3NpemU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhhdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZyYW1lR3JhYmJlcjtcbiIsIi8vIE5PVEU6IChTT01FIE9GKSBUSElTIElTIEJST1dTRVIgT05MWSBDT0RFLiAgTm9kZSBkb2VzIG5vdCBoYXZlICdhdG9iJyBidWlsdCBpbiwgbm9yIFhNTEh0dHBSZXF1ZXN0LlxuLy8gSG93IGV4YWN0bHkgaXMgdGhpcyBzZXQgb2YgZnVuY3Rpb25zIHVzZWQgaW4gUXVhZ2dhPyBEbyB3ZSBuZWVkIHRoZSBicm93c2VyIHNwZWNpZmljIGNvZGU/IERvIHdlXG4vLyBuZWVkIHRvIHBvcnQgYW55IHBhcnQgb2YgdGhpcyB0aGF0IGRvZXNuJ3Qgd29yayBpbiBOb2RlIHRvIG5vZGU/XG5cbi8vIFRhZ3Mgc2NyYXBlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9leGlmLWpzL2V4aWYtanNcbmNvbnN0IEV4aWZUYWdzID0geyAweDAxMTI6ICdvcmllbnRhdGlvbicgfTtcbmV4cG9ydCBjb25zdCBBdmFpbGFibGVUYWdzID0gT2JqZWN0LmtleXMoRXhpZlRhZ3MpLm1hcCgoa2V5KSA9PiBFeGlmVGFnc1trZXldKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRUYWdzSW5PYmplY3RVUkwoc3JjLCB0YWdzID0gQXZhaWxhYmxlVGFncykge1xuICAgIGlmICgvXmJsb2I6L2kudGVzdChzcmMpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RVUkxUb0Jsb2Ioc3JjKVxuICAgICAgICAgICAgLnRoZW4ocmVhZFRvQnVmZmVyKVxuICAgICAgICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gZmluZFRhZ3NJbkJ1ZmZlcihidWZmZXIsIHRhZ3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFRvQXJyYXlCdWZmZXIoZGF0YVVybCkge1xuICAgIGNvbnN0IGJhc2U2NCA9IGRhdGFVcmwucmVwbGFjZSgvXmRhdGE6KFteO10rKTtiYXNlNjQsL2dtaSwgJycpO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICBjb25zdCBsZW4gPSBiaW5hcnkubGVuZ3RoO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihsZW4pO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2aWV3W2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJlYWRUb0J1ZmZlcihibG9iKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBvYmplY3RVUkxUb0Jsb2IodXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIGh0dHAucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgICAgICBodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChodHRwLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUgJiYgKGh0dHAuc3RhdHVzID09PSAyMDAgfHwgaHR0cC5zdGF0dXMgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaHR0cC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICBodHRwLnNlbmQoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRUYWdzSW5CdWZmZXIoZmlsZSwgc2VsZWN0ZWRUYWdzID0gQXZhaWxhYmxlVGFncykge1xuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGZpbGUpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGZpbGUuYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBleGlmVGFncyA9IHNlbGVjdGVkVGFncy5yZWR1Y2UoKHJlc3VsdCwgc2VsZWN0ZWRUYWcpID0+IHtcbiAgICAgICAgY29uc3QgZXhpZlRhZyA9IE9iamVjdC5rZXlzKEV4aWZUYWdzKS5maWx0ZXIoKHRhZykgPT4gRXhpZlRhZ3NbdGFnXSA9PT0gc2VsZWN0ZWRUYWcpWzBdO1xuICAgICAgICBpZiAoZXhpZlRhZykge1xuICAgICAgICAgICAgcmVzdWx0W2V4aWZUYWddID0gc2VsZWN0ZWRUYWc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gICAgbGV0IG9mZnNldCA9IDI7XG4gICAgbGV0IG1hcmtlcjtcblxuICAgIGlmICgoZGF0YVZpZXcuZ2V0VWludDgoMCkgIT09IDB4RkYpIHx8IChkYXRhVmlldy5nZXRVaW50OCgxKSAhPT0gMHhEOCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGRhdGFWaWV3LmdldFVpbnQ4KG9mZnNldCkgIT09IDB4RkYpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtlciA9IGRhdGFWaWV3LmdldFVpbnQ4KG9mZnNldCArIDEpO1xuICAgICAgICBpZiAobWFya2VyID09PSAweEUxKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZEVYSUZEYXRhKGRhdGFWaWV3LCBvZmZzZXQgKyA0LCBleGlmVGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IDIgKyBkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0ICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWFkRVhJRkRhdGEoZmlsZSwgc3RhcnQsIGV4aWZUYWdzKSB7XG4gICAgaWYgKGdldFN0cmluZ0Zyb21CdWZmZXIoZmlsZSwgc3RhcnQsIDQpICE9PSAnRXhpZicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpZmZPZmZzZXQgPSBzdGFydCArIDY7XG4gICAgbGV0IGJpZ0VuZDtcblxuICAgIGlmIChmaWxlLmdldFVpbnQxNih0aWZmT2Zmc2V0KSA9PT0gMHg0OTQ5KSB7XG4gICAgICAgIGJpZ0VuZCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZmlsZS5nZXRVaW50MTYodGlmZk9mZnNldCkgPT09IDB4NEQ0RCkge1xuICAgICAgICBiaWdFbmQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5nZXRVaW50MTYodGlmZk9mZnNldCArIDIsICFiaWdFbmQpICE9PSAweDAwMkEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0SUZET2Zmc2V0ID0gZmlsZS5nZXRVaW50MzIodGlmZk9mZnNldCArIDQsICFiaWdFbmQpO1xuICAgIGlmIChmaXJzdElGRE9mZnNldCA8IDB4MDAwMDAwMDgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZ3MgPSByZWFkVGFncyhmaWxlLCB0aWZmT2Zmc2V0LCB0aWZmT2Zmc2V0ICsgZmlyc3RJRkRPZmZzZXQsIGV4aWZUYWdzLCBiaWdFbmQpO1xuICAgIHJldHVybiB0YWdzO1xufVxuXG5mdW5jdGlvbiByZWFkVGFncyhmaWxlLCB0aWZmU3RhcnQsIGRpclN0YXJ0LCBzdHJpbmdzLCBiaWdFbmQpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gZmlsZS5nZXRVaW50MTYoZGlyU3RhcnQsICFiaWdFbmQpO1xuICAgIGNvbnN0IHRhZ3MgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5T2Zmc2V0ID0gZGlyU3RhcnQgKyBpICogMTIgKyAyO1xuICAgICAgICBjb25zdCB0YWcgPSBzdHJpbmdzW2ZpbGUuZ2V0VWludDE2KGVudHJ5T2Zmc2V0LCAhYmlnRW5kKV07XG4gICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgIHRhZ3NbdGFnXSA9IHJlYWRUYWdWYWx1ZShmaWxlLCBlbnRyeU9mZnNldCwgdGlmZlN0YXJ0LCBkaXJTdGFydCwgYmlnRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFncztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1ZhbHVlKGZpbGUsIGVudHJ5T2Zmc2V0LCB0aWZmU3RhcnQsIGRpclN0YXJ0LCBiaWdFbmQpIHtcbiAgICBjb25zdCB0eXBlID0gZmlsZS5nZXRVaW50MTYoZW50cnlPZmZzZXQgKyAyLCAhYmlnRW5kKTtcbiAgICBjb25zdCBudW1WYWx1ZXMgPSBmaWxlLmdldFVpbnQzMihlbnRyeU9mZnNldCArIDQsICFiaWdFbmQpO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGlmIChudW1WYWx1ZXMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRVaW50MTYoZW50cnlPZmZzZXQgKyA4LCAhYmlnRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbUJ1ZmZlcihidWZmZXIsIHN0YXJ0LCBsZW5ndGgpIHtcbiAgICBsZXQgb3V0c3RyID0gJyc7XG4gICAgZm9yIChsZXQgbiA9IHN0YXJ0OyBuIDwgc3RhcnQgKyBsZW5ndGg7IG4rKykge1xuICAgICAgICBvdXRzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZmZXIuZ2V0VWludDgobikpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0c3RyO1xufVxuIiwiaW1wb3J0IHsgZmluZFRhZ3NJbk9iamVjdFVSTCB9IGZyb20gJy4vZXhpZl9oZWxwZXInO1xuXG5jb25zdCBJbWFnZUxvYWRlciA9IHt9O1xuSW1hZ2VMb2FkZXIubG9hZCA9IGZ1bmN0aW9uIChkaXJlY3RvcnksIGNhbGxiYWNrLCBvZmZzZXQsIHNpemUsIHNlcXVlbmNlLCBjb25maWcpIHtcbiAgICBjb25zdCBodG1sSW1hZ2VzU3JjQXJyYXkgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gICAgY29uc3QgaHRtbEltYWdlc0FycmF5ID0gbmV3IEFycmF5KGh0bWxJbWFnZXNTcmNBcnJheS5sZW5ndGgpO1xuICAgIGxldCBpO1xuICAgIGxldCBpbWc7XG4gICAgbGV0IG51bTtcblxuICAgIGlmIChzZXF1ZW5jZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaHRtbEltYWdlc1NyY0FycmF5WzBdID0gZGlyZWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBodG1sSW1hZ2VzU3JjQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG51bSA9IChvZmZzZXQgKyBpKTtcbiAgICAgICAgICAgIGh0bWxJbWFnZXNTcmNBcnJheVtpXSA9IGAke2RpcmVjdG9yeX1pbWFnZS0keyhgMDAke251bX1gKS5zbGljZSgtMyl9LmpwZ2A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaHRtbEltYWdlc0FycmF5Lm5vdExvYWRlZCA9IFtdO1xuICAgIGh0bWxJbWFnZXNBcnJheS5hZGRJbWFnZSA9IGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICBodG1sSW1hZ2VzQXJyYXkubm90TG9hZGVkLnB1c2goaW1hZ2UpO1xuICAgIH07XG4gICAgaHRtbEltYWdlc0FycmF5LmxvYWRlZCA9IGZ1bmN0aW9uIChsb2FkZWRJbWcpIHtcbiAgICAgICAgY29uc3Qgbm90bG9hZGVkSW1ncyA9IGh0bWxJbWFnZXNBcnJheS5ub3RMb2FkZWQ7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgbm90bG9hZGVkSW1ncy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgaWYgKG5vdGxvYWRlZEltZ3NbeF0gPT09IGxvYWRlZEltZykge1xuICAgICAgICAgICAgICAgIG5vdGxvYWRlZEltZ3Muc3BsaWNlKHgsIDEpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaHRtbEltYWdlc1NyY0FycmF5Lmxlbmd0aDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltZ05hbWUgPSBodG1sSW1hZ2VzU3JjQXJyYXlbeV0uc3Vic3RyKGh0bWxJbWFnZXNTcmNBcnJheVt5XS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZEltZy5zcmMubGFzdEluZGV4T2YoaW1nTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sSW1hZ2VzQXJyYXlbeV0gPSB7IGltZzogbG9hZGVkSW1nIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm90bG9hZGVkSW1ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgY29uZmlnPy5kZWJ1Zz8uc2hvd0ltYWdlRGV0YWlscykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJbWFnZXMgbG9hZGVkOiAke2h0bWxJbWFnZXNBcnJheS5sZW5ndGh9IGltYWdlJHtodG1sSW1hZ2VzQXJyYXkubGVuZ3RoICE9PSAxID8gJ3MnIDogJyd9IGZyb20gJHtzZXF1ZW5jZSA9PT0gZmFsc2UgPyBkaXJlY3RvcnkgOiBkaXJlY3RvcnkgKyAnIChzZXF1ZW5jZSknfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlcXVlbmNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGZpbmRUYWdzSW5PYmplY3RVUkwoZGlyZWN0b3J5LCBbJ29yaWVudGF0aW9uJ10pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh0YWdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sSW1hZ2VzQXJyYXlbMF0udGFncyA9IHRhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhodG1sSW1hZ2VzQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhodG1sSW1hZ2VzQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soaHRtbEltYWdlc0FycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaHRtbEltYWdlc1NyY0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBodG1sSW1hZ2VzQXJyYXkuYWRkSW1hZ2UoaW1nKTtcbiAgICAgICAgYWRkT25sb2FkSGFuZGxlcihpbWcsIGh0bWxJbWFnZXNBcnJheSk7XG4gICAgICAgIGltZy5zcmMgPSBodG1sSW1hZ2VzU3JjQXJyYXlbaV07XG4gICAgfVxufTtcblxuZnVuY3Rpb24gYWRkT25sb2FkSGFuZGxlcihpbWcsIGh0bWxJbWFnZXNBcnJheSkge1xuICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWxJbWFnZXNBcnJheS5sb2FkZWQodGhpcyk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKEltYWdlTG9hZGVyKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IEltYWdlTG9hZGVyIGZyb20gJy4uL2ltYWdlX2xvYWRlcic7XG5pbXBvcnQgeyBYWVNpemUsIFBvaW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbUZhY3RvcnksIElucHV0U3RyZWFtLCBFdmVudEhhbmRsZXJMaXN0IH0gZnJvbSAnLi9pbnB1dF9zdHJlYW0uZCc7XG5cbmNvbnN0IGlucHV0U3RyZWFtRmFjdG9yeTogSW5wdXRTdHJlYW1GYWN0b3J5ID0ge1xuICAgIGNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTogSW5wdXRTdHJlYW0ge1xuICAgICAgICBjb25zb2xlLndhcm4oJyoqKiogSW5wdXRTdHJlYW1Ccm93c2VyIGNyZWF0ZVZpZGVvU3RyZWFtJyk7XG4gICAgICAgIGxldCBfY29uZmlnOiB7IHNpemU6IG51bWJlcjsgdHlwZTogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICBjb25zdCBfZXZlbnRIYW5kbGVyczogRXZlbnRIYW5kbGVyTGlzdCA9IHt9O1xuICAgICAgICBsZXQgX2NhbGN1bGF0ZWRXaWR0aDogbnVtYmVyO1xuICAgICAgICBsZXQgX2NhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgY29uc3QgX3RvcFJpZ2h0OiBQb2ludCA9IHsgeDogMCwgeTogMCwgdHlwZTogJ1BvaW50JyB9O1xuICAgICAgICBjb25zdCBfY2FudmFzU2l6ZTogWFlTaXplID0geyB4OiAwLCB5OiAwLCB0eXBlOiAnWFlTaXplJyB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXRTaXplKCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB2aWRlby52aWRlb1dpZHRoO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgX2NhbGN1bGF0ZWRXaWR0aCA9IF9jb25maWc/LnNpemUgPyB3aWR0aCAvIGhlaWdodCA+IDEgPyBfY29uZmlnLnNpemUgOiBNYXRoLmZsb29yKCh3aWR0aCAvIGhlaWdodCkgKiBfY29uZmlnLnNpemUpIDogd2lkdGg7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIF9jYWxjdWxhdGVkSGVpZ2h0ID0gX2NvbmZpZz8uc2l6ZSA/IHdpZHRoIC8gaGVpZ2h0ID4gMSA/IE1hdGguZmxvb3IoKGhlaWdodCAvIHdpZHRoKSAqIF9jb25maWcuc2l6ZSkgOiBfY29uZmlnLnNpemUgOiBoZWlnaHQ7XG5cbiAgICAgICAgICAgIF9jYW52YXNTaXplLnggPSBfY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICAgICAgX2NhbnZhc1NpemUueSA9IF9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSA9IHtcbiAgICAgICAgICAgIGdldFJlYWxXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW8udmlkZW9XaWR0aDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFJlYWxIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvLnZpZGVvSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0V2lkdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0V2lkdGgod2lkdGgpIHtcbiAgICAgICAgICAgICAgICBfY2FsY3VsYXRlZFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgX2NhbGN1bGF0ZWRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRJbnB1dFN0cmVhbShjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3NyYycsICh0eXBlb2YgY29uZmlnLnNyYyAhPT0gJ3VuZGVmaW5lZCcpID8gY29uZmlnLnNyYyA6ICcnKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVuZGVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2aWRlby5lbmRlZDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldENvbmZpZygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbmZpZztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2aWRlbykge1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBhdXNlKCkge1xuICAgICAgICAgICAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwbGF5KCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRDdXJyZW50VGltZSh0aW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jb25maWc/LnR5cGUgIT09ICdMaXZlU3RyZWFtJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY3VycmVudFRpbWUnLCB0aW1lLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGYsIGJvb2wpIHtcbiAgICAgICAgICAgICAgICBpZiAoX2V2ZW50TmFtZXMuaW5kZXhPZihldmVudCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2V2ZW50SGFuZGxlcnNbZXZlbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfZXZlbnRIYW5kbGVyc1tldmVudF0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZXZlbnRIYW5kbGVyc1tldmVudF0ucHVzaChmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmLCBib29sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjbGVhckV2ZW50SGFuZGxlcnMoKSB7XG4gICAgICAgICAgICAgICAgX2V2ZW50TmFtZXMuZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJpZ2dlcihldmVudE5hbWUsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgajtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBfZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NhbnJlY29yZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdFNpemUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tqXS5hcHBseShpbnB1dFN0cmVhbSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRUb3BSaWdodCh0b3BSaWdodCkge1xuICAgICAgICAgICAgICAgIF90b3BSaWdodC54ID0gdG9wUmlnaHQueDtcbiAgICAgICAgICAgICAgICBfdG9wUmlnaHQueSA9IHRvcFJpZ2h0Lnk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRUb3BSaWdodCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RvcFJpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0Q2FudmFzU2l6ZShzaXplKSB7XG4gICAgICAgICAgICAgICAgX2NhbnZhc1NpemUueCA9IHNpemUueDtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS55ID0gc2l6ZS55O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0Q2FudmFzU2l6ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NhbnZhc1NpemU7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRGcmFtZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlkZW87XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07XG4gICAgfSxcbiAgICBjcmVhdGVMaXZlU3RyZWFtKHZpZGVvKTogSW5wdXRTdHJlYW0ge1xuICAgICAgICBjb25zb2xlLndhcm4oJyoqKiogSW5wdXRTdHJlYW1Ccm93c2VyIGNyZWF0ZUxpdmVTdHJlYW0nKTtcbiAgICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgICAgICB2aWRlby5zZXRBdHRyaWJ1dGUoJ2F1dG9wbGF5JywgJ3RydWUnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aGF0ID0gaW5wdXRTdHJlYW1GYWN0b3J5LmNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKTtcbiAgICAgICAgdGhhdC5lbmRlZCA9IGZ1bmN0aW9uIGVuZGVkKCk6IGZhbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBjcmVhdGVJbWFnZVN0cmVhbSgpOiBJbnB1dFN0cmVhbSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignKioqKiBJbnB1dFN0cmVhbUJyb3dzZXIgY3JlYXRlSW1hZ2VTdHJlYW0nKTtcbiAgICAgICAgbGV0IF9jb25maWc6IHsgc2l6ZTogbnVtYmVyOyBzZXF1ZW5jZTogYW55IH0gfCBudWxsID0gbnVsbDtcblxuICAgICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICAgICAgbGV0IGZyYW1lSWR4ID0gMDtcbiAgICAgICAgbGV0IHBhdXNlZCA9IHRydWU7XG4gICAgICAgIGxldCBsb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGltZ0FycmF5OiBhbnlbXSB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDE7XG4gICAgICAgIGxldCBiYXNlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGVuZGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBjYWxjdWxhdGVkV2lkdGg6IG51bWJlcjtcbiAgICAgICAgbGV0IGNhbGN1bGF0ZWRIZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgY29uc3QgX2V2ZW50TmFtZXMgPSBbJ2NhbnJlY29yZCcsICdlbmRlZCddO1xuICAgICAgICBjb25zdCBfZXZlbnRIYW5kbGVyczogRXZlbnRIYW5kbGVyTGlzdCA9IHt9O1xuICAgICAgICBjb25zdCBfdG9wUmlnaHQ6IFBvaW50ID0geyB4OiAwLCB5OiAwLCB0eXBlOiAnUG9pbnQnIH07XG4gICAgICAgIGNvbnN0IF9jYW52YXNTaXplOiBYWVNpemUgPSB7IHg6IDAsIHk6IDAsIHR5cGU6ICdYWVNpemUnIH07XG5cbiAgICAgICAgZnVuY3Rpb24gbG9hZEltYWdlcygpOiB2b2lkIHtcbiAgICAgICAgICAgIGxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgSW1hZ2VMb2FkZXIubG9hZChiYXNlVXJsLCAoaW1nczogQXJyYXk8eyB0YWdzOiBhbnk7IGltZzogSFRNTEltYWdlRWxlbWVudH0+KSA9PiB7XG4gICAgICAgICAgICAgICAgaW1nQXJyYXkgPSBpbWdzO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgICBpZiAoaW1nc1swXS50YWdzICYmIGltZ3NbMF0udGFncy5vcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaW1nc1swXS50YWdzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gaW1nc1swXS5pbWcud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBpbWdzWzBdLmltZy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gaW1nc1swXS5pbWcuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkV2lkdGggPSBfY29uZmlnPy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gX2NvbmZpZy5zaXplIDogTWF0aC5mbG9vcigod2lkdGggLyBoZWlnaHQpICogX2NvbmZpZy5zaXplKSA6IHdpZHRoO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBfY29uZmlnPy5zaXplID8gd2lkdGggLyBoZWlnaHQgPiAxID8gTWF0aC5mbG9vcigoaGVpZ2h0IC8gd2lkdGgpICogX2NvbmZpZy5zaXplKSA6IF9jb25maWcuc2l6ZSA6IGhlaWdodDtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS54ID0gY2FsY3VsYXRlZFdpZHRoO1xuICAgICAgICAgICAgICAgIF9jYW52YXNTaXplLnkgPSBjYWxjdWxhdGVkSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZnJhbWVJZHggPSAwO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hFdmVudCgnY2FucmVjb3JkJywgW10pO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSwgb2Zmc2V0LCBzaXplLCBfY29uZmlnPy5zZXF1ZW5jZSwgX2NvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwdWJsaXNoRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgICAgICAgICAgIGxldCBqO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBfZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdO1xuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMgJiYgaGFuZGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoYW5kbGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmFwcGx5KGlucHV0U3RyZWFtLCBhcmdzIGFzIGFueSk7IC8vIFRPRE86IHR5cGVzY3JpcHQgY29tcGxhaW5zIHRoYXQgYW55W10gaXMgbm90IHZhbGlkIGZvciBhIHNlY29uZCBhcmcgZm9yIGFwcGx5PyFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhbnkgY29kZSBzaGFyZWQgd2l0aCB0aGUgZmlyc3QgSW5wdXRTdHJlYW0gYWJvdmUgc2hvdWxkIGJlIHNoYXJlZCBub3QgY29waWVkXG4gICAgICAgIC8vIFRPRE86IHB1Ymxpc2hFdmVudCBuZWVkcyBhY2Nlc3MgdG8gaW5wdXRTdHJlYW0sIGJ1dCBpbnB1dFN0cmVhbSBuZWVkcyBhY2Nlc3MgdG8gcHVibGlzaEV2ZW50XG4gICAgICAgIC8vIFRPRE86IFRoaXMgaXMgd2h5IGl0J3MgYSAndmFyJywgc28gaXQgaG9pc3RzIGJhY2suICBUaGlzIGlzIHVnbHksIGFuZCBzaG91bGQgYmUgY2hhbmdlZC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhcix2YXJzLW9uLXRvcFxuICAgICAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtID0ge1xuXG4gICAgICAgICAgICB0cmlnZ2VyOiBwdWJsaXNoRXZlbnQsXG5cbiAgICAgICAgICAgIGdldFdpZHRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVkV2lkdGg7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRIZWlnaHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRIZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRXaWR0aChuZXdXaWR0aCkge1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SGVpZ2h0KG5ld0hlaWdodCkge1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRSZWFsV2lkdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0UmVhbEhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SW5wdXRTdHJlYW0oc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgICAgICAgIF9jb25maWcgPSBzdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uc2VxdWVuY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmwgPSBzdHJlYW0uc3JjO1xuICAgICAgICAgICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAgICAgICBiYXNlVXJsID0gc3RyZWFtLnNyYztcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0cmVhbS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvYWRJbWFnZXMoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVuZGVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRlZDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZSgpIHt9LFxuXG4gICAgICAgICAgICBnZXRDb25maWcoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb25maWc7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGxheSgpIHtcbiAgICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldEN1cnJlbnRUaW1lKHRpbWUpIHtcbiAgICAgICAgICAgICAgICBmcmFtZUlkeCA9IHRpbWU7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9ldmVudE5hbWVzLmluZGV4T2YoZXZlbnQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9ldmVudEhhbmRsZXJzW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2V2ZW50SGFuZGxlcnNbZXZlbnRdLnB1c2goZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2xlYXJFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKF9ldmVudEhhbmRsZXJzKS5mb3JFYWNoKChpbmQpID0+IGRlbGV0ZSBfZXZlbnRIYW5kbGVyc1tpbmRdKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldFRvcFJpZ2h0KHRvcFJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgX3RvcFJpZ2h0LnggPSB0b3BSaWdodC54O1xuICAgICAgICAgICAgICAgIF90b3BSaWdodC55ID0gdG9wUmlnaHQueTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFRvcFJpZ2h0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdG9wUmlnaHQ7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXRDYW52YXNTaXplKGNhbnZhc1NpemUpIHtcbiAgICAgICAgICAgICAgICBfY2FudmFzU2l6ZS54ID0gY2FudmFzU2l6ZS54O1xuICAgICAgICAgICAgICAgIF9jYW52YXNTaXplLnkgPSBjYW52YXNTaXplLnk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRDYW52YXNTaXplKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY2FudmFzU2l6ZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEZyYW1lKCkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFtZTtcblxuICAgICAgICAgICAgICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gaW1nQXJyYXk/LltmcmFtZUlkeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZUlkeCA8IChzaXplIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSWR4Kys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaEV2ZW50KCdlbmRlZCcsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLXJldHVyblxuICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpbnB1dFN0cmVhbTtcbiAgICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgaW5wdXRTdHJlYW1GYWN0b3J5O1xuIiwiLyoqXG4gKiBodHRwOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9UaXBzLzQwNzE3Mi9Db25uZWN0ZWQtQ29tcG9uZW50LUxhYmVsaW5nLWFuZC1WZWN0b3JpemF0aW9uXG4gKi9cbmNvbnN0IFRyYWNlciA9IHtcbiAgICBzZWFyY2hEaXJlY3Rpb25zOiBbWzAsIDFdLCBbMSwgMV0sIFsxLCAwXSwgWzEsIC0xXSwgWzAsIC0xXSwgWy0xLCAtMV0sIFstMSwgMF0sIFstMSwgMV1dLFxuICAgIGNyZWF0ZShpbWFnZVdyYXBwZXIsIGxhYmVsV3JhcHBlcikge1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZVdyYXBwZXIuZGF0YTtcbiAgICAgICAgY29uc3QgbGFiZWxEYXRhID0gbGFiZWxXcmFwcGVyLmRhdGE7XG4gICAgICAgIGNvbnN0IHsgc2VhcmNoRGlyZWN0aW9ucyB9ID0gdGhpcztcbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgICAgICBsZXQgcG9zO1xuXG4gICAgICAgIGZ1bmN0aW9uIHRyYWNlKGN1cnJlbnQsIGNvbG9yLCBsYWJlbCwgZWRnZWxhYmVsKSB7XG4gICAgICAgICAgICBsZXQgaTtcbiAgICAgICAgICAgIGxldCB5O1xuICAgICAgICAgICAgbGV0IHg7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWFyY2hEaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgeSA9IGN1cnJlbnQuY3kgKyBzZWFyY2hEaXJlY3Rpb25zW2N1cnJlbnQuZGlyXVswXTtcbiAgICAgICAgICAgICAgICB4ID0gY3VycmVudC5jeCArIHNlYXJjaERpcmVjdGlvbnNbY3VycmVudC5kaXJdWzFdO1xuICAgICAgICAgICAgICAgIHBvcyA9IHkgKiB3aWR0aCArIHg7XG4gICAgICAgICAgICAgICAgaWYgKChpbWFnZURhdGFbcG9zXSA9PT0gY29sb3IpICYmICgobGFiZWxEYXRhW3Bvc10gPT09IDApIHx8IChsYWJlbERhdGFbcG9zXSA9PT0gbGFiZWwpKSkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbERhdGFbcG9zXSA9IGxhYmVsO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmN5ID0geTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5jeCA9IHg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFiZWxEYXRhW3Bvc10gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxEYXRhW3Bvc10gPSBlZGdlbGFiZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZGlyID0gKGN1cnJlbnQuZGlyICsgMSkgJSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdmVydGV4MkQoeCwgeSwgZGlyKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICBwcmV2OiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNvbnRvdXJUcmFjaW5nKHN5LCBzeCwgbGFiZWwsIGNvbG9yLCBlZGdlbGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBGdiA9IG51bGw7XG4gICAgICAgICAgICBsZXQgQ3Y7XG4gICAgICAgICAgICBsZXQgUDtcbiAgICAgICAgICAgIGxldCBsZGlyO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICBjeDogc3gsXG4gICAgICAgICAgICAgICAgY3k6IHN5LFxuICAgICAgICAgICAgICAgIGRpcjogMCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCkpIHtcbiAgICAgICAgICAgICAgICBGdiA9IHZlcnRleDJEKHN4LCBzeSwgY3VycmVudC5kaXIpO1xuICAgICAgICAgICAgICAgIEN2ID0gRnY7XG4gICAgICAgICAgICAgICAgbGRpciA9IGN1cnJlbnQuZGlyO1xuICAgICAgICAgICAgICAgIFAgPSB2ZXJ0ZXgyRChjdXJyZW50LmN4LCBjdXJyZW50LmN5LCAwKTtcbiAgICAgICAgICAgICAgICBQLnByZXYgPSBDdjtcbiAgICAgICAgICAgICAgICBDdi5uZXh0ID0gUDtcbiAgICAgICAgICAgICAgICBQLm5leHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIEN2ID0gUDtcblxuICAgICAgICAgICAgICAgIGxldCB0b3RhbFBpeGVsQ291bnQgPSBpbWFnZVdyYXBwZXIuc2l6ZS54ICogaW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICAgICAgICAgICAgICBsZXQgcGl4ZWxDb3VudGVyID0gMDtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZGlyID0gKGN1cnJlbnQuZGlyICsgNikgJSA4O1xuICAgICAgICAgICAgICAgICAgICB0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZGlyICE9PSBjdXJyZW50LmRpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ3YuZGlyID0gY3VycmVudC5kaXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBQID0gdmVydGV4MkQoY3VycmVudC5jeCwgY3VycmVudC5jeSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBQLnByZXYgPSBDdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2Lm5leHQgPSBQO1xuICAgICAgICAgICAgICAgICAgICAgICAgUC5uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2ID0gUDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2LmRpciA9IGxkaXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdi54ID0gY3VycmVudC5jeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN2LnkgPSBjdXJyZW50LmN5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxkaXIgPSBjdXJyZW50LmRpcjtcbiAgICAgICAgICAgICAgICB9IHdoaWxlICgoY3VycmVudC5jeCAhPT0gc3ggfHwgY3VycmVudC5jeSAhPT0gc3kpICYmICsrcGl4ZWxDb3VudGVyIDwgdG90YWxQaXhlbENvdW50KTtcbiAgICAgICAgICAgICAgICBGdi5wcmV2ID0gQ3YucHJldjtcbiAgICAgICAgICAgICAgICBDdi5wcmV2Lm5leHQgPSBGdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBGdjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFjZShjdXJyZW50LCBjb2xvciwgbGFiZWwsIGVkZ2VsYWJlbCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udG91clRyYWNpbmcoc3ksIHN4LCBsYWJlbCwgY29sb3IsIGVkZ2VsYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250b3VyVHJhY2luZyhzeSwgc3gsIGxhYmVsLCBjb2xvciwgZWRnZWxhYmVsKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IChUcmFjZXIpO1xuIiwiaW1wb3J0IFRyYWNlciBmcm9tICcuL3RyYWNlcic7XG5cbi8qKlxuICogaHR0cDovL3d3dy5jb2RlcHJvamVjdC5jb20vVGlwcy80MDcxNzIvQ29ubmVjdGVkLUNvbXBvbmVudC1MYWJlbGluZy1hbmQtVmVjdG9yaXphdGlvblxuICovXG5jb25zdCBSYXN0ZXJpemVyID0ge1xuICAgIGNyZWF0ZUNvbnRvdXIyRCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpcjogbnVsbCxcbiAgICAgICAgICAgIGluZGV4OiBudWxsLFxuICAgICAgICAgICAgZmlyc3RWZXJ0ZXg6IG51bGwsXG4gICAgICAgICAgICBpbnNpZGVDb250b3VyczogbnVsbCxcbiAgICAgICAgICAgIG5leHRwZWVyOiBudWxsLFxuICAgICAgICAgICAgcHJldnBlZXI6IG51bGwsXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBDT05UT1VSX0RJUjoge1xuICAgICAgICBDV19ESVI6IDAsXG4gICAgICAgIENDV19ESVI6IDEsXG4gICAgICAgIFVOS05PV05fRElSOiAyLFxuICAgIH0sXG4gICAgRElSOiB7XG4gICAgICAgIE9VVFNJREVfRURHRTogLTMyNzY3LFxuICAgICAgICBJTlNJREVfRURHRTogLTMyNzY2LFxuICAgIH0sXG4gICAgY3JlYXRlKGltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGltYWdlV3JhcHBlci5kYXRhO1xuICAgICAgICBjb25zdCBsYWJlbERhdGEgPSBsYWJlbFdyYXBwZXIuZGF0YTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWFnZVdyYXBwZXIuc2l6ZS54O1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVdyYXBwZXIuc2l6ZS55O1xuICAgICAgICBjb25zdCB0cmFjZXIgPSBUcmFjZXIuY3JlYXRlKGltYWdlV3JhcHBlciwgbGFiZWxXcmFwcGVyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFzdGVyaXplKGRlcHRobGFiZWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sb3I7XG4gICAgICAgICAgICAgICAgbGV0IGJjO1xuICAgICAgICAgICAgICAgIGxldCBsYztcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxpbmRleDtcbiAgICAgICAgICAgICAgICBsZXQgY3g7XG4gICAgICAgICAgICAgICAgbGV0IGN5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yTWFwID0gW107XG4gICAgICAgICAgICAgICAgbGV0IHZlcnRleDtcbiAgICAgICAgICAgICAgICBsZXQgcDtcbiAgICAgICAgICAgICAgICBsZXQgY2M7XG4gICAgICAgICAgICAgICAgbGV0IHNjO1xuICAgICAgICAgICAgICAgIGxldCBwb3M7XG4gICAgICAgICAgICAgICAgbGV0IGNvbm5lY3RlZENvdW50ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaTtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0MDA7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb2xvck1hcFtpXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29sb3JNYXBbMF0gPSBpbWFnZURhdGFbMF07XG4gICAgICAgICAgICAgICAgY2MgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAoY3kgPSAxOyBjeSA8IGhlaWdodCAtIDE7IGN5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxpbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3JNYXBbMF07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY3ggPSAxOyBjeCA8IHdpZHRoIC0gMTsgY3grKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gY3kgKiB3aWR0aCArIGN4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsRGF0YVtwb3NdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBpbWFnZURhdGFbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IgIT09IGJjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYyA9IGNvbm5lY3RlZENvdW50ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwW2xjXSA9IGNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleCA9IHRyYWNlci5jb250b3VyVHJhY2luZyhjeSwgY3gsIGxjLCBjb2xvciwgUmFzdGVyaXplci5ESVIuT1VUU0lERV9FREdFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsaW5kZXggPSBsYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gUmFzdGVyaXplci5jcmVhdGVDb250b3VyMkQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmRpciA9IFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ1dfRElSO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5kZXggPSBsYWJlbGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZmlyc3RWZXJ0ZXggPSB2ZXJ0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uZXh0cGVlciA9IGNjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5zaWRlQ29udG91cnMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5wcmV2cGVlciA9IHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleCA9IHRyYWNlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250b3VyVHJhY2luZyhjeSwgY3gsIFJhc3Rlcml6ZXIuRElSLklOU0lERV9FREdFLCBjb2xvciwgbGFiZWxpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVydGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IFJhc3Rlcml6ZXIuY3JlYXRlQ29udG91cjJEKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5maXJzdFZlcnRleCA9IHZlcnRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmluc2lkZUNvbnRvdXJzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGhsYWJlbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmRpciA9IFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ0NXX0RJUjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmRpciA9IFJhc3Rlcml6ZXIuQ09OVE9VUl9ESVIuQ1dfRElSO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmluZGV4ID0gZGVwdGhsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IGNjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoc2MgIT09IG51bGwpICYmIHNjLmluZGV4ICE9PSBsYWJlbGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjID0gc2MubmV4dHBlZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLm5leHRwZWVyID0gc2MuaW5zaWRlQ29udG91cnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYy5pbnNpZGVDb250b3VycyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MuaW5zaWRlQ29udG91cnMucHJldnBlZXIgPSBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLmluc2lkZUNvbnRvdXJzID0gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbERhdGFbcG9zXSA9IGxhYmVsaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYWJlbERhdGFbcG9zXSA9PT0gUmFzdGVyaXplci5ESVIuT1VUU0lERV9FREdFXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxhYmVsRGF0YVtwb3NdID09PSBSYXN0ZXJpemVyLkRJUi5JTlNJREVfRURHRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbERhdGFbcG9zXSA9PT0gUmFzdGVyaXplci5ESVIuSU5TSURFX0VER0UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMgPSBpbWFnZURhdGFbcG9zXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYyA9IGNvbG9yTWFwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxpbmRleCA9IGxhYmVsRGF0YVtwb3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjID0gY29sb3JNYXBbbGFiZWxpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2MgPSBjYztcbiAgICAgICAgICAgICAgICB3aGlsZSAoc2MgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2MuaW5kZXggPSBkZXB0aGxhYmVsO1xuICAgICAgICAgICAgICAgICAgICBzYyA9IHNjLm5leHRwZWVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjYyxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IGNvbm5lY3RlZENvdW50LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVidWc6IHtcbiAgICAgICAgICAgICAgICBkcmF3Q29udG91cihjYW52YXMsIGZpcnN0Q29udG91cikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBxID0gZmlyc3RDb250b3VyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcDtcblxuICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmVkJztcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZWQnO1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlxID0gcHEuaW5zaWRlQ29udG91cnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpcSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBpcTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcSA9IGlxLm5leHRwZWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcHE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHEgPSBwcS5uZXh0cGVlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXEgPSBwcS5pbnNpZGVDb250b3VycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHEuZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSYXN0ZXJpemVyLkNPTlRPVVJfRElSLkNXX0RJUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmFzdGVyaXplci5DT05UT1VSX0RJUi5DQ1dfRElSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmFzdGVyaXplci5DT05UT1VSX0RJUi5VTktOT1dOX0RJUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBxLmZpcnN0VmVydGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhwLngsIHAueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgubGluZVRvKHAueCwgcC55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHAgIT09IHEuZmlyc3RWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3Rlcml6ZXI7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuLyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG4vKiBAcHJlc2VydmUgQVNNIEJFR0lOICovXG4vKipcbiAqIE1vcnBob2xvZ2ljYWwgc2tlbGV0b25pemF0aW9uIHVzaW5nIGl0ZXJhdGl2ZSB0aGlubmluZyBhbGdvcml0aG0uXG4gKiBSZWR1Y2VzIGJpbmFyeSBpbWFnZXMgdG8gc2luZ2xlLXBpeGVsLXdpZGUgc2tlbGV0b25zIHdoaWxlIHByZXNlcnZpbmcgdG9wb2xvZ3kuXG4gKlxuICogTWVtb3J5IGxheW91dCBpbiBzaGFyZWQgQXJyYXlCdWZmZXIgKDQgcmVnaW9ucyBvZiBzaXplwrIpOlxuICogLSBSZWdpb24gMDogV29ya2luZyBpbWFnZSAoc3ViSW1hZ2VQdHIgPSAwKVxuICogLSBSZWdpb24gMTogRXJvZGVkIHJlc3VsdCAoZXJvZGVkSW1hZ2VQdHIgPSBzaXplwrIpXG4gKiAtIFJlZ2lvbiAyOiBUZW1wL3NjcmF0Y2ggc3BhY2UgKHRlbXBJbWFnZVB0ciA9IDIqc2l6ZcKyKVxuICogLSBSZWdpb24gMzogRmluYWwgc2tlbGV0b24gb3V0cHV0IChza2VsSW1hZ2VQdHIgPSAzKnNpemXCsilcbiAqL1xuZnVuY3Rpb24gU2tlbGV0b25pemVyKHN0ZGxpYiwgZm9yZWlnbiwgYnVmZmVyKSB7XG4gICAgJ3VzZSBhc20nO1xuXG4gICAgdmFyIGltYWdlcyA9IG5ldyBzdGRsaWIuVWludDhBcnJheShidWZmZXIpO1xuICAgIHZhciBzaXplID0gZm9yZWlnbi5zaXplIHwgMDtcbiAgICB2YXIgaW11bCA9IHN0ZGxpYi5NYXRoLmltdWw7XG5cbiAgICAvKipcbiAgICAgKiBNb3JwaG9sb2dpY2FsIGVyb3Npb24gd2l0aCA1LXBpeGVsIGNyb3NzIHN0cnVjdHVyaW5nIGVsZW1lbnQuXG4gICAgICogQSBwaXhlbCBzdXJ2aXZlcyBvbmx5IGlmIGFsbCA1IHBpeGVscyBpbiB0aGUgY3Jvc3MgcGF0dGVybiBhcmUgc2V0OlxuICAgICAqIHRvcC1sZWZ0LCB0b3AtcmlnaHQsIGNlbnRlciwgYm90dG9tLWxlZnQsIGJvdHRvbS1yaWdodC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcm9kZShpbkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBpbkltYWdlUHRyID0gaW5JbWFnZVB0ciB8IDA7XG4gICAgICAgIG91dEltYWdlUHRyID0gb3V0SW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciB2ID0gMDtcbiAgICAgICAgdmFyIHUgPSAwO1xuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgdmFyIHlTdGFydDEgPSAwO1xuICAgICAgICB2YXIgeVN0YXJ0MiA9IDA7XG4gICAgICAgIHZhciB4U3RhcnQxID0gMDtcbiAgICAgICAgdmFyIHhTdGFydDIgPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcblxuICAgICAgICBmb3IgKHYgPSAxOyAodiB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdiA9ICh2ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgZm9yICh1ID0gMTsgKHUgfCAwKSA8ICgoc2l6ZSAtIDEpIHwgMCk7IHUgPSAodSArIDEpIHwgMCkge1xuICAgICAgICAgICAgICAgIHlTdGFydDEgPSAob2Zmc2V0IC0gc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHlTdGFydDIgPSAob2Zmc2V0ICsgc2l6ZSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDEgPSAodSAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgICB4U3RhcnQyID0gKHUgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgc3VtID0gKChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQxICsgeFN0YXJ0MSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQyKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSB8IDApXG4gICAgICAgICAgICAgICAgICAgICsgKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDIgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDIpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICAgICAgICAgIC8vIFBpeGVsIHN1cnZpdmVzIGVyb3Npb24gb25seSBpZiBhbGwgNSBjcm9zcyBuZWlnaGJvcnMgYXJlIHNldFxuICAgICAgICAgICAgICAgIGlmICgoc3VtIHwgMCkgPT0gKDUgfCAwKSkge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgb2Zmc2V0ICsgdSkgfCAwXSA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBpeGVsLXdpc2Ugc3VidHJhY3Rpb246IG91dCA9IGEgLSBiIChjYXB0dXJlcyB0aGUgXCJwZWVsZWRcIiBsYXllcilcbiAgICBmdW5jdGlvbiBzdWJ0cmFjdChhSW1hZ2VQdHIsIGJJbWFnZVB0ciwgb3V0SW1hZ2VQdHIpIHtcbiAgICAgICAgYUltYWdlUHRyID0gYUltYWdlUHRyIHwgMDtcbiAgICAgICAgYkltYWdlUHRyID0gYkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKG91dEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID0gKChpbWFnZXNbKGFJbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApIC0gKGltYWdlc1soYkltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBpeGVsLXdpc2UgT1I6IG91dCA9IGEgfCBiIChhY2N1bXVsYXRlcyBza2VsZXRvbiBsYXllcnMpXG4gICAgZnVuY3Rpb24gYml0d2lzZU9yKGFJbWFnZVB0ciwgYkltYWdlUHRyLCBvdXRJbWFnZVB0cikge1xuICAgICAgICBhSW1hZ2VQdHIgPSBhSW1hZ2VQdHIgfCAwO1xuICAgICAgICBiSW1hZ2VQdHIgPSBiSW1hZ2VQdHIgfCAwO1xuICAgICAgICBvdXRJbWFnZVB0ciA9IG91dEltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gPSAoKGltYWdlc1soYUltYWdlUHRyICsgbGVuZ3RoKSB8IDBdIHwgMCkgfCAoaW1hZ2VzWyhiSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ291bnRzIG5vbi16ZXJvIHBpeGVscyB0byBkZXRlY3Qgd2hlbiBlcm9zaW9uIGlzIGNvbXBsZXRlXG4gICAgZnVuY3Rpb24gY291bnROb25aZXJvKGltYWdlUHRyKSB7XG4gICAgICAgIGltYWdlUHRyID0gaW1hZ2VQdHIgfCAwO1xuXG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICB2YXIgbGVuZ3RoID0gMDtcblxuICAgICAgICBsZW5ndGggPSBpbXVsKHNpemUsIHNpemUpIHwgMDtcblxuICAgICAgICB3aGlsZSAoKGxlbmd0aCB8IDApID4gMCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEpIHwgMDtcbiAgICAgICAgICAgIHN1bSA9ICgoc3VtIHwgMCkgKyAoaW1hZ2VzWyhpbWFnZVB0ciArIGxlbmd0aCkgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHN1bSB8IDApO1xuICAgIH1cblxuICAgIC8vIEZpbGxzIGltYWdlIHJlZ2lvbiB3aXRoIGEgY29uc3RhbnQgdmFsdWVcbiAgICBmdW5jdGlvbiBpbml0KGltYWdlUHRyLCB2YWx1ZSkge1xuICAgICAgICBpbWFnZVB0ciA9IGltYWdlUHRyIHwgMDtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNb3JwaG9sb2dpY2FsIGRpbGF0aW9uIHdpdGggNS1waXhlbCBjcm9zcyAtIHBpeGVsIGlzIHNldCBpZiBhbnkgbmVpZ2hib3IgaXMgc2V0XG4gICAgZnVuY3Rpb24gZGlsYXRlKGluSW1hZ2VQdHIsIG91dEltYWdlUHRyKSB7XG4gICAgICAgIGluSW1hZ2VQdHIgPSBpbkltYWdlUHRyIHwgMDtcbiAgICAgICAgb3V0SW1hZ2VQdHIgPSBvdXRJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICB2YXIgdSA9IDA7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICB2YXIgeVN0YXJ0MSA9IDA7XG4gICAgICAgIHZhciB5U3RhcnQyID0gMDtcbiAgICAgICAgdmFyIHhTdGFydDEgPSAwO1xuICAgICAgICB2YXIgeFN0YXJ0MiA9IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuXG4gICAgICAgIGZvciAodiA9IDE7ICh2IHwgMCkgPCAoKHNpemUgLSAxKSB8IDApOyB2ID0gKHYgKyAxKSB8IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICBmb3IgKHUgPSAxOyAodSB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgdSA9ICh1ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MSA9IChvZmZzZXQgLSBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeVN0YXJ0MiA9IChvZmZzZXQgKyBzaXplKSB8IDA7XG4gICAgICAgICAgICAgICAgeFN0YXJ0MSA9ICh1IC0gMSkgfCAwO1xuICAgICAgICAgICAgICAgIHhTdGFydDIgPSAodSArIDEpIHwgMDtcbiAgICAgICAgICAgICAgICBzdW0gPSAoKGltYWdlc1soaW5JbWFnZVB0ciArIHlTdGFydDEgKyB4U3RhcnQxKSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MSArIHhTdGFydDIpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdIHwgMClcbiAgICAgICAgICAgICAgICAgICAgKyAoaW1hZ2VzWyhpbkltYWdlUHRyICsgeVN0YXJ0MiArIHhTdGFydDEpIHwgMF0gfCAwKVxuICAgICAgICAgICAgICAgICAgICArIChpbWFnZXNbKGluSW1hZ2VQdHIgKyB5U3RhcnQyICsgeFN0YXJ0MikgfCAwXSB8IDApKSB8IDA7XG4gICAgICAgICAgICAgICAgaWYgKChzdW0gfCAwKSA+ICgwIHwgMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VzWyhvdXRJbWFnZVB0ciArIG9mZnNldCArIHUpIHwgMF0gPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlc1sob3V0SW1hZ2VQdHIgKyBvZmZzZXQgKyB1KSB8IDBdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb3BpZXMgaW1hZ2UgZGF0YSBmcm9tIHNyYyB0byBkc3QgcmVnaW9uXG4gICAgZnVuY3Rpb24gbWVtY3B5KHNyY0ltYWdlUHRyLCBkc3RJbWFnZVB0cikge1xuICAgICAgICBzcmNJbWFnZVB0ciA9IHNyY0ltYWdlUHRyIHwgMDtcbiAgICAgICAgZHN0SW1hZ2VQdHIgPSBkc3RJbWFnZVB0ciB8IDA7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGVuZ3RoID0gaW11bChzaXplLCBzaXplKSB8IDA7XG5cbiAgICAgICAgd2hpbGUgKChsZW5ndGggfCAwKSA+IDApIHtcbiAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGRzdEltYWdlUHRyICsgbGVuZ3RoKSB8IDBdID0gKGltYWdlc1soc3JjSW1hZ2VQdHIgKyBsZW5ndGgpIHwgMF0gfCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFplcm9zIG91dCB0aGUgYm9yZGVyIHBpeGVscyBvZiB0aGUgaW1hZ2UuXG4gICAgICogRmlyc3QgbG9vcDogaGFuZGxlcyB0b3AsIGxlZnQsIGFuZCByaWdodCBlZGdlcyBzaW11bHRhbmVvdXNseVxuICAgICAqIFNlY29uZCBsb29wOiBoYW5kbGVzIGJvdHRvbSBlZGdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gemVyb0JvcmRlcihpbWFnZVB0cikge1xuICAgICAgICBpbWFnZVB0ciA9IGltYWdlUHRyIHwgMDtcblxuICAgICAgICB2YXIgeCA9IDA7XG4gICAgICAgIHZhciB5ID0gMDtcblxuICAgICAgICBmb3IgKHggPSAwOyAoeCB8IDApIDwgKChzaXplIC0gMSkgfCAwKTsgeCA9ICh4ICsgMSkgfCAwKSB7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeCkgfCAwXSA9IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKCh5ICsgc2l6ZSkgLSAxKSB8IDA7XG4gICAgICAgICAgICBpbWFnZXNbKGltYWdlUHRyICsgeSkgfCAwXSA9IDA7XG4gICAgICAgICAgICB5ID0gKHkgKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh4ID0gMDsgKHggfCAwKSA8IChzaXplIHwgMCk7IHggPSAoeCArIDEpIHwgMCkge1xuICAgICAgICAgICAgaW1hZ2VzWyhpbWFnZVB0ciArIHkpIHwgMF0gPSAwO1xuICAgICAgICAgICAgeSA9ICh5ICsgMSkgfCAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFpbiBza2VsZXRvbml6YXRpb24gYWxnb3JpdGhtIHVzaW5nIGl0ZXJhdGl2ZSB0aGlubmluZzpcbiAgICAgKiAxLiBFcm9kZSB0aGUgd29ya2luZyBpbWFnZVxuICAgICAqIDIuIERpbGF0ZSB0aGUgZXJvZGVkIHZlcnNpb25cbiAgICAgKiAzLiBTdWJ0cmFjdCBkaWxhdGVkIGZyb20gb3JpZ2luYWwgKGV4dHJhY3RzIFwicGVlbGVkXCIgbGF5ZXIpXG4gICAgICogNC4gT1IgdGhlIHBlZWxlZCBsYXllciBpbnRvIHNrZWxldG9uIGFjY3VtdWxhdG9yXG4gICAgICogNS4gQ29weSBlcm9kZWQgaW1hZ2UgYmFjayB0byB3b3JraW5nIGltYWdlXG4gICAgICogNi4gUmVwZWF0IHVudGlsIHdvcmtpbmcgaW1hZ2UgaXMgZW1wdHlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHt2b2lkfSBObyByZXR1cm4gdmFsdWUgLSBvcGVyYXRlcyBkaXJlY3RseSBvbiBzaGFyZWQgYnVmZmVyLlxuICAgICAqICAgSW5wdXQgaW1hZ2UgaXMgcmVhZCBmcm9tIGJ1ZmZlciBvZmZzZXQgMCAoc3ViSW1hZ2VQdHIpLlxuICAgICAqICAgT3V0cHV0IHNrZWxldG9uIGlzIHdyaXR0ZW4gdG8gYnVmZmVyIG9mZnNldCAzKnNpemXCsiAoc2tlbEltYWdlUHRyKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBza2VsZXRvbml6ZSgpIHtcbiAgICAgICAgdmFyIHN1YkltYWdlUHRyID0gMDsgICAgICAgIC8vIFJlZ2lvbiAwOiBXb3JraW5nIGltYWdlIChpbnB1dCwgb2Zmc2V0ID0gMClcbiAgICAgICAgdmFyIGVyb2RlZEltYWdlUHRyID0gMDsgICAgIC8vIFJlZ2lvbiAxOiBFcm9kZWQgcmVzdWx0IChvZmZzZXQgPSBzaXplwrIpXG4gICAgICAgIHZhciB0ZW1wSW1hZ2VQdHIgPSAwOyAgICAgICAvLyBSZWdpb24gMjogU2NyYXRjaCBzcGFjZSAob2Zmc2V0ID0gMipzaXplwrIpXG4gICAgICAgIHZhciBza2VsSW1hZ2VQdHIgPSAwOyAgICAgICAvLyBSZWdpb24gMzogRmluYWwgc2tlbGV0b24gKG91dHB1dCwgb2Zmc2V0ID0gMypzaXplwrIpXG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICB2YXIgZG9uZSA9IDA7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGJ5dGUgb2Zmc2V0cyBmb3IgZWFjaCByZWdpb24gaW4gdGhlIHNoYXJlZCBidWZmZXJcbiAgICAgICAgZXJvZGVkSW1hZ2VQdHIgPSBpbXVsKHNpemUsIHNpemUpIHwgMDsgICAgICAgICAgICAgICAgICAvLyBSZWdpb24gMTogc2l6ZcKyIGJ5dGVzIGluXG4gICAgICAgIHRlbXBJbWFnZVB0ciA9IChlcm9kZWRJbWFnZVB0ciArIGVyb2RlZEltYWdlUHRyKSB8IDA7ICAvLyBSZWdpb24gMjogMipzaXplwrIgYnl0ZXMgaW5cbiAgICAgICAgc2tlbEltYWdlUHRyID0gKHRlbXBJbWFnZVB0ciArIGVyb2RlZEltYWdlUHRyKSB8IDA7ICAgIC8vIFJlZ2lvbiAzOiAzKnNpemXCsiBieXRlcyBpblxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgc2tlbGV0b24gYWNjdW11bGF0b3IgdG8gemVyb1xuICAgICAgICBpbml0KHNrZWxJbWFnZVB0ciwgMCk7XG4gICAgICAgIHplcm9Cb3JkZXIoc3ViSW1hZ2VQdHIpO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVyb2RlKHN1YkltYWdlUHRyLCBlcm9kZWRJbWFnZVB0cik7XG4gICAgICAgICAgICBkaWxhdGUoZXJvZGVkSW1hZ2VQdHIsIHRlbXBJbWFnZVB0cik7XG4gICAgICAgICAgICBzdWJ0cmFjdChzdWJJbWFnZVB0ciwgdGVtcEltYWdlUHRyLCB0ZW1wSW1hZ2VQdHIpO1xuICAgICAgICAgICAgYml0d2lzZU9yKHNrZWxJbWFnZVB0ciwgdGVtcEltYWdlUHRyLCBza2VsSW1hZ2VQdHIpO1xuICAgICAgICAgICAgbWVtY3B5KGVyb2RlZEltYWdlUHRyLCBzdWJJbWFnZVB0cik7XG4gICAgICAgICAgICBzdW0gPSBjb3VudE5vblplcm8oc3ViSW1hZ2VQdHIpIHwgMDtcbiAgICAgICAgICAgIGRvbmUgPSAoKHN1bSB8IDApID09IDAgfCAwKTtcbiAgICAgICAgfSB3aGlsZSAoIWRvbmUpO1xuICAgIH1cbiAgICByZXR1cm4geyBza2VsZXRvbml6ZTogc2tlbGV0b25pemUgfTtcbn1cbi8qIEBwcmVzZXJ2ZSBBU00gRU5EICovXG5cbmV4cG9ydCBkZWZhdWx0IFNrZWxldG9uaXplcjtcbi8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG4iLCJpbXBvcnQgeyB2ZWMyLCBtYXQyIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBJbWFnZVdyYXBwZXIgZnJvbSAnLi4vY29tbW9uL2ltYWdlX3dyYXBwZXInO1xuaW1wb3J0IHtcbiAgICBjYWxjdWxhdGVQYXRjaFNpemUsXG4gICAgb3RzdVRocmVzaG9sZCxcbiAgICBoc3YycmdiLFxuICAgIGNsdXN0ZXIsXG4gICAgdG9wR2VuZXJpYyxcbiAgICBpbWFnZVJlZixcbiAgICBoYWxmU2FtcGxlLFxuICAgIGNvbXB1dGVJbWFnZUFyZWEsXG59IGZyb20gJy4uL2NvbW1vbi9jdl91dGlscyc7XG5pbXBvcnQgQXJyYXlIZWxwZXIgZnJvbSAnLi4vY29tbW9uL2FycmF5X2hlbHBlcic7XG5pbXBvcnQgSW1hZ2VEZWJ1ZyBmcm9tICcuLi9jb21tb24vaW1hZ2VfZGVidWcnO1xuaW1wb3J0IFJhc3Rlcml6ZXIgZnJvbSAnLi9yYXN0ZXJpemVyJztcbmltcG9ydCBUcmFjZXIgZnJvbSAnLi90cmFjZXInO1xuaW1wb3J0IHNrZWxldG9uaXplciBmcm9tICcuL3NrZWxldG9uaXplcic7XG5cbmxldCBfY29uZmlnO1xubGV0IF9jdXJyZW50SW1hZ2VXcmFwcGVyO1xubGV0IF9za2VsSW1hZ2VXcmFwcGVyO1xubGV0IF9zdWJJbWFnZVdyYXBwZXI7XG5sZXQgX2xhYmVsSW1hZ2VXcmFwcGVyO1xubGV0IF9wYXRjaEdyaWQ7XG5sZXQgX3BhdGNoTGFiZWxHcmlkO1xubGV0IF9pbWFnZVRvUGF0Y2hHcmlkO1xubGV0IF9iaW5hcnlJbWFnZVdyYXBwZXI7XG5sZXQgX3BhdGNoU2l6ZTtcbmNvbnN0IF9jYW52YXNDb250YWluZXIgPSB7XG4gICAgY3R4OiB7XG4gICAgICAgIGJpbmFyeTogbnVsbCxcbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBiaW5hcnk6IG51bGwsXG4gICAgfSxcbn07XG5jb25zdCBfbnVtUGF0Y2hlcyA9IHsgeDogMCwgeTogMCB9O1xubGV0IF9pbnB1dEltYWdlV3JhcHBlcjtcbmxldCBfc2tlbGV0b25pemVyO1xuXG5mdW5jdGlvbiBpbml0QnVmZmVycygpIHtcbiAgICBpZiAoX2NvbmZpZy5oYWxmU2FtcGxlKSB7XG4gICAgICAgIF9jdXJyZW50SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgICAgeDogX2lucHV0SW1hZ2VXcmFwcGVyLnNpemUueCAvIDIgfCAwLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICAgIHk6IF9pbnB1dEltYWdlV3JhcHBlci5zaXplLnkgLyAyIHwgMCxcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2N1cnJlbnRJbWFnZVdyYXBwZXIgPSBfaW5wdXRJbWFnZVdyYXBwZXI7XG4gICAgfVxuXG4gICAgX3BhdGNoU2l6ZSA9IGNhbGN1bGF0ZVBhdGNoU2l6ZShfY29uZmlnLnBhdGNoU2l6ZSwgX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIF9udW1QYXRjaGVzLnggPSBfY3VycmVudEltYWdlV3JhcHBlci5zaXplLnggLyBfcGF0Y2hTaXplLnggfCAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgX251bVBhdGNoZXMueSA9IF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUueSAvIF9wYXRjaFNpemUueSB8IDA7XG5cbiAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyID0gbmV3IEltYWdlV3JhcHBlcihfY3VycmVudEltYWdlV3JhcHBlci5zaXplLCB1bmRlZmluZWQsIFVpbnQ4QXJyYXksIGZhbHNlKTtcblxuICAgIF9sYWJlbEltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIoX3BhdGNoU2l6ZSwgdW5kZWZpbmVkLCBBcnJheSwgdHJ1ZSk7XG5cbiAgICBjb25zdCBza2VsZXRvbkltYWdlRGF0YSA9IG5ldyBBcnJheUJ1ZmZlcig2NCAqIDEwMjQpO1xuICAgIF9zdWJJbWFnZVdyYXBwZXIgPSBuZXcgSW1hZ2VXcmFwcGVyKF9wYXRjaFNpemUsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KHNrZWxldG9uSW1hZ2VEYXRhLCAwLCBfcGF0Y2hTaXplLnggKiBfcGF0Y2hTaXplLnkpKTtcbiAgICBfc2tlbEltYWdlV3JhcHBlciA9IG5ldyBJbWFnZVdyYXBwZXIoX3BhdGNoU2l6ZSxcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2tlbGV0b25JbWFnZURhdGEsIF9wYXRjaFNpemUueCAqIF9wYXRjaFNpemUueSAqIDMsIF9wYXRjaFNpemUueCAqIF9wYXRjaFNpemUueSksXG4gICAgICAgIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgX3NrZWxldG9uaXplciA9IHNrZWxldG9uaXplcihcbiAgICAgICAgeyBNYXRoLCBVaW50OEFycmF5IH0sXG4gICAgICAgIHsgc2l6ZTogX3BhdGNoU2l6ZS54IH0sXG4gICAgICAgIHNrZWxldG9uSW1hZ2VEYXRhLFxuICAgICk7XG5cbiAgICBfaW1hZ2VUb1BhdGNoR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoe1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICB4OiAoX2N1cnJlbnRJbWFnZVdyYXBwZXIuc2l6ZS54IC8gX3N1YkltYWdlV3JhcHBlci5zaXplLngpIHwgMCxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgeTogKF9jdXJyZW50SW1hZ2VXcmFwcGVyLnNpemUueSAvIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS55KSB8IDAsXG4gICAgfSwgdW5kZWZpbmVkLCBBcnJheSwgdHJ1ZSk7XG4gICAgX3BhdGNoR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoX2ltYWdlVG9QYXRjaEdyaWQuc2l6ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgIF9wYXRjaExhYmVsR3JpZCA9IG5ldyBJbWFnZVdyYXBwZXIoX2ltYWdlVG9QYXRjaEdyaWQuc2l6ZSwgdW5kZWZpbmVkLCBJbnQzMkFycmF5LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gaW5pdENhbnZhcygpIHtcbiAgICBpZiAoX2NvbmZpZy51c2VXb3JrZXIgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIF9jYW52YXNDb250YWluZXIuZG9tLmJpbmFyeS5jbGFzc05hbWUgPSAnYmluYXJ5QnVmZmVyJztcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd0NhbnZhcyA9PT0gdHJ1ZSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGVidWcnKS5hcHBlbmRDaGlsZChfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkpO1xuICAgIH1cbiAgICBjb25zdCB3aWxsUmVhZEZyZXF1ZW50bHkgPSAhIV9jb25maWcud2lsbFJlYWRGcmVxdWVudGx5O1xuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zz8uc2hvd0NhbnZhcykge1xuICAgICAgICBjb25zb2xlLndhcm4oJyogaW5pdENhbnZhcyB3aWxsUmVhZEZyZXF1ZW50bHknLCB3aWxsUmVhZEZyZXF1ZW50bHksIF9jb25maWcpO1xuICAgIH1cbiAgICBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnkgPSBfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseSB9KTtcbiAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkud2lkdGggPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnkuaGVpZ2h0ID0gX2JpbmFyeUltYWdlV3JhcHBlci5zaXplLnk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJvdW5kaW5nIGJveCB3aGljaCBlbmNsb3NlcyBhbGwgdGhlIGdpdmVuIHBhdGNoZXNcbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG1pbmltYWwgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGJveEZyb21QYXRjaGVzKHBhdGNoZXMpIHtcbiAgICBsZXQgb3ZlckF2ZztcbiAgICBsZXQgaTtcbiAgICBsZXQgajtcbiAgICBsZXQgcGF0Y2g7XG4gICAgbGV0IHRyYW5zTWF0O1xuICAgIGxldCBtaW54ID0gX2JpbmFyeUltYWdlV3JhcHBlci5zaXplLng7XG4gICAgbGV0IG1pbnkgPSBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICBsZXQgbWF4eCA9IC1fYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueDtcbiAgICBsZXQgbWF4eSA9IC1fYmluYXJ5SW1hZ2VXcmFwcGVyLnNpemUueTtcbiAgICBsZXQgYm94O1xuICAgIGxldCBzY2FsZTtcblxuICAgIC8vIGRyYXcgYWxsIHBhdGNoZXMgd2hpY2ggYXJlIHRvIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgIG92ZXJBdmcgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgICAgb3ZlckF2ZyArPSBwYXRjaC5yYWQ7XG4gICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93UGF0Y2hlcykge1xuICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LCB7IGNvbG9yOiAncmVkJyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJBdmcgLz0gcGF0Y2hlcy5sZW5ndGg7XG4gICAgb3ZlckF2ZyA9IChvdmVyQXZnICogMTgwIC8gTWF0aC5QSSArIDkwKSAlIDE4MCAtIDkwO1xuICAgIGlmIChvdmVyQXZnIDwgMCkge1xuICAgICAgICBvdmVyQXZnICs9IDE4MDtcbiAgICB9XG5cbiAgICBvdmVyQXZnID0gKDE4MCAtIG92ZXJBdmcpICogTWF0aC5QSSAvIDE4MDtcbiAgICB0cmFuc01hdCA9IG1hdDIuY29weShtYXQyLmNyZWF0ZSgpLCBbTWF0aC5jb3Mob3ZlckF2ZyksIE1hdGguc2luKG92ZXJBdmcpLCAtTWF0aC5zaW4ob3ZlckF2ZyksIE1hdGguY29zKG92ZXJBdmcpXSk7XG5cbiAgICAvLyBpdGVyYXRlIG92ZXIgcGF0Y2hlcyBhbmQgcm90YXRlIGJ5IGFuZ2xlXG4gICAgZm9yIChpID0gMDsgaSA8IHBhdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDIocGF0Y2guYm94W2pdLCBwYXRjaC5ib3hbal0sIHRyYW5zTWF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93VHJhbnNmb3JtZWQpIHtcbiAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgocGF0Y2guYm94LCB7IHg6IDAsIHk6IDEgfSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LCB7IGNvbG9yOiAnIzk5ZmYwMCcsIGxpbmVXaWR0aDogMiB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZpbmQgYm91bmRpbmcgYm94XG4gICAgZm9yIChpID0gMDsgaSA8IHBhdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcGF0Y2ggPSBwYXRjaGVzW2ldO1xuICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzBdIDwgbWlueCkge1xuICAgICAgICAgICAgICAgIG1pbnggPSBwYXRjaC5ib3hbal1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzBdID4gbWF4eCkge1xuICAgICAgICAgICAgICAgIG1heHggPSBwYXRjaC5ib3hbal1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzFdIDwgbWlueSkge1xuICAgICAgICAgICAgICAgIG1pbnkgPSBwYXRjaC5ib3hbal1bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF0Y2guYm94W2pdWzFdID4gbWF4eSkge1xuICAgICAgICAgICAgICAgIG1heHkgPSBwYXRjaC5ib3hbal1bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBib3ggPSBbW21pbngsIG1pbnldLCBbbWF4eCwgbWlueV0sIFttYXh4LCBtYXh5XSwgW21pbngsIG1heHldXTtcblxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5ib3hGcm9tUGF0Y2hlcy5zaG93VHJhbnNmb3JtZWRCb3gpIHtcbiAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UGF0aChib3gsIHsgeDogMCwgeTogMSB9LCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksIHsgY29sb3I6ICcjZmYwMDAwJywgbGluZVdpZHRoOiAyIH0pO1xuICAgIH1cblxuICAgIHNjYWxlID0gX2NvbmZpZy5oYWxmU2FtcGxlID8gMiA6IDE7XG4gICAgLy8gcmV2ZXJzZSByb3RhdGlvbjtcbiAgICB0cmFuc01hdCA9IG1hdDIuaW52ZXJ0KHRyYW5zTWF0LCB0cmFuc01hdCk7XG4gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICB2ZWMyLnRyYW5zZm9ybU1hdDIoYm94W2pdLCBib3hbal0sIHRyYW5zTWF0KTtcbiAgICB9XG5cbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuYm94RnJvbVBhdGNoZXMuc2hvd0JCKSB7XG4gICAgICAgIEltYWdlRGVidWcuZHJhd1BhdGgoYm94LCB7IHg6IDAsIHk6IDEgfSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LCB7IGNvbG9yOiAnI2ZmMDAwMCcsIGxpbmVXaWR0aDogMiB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgIHZlYzIuc2NhbGUoYm94W2pdLCBib3hbal0sIHNjYWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm94O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaW5hcnkgaW1hZ2Ugb2YgdGhlIGN1cnJlbnQgaW1hZ2VcbiAqL1xuZnVuY3Rpb24gYmluYXJpemVJbWFnZSgpIHtcbiAgICBvdHN1VGhyZXNob2xkKF9jdXJyZW50SW1hZ2VXcmFwcGVyLCBfYmluYXJ5SW1hZ2VXcmFwcGVyKTtcbiAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyLnplcm9Cb3JkZXIoKTtcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd0NhbnZhcykge1xuICAgICAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyLnNob3coX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LCAyNTUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgdGhlIGVudGlyZSBpbWFnZVxuICogZXh0cmFjdCBwYXRjaGVzXG4gKi9cbmZ1bmN0aW9uIGZpbmRQYXRjaGVzKCkge1xuICAgIGxldCBpO1xuICAgIGxldCBqO1xuICAgIGxldCB4O1xuICAgIGxldCB5O1xuICAgIGxldCBtb21lbnRzO1xuICAgIGxldCBwYXRjaGVzRm91bmQgPSBbXTtcbiAgICBsZXQgcmFzdGVyaXplcjtcbiAgICBsZXQgcmFzdGVyUmVzdWx0O1xuICAgIGxldCBwYXRjaDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgX251bVBhdGNoZXMueDsgaSsrKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBfbnVtUGF0Y2hlcy55OyBqKyspIHtcbiAgICAgICAgICAgIHggPSBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueCAqIGk7XG4gICAgICAgICAgICB5ID0gX3N1YkltYWdlV3JhcHBlci5zaXplLnkgKiBqO1xuXG4gICAgICAgICAgICAvLyBzZXBlcmF0ZSBwYXJ0c1xuICAgICAgICAgICAgc2tlbGV0b25pemUoeCwgeSk7XG5cbiAgICAgICAgICAgIC8vIFJhc3Rlcml6ZSwgZmluZCBpbmRpdmlkdWFsIGJhcnNcbiAgICAgICAgICAgIF9za2VsSW1hZ2VXcmFwcGVyLnplcm9Cb3JkZXIoKTtcbiAgICAgICAgICAgIEFycmF5SGVscGVyLmluaXQoX2xhYmVsSW1hZ2VXcmFwcGVyLmRhdGEsIDApO1xuICAgICAgICAgICAgcmFzdGVyaXplciA9IFJhc3Rlcml6ZXIuY3JlYXRlKF9za2VsSW1hZ2VXcmFwcGVyLCBfbGFiZWxJbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgcmFzdGVyUmVzdWx0ID0gcmFzdGVyaXplci5yYXN0ZXJpemUoMCk7XG5cbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93TGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgX2xhYmVsSW1hZ2VXcmFwcGVyLm92ZXJsYXkoX2NhbnZhc0NvbnRhaW5lci5kb20uYmluYXJ5LCBNYXRoLmZsb29yKDM2MCAvIHJhc3RlclJlc3VsdC5jb3VudCksXG4gICAgICAgICAgICAgICAgICAgIHsgeCwgeSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIG1vbWVudHMgZnJvbSB0aGUgc2tlbGV0b25pemVkIHBhdGNoXG4gICAgICAgICAgICBtb21lbnRzID0gX2xhYmVsSW1hZ2VXcmFwcGVyLm1vbWVudHMocmFzdGVyUmVzdWx0LmNvdW50KTtcblxuICAgICAgICAgICAgLy8gZXh0cmFjdCBlbGlnaWJsZSBwYXRjaGVzXG4gICAgICAgICAgICBwYXRjaGVzRm91bmQgPSBwYXRjaGVzRm91bmQuY29uY2F0KGRlc2NyaWJlUGF0Y2gobW9tZW50cywgW2ksIGpdLCB4LCB5KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd0ZvdW5kUGF0Y2hlcykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGF0Y2hlc0ZvdW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXRjaCA9IHBhdGNoZXNGb3VuZFtpXTtcbiAgICAgICAgICAgIEltYWdlRGVidWcuZHJhd1JlY3QocGF0Y2gucG9zLCBfc3ViSW1hZ2VXcmFwcGVyLnNpemUsIF9jYW52YXNDb250YWluZXIuY3R4LmJpbmFyeSxcbiAgICAgICAgICAgICAgICB7IGNvbG9yOiAnIzk5ZmYwMCcsIGxpbmVXaWR0aDogMiB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRjaGVzRm91bmQ7XG59XG5cbi8qKlxuICogRmluZHMgdGhvc2UgY29ubmVjdGVkIGFyZWFzIHdoaWNoIGNvbnRhaW4gYXQgbGVhc3QgNiBwYXRjaGVzXG4gKiBhbmQgcmV0dXJucyB0aGVtIG9yZGVyZWQgREVTQyBieSB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lZCBwYXRjaGVzXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4TGFiZWxcbiAqL1xuZnVuY3Rpb24gZmluZEJpZ2dlc3RDb25uZWN0ZWRBcmVhcyhtYXhMYWJlbCkge1xuICAgIGxldCBpO1xuICAgIGxldCBzdW07XG4gICAgbGV0IGxhYmVsSGlzdCA9IFtdO1xuICAgIGxldCB0b3BMYWJlbHMgPSBbXTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBtYXhMYWJlbDsgaSsrKSB7XG4gICAgICAgIGxhYmVsSGlzdC5wdXNoKDApO1xuICAgIH1cbiAgICBzdW0gPSBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7XG4gICAgd2hpbGUgKHN1bS0tKSB7XG4gICAgICAgIGlmIChfcGF0Y2hMYWJlbEdyaWQuZGF0YVtzdW1dID4gMCkge1xuICAgICAgICAgICAgbGFiZWxIaXN0W19wYXRjaExhYmVsR3JpZC5kYXRhW3N1bV0gLSAxXSsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGFiZWxIaXN0ID0gbGFiZWxIaXN0Lm1hcCgodmFsLCBpZHgpID0+ICh7XG4gICAgICAgIHZhbCxcbiAgICAgICAgbGFiZWw6IGlkeCArIDEsXG4gICAgfSkpO1xuXG4gICAgbGFiZWxIaXN0LnNvcnQoKGEsIGIpID0+IGIudmFsIC0gYS52YWwpO1xuXG4gICAgLy8gZXh0cmFjdCB0b3AgYXJlYXMgd2l0aCBhdCBsZWFzdCA2IHBhdGNoZXMgcHJlc2VudFxuICAgIHRvcExhYmVscyA9IGxhYmVsSGlzdC5maWx0ZXIoKGVsKSA9PiBlbC52YWwgPj0gNSk7XG5cbiAgICByZXR1cm4gdG9wTGFiZWxzO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGZpbmRCb3hlcyh0b3BMYWJlbHMsIG1heExhYmVsKSB7XG4gICAgbGV0IGk7XG4gICAgbGV0IGo7XG4gICAgbGV0IHN1bTtcbiAgICBjb25zdCBwYXRjaGVzID0gW107XG4gICAgbGV0IHBhdGNoO1xuICAgIGxldCBib3g7XG4gICAgY29uc3QgYm94ZXMgPSBbXTtcbiAgICBjb25zdCBoc3YgPSBbMCwgMSwgMV07XG4gICAgY29uc3QgcmdiID0gWzAsIDAsIDBdO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRvcExhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdW0gPSBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7XG4gICAgICAgIHBhdGNoZXMubGVuZ3RoID0gMDtcbiAgICAgICAgd2hpbGUgKHN1bS0tKSB7XG4gICAgICAgICAgICBpZiAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbc3VtXSA9PT0gdG9wTGFiZWxzW2ldLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2ggPSBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW3N1bV07XG4gICAgICAgICAgICAgICAgcGF0Y2hlcy5wdXNoKHBhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib3ggPSBib3hGcm9tUGF0Y2hlcyhwYXRjaGVzKTtcbiAgICAgICAgaWYgKGJveCkge1xuICAgICAgICAgICAgYm94ZXMucHVzaChib3gpO1xuXG4gICAgICAgICAgICAvLyBkcmF3IHBhdGNoLWxhYmVscyBpZiByZXF1ZXN0ZWRcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93UmVtYWluaW5nUGF0Y2hMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0Y2hlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaCA9IHBhdGNoZXNbal07XG4gICAgICAgICAgICAgICAgICAgIGhzdlswXSA9ICh0b3BMYWJlbHNbaV0ubGFiZWwgLyAobWF4TGFiZWwgKyAxKSkgKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgIGhzdjJyZ2IoaHN2LCByZ2IpO1xuICAgICAgICAgICAgICAgICAgICBJbWFnZURlYnVnLmRyYXdSZWN0KHBhdGNoLnBvcywgX3N1YkltYWdlV3JhcHBlci5zaXplLCBfY2FudmFzQ29udGFpbmVyLmN0eC5iaW5hcnksXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiBgcmdiKCR7cmdiLmpvaW4oJywnKX0pYCwgbGluZVdpZHRoOiAyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm94ZXM7XG59XG5cbi8qKlxuICogRmluZCBzaW1pbGFyIG1vbWVudHMgKHZpYSBjbHVzdGVyKVxuICogQHBhcmFtIHtPYmplY3R9IG1vbWVudHNcbiAqL1xuZnVuY3Rpb24gc2ltaWxhck1vbWVudHMobW9tZW50cykge1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3Rlcihtb21lbnRzLCAwLjkwKTtcbiAgICBjb25zdCB0b3BDbHVzdGVyID0gdG9wR2VuZXJpYyhjbHVzdGVycywgMSwgKGUpID0+IGUuZ2V0UG9pbnRzKCkubGVuZ3RoKTtcbiAgICBsZXQgcG9pbnRzID0gW107IGNvbnN0XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgIGlmICh0b3BDbHVzdGVyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBwb2ludHMgPSB0b3BDbHVzdGVyWzBdLml0ZW0uZ2V0UG9pbnRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwb2ludHNbaV0ucG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNrZWxldG9uaXplKHgsIHkpIHtcbiAgICBfYmluYXJ5SW1hZ2VXcmFwcGVyLnN1YkltYWdlQXNDb3B5KF9zdWJJbWFnZVdyYXBwZXIsIGltYWdlUmVmKHgsIHkpKTtcbiAgICBfc2tlbGV0b25pemVyLnNrZWxldG9uaXplKCk7XG5cbiAgICAvLyBTaG93IHNrZWxldG9uIGlmIHJlcXVlc3RlZFxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgX2NvbmZpZy5kZWJ1Zy5zaG93U2tlbGV0b24pIHtcbiAgICAgICAgX3NrZWxJbWFnZVdyYXBwZXIub3ZlcmxheShfY2FudmFzQ29udGFpbmVyLmRvbS5iaW5hcnksIDM2MCwgaW1hZ2VSZWYoeCwgeSkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhbmQgZGVzY3JpYmVzIHRob3NlIHBhdGNoZXMgd2hpY2ggc2VlbSB0byBjb250YWluIGEgYmFyY29kZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge0FycmF5fSBtb21lbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gcGF0Y2hQb3MsXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEByZXR1cm5zIHtBcnJheX0gbGlzdCBvZiBwYXRjaGVzXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlUGF0Y2gobW9tZW50cywgcGF0Y2hQb3MsIHgsIHkpIHtcbiAgICBsZXQgaztcbiAgICBsZXQgYXZnO1xuICAgIGNvbnN0IGVsaWdpYmxlTW9tZW50cyA9IFtdO1xuICAgIGxldCBtYXRjaGluZ01vbWVudHM7XG4gICAgbGV0IHBhdGNoO1xuICAgIGNvbnN0IHBhdGNoZXNGb3VuZCA9IFtdO1xuICAgIGNvbnN0IG1pbkNvbXBvbmVudFdlaWdodCA9IE1hdGguY2VpbChfcGF0Y2hTaXplLnggLyAzKTtcblxuICAgIGlmIChtb21lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIC8vIG9ubHkgY29sbGVjdCBtb21lbnRzIHdoaWNoJ3MgYXJlYSBjb3ZlcnMgYXQgbGVhc3QgbWluQ29tcG9uZW50V2VpZ2h0IHBpeGVscy5cbiAgICAgICAgZm9yIChrID0gMDsgayA8IG1vbWVudHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChtb21lbnRzW2tdLm0wMCA+IG1pbkNvbXBvbmVudFdlaWdodCkge1xuICAgICAgICAgICAgICAgIGVsaWdpYmxlTW9tZW50cy5wdXNoKG1vbWVudHNba10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYXQgbGVhc3QgMiBtb21lbnRzIGFyZSBmb3VuZCB3aGljaCBoYXZlIGF0IGxlYXN0IG1pbkNvbXBvbmVudFdlaWdodHMgY292ZXJlZFxuICAgICAgICBpZiAoZWxpZ2libGVNb21lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBtYXRjaGluZ01vbWVudHMgPSBzaW1pbGFyTW9tZW50cyhlbGlnaWJsZU1vbWVudHMpO1xuICAgICAgICAgICAgYXZnID0gMDtcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0aGUgc2ltaWxhcml0eSBvZiB0aGUgbW9tZW50c1xuICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG1hdGNoaW5nTW9tZW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGF2ZyArPSBtYXRjaGluZ01vbWVudHNba10/LnJhZCA/PyAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbmx5IHR3byBvZiB0aGUgbW9tZW50cyBhcmUgYWxsb3dlZCBub3QgdG8gZml0IGludG8gdGhlIGVxdWF0aW9uXG4gICAgICAgICAgICAvLyBhZGQgdGhlIHBhdGNoIHRvIHRoZSBzZXRcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ01vbWVudHMubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgICAgICAmJiBtYXRjaGluZ01vbWVudHMubGVuZ3RoID49IChlbGlnaWJsZU1vbWVudHMubGVuZ3RoIC8gNCkgKiAzXG4gICAgICAgICAgICAgICAgICAgICYmIG1hdGNoaW5nTW9tZW50cy5sZW5ndGggPiBtb21lbnRzLmxlbmd0aCAvIDQpIHtcbiAgICAgICAgICAgICAgICBhdmcgLz0gbWF0Y2hpbmdNb21lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBwYXRjaCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHBhdGNoUG9zWzFdICogX251bVBhdGNoZXMueCArIHBhdGNoUG9zWzBdLFxuICAgICAgICAgICAgICAgICAgICBwb3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBib3g6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUoW3gsIHldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUoW3ggKyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueCwgeV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi5jbG9uZShbeCArIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZS54LCB5ICsgX3N1YkltYWdlV3JhcHBlci5zaXplLnldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIuY2xvbmUoW3gsIHkgKyBfc3ViSW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBtb21lbnRzOiBtYXRjaGluZ01vbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIHJhZDogYXZnLFxuICAgICAgICAgICAgICAgICAgICB2ZWM6IHZlYzIuY2xvbmUoW01hdGguY29zKGF2ZyksIE1hdGguc2luKGF2ZyldKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBhdGNoZXNGb3VuZC5wdXNoKHBhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0Y2hlc0ZvdW5kO1xufVxuXG4vKipcbiAqIGZpbmRzIHBhdGNoZXMgd2hpY2ggYXJlIGNvbm5lY3RlZCBhbmQgc2hhcmUgdGhlIHNhbWUgb3JpZW50YXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXRjaGVzRm91bmRcbiAqL1xuZnVuY3Rpb24gcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkocGF0Y2hlc0ZvdW5kKSB7XG4gICAgbGV0IGxhYmVsID0gMDtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSAwLjk1O1xuICAgIGxldCBjdXJySWR4ID0gMDtcbiAgICBsZXQgajtcbiAgICBsZXQgcGF0Y2g7XG4gICAgY29uc3QgaHN2ID0gWzAsIDEsIDFdO1xuICAgIGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcblxuICAgIGZ1bmN0aW9uIG5vdFlldFByb2Nlc3NlZCgpIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKF9wYXRjaExhYmVsR3JpZC5kYXRhW2ldID09PSAwICYmIF9wYXRjaEdyaWQuZGF0YVtpXSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhY2UoY3VycmVudElkeCkge1xuICAgICAgICBsZXQgeDtcbiAgICAgICAgbGV0IHk7XG4gICAgICAgIGxldCBjdXJyZW50UGF0Y2g7XG4gICAgICAgIGxldCBpZHg7XG4gICAgICAgIGxldCBkaXI7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB7XG4gICAgICAgICAgICB4OiBjdXJyZW50SWR4ICUgX3BhdGNoTGFiZWxHcmlkLnNpemUueCxcbiAgICAgICAgICAgIHk6IChjdXJyZW50SWR4IC8gX3BhdGNoTGFiZWxHcmlkLnNpemUueCkgfCAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgc2ltaWxhcml0eTtcblxuICAgICAgICBpZiAoY3VycmVudElkeCA8IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY3VycmVudFBhdGNoID0gX2ltYWdlVG9QYXRjaEdyaWQuZGF0YVtjdXJyZW50SWR4XTtcbiAgICAgICAgICAgIC8vIGFzc2lnbiBsYWJlbFxuICAgICAgICAgICAgX3BhdGNoTGFiZWxHcmlkLmRhdGFbY3VycmVudElkeF0gPSBsYWJlbDtcbiAgICAgICAgICAgIGZvciAoZGlyID0gMDsgZGlyIDwgVHJhY2VyLnNlYXJjaERpcmVjdGlvbnMubGVuZ3RoOyBkaXIrKykge1xuICAgICAgICAgICAgICAgIHkgPSBjdXJyZW50LnkgKyBUcmFjZXIuc2VhcmNoRGlyZWN0aW9uc1tkaXJdWzBdO1xuICAgICAgICAgICAgICAgIHggPSBjdXJyZW50LnggKyBUcmFjZXIuc2VhcmNoRGlyZWN0aW9uc1tkaXJdWzFdO1xuICAgICAgICAgICAgICAgIGlkeCA9IHkgKiBfcGF0Y2hMYWJlbEdyaWQuc2l6ZS54ICsgeDtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIGlmIHBhdGNoIGVtcHR5XG4gICAgICAgICAgICAgICAgaWYgKF9wYXRjaEdyaWQuZGF0YVtpZHhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wYXRjaExhYmVsR3JpZC5kYXRhW2lkeF0gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKF9wYXRjaExhYmVsR3JpZC5kYXRhW2lkeF0gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2ltaWxhcml0eSA9IE1hdGguYWJzKHZlYzIuZG90KF9pbWFnZVRvUGF0Y2hHcmlkLmRhdGFbaWR4XS52ZWMsIGN1cnJlbnRQYXRjaC52ZWMpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbWlsYXJpdHkgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlKGlkeCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwcmVwYXJlIGZvciBmaW5kaW5nIHRoZSByaWdodCBwYXRjaGVzXG4gICAgQXJyYXlIZWxwZXIuaW5pdChfcGF0Y2hHcmlkLmRhdGEsIDApO1xuICAgIEFycmF5SGVscGVyLmluaXQoX3BhdGNoTGFiZWxHcmlkLmRhdGEsIDApO1xuICAgIEFycmF5SGVscGVyLmluaXQoX2ltYWdlVG9QYXRjaEdyaWQuZGF0YSwgbnVsbCk7XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgcGF0Y2hlc0ZvdW5kLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHBhdGNoID0gcGF0Y2hlc0ZvdW5kW2pdO1xuICAgICAgICBfaW1hZ2VUb1BhdGNoR3JpZC5kYXRhW3BhdGNoLmluZGV4XSA9IHBhdGNoO1xuICAgICAgICBfcGF0Y2hHcmlkLmRhdGFbcGF0Y2guaW5kZXhdID0gMTtcbiAgICB9XG5cbiAgICAvLyByYXN0ZXJpemUgdGhlIHBhdGNoZXMgZm91bmQgdG8gZGV0ZXJtaW5lIGFyZWFcbiAgICBfcGF0Y2hHcmlkLnplcm9Cb3JkZXIoKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICAgIHdoaWxlICgoY3VycklkeCA9IG5vdFlldFByb2Nlc3NlZCgpKSA8IF9wYXRjaExhYmVsR3JpZC5kYXRhLmxlbmd0aCkge1xuICAgICAgICBsYWJlbCsrO1xuICAgICAgICB0cmFjZShjdXJySWR4KTtcbiAgICB9XG5cbiAgICAvLyBkcmF3IHBhdGNoLWxhYmVscyBpZiByZXF1ZXN0ZWRcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIF9jb25maWcuZGVidWcuc2hvd1BhdGNoTGFiZWxzKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBfcGF0Y2hMYWJlbEdyaWQuZGF0YS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKF9wYXRjaExhYmVsR3JpZC5kYXRhW2pdID4gMCAmJiBfcGF0Y2hMYWJlbEdyaWQuZGF0YVtqXSA8PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgIHBhdGNoID0gX2ltYWdlVG9QYXRjaEdyaWQuZGF0YVtqXTtcbiAgICAgICAgICAgICAgICBoc3ZbMF0gPSAoX3BhdGNoTGFiZWxHcmlkLmRhdGFbal0gLyAobGFiZWwgKyAxKSkgKiAzNjA7XG4gICAgICAgICAgICAgICAgaHN2MnJnYihoc3YsIHJnYik7XG4gICAgICAgICAgICAgICAgSW1hZ2VEZWJ1Zy5kcmF3UmVjdChwYXRjaC5wb3MsIF9zdWJJbWFnZVdyYXBwZXIuc2l6ZSwgX2NhbnZhc0NvbnRhaW5lci5jdHguYmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICB7IGNvbG9yOiBgcmdiKCR7cmdiLmpvaW4oJywnKX0pYCwgbGluZVdpZHRoOiAyIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVsO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgaW5pdChpbnB1dEltYWdlV3JhcHBlciwgY29uZmlnKSB7XG4gICAgICAgIF9jb25maWcgPSBjb25maWc7XG4gICAgICAgIF9pbnB1dEltYWdlV3JhcHBlciA9IGlucHV0SW1hZ2VXcmFwcGVyO1xuXG4gICAgICAgIGluaXRCdWZmZXJzKCk7XG4gICAgICAgIGluaXRDYW52YXMoKTtcbiAgICB9LFxuXG4gICAgbG9jYXRlKCkge1xuICAgICAgICBpZiAoX2NvbmZpZy5oYWxmU2FtcGxlKSB7XG4gICAgICAgICAgICBoYWxmU2FtcGxlKF9pbnB1dEltYWdlV3JhcHBlciwgX2N1cnJlbnRJbWFnZVdyYXBwZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmluYXJpemVJbWFnZSgpO1xuICAgICAgICBjb25zdCBwYXRjaGVzRm91bmQgPSBmaW5kUGF0Y2hlcygpO1xuICAgICAgICAvLyByZXR1cm4gdW5sZXNzIDUlIG9yIG1vcmUgcGF0Y2hlcyBhcmUgZm91bmRcbiAgICAgICAgaWYgKHBhdGNoZXNGb3VuZC5sZW5ndGggPCBfbnVtUGF0Y2hlcy54ICogX251bVBhdGNoZXMueSAqIDAuMDUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmFzdGVycml6ZSBhcmVhIGJ5IGNvbXBhcmluZyBhbmd1bGFyIHNpbWlsYXJpdHk7XG4gICAgICAgIGNvbnN0IG1heExhYmVsID0gcmFzdGVyaXplQW5ndWxhclNpbWlsYXJpdHkocGF0Y2hlc0ZvdW5kKTtcbiAgICAgICAgaWYgKG1heExhYmVsIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZWFyY2ggZm9yIGFyZWEgd2l0aCB0aGUgbW9zdCBwYXRjaGVzIChiaWdnZXN0IGNvbm5lY3RlZCBhcmVhKVxuICAgICAgICBjb25zdCB0b3BMYWJlbHMgPSBmaW5kQmlnZ2VzdENvbm5lY3RlZEFyZWFzKG1heExhYmVsKTtcbiAgICAgICAgaWYgKHRvcExhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm94ZXMgPSBmaW5kQm94ZXModG9wTGFiZWxzLCBtYXhMYWJlbCk7XG4gICAgICAgIHJldHVybiBib3hlcztcbiAgICB9LFxuXG4gICAgY2hlY2tJbWFnZUNvbnN0cmFpbnRzKGlucHV0U3RyZWFtLCBjb25maWcpIHtcbiAgICAgICAgbGV0IHBhdGNoU2l6ZTtcbiAgICAgICAgbGV0IHdpZHRoID0gaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKTtcbiAgICAgICAgbGV0IGhlaWdodCA9IGlucHV0U3RyZWFtLmdldEhlaWdodCgpO1xuICAgICAgICBjb25zdCB0aGlzSGFsZlNhbXBsZSA9IGNvbmZpZy5oYWxmU2FtcGxlID8gMC41IDogMTtcbiAgICAgICAgbGV0IGFyZWE7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHQgYmFzZWQgb24gYXJlYVxuICAgICAgICBpZiAoaW5wdXRTdHJlYW0uZ2V0Q29uZmlnKCkuYXJlYSkge1xuICAgICAgICAgICAgYXJlYSA9IGNvbXB1dGVJbWFnZUFyZWEod2lkdGgsIGhlaWdodCwgaW5wdXRTdHJlYW0uZ2V0Q29uZmlnKCkuYXJlYSk7XG4gICAgICAgICAgICBpbnB1dFN0cmVhbS5zZXRUb3BSaWdodCh7IHg6IGFyZWEuc3gsIHk6IGFyZWEuc3kgfSk7XG4gICAgICAgICAgICBpbnB1dFN0cmVhbS5zZXRDYW52YXNTaXplKHsgeDogd2lkdGgsIHk6IGhlaWdodCB9KTtcbiAgICAgICAgICAgIHdpZHRoID0gYXJlYS5zdztcbiAgICAgICAgICAgIGhlaWdodCA9IGFyZWEuc2g7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaXplID0ge1xuICAgICAgICAgICAgeDogTWF0aC5mbG9vcih3aWR0aCAqIHRoaXNIYWxmU2FtcGxlKSxcbiAgICAgICAgICAgIHk6IE1hdGguZmxvb3IoaGVpZ2h0ICogdGhpc0hhbGZTYW1wbGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHBhdGNoU2l6ZSA9IGNhbGN1bGF0ZVBhdGNoU2l6ZShjb25maWcucGF0Y2hTaXplLCBzaXplKTtcbiAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCAmJiBjb25maWcuZGVidWc/LnNob3dQYXRjaFNpemUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQYXRjaC1TaXplOiAke0pTT04uc3RyaW5naWZ5KHBhdGNoU2l6ZSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dFN0cmVhbS5zZXRXaWR0aChNYXRoLm1heChNYXRoLmZsb29yKE1hdGguZmxvb3Ioc2l6ZS54IC8gcGF0Y2hTaXplLngpICogKDEgLyB0aGlzSGFsZlNhbXBsZSkgKiBwYXRjaFNpemUueCksIHBhdGNoU2l6ZS54KSk7XG4gICAgICAgIGlucHV0U3RyZWFtLnNldEhlaWdodChNYXRoLm1heChNYXRoLmZsb29yKE1hdGguZmxvb3Ioc2l6ZS55IC8gcGF0Y2hTaXplLnkpICogKDEgLyB0aGlzSGFsZlNhbXBsZSkgKiBwYXRjaFNpemUueSksIHBhdGNoU2l6ZS55KSk7XG5cbiAgICAgICAgaWYgKChpbnB1dFN0cmVhbS5nZXRXaWR0aCgpICUgcGF0Y2hTaXplLngpID09PSAwICYmIChpbnB1dFN0cmVhbS5nZXRIZWlnaHQoKSAlIHBhdGNoU2l6ZS55KSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmdzOiBXaWR0aCAoJHtcbiAgICAgICAgICAgIHdpZHRofSApYW5kIGhlaWdodCAoJHtoZWlnaHRcbiAgICAgICAgfSkgbXVzdCBhIG11bHRpcGxlIG9mICR7cGF0Y2hTaXplLnh9YCk7XG4gICAgfSxcbn07XG4iLCJpbXBvcnQgeyBRdWFnZ2FKU0NvbmZpZ09iamVjdCB9IGZyb20gXCIuLi90eXBlLWRlZmluaXRpb25zL3F1YWdnYVwiO1xuaW1wb3J0IEltYWdlV3JhcHBlciBmcm9tIFwiY29tbW9uL2ltYWdlX3dyYXBwZXJcIjtcblxuZXhwb3J0IGNsYXNzIFF1YWdnYUNvbnRleHQge1xuICAgIHB1YmxpYyBjb25maWc/OiBRdWFnZ2FKU0NvbmZpZ09iamVjdDtcblxuICAgIHB1YmxpYyBpbnB1dFN0cmVhbTogYW55O1xuXG4gICAgcHVibGljIGZyYW1lZ3JhYmJlcjogYW55O1xuXG4gICAgcHVibGljIGlucHV0SW1hZ2VXcmFwcGVyPzogSW1hZ2VXcmFwcGVyO1xuXG4gICAgcHVibGljIHN0b3BwZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBib3hTaXplOiBhbnk7XG5cbiAgICBwdWJsaWMgcmVzdWx0Q29sbGVjdG9yOiBhbnk7XG5cbiAgICBwdWJsaWMgZGVjb2RlcjogYW55O1xuXG4gICAgcHVibGljIHdvcmtlclBvb2w6IGFueVtdID0gW107XG5cbiAgICBwdWJsaWMgb25VSVRocmVhZCA9IHRydWU7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2FudmFzQ29udGFpbmVyID0gbmV3IENhbnZhc0NvbnRhaW5lcigpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2FudmFzSW5mbyB7XG4gICAgaW1hZ2U6IGFueTtcbiAgICBvdmVybGF5OiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBDYW52YXNDb250YWluZXIge1xuICAgIHB1YmxpYyByZWFkb25seSBjdHg6IENhbnZhc0luZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGRvbTogQ2FudmFzSW5mbztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmN0eCA9IG5ldyBDYW52YXNJbmZvKCk7XG4gICAgICAgIHRoaXMuZG9tID0gbmV3IENhbnZhc0luZm8oKTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3UG9ydCh0YXJnZXQ/OiBFbGVtZW50IHwgc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyBhbHJlYWR5IGEgRE9NIGVsZW1lbnRcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0Lm5vZGVOYW1lICYmIHRhcmdldC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICAvLyBVc2UgJyNpbnRlcmFjdGl2ZS52aWV3cG9ydCcgYXMgYSBmYWxsYmFjayBzZWxlY3RvciAoYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyA/IHRhcmdldCA6ICcjaW50ZXJhY3RpdmUudmlld3BvcnQnO1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbn1cbiIsImltcG9ydCB7IHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEltYWdlV3JhcHBlciBmcm9tICcuLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgdHlwZSB7IElucHV0U3RyZWFtIH0gZnJvbSAnLi4vaW5wdXQvaW5wdXRfc3RyZWFtL2lucHV0X3N0cmVhbS5kJztcbmltcG9ydCBCYXJjb2RlTG9jYXRvciBmcm9tICcuLi9sb2NhdG9yL2JhcmNvZGVfbG9jYXRvcic7XG5cbi8vIFRPRE86IG5lZWQgdHlwZXNjcmlwdCBkZWYgZm9yIEJhcmNvZGVMb2NhdG9yXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0QnVmZmVycyhcbiAgICBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0sXG4gICAgaW1hZ2VXcmFwcGVyOiBJbWFnZVdyYXBwZXIgfCB1bmRlZmluZWQsXG4gICAgbG9jYXRvcjogYW55LFxuKSB7XG4gICAgY29uc3QgaW5wdXRJbWFnZVdyYXBwZXIgPSBpbWFnZVdyYXBwZXIgfHwgbmV3IEltYWdlV3JhcHBlcih7XG4gICAgICAgIHg6IGlucHV0U3RyZWFtLmdldFdpZHRoKCksXG4gICAgICAgIHk6IGlucHV0U3RyZWFtLmdldEhlaWdodCgpLFxuICAgICAgICB0eXBlOiAnWFlTaXplJyxcbiAgICB9KTtcblxuICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQgJiYgKGxvY2F0b3IgYXMgYW55KS5jb25maWc/LmRlYnVnPy5zaG93SW1hZ2VEZXRhaWxzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBpbWFnZSB3cmFwcGVyIHNpemUgJHtpbnB1dEltYWdlV3JhcHBlci5zaXplfWApO1xuICAgIH1cbiAgICBjb25zdCBib3hTaXplID0gW1xuICAgICAgICB2ZWMyLmNsb25lKFswLCAwXSksXG4gICAgICAgIHZlYzIuY2xvbmUoWzAsIGlucHV0SW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICB2ZWMyLmNsb25lKFtpbnB1dEltYWdlV3JhcHBlci5zaXplLngsIGlucHV0SW1hZ2VXcmFwcGVyLnNpemUueV0pLFxuICAgICAgICB2ZWMyLmNsb25lKFtpbnB1dEltYWdlV3JhcHBlci5zaXplLngsIDBdKSxcbiAgICBdO1xuICAgIEJhcmNvZGVMb2NhdG9yLmluaXQoaW5wdXRJbWFnZVdyYXBwZXIsIGxvY2F0b3IpO1xuICAgIHJldHVybiB7IGlucHV0SW1hZ2VXcmFwcGVyLCBib3hTaXplIH07XG59XG4iLCJpbXBvcnQgeyBRdWFnZ2FDb250ZXh0LCBDYW52YXNDb250YWluZXIgfSBmcm9tICdRdWFnZ2FDb250ZXh0JztcbmltcG9ydCBnZXRWaWV3UG9ydCBmcm9tICcuL2dldFZpZXdQb3J0JztcbmltcG9ydCB0eXBlIHsgWFlTaXplIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5cbmZ1bmN0aW9uIGZpbmRPckNyZWF0ZUNhbnZhcyhzZWxlY3Rvcjogc3RyaW5nLCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzO1xufVxuXG5mdW5jdGlvbiBnZXRDYW52YXNBbmRDb250ZXh0KHNlbGVjdG9yOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nLCBvcHRpb25zOiB7IHdpbGxSZWFkRnJlcXVlbnRseTogYm9vbGVhbjsgZGVidWc/OiBhbnkgfSkge1xuICAgIGNvbnN0IGNhbnZhcyA9IGZpbmRPckNyZWF0ZUNhbnZhcyhzZWxlY3RvciwgY2xhc3NOYW1lKTtcbiAgICBpZiAoRU5WLmRldmVsb3BtZW50ICYmIG9wdGlvbnMuZGVidWc/LnNob3dJbWFnZURldGFpbHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCcqIGluaXRDYW52YXMgZ2V0Q2FudmFzQW5kQ29udGV4dCcpO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IG9wdGlvbnMud2lsbFJlYWRGcmVxdWVudGx5IH0pO1xuICAgIHJldHVybiB7IGNhbnZhcywgY29udGV4dCB9O1xufVxuXG5mdW5jdGlvbiBpbml0Q2FudmFzZXMoY2FudmFzU2l6ZTogWFlTaXplLCB7IHdpbGxSZWFkRnJlcXVlbnRseSwgZGVidWcgfTogeyB3aWxsUmVhZEZyZXF1ZW50bHk6IGJvb2xlYW47IGRlYnVnPzogYW55IH0pOiBDYW52YXNDb250YWluZXIgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBpbWFnZSA9IGdldENhbnZhc0FuZENvbnRleHQoJ2NhbnZhcy5pbWdCdWZmZXInLCAnaW1nQnVmZmVyJywgeyB3aWxsUmVhZEZyZXF1ZW50bHksIGRlYnVnIH0pO1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gZ2V0Q2FudmFzQW5kQ29udGV4dCgnY2FudmFzLmRyYXdpbmdCdWZmZXInLCAnZHJhd2luZ0J1ZmZlcicsIHsgd2lsbFJlYWRGcmVxdWVudGx5LCBkZWJ1ZyB9KTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICAgIGltYWdlLmNhbnZhcy53aWR0aCA9IG92ZXJsYXkuY2FudmFzLndpZHRoID0gY2FudmFzU2l6ZS54O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbXVsdGktYXNzaWduXG4gICAgICAgIGltYWdlLmNhbnZhcy5oZWlnaHQgPSBvdmVybGF5LmNhbnZhcy5oZWlnaHQgPSBjYW52YXNTaXplLnk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRvbToge1xuICAgICAgICAgICAgICAgIGltYWdlOiBpbWFnZS5jYW52YXMsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogb3ZlcmxheS5jYW52YXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3R4OiB7XG4gICAgICAgICAgICAgICAgaW1hZ2U6IGltYWdlLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgb3ZlcmxheTogb3ZlcmxheS5jb250ZXh0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRDYW52YXMoY29udGV4dDogUXVhZ2dhQ29udGV4dCk6IENhbnZhc0NvbnRhaW5lciB8IG51bGwge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld1BvcnQoY29udGV4dD8uY29uZmlnPy5pbnB1dFN0cmVhbT8udGFyZ2V0KTtcbiAgICBjb25zdCB0eXBlID0gY29udGV4dD8uY29uZmlnPy5pbnB1dFN0cmVhbT8udHlwZTtcbiAgICBpZiAoIXR5cGUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGluaXRDYW52YXNlcyhcbiAgICAgICAgY29udGV4dC5pbnB1dFN0cmVhbS5nZXRDYW52YXNTaXplKCksXG4gICAgICAgIHtcbiAgICAgICAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogISFjb250ZXh0Py5jb25maWc/LmlucHV0U3RyZWFtPy53aWxsUmVhZEZyZXF1ZW50bHksXG4gICAgICAgICAgICBkZWJ1ZzogY29udGV4dD8uY29uZmlnPy5sb2NhdG9yPy5kZWJ1Z1xuICAgICAgICB9XG4gICAgKTtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIHsgZG9tOiB7IGltYWdlOiBudWxsLCBvdmVybGF5OiBudWxsIH0sIGN0eDogeyBpbWFnZTogbnVsbCwgb3ZlcmxheTogbnVsbCB9IH07XG5cbiAgICBjb25zdCB7IGRvbSB9ID0gY29udGFpbmVyO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdJbWFnZVN0cmVhbScgJiYgIXZpZXdwb3J0LmNvbnRhaW5zKGRvbS5pbWFnZSkpIHtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydC5hcHBlbmRDaGlsZChkb20uaW1hZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydC5jb250YWlucyhkb20ub3ZlcmxheSkpIHtcbiAgICAgICAgICAgICAgICB2aWV3cG9ydC5hcHBlbmRDaGlsZChkb20ub3ZlcmxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbiIsIi8qIFdvcmtlciBmdW5jdGlvbnMuIFRoZXNlIGFyZSBzdHJhaWdodCBmcm9tIHRoZSBvcmlnaW5hbCBxdWFnZ2EuanMgZmlsZS5cbiAqIE5vdCBwcmVzZW50bHkgdXNlZCwgYXMgd29ya2VyIHN1cHBvcnQgaXMgbm9uLWZ1bmN0aW9uYWwuICBLZWVwaW5nIHRoZW0gYXJvdW5kIHRlbXBvcmFyaWx5XG4gKiB0byByZWZlciB0byB1bnRpbCBpdCBpcyByZS1pbXBsZW1lbnRlZC4gV2UgbWF5IGJlIGFibGUgdG8gZml4L3VzZSBzb21lIG9mIHRoaXMuXG4gKi9cblxuaW1wb3J0IHsgUXVhZ2dhSlNDb25maWdPYmplY3QsIFF1YWdnYUpTUmVhZGVyQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhXCI7XG5cbi8vIFRPRE86IG5lZWQgYSB0eXBlc2NyaXB0IGludGVyZmFjZSBmb3IgRnJhbWVHcmFiYmVyXG5cbmludGVyZmFjZSBRV29ya2VyVGhyZWFkIHtcbiAgICBpbWFnZURhdGE6IFVpbnQ4QXJyYXk7XG4gICAgYnVzeTogYm9vbGVhbjtcbiAgICB3b3JrZXI6IFdvcmtlcjtcbn1cblxubGV0IHdvcmtlclBvb2w6IEFycmF5PFFXb3JrZXJUaHJlYWQ+ID0gW107XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVXb3JrZXJzKGZyYW1lR3JhYmJlcjogYW55KSB7XG4gICAgbGV0IGF2YWlsYWJsZVdvcmtlcjogUVdvcmtlclRocmVhZDtcbiAgICBpZiAod29ya2VyUG9vbC5sZW5ndGgpIHtcbiAgICAgICAgYXZhaWxhYmxlV29ya2VyID0gd29ya2VyUG9vbC5maWx0ZXIoKHdvcmtlclRocmVhZCkgPT4gIXdvcmtlclRocmVhZC5idXN5KVswXTtcbiAgICAgICAgaWYgKGF2YWlsYWJsZVdvcmtlcikge1xuICAgICAgICAgICAgZnJhbWVHcmFiYmVyLmF0dGFjaERhdGEoYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YSk7XG4gICAgICAgICAgICBpZiAoZnJhbWVHcmFiYmVyLmdyYWIoKSkge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdvcmtlci5idXN5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXb3JrZXIud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgY21kOiAncHJvY2VzcycsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YTogYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YSxcbiAgICAgICAgICAgICAgICB9LCBbYXZhaWxhYmxlV29ya2VyLmltYWdlRGF0YS5idWZmZXJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb25maWdGb3JXb3JrZXIoY29uZmlnOiBRdWFnZ2FKU0NvbmZpZ09iamVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgaW5wdXRTdHJlYW06IHtcbiAgICAgICAgICAgIC4uLmNvbmZpZy5pbnB1dFN0cmVhbSxcbiAgICAgICAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyBAdHMtaWdub3JlXG5mdW5jdGlvbiB3b3JrZXJJbnRlcmZhY2UoZmFjdG9yeSkge1xuICAgIGlmIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciBRdWFnZ2EgPSBmYWN0b3J5KCkuZGVmYXVsdDtcbiAgICAgICAgaWYgKCFRdWFnZ2EpIHtcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyAnZXZlbnQnOiAnZXJyb3InLCBtZXNzYWdlOiAnUXVhZ2dhIGNvdWxkIG5vdCBiZSBjcmVhdGVkJyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbi8vIEB0cy1pZ25vcmVcbiAgICB2YXIgaW1hZ2VXcmFwcGVyO1xuXG4vLyBAdHMtaWdub3JlXG4gICAgZnVuY3Rpb24gb25Qcm9jZXNzZWQocmVzdWx0KSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgJ2V2ZW50JzogJ3Byb2Nlc3NlZCcsXG4vLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpbWFnZURhdGE6IGltYWdlV3JhcHBlci5kYXRhLFxuICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQsXG4vLyBAdHMtaWdub3JlXG4gICAgICAgIH0sIFtpbWFnZVdyYXBwZXIuZGF0YS5idWZmZXJdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3b3JrZXJJbnRlcmZhY2VSZWFkeSgpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAnZXZlbnQnOiAnaW5pdGlhbGl6ZWQnLFxuLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaW1hZ2VEYXRhOiBpbWFnZVdyYXBwZXIuZGF0YSxcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgfSwgW2ltYWdlV3JhcHBlci5kYXRhLmJ1ZmZlcl0pO1xuICAgIH1cblxuLy8gQHRzLWlnbm9yZVxuICAgIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGUuZGF0YS5jbWQgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGUuZGF0YS5jb25maWc7XG4gICAgICAgICAgICBjb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgICAgIGltYWdlV3JhcHBlciA9IG5ldyBRdWFnZ2EuSW1hZ2VXcmFwcGVyKHtcbiAgICAgICAgICAgICAgICB4OiBlLmRhdGEuc2l6ZS54LFxuICAgICAgICAgICAgICAgIHk6IGUuZGF0YS5zaXplLnksXG4gICAgICAgICAgICB9LCBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKSk7XG4gICAgICAgICAgICBRdWFnZ2EuaW5pdChjb25maWcsIHdvcmtlckludGVyZmFjZVJlYWR5LCBpbWFnZVdyYXBwZXIpO1xuICAgICAgICAgICAgUXVhZ2dhLm9uUHJvY2Vzc2VkKG9uUHJvY2Vzc2VkKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuY21kID09PSAncHJvY2VzcycpIHtcbi8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGltYWdlV3JhcHBlci5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLmltYWdlRGF0YSk7XG4gICAgICAgICAgICBRdWFnZ2Euc3RhcnQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuY21kID09PSAnc2V0UmVhZGVycycpIHtcbiAgICAgICAgICAgIFF1YWdnYS5zZXRSZWFkZXJzKGUuZGF0YS5yZWFkZXJzKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuY21kID09PSAncmVnaXN0ZXJSZWFkZXInKSB7XG4gICAgICAgICAgICBRdWFnZ2EucmVnaXN0ZXJSZWFkZXIoZS5kYXRhLm5hbWUsIGUuZGF0YS5yZWFkZXIpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZXJCbG9iKCkge1xuICAgIHZhciBibG9iLFxuICAgICAgICBmYWN0b3J5U291cmNlO1xuXG4gICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIF9fZmFjdG9yeVNvdXJjZV9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGZhY3RvcnlTb3VyY2UgPSBfX2ZhY3RvcnlTb3VyY2VfXzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIH1cbiAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gICAgYmxvYiA9IG5ldyBCbG9iKFsnKCcgKyB3b3JrZXJJbnRlcmZhY2UudG9TdHJpbmcoKSArICcpKCcgKyBmYWN0b3J5U291cmNlICsgJyk7J10sXG4gICAgICAgIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG5cbiAgICByZXR1cm4gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0V29ya2VyKGNvbmZpZzogUXVhZ2dhSlNDb25maWdPYmplY3QsIGlucHV0U3RyZWFtOiBhbnksIGNiOiBGdW5jdGlvbikge1xuICAgIGNvbnN0IGJsb2JVUkwgPSBnZW5lcmF0ZVdvcmtlckJsb2IoKTtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKGJsb2JVUkwpO1xuXG4gICAgY29uc3Qgd29ya2VyVGhyZWFkOiBRV29ya2VyVGhyZWFkID0ge1xuICAgICAgICB3b3JrZXIsXG4gICAgICAgIGltYWdlRGF0YTogbmV3IFVpbnQ4QXJyYXkoaW5wdXRTdHJlYW0uZ2V0V2lkdGgoKSAqIGlucHV0U3RyZWFtLmdldEhlaWdodCgpKSxcbiAgICAgICAgYnVzeTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgd29ya2VyVGhyZWFkLndvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZS5kYXRhLmV2ZW50ID09PSAnaW5pdGlhbGl6ZWQnKSB7XG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVUkwpO1xuICAgICAgICAgICAgd29ya2VyVGhyZWFkLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV29ya2VyIGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYih3b3JrZXJUaHJlYWQpO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ3Byb2Nlc3NlZCcpIHtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5pbWFnZURhdGEgPSBuZXcgVWludDhBcnJheShlLmRhdGEuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIHdvcmtlclRocmVhZC5idXN5ID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBUT0RPOiBob3cgdG8gdGhyZWFkIHB1Ymxpc2hSZXN1bHQgaW50byBoZXJlPyBUeXBlU2NyaXB0IHNheXMgaXQncyBub3QgaGVyZS4gaHR0cHM6Ly9naXRodWIuY29tL2VyaWNibGFkZS9xdWFnZ2EyL2lzc3Vlcy80NjYjaXNzdWVjb21tZW50LTE3MjQyNDgwODAgc2F5cyBpdCdzIG5lY2Vzc2FyeT9cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHVibGlzaFJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcHVibGlzaFJlc3VsdChlLmRhdGEucmVzdWx0LCB3b3JrZXJUaHJlYWQuaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEuZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGlmIChFTlYuZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV29ya2VyIGVycm9yOiAnICsgZS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHdvcmtlclRocmVhZC53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBjbWQ6ICdpbml0JyxcbiAgICAgICAgc2l6ZTogeyB4OiBpbnB1dFN0cmVhbS5nZXRXaWR0aCgpLCB5OiBpbnB1dFN0cmVhbS5nZXRIZWlnaHQoKSB9LFxuICAgICAgICBpbWFnZURhdGE6IHdvcmtlclRocmVhZC5pbWFnZURhdGEsXG4gICAgICAgIGNvbmZpZzogY29uZmlnRm9yV29ya2VyKGNvbmZpZyksXG4gICAgfSwgW3dvcmtlclRocmVhZC5pbWFnZURhdGEuYnVmZmVyXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGp1c3RXb3JrZXJQb29sKGNhcGFjaXR5OiBudW1iZXIsIGNvbmZpZz86IFF1YWdnYUpTQ29uZmlnT2JqZWN0LCBpbnB1dFN0cmVhbT86IGFueSwgY2I/OiBGdW5jdGlvbikge1xuICAgIGNvbnN0IGluY3JlYXNlQnkgPSBjYXBhY2l0eSAtIHdvcmtlclBvb2wubGVuZ3RoO1xuICAgIGlmIChpbmNyZWFzZUJ5ID09PSAwICYmIGNiKSB7XG4gICAgICAgIGNiKCk7XG4gICAgfSBlbHNlIGlmIChpbmNyZWFzZUJ5IDwgMCkge1xuICAgICAgICBjb25zdCB3b3JrZXJzVG9UZXJtaW5hdGUgPSB3b3JrZXJQb29sLnNsaWNlKGluY3JlYXNlQnkpO1xuICAgICAgICB3b3JrZXJzVG9UZXJtaW5hdGUuZm9yRWFjaChmdW5jdGlvbiAod29ya2VyVGhyZWFkKSB7XG4gICAgICAgICAgICB3b3JrZXJUaHJlYWQud29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgaWYgKEVOVi5kZXZlbG9wbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXb3JrZXIgdGVybWluYXRlZCEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHdvcmtlclBvb2wgPSB3b3JrZXJQb29sLnNsaWNlKDAsIGluY3JlYXNlQnkpO1xuICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3b3JrZXJJbml0aWFsaXplZCA9ICh3b3JrZXJUaHJlYWQ6IFFXb3JrZXJUaHJlYWQpID0+IHtcbiAgICAgICAgICAgIHdvcmtlclBvb2wucHVzaCh3b3JrZXJUaHJlYWQpO1xuICAgICAgICAgICAgaWYgKHdvcmtlclBvb2wubGVuZ3RoID49IGNhcGFjaXR5ICYmIGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluY3JlYXNlQnk7IGkrKykge1xuICAgICAgICAgICAgICAgIGluaXRXb3JrZXIoY29uZmlnLCBpbnB1dFN0cmVhbSwgd29ya2VySW5pdGlhbGl6ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZGVycyhyZWFkZXJzOiBBcnJheTxRdWFnZ2FKU1JlYWRlckNvbmZpZz4pIHtcbiAgICB3b3JrZXJQb29sLmZvckVhY2goKHdvcmtlclRocmVhZCkgPT4gd29ya2VyVGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7IGNtZDogJ3NldFJlYWRlcnMnLCByZWFkZXJzIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVhZGVyKG5hbWU6IHN0cmluZywgcmVhZGVyOiBhbnkpIHtcbiAgICB3b3JrZXJQb29sLmZvckVhY2goKHdvcmtlclRocmVhZCkgPT4gd29ya2VyVGhyZWFkLndvcmtlci5wb3N0TWVzc2FnZSh7IGNtZDogJ3JlZ2lzdGVyUmVhZGVyJywgbmFtZSwgcmVhZGVyIH0pKTtcbn1cbiIsImltcG9ydCB7IElucHV0U3RyZWFtRmFjdG9yeSB9IGZyb20gJ2lucHV0L2lucHV0X3N0cmVhbS9pbnB1dF9zdHJlYW0uZCc7XG5pbXBvcnQgdHlwZSB7IElucHV0U3RyZWFtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG4vLyBUT0RPOiBuZWVkIHRvIGNyZWF0ZSBhbiBJbnB1dFN0cmVhbSB0eXBlc2NyaXB0IGludGVyZmFjZSwgc28gd2UgZG9uJ3QgaGF2ZSBhbiBcImFueVwiIGluIHRoZSBuZXh0IGxpbmVcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldHVwSW5wdXRTdHJlYW0odHlwZTogSW5wdXRTdHJlYW1UeXBlID0gJ0xpdmVTdHJlYW0nLCB2aWV3cG9ydDogRWxlbWVudCB8IG51bGwsIGlucHV0U3RyZWFtRmFjdG9yeTogSW5wdXRTdHJlYW1GYWN0b3J5KSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ1ZpZGVvU3RyZWFtJzoge1xuICAgICAgICAgICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2aWRlbyxcbiAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW1GYWN0b3J5LmNyZWF0ZVZpZGVvU3RyZWFtKHZpZGVvKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW1hZ2VTdHJlYW0nOlxuICAgICAgICAgICAgcmV0dXJuIHsgaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtRmFjdG9yeS5jcmVhdGVJbWFnZVN0cmVhbSgpIH07XG4gICAgICAgIGNhc2UgJ0xpdmVTdHJlYW0nOiB7XG4gICAgICAgICAgICBsZXQgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgIHZpZGVvID0gdmlld3BvcnQucXVlcnlTZWxlY3RvcigndmlkZW8nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZpZGVvKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmlkZW8sXG4gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtRmFjdG9yeS5jcmVhdGVMaXZlU3RyZWFtKHZpZGVvIGFzIEhUTUxWaWRlb0VsZW1lbnQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgKiBzZXR1cElucHV0U3RyZWFtIGludmFsaWQgdHlwZSAke3R5cGV9YCk7XG4gICAgICAgICAgICByZXR1cm4geyB2aWRlbzogbnVsbCwgaW5wdXRTdHJlYW06IG51bGwgfTtcbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuaW1wb3J0IHR5cGUgeyBQb2ludCB9IGZyb20gJy4uLy4uL3R5cGUtZGVmaW5pdGlvbnMvcXVhZ2dhLmQnO1xuXG5leHBvcnQgdHlwZSBCb3ggPSBBcnJheTxbIG51bWJlciwgbnVtYmVyIF0+O1xuXG5leHBvcnQgdHlwZSBMaW5lID0gWyBQb2ludCwgUG9pbnQgXTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVCb3goYm94OiBCb3gsIHhPZmZzZXQ6IG51bWJlciwgeU9mZnNldDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGNvcm5lciA9IGJveC5sZW5ndGg7XG4gICAgd2hpbGUgKGNvcm5lci0tKSB7XG4gICAgICAgIGJveFtjb3JuZXJdWzBdICs9IHhPZmZzZXQ7XG4gICAgICAgIGJveFtjb3JuZXJdWzFdICs9IHlPZmZzZXQ7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW92ZUxpbmUobGluZTogTGluZSwgeE9mZnNldDogbnVtYmVyLCB5T2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsaW5lWzBdLnggKz0geE9mZnNldDtcbiAgICBsaW5lWzBdLnkgKz0geU9mZnNldDtcbiAgICBsaW5lWzFdLnggKz0geE9mZnNldDtcbiAgICBsaW5lWzFdLnkgKz0geU9mZnNldDtcbn1cbiIsImltcG9ydCB7IHZlYzIgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHsgUXVhZ2dhSlNSZXN1bHRPYmplY3QsIFF1YWdnYUpTUmVhZGVyQ29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZS1kZWZpbml0aW9ucy9xdWFnZ2EuZCc7XG5pbXBvcnQgRXZlbnRzIGZyb20gJy4uL2NvbW1vbi9ldmVudHMnO1xuaW1wb3J0IEltYWdlV3JhcHBlciBmcm9tICcuLi9jb21tb24vaW1hZ2Vfd3JhcHBlcic7XG5pbXBvcnQgQmFyY29kZURlY29kZXIgZnJvbSAnLi4vZGVjb2Rlci9iYXJjb2RlX2RlY29kZXInO1xuaW1wb3J0IENhbWVyYUFjY2VzcyBmcm9tICcuLi9pbnB1dC9jYW1lcmFfYWNjZXNzJztcbmltcG9ydCBGcmFtZUdyYWJiZXIgZnJvbSAnLi4vaW5wdXQvZnJhbWVfZ3JhYmJlci5qcyc7XG5pbXBvcnQgSW5wdXRTdHJlYW0gZnJvbSAnLi4vaW5wdXQvaW5wdXRfc3RyZWFtL2lucHV0X3N0cmVhbSc7XG5pbXBvcnQgQmFyY29kZUxvY2F0b3IgZnJvbSAnLi4vbG9jYXRvci9iYXJjb2RlX2xvY2F0b3InO1xuaW1wb3J0IHsgUXVhZ2dhQ29udGV4dCB9IGZyb20gJy4uL1F1YWdnYUNvbnRleHQnO1xuaW1wb3J0IHsgQmFyY29kZUluZm8gfSBmcm9tICcuLi9yZWFkZXIvYmFyY29kZV9yZWFkZXInO1xuaW1wb3J0IF9nZXRWaWV3UG9ydCBmcm9tICcuL2dldFZpZXdQb3J0JztcbmltcG9ydCBfaW5pdEJ1ZmZlcnMgZnJvbSAnLi9pbml0QnVmZmVycyc7XG5pbXBvcnQgX2luaXRDYW52YXMgZnJvbSAnLi9pbml0Q2FudmFzJztcbmltcG9ydCAqIGFzIFFXb3JrZXJzIGZyb20gJy4vcXdvcmtlcic7XG5pbXBvcnQgc2V0dXBJbnB1dFN0cmVhbSBmcm9tICcuL3NldHVwSW5wdXRTdHJlYW0nO1xuaW1wb3J0IHsgbW92ZUxpbmUsIG1vdmVCb3ggfSBmcm9tICcuL3RyYW5zZm9ybSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1YWdnYSB7XG4gICAgY29udGV4dDogUXVhZ2dhQ29udGV4dCA9IG5ldyBRdWFnZ2FDb250ZXh0KCk7XG5cbiAgICBpbml0QnVmZmVycyhpbWFnZVdyYXBwZXI/OiBJbWFnZVdyYXBwZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbnB1dEltYWdlV3JhcHBlciwgYm94U2l6ZSB9ID0gX2luaXRCdWZmZXJzKFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgaW1hZ2VXcmFwcGVyLFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmNvbmZpZy5sb2NhdG9yLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXIgPSBpbnB1dEltYWdlV3JhcHBlcjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJveFNpemUgPSBib3hTaXplO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVEYXRhKGltYWdlV3JhcHBlcj86IEltYWdlV3JhcHBlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRCdWZmZXJzKGltYWdlV3JhcHBlcik7XG4gICAgICAgIHRoaXMuY29udGV4dC5kZWNvZGVyID0gQmFyY29kZURlY29kZXIuY3JlYXRlKHRoaXMuY29udGV4dC5jb25maWcuZGVjb2RlciwgdGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBnZXRWaWV3UG9ydCgpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0LmNvbmZpZyB8fCAhdGhpcy5jb250ZXh0LmNvbmZpZy5pbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IHRoaXMuY29udGV4dC5jb25maWcuaW5wdXRTdHJlYW07XG4gICAgICAgIHJldHVybiBfZ2V0Vmlld1BvcnQodGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZWFkeShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0ucGxheSgpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGluaXRDYW52YXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IF9pbml0Q2FudmFzKHRoaXMuY29udGV4dCk7XG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjdHgsIGRvbSB9ID0gY29udGFpbmVyO1xuICAgICAgICB0aGlzLmNvbnRleHQuY2FudmFzQ29udGFpbmVyLmRvbS5pbWFnZSA9IGRvbS5pbWFnZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNhbnZhc0NvbnRhaW5lci5kb20ub3ZlcmxheSA9IGRvbS5vdmVybGF5O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2FudmFzQ29udGFpbmVyLmN0eC5pbWFnZSA9IGN0eC5pbWFnZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNhbnZhc0NvbnRhaW5lci5jdHgub3ZlcmxheSA9IGN0eC5vdmVybGF5O1xuICAgIH1cblxuICAgIGNhblJlY29yZCA9IChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBCYXJjb2RlTG9jYXRvci5jaGVja0ltYWdlQ29uc3RyYWludHModGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLCB0aGlzLmNvbnRleHQuY29uZmlnPy5sb2NhdG9yKTtcbiAgICAgICAgdGhpcy5pbml0Q2FudmFzKCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIgPSBGcmFtZUdyYWJiZXIuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmNhbnZhc0NvbnRhaW5lci5kb20uaW1hZ2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jb25maWcubnVtT2ZXb3JrZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jb25maWcubnVtT2ZXb3JrZXJzID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIFFXb3JrZXJzLmFkanVzdFdvcmtlclBvb2woXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuY29uZmlnLm51bU9mV29ya2VycyxcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jb25maWcsXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5jb25maWc/Lm51bU9mV29ya2VycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVEYXRhKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVhZHkoY2FsbGJhY2spO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgaW5pdElucHV0U3RyZWFtKGNhbGxiYWNrOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY29uZmlnIHx8ICF0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlOiBpbnB1dFR5cGUsIGNvbnN0cmFpbnRzIH0gPSB0aGlzLmNvbnRleHQuY29uZmlnLmlucHV0U3RyZWFtO1xuICAgICAgICBjb25zdCB7IHZpZGVvLCBpbnB1dFN0cmVhbSB9ID0gc2V0dXBJbnB1dFN0cmVhbShpbnB1dFR5cGUsIHRoaXMuZ2V0Vmlld1BvcnQoKSwgSW5wdXRTdHJlYW0pO1xuXG4gICAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdMaXZlU3RyZWFtJyAmJiB2aWRlbykge1xuICAgICAgICAgICAgQ2FtZXJhQWNjZXNzLnJlcXVlc3QodmlkZW8sIGNvbnN0cmFpbnRzKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IGlucHV0U3RyZWFtLnRyaWdnZXIoJ2NhbnJlY29yZCcpKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjYWxsYmFjayhlcnIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dFN0cmVhbSkge1xuICAgICAgICAgICAgaW5wdXRTdHJlYW0uc2V0QXR0cmlidXRlKCdwcmVsb2FkJywgJ2F1dG8nKTtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldElucHV0U3RyZWFtKHRoaXMuY29udGV4dC5jb25maWcuaW5wdXRTdHJlYW0pO1xuICAgICAgICAgICAgaW5wdXRTdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignY2FucmVjb3JkJywgdGhpcy5jYW5SZWNvcmQuYmluZCh1bmRlZmluZWQsIGNhbGxiYWNrKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTtcbiAgICB9XG5cbiAgICBnZXRCb3VuZGluZ0JveGVzKCk6IEFycmF5PEFycmF5PEFycmF5PG51bWJlcj4+PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbmZpZz8ubG9jYXRlID8gQmFyY29kZUxvY2F0b3IubG9jYXRlKClcbiAgICAgICAgICAgIDogW1tcbiAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKHRoaXMuY29udGV4dC5ib3hTaXplWzBdKSxcbiAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKHRoaXMuY29udGV4dC5ib3hTaXplWzFdKSxcbiAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKHRoaXMuY29udGV4dC5ib3hTaXplWzJdKSxcbiAgICAgICAgICAgICAgICB2ZWMyLmNsb25lKHRoaXMuY29udGV4dC5ib3hTaXplWzNdKSxcbiAgICAgICAgICAgIF1dIGFzIHVua25vd24gYXMgQXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+O1xuICAgIH1cblxuICAgIC8vIFRPRE86IG5lZWQgYSB0eXBlc2NyaXB0IHR5cGUgZm9yIHJlc3VsdCBoZXJlLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gICAgdHJhbnNmb3JtUmVzdWx0KHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvcFJpZ2h0ID0gdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLmdldFRvcFJpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQgPSB0b3BSaWdodC54O1xuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gdG9wUmlnaHQueTtcblxuICAgICAgICBpZiAoeE9mZnNldCA9PT0gMCAmJiB5T2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmJhcmNvZGVzKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBCYXJjb2RlSW5mbyBtYXkgbm90IGJlIHRoZSByaWdodCB0eXBlIGhlcmUuXG4gICAgICAgICAgICByZXN1bHQuYmFyY29kZXMuZm9yRWFjaCgoYmFyY29kZTogQmFyY29kZUluZm8pID0+IHRoaXMudHJhbnNmb3JtUmVzdWx0KGJhcmNvZGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQubGluZSAmJiByZXN1bHQubGluZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIG1vdmVMaW5lKHJlc3VsdC5saW5lLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQuYm94KSB7XG4gICAgICAgICAgICBtb3ZlQm94KHJlc3VsdC5ib3gsIHhPZmZzZXQsIHlPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5ib3hlcyAmJiByZXN1bHQuYm94ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQuYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtb3ZlQm94KHJlc3VsdC5ib3hlc1tpXSwgeE9mZnNldCwgeU9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRSZXN1bHQocmVzdWx0OiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCwgaW1hZ2VEYXRhOiBBcnJheTxudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIGlmICghaW1hZ2VEYXRhIHx8ICF0aGlzLmNvbnRleHQucmVzdWx0Q29sbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgYSBcImJhcmNvZGVzXCIgcmVzdWx0LCBpZiBhbnkuLi5cbiAgICAgICAgaWYgKHJlc3VsdC5iYXJjb2Rlcykge1xuICAgICAgICAgICAgcmVzdWx0LmJhcmNvZGVzLmZpbHRlcigoYmFyY29kZTogUXVhZ2dhSlNSZXN1bHRPYmplY3QpID0+IGJhcmNvZGUuY29kZVJlc3VsdClcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoYmFyY29kZTogUXVhZ2dhSlNSZXN1bHRPYmplY3QpID0+IHRoaXMuYWRkUmVzdWx0KGJhcmNvZGUsIGltYWdlRGF0YSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb2RlUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdWx0Q29sbGVjdG9yLmFkZFJlc3VsdChcbiAgICAgICAgICAgICAgICBpbWFnZURhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlucHV0U3RyZWFtLmdldENhbnZhc1NpemUoKSxcbiAgICAgICAgICAgICAgICByZXN1bHQuY29kZVJlc3VsdCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIGhhc0NvZGVSZXN1bHQocmVzdWx0OiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEocmVzdWx0ICYmIChyZXN1bHQuYmFyY29kZXNcbiAgICAgICAgICAgID8gcmVzdWx0LmJhcmNvZGVzLnNvbWUoKGJhcmNvZGUpID0+IGJhcmNvZGUuY29kZVJlc3VsdClcbiAgICAgICAgICAgIDogcmVzdWx0LmNvZGVSZXN1bHQpKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICAgIHB1Ymxpc2hSZXN1bHQocmVzdWx0OiBRdWFnZ2FKU1Jlc3VsdE9iamVjdCB8IG51bGwgPSBudWxsLCBpbWFnZURhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJlc3VsdFRvUHVibGlzaDogQXJyYXk8UXVhZ2dhSlNSZXN1bHRPYmplY3Q+IHwgUXVhZ2dhSlNSZXN1bHRPYmplY3QgfCBudWxsID0gcmVzdWx0O1xuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgdGhpcy5jb250ZXh0Lm9uVUlUaHJlYWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLmFkZFJlc3VsdChyZXN1bHQsIGltYWdlRGF0YSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXN1bHRUb1B1Ymxpc2ggPSByZXN1bHQ/LmJhcmNvZGVzPy5sZW5ndGggPiAwID8gcmVzdWx0LmJhcmNvZGVzIDogcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgRXZlbnRzLnB1Ymxpc2goJ3Byb2Nlc3NlZCcsIHJlc3VsdFRvUHVibGlzaCBhcyBuZXZlcik7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvZGVSZXN1bHQocmVzdWx0IGFzIFF1YWdnYUpTUmVzdWx0T2JqZWN0KSkge1xuICAgICAgICAgICAgRXZlbnRzLnB1Ymxpc2goJ2RldGVjdGVkJywgcmVzdWx0VG9QdWJsaXNoIGFzIG5ldmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGxvY2F0ZUFuZERlY29kZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYm94ZXMgPSB0aGlzLmdldEJvdW5kaW5nQm94ZXMoKTtcbiAgICAgICAgaWYgKGJveGVzKSB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVSZXN1bHQgPSAoYXdhaXQgdGhpcy5jb250ZXh0LmRlY29kZXIuZGVjb2RlRnJvbUJvdW5kaW5nQm94ZXMoYm94ZXMpKSB8fCB7fTtcbiAgICAgICAgICAgIGRlY29kZVJlc3VsdC5ib3hlcyA9IGJveGVzO1xuICAgICAgICAgICAgdGhpcy5wdWJsaXNoUmVzdWx0KGRlY29kZVJlc3VsdCwgdGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyPy5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUmVzdWx0ID0gYXdhaXQgdGhpcy5jb250ZXh0LmRlY29kZXIuZGVjb2RlRnJvbUltYWdlKHRoaXMuY29udGV4dC5pbnB1dEltYWdlV3JhcHBlcik7XG4gICAgICAgICAgICBpZiAoaW1hZ2VSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hSZXN1bHQoaW1hZ2VSZXN1bHQsIHRoaXMuY29udGV4dC5pbnB1dEltYWdlV3JhcHBlcj8uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaFJlc3VsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0Lm9uVUlUaHJlYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcnNVcGRhdGVkID0gUVdvcmtlcnMudXBkYXRlV29ya2Vycyh0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyKTtcbiAgICAgICAgICAgIGlmICghd29ya2Vyc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZnJhbWVncmFiYmVyLmF0dGFjaERhdGEodGhpcy5jb250ZXh0LmlucHV0SW1hZ2VXcmFwcGVyPy5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LmZyYW1lZ3JhYmJlci5ncmFiKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZXJzVXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGVBbmREZWNvZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5mcmFtZWdyYWJiZXIuYXR0YWNoRGF0YSh0aGlzLmNvbnRleHQuaW5wdXRJbWFnZVdyYXBwZXI/LmRhdGEpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZyYW1lZ3JhYmJlci5ncmFiKCk7XG4gICAgICAgICAgICB0aGlzLmxvY2F0ZUFuZERlY29kZSgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHN0YXJ0Q29udGludW91c1VwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IG5leHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBkZWxheSA9IDEwMDAgLyAodGhpcy5jb250ZXh0LmNvbmZpZz8uZnJlcXVlbmN5IHx8IDYwKTtcblxuICAgICAgICB0aGlzLmNvbnRleHQuc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB7IGNvbnRleHQgfSA9IHRoaXM7XG5cbiAgICAgICAgY29uc3QgbmV3RnJhbWUgPSAodGltZXN0YW1wOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0IHx8IHRpbWVzdGFtcDtcbiAgICAgICAgICAgIGlmICghY29udGV4dC5zdG9wcGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcCA+PSBuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgKz0gZGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobmV3RnJhbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG5ld0ZyYW1lKHBlcmZvcm1hbmNlLm5vdygpKTtcbiAgICB9XG5cbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5vblVJVGhyZWFkICYmIHRoaXMuY29udGV4dC5jb25maWc/LmlucHV0U3RyZWFtPy50eXBlID09PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDb250aW51b3VzVXBkYXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICBRV29ya2Vycy5hZGp1c3RXb3JrZXJQb29sKDApO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNvbmZpZz8uaW5wdXRTdHJlYW0gJiYgdGhpcy5jb250ZXh0LmNvbmZpZy5pbnB1dFN0cmVhbS50eXBlID09PSAnTGl2ZVN0cmVhbScpIHtcbiAgICAgICAgICAgIGF3YWl0IENhbWVyYUFjY2Vzcy5yZWxlYXNlKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5wdXRTdHJlYW0uY2xlYXJFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRSZWFkZXJzKHJlYWRlcnM6IEFycmF5PFF1YWdnYUpTUmVhZGVyQ29uZmlnPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmRlY29kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5kZWNvZGVyLnNldFJlYWRlcnMocmVhZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgUVdvcmtlcnMuc2V0UmVhZGVycyhyZWFkZXJzKTtcbiAgICB9XG5cbiAgICByZWdpc3RlclJlYWRlcihuYW1lOiBzdHJpbmcsIHJlYWRlcjogUXVhZ2dhSlNSZWFkZXJDb25maWcpOiB2b2lkIHtcbiAgICAgICAgQmFyY29kZURlY29kZXIucmVnaXN0ZXJSZWFkZXIobmFtZSwgcmVhZGVyKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5kZWNvZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZGVjb2Rlci5yZWdpc3RlclJlYWRlcihuYW1lLCByZWFkZXIpO1xuICAgICAgICB9XG4gICAgICAgIFFXb3JrZXJzLnJlZ2lzdGVyUmVhZGVyKG5hbWUsIHJlYWRlcik7XG4gICAgfVxufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC9tZXJnZSc7XG5pbXBvcnQgVHlwZURlZnMgZnJvbSAnLi9jb21tb24vdHlwZWRlZnMnOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5pbXBvcnQgSW1hZ2VXcmFwcGVyIGZyb20gJy4vY29tbW9uL2ltYWdlX3dyYXBwZXInO1xuaW1wb3J0IEJhcmNvZGVEZWNvZGVyIGZyb20gJy4vZGVjb2Rlci9iYXJjb2RlX2RlY29kZXInO1xuaW1wb3J0ICogYXMgUmVhZGVycyBmcm9tICcuL3JlYWRlci9pbmRleCc7XG5pbXBvcnQgRXZlbnRzIGZyb20gJy4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgQ2FtZXJhQWNjZXNzIGZyb20gJy4vaW5wdXQvY2FtZXJhX2FjY2Vzcyc7XG5pbXBvcnQgSW1hZ2VEZWJ1ZyBmcm9tICcuL2NvbW1vbi9pbWFnZV9kZWJ1Zyc7XG5pbXBvcnQgUmVzdWx0Q29sbGVjdG9yIGZyb20gJy4vYW5hbHl0aWNzL3Jlc3VsdF9jb2xsZWN0b3InO1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xuXG5pbXBvcnQgUXVhZ2dhIGZyb20gJy4vcXVhZ2dhL3F1YWdnYSc7XG5cbmNvbnN0IGluc3RhbmNlID0gbmV3IFF1YWdnYSgpO1xuY29uc3QgX2NvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuXG5jb25zdCBRdWFnZ2FKU1N0YXRpY0ludGVyZmFjZSA9IHtcbiAgICBpbml0OiBmdW5jdGlvbiAoY29uZmlnLCBjYiwgaW1hZ2VXcmFwcGVyLCBxdWFnZ2FJbnN0YW5jZSA9IGluc3RhbmNlKSB7XG4gICAgICAgIGxldCBwcm9taXNlO1xuICAgICAgICBpZiAoIWNiKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNiID0gKGVycikgPT4geyBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoKTsgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHF1YWdnYUluc3RhbmNlLmNvbnRleHQuY29uZmlnID0gbWVyZ2Uoe30sIENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgLy8gVE9ETyAjMTc5OiBwZW5kaW5nIHJlc3RydWN0dXJlIGluIElzc3VlICMxNzksIHdlIGFyZSB0ZW1wIGRpc2FibGluZyB3b3JrZXJzXG4gICAgICAgIGlmIChxdWFnZ2FJbnN0YW5jZS5jb250ZXh0LmNvbmZpZy5udW1PZldvcmtlcnMgPiAwKSB7XG4gICAgICAgICAgICBxdWFnZ2FJbnN0YW5jZS5jb250ZXh0LmNvbmZpZy5udW1PZldvcmtlcnMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbWFnZVdyYXBwZXIpIHtcbiAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLmNvbnRleHQub25VSVRocmVhZCA9IGZhbHNlO1xuICAgICAgICAgICAgcXVhZ2dhSW5zdGFuY2UuaW5pdGlhbGl6ZURhdGEoaW1hZ2VXcmFwcGVyKTtcbiAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWFnZ2FJbnN0YW5jZS5pbml0SW5wdXRTdHJlYW0oY2IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnN0YXJ0KCk7XG4gICAgfSxcbiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zdG9wKCk7XG4gICAgfSxcbiAgICBwYXVzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBfY29udGV4dC5zdG9wcGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIG9uRGV0ZWN0ZWQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNhbGxiYWNrIHx8ICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ29iamVjdCcgfHwgIWNhbGxiYWNrLmNhbGxiYWNrKSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoJyogd2FybmluZzogUXVhZ2dhLm9uRGV0ZWN0ZWQgY2FsbGVkIHdpdGggaW52YWxpZCBjYWxsYmFjaywgaWdub3JpbmcnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBFdmVudHMuc3Vic2NyaWJlKCdkZXRlY3RlZCcsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIG9mZkRldGVjdGVkOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgRXZlbnRzLnVuc3Vic2NyaWJlKCdkZXRlY3RlZCcsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIG9uUHJvY2Vzc2VkOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFjYWxsYmFjayB8fCAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdvYmplY3QnIHx8ICFjYWxsYmFjay5jYWxsYmFjaykpKSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCcqIHdhcm5pbmc6IFF1YWdnYS5vblByb2Nlc3NlZCBjYWxsZWQgd2l0aCBpbnZhbGlkIGNhbGxiYWNrLCBpZ25vcmluZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEV2ZW50cy5zdWJzY3JpYmUoJ3Byb2Nlc3NlZCcsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIG9mZlByb2Nlc3NlZDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIEV2ZW50cy51bnN1YnNjcmliZSgncHJvY2Vzc2VkJywgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgc2V0UmVhZGVyczogZnVuY3Rpb24gKHJlYWRlcnMpIHtcbiAgICAgICAgaWYgKCFyZWFkZXJzKSB7XG4gICAgICAgICAgICBjb25zb2xlLnRyYWNlKCcqIHdhcm5pbmc6IFF1YWdnYS5zZXRSZWFkZXJzIGNhbGxlZCB3aXRoIG5vIHJlYWRlcnMsIGlnbm9yaW5nJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2Uuc2V0UmVhZGVycyhyZWFkZXJzKTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyUmVhZGVyOiBmdW5jdGlvbiAobmFtZSwgcmVhZGVyKSB7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgnKiB3YXJuaW5nOiBRdWFnZ2EucmVnaXN0ZXJSZWFkZXIgY2FsbGVkIHdpdGggbm8gbmFtZSwgaWdub3JpbmcnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlYWRlcikge1xuICAgICAgICAgICAgY29uc29sZS50cmFjZSgnKiB3YXJuaW5nOiBRdWFnZ2EucmVnaXN0ZXJSZWFkZXIgY2FsbGVkIHdpdGggbm8gcmVhZGVyLCBpZ25vcmluZycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLnJlZ2lzdGVyUmVhZGVyKG5hbWUsIHJlYWRlcik7XG4gICAgfSxcbiAgICByZWdpc3RlclJlc3VsdENvbGxlY3RvcjogZnVuY3Rpb24gKHJlc3VsdENvbGxlY3Rvcikge1xuICAgICAgICBpZiAocmVzdWx0Q29sbGVjdG9yICYmIHR5cGVvZiByZXN1bHRDb2xsZWN0b3IuYWRkUmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfY29udGV4dC5yZXN1bHRDb2xsZWN0b3IgPSByZXN1bHRDb2xsZWN0b3I7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGdldCBjYW52YXMoKSB7XG4gICAgICAgIHJldHVybiBfY29udGV4dC5jYW52YXNDb250YWluZXI7XG4gICAgfSxcbiAgICBkZWNvZGVTaW5nbGU6IGZ1bmN0aW9uIChjb25maWcsIHJlc3VsdENhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHF1YWdnYUluc3RhbmNlID0gbmV3IFF1YWdnYSgpO1xuICAgICAgICBjb25maWcgPSBtZXJnZSh7XG4gICAgICAgICAgICBpbnB1dFN0cmVhbToge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdJbWFnZVN0cmVhbScsXG4gICAgICAgICAgICAgICAgc2VxdWVuY2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNpemU6IDgwMCxcbiAgICAgICAgICAgICAgICBzcmM6IGNvbmZpZy5zcmMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbnVtT2ZXb3JrZXJzOiAoRU5WLmRldmVsb3BtZW50ICYmIGNvbmZpZy5kZWJ1ZykgPyAwIDogMSxcbiAgICAgICAgICAgIGxvY2F0b3I6IHtcbiAgICAgICAgICAgICAgICBoYWxmU2FtcGxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sIGNvbmZpZyk7XG4gICAgICAgIC8vIFRPRE8gIzE3NTogcmVzdHJ1Y3R1cmUgd29ya2VyIHN1cHBvcnQgc28gdGhhdCBpdCB3aWxsIHdvcmsgd2l0aCB0eXBlc2NyaXB0IHVzaW5nIHdvcmtlci1sb2FkZXJcbiAgICAgICAgLy8gaHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9sb2FkZXJzL3dvcmtlci1sb2FkZXIvXG4gICAgICAgIGlmIChjb25maWcubnVtT2ZXb3JrZXJzID4gMCkge1xuICAgICAgICAgICAgY29uZmlnLm51bU9mV29ya2VycyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd29ya2VycyByZXF1aXJlIFdvcmtlciBhbmQgQmxvYiBzdXBwb3J0IHByZXNlbnRseSwgc28gaWYgbm8gQmxvYiBvciBXb3JrZXIgdGhlbiBzZXRcbiAgICAgICAgLy8gd29ya2VycyB0byAwLlxuICAgICAgICBpZiAoY29uZmlnLm51bU9mV29ya2VycyA+IDAgJiYgKHR5cGVvZiBCbG9iID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgV29ya2VyID09PSAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignKiBubyBXb3JrZXIgYW5kL29yIEJsb2Igc3VwcG9ydCAtIGZvcmNpbmcgbnVtT2ZXb3JrZXJzIHRvIDAnKTtcbiAgICAgICAgICAgIGNvbmZpZy5udW1PZldvcmtlcnMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdChjb25maWcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRzLm9uY2UoJ3Byb2Nlc3NlZCcsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrLmNhbGwobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHF1YWdnYUluc3RhbmNlLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgfSwgbnVsbCwgcXVhZ2dhSW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gYWRkIHRoZSB1c3VhbGx5IGV4cGVjdGVkIFwiZGVmYXVsdFwiIGZvciB1c2Ugd2l0aCByZXF1aXJlLCBidWlsZCBzdGVwIHdvbid0IGFsbG93IHVzIHRvXG4gICAgLy8gd3JpdGUgdG8gbW9kdWxlLmV4cG9ydHMgc28gZG8gaXQgaGVyZS5cbiAgICBnZXQgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIFF1YWdnYUpTU3RhdGljSW50ZXJmYWNlO1xuICAgIH0sXG4gICAgUmVhZGVycyxcbiAgICBDYW1lcmFBY2Nlc3MsXG4gICAgSW1hZ2VEZWJ1ZyxcbiAgICBJbWFnZVdyYXBwZXIsXG4gICAgUmVzdWx0Q29sbGVjdG9yLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUXVhZ2dhSlNTdGF0aWNJbnRlcmZhY2U7XG4vLyBleHBvcnQgQmFyY29kZVJlYWRlciBhbmQgb3RoZXIgdXRpbGl0aWVzIGZvciBleHRlcm5hbCBwbHVnaW5zXG5leHBvcnQge1xuICAgIEJhcmNvZGVEZWNvZGVyLFxuICAgIFJlYWRlcnMsXG4gICAgQ2FtZXJhQWNjZXNzLFxuICAgIEltYWdlRGVidWcsXG4gICAgSW1hZ2VXcmFwcGVyLFxuICAgIFJlc3VsdENvbGxlY3Rvcixcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9