You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

25 lines
443 KiB
JavaScript

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "vendor-chunks/axios";
exports.ids = ["vendor-chunks/axios"];
exports.modules = {
/***/ "(ssr)/./node_modules/axios/dist/node/axios.cjs":
/*!************************************************!*\
!*** ./node_modules/axios/dist/node/axios.cjs ***!
\************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("// Axios v1.7.5 Copyright (c) 2024 Matt Zabriskie and contributors\n\nconst FormData$1 = __webpack_require__(/*! form-data */ \"(ssr)/./node_modules/form-data/lib/form_data.js\");\nconst url = __webpack_require__(/*! url */ \"url\");\nconst proxyFromEnv = __webpack_require__(/*! proxy-from-env */ \"(ssr)/./node_modules/proxy-from-env/index.js\");\nconst http = __webpack_require__(/*! http */ \"http\");\nconst https = __webpack_require__(/*! https */ \"https\");\nconst util = __webpack_require__(/*! util */ \"util\");\nconst followRedirects = __webpack_require__(/*! follow-redirects */ \"(ssr)/./node_modules/follow-redirects/index.js\");\nconst zlib = __webpack_require__(/*! zlib */ \"zlib\");\nconst stream = __webpack_require__(/*! stream */ \"stream\");\nconst events = __webpack_require__(/*! events */ \"events\");\nfunction _interopDefaultLegacy(e) {\n return e && typeof e === \"object\" && \"default\" in e ? e : {\n \"default\": e\n };\n}\nconst FormData__default = /*#__PURE__*/ _interopDefaultLegacy(FormData$1);\nconst url__default = /*#__PURE__*/ _interopDefaultLegacy(url);\nconst http__default = /*#__PURE__*/ _interopDefaultLegacy(http);\nconst https__default = /*#__PURE__*/ _interopDefaultLegacy(https);\nconst util__default = /*#__PURE__*/ _interopDefaultLegacy(util);\nconst followRedirects__default = /*#__PURE__*/ _interopDefaultLegacy(followRedirects);\nconst zlib__default = /*#__PURE__*/ _interopDefaultLegacy(zlib);\nconst stream__default = /*#__PURE__*/ _interopDefaultLegacy(stream);\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n// utils is a library of generic helper functions non-specific to axios\nconst { toString } = Object.prototype;\nconst { getPrototypeOf } = Object;\nconst kindOf = ((cache)=>(thing)=>{\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n })(Object.create(null));\nconst kindOfTest = (type)=>{\n type = type.toLowerCase();\n return (thing)=>kindOf(thing) === type;\n};\nconst typeOfTest = (type)=>(thing)=>typeof thing === type;\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */ const { isArray } = Array;\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */ const isUndefined = typeOfTest(\"undefined\");\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */ function isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */ const isArrayBuffer = kindOfTest(\"ArrayBuffer\");\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */ function isArrayBufferView(val) {\n let result;\n if (typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView) {\n result = ArrayBuffer.isView(val);\n } else {\n result = val && val.buffer && isArrayBuffer(val.buffer);\n }\n return result;\n}\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */ const isString = typeOfTest(\"string\");\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */ const isFunction = typeOfTest(\"function\");\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */ const isNumber = typeOfTest(\"number\");\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */ const isObject = (thing)=>thing !== null && typeof thing === \"object\";\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */ const isBoolean = (thing)=>thing === true || thing === false;\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */ const isPlainObject = (val)=>{\n if (kindOf(val) !== \"object\") {\n return false;\n }\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */ const isDate = kindOfTest(\"Date\");\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */ const isFile = kindOfTest(\"File\");\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */ const isBlob = kindOfTest(\"Blob\");\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */ const isFileList = kindOfTest(\"FileList\");\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */ const isStream = (val)=>isObject(val) && isFunction(val.pipe);\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */ const isFormData = (thing)=>{\n let kind;\n return thing && (typeof FormData === \"function\" && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === \"formdata\" || // detect form-data instance\n kind === \"object\" && isFunction(thing.toString) && thing.toString() === \"[object FormData]\"));\n};\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */ const isURLSearchParams = kindOfTest(\"URLSearchParams\");\nconst [isReadableStream, isRequest, isResponse, isHeaders] = [\n \"ReadableStream\",\n \"Request\",\n \"Response\",\n \"Headers\"\n].map(kindOfTest);\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */ const trim = (str)=>str.trim ? str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */ function forEach(obj, fn, { allOwnKeys = false } = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === \"undefined\") {\n return;\n }\n let i;\n let l;\n // Force an array if not already something iterable\n if (typeof obj !== \"object\") {\n /*eslint no-param-reassign:0*/ obj = [\n obj\n ];\n }\n if (isArray(obj)) {\n // Iterate over array values\n for(i = 0, l = obj.length; i < l; i++){\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n for(i = 0; i < len; i++){\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while(i-- > 0){\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\nconst _global = (()=>{\n /*eslint no-undef:0*/ if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : false ? 0 : global;\n})();\nconst isContextDefined = (context)=>!isUndefined(context) && context !== _global;\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */ function merge() {\n const { caseless } = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key)=>{\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n for(let i = 0, l = arguments.length; i < l; i++){\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */ const extend = (a, b, thisArg, { allOwnKeys } = {})=>{\n forEach(b, (val, key)=>{\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {\n allOwnKeys\n });\n return a;\n};\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */ const stripBOM = (content)=>{\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n};\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */ const inherits = (constructor, superConstructor, props, descriptors)=>{\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, \"super\", {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */ const toFlatObject = (sourceObj, destObj, filter, propFilter)=>{\n let props;\n let i;\n let prop;\n const merged = {};\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while(i-- > 0){\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n }while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n return destObj;\n};\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */ const endsWith = (str, searchString, position)=>{\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */ const toArray = (thing)=>{\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while(i-- > 0){\n arr[i] = thing[i];\n }\n return arr;\n};\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */ // eslint-disable-next-line func-names\nconst isTypedArray = ((TypedArray)=>{\n // eslint-disable-next-line func-names\n return (thing)=>{\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== \"undefined\" && getPrototypeOf(Uint8Array));\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */ const forEachEntry = (obj, fn)=>{\n const generator = obj && obj[Symbol.iterator];\n const iterator = generator.call(obj);\n let result;\n while((result = iterator.next()) && !result.done){\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */ const matchAll = (regExp, str)=>{\n let matches;\n const arr = [];\n while((matches = regExp.exec(str)) !== null){\n arr.push(matches);\n }\n return arr;\n};\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */ const isHTMLForm = kindOfTest(\"HTMLFormElement\");\nconst toCamelCase = (str)=>{\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g, function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n });\n};\n/* Creating a function that will check if an object has a property. */ const hasOwnProperty = (({ hasOwnProperty })=>(obj, prop)=>hasOwnProperty.call(obj, prop))(Object.prototype);\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */ const isRegExp = kindOfTest(\"RegExp\");\nconst reduceDescriptors = (obj, reducer)=>{\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n forEach(descriptors, (descriptor, name)=>{\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n Object.defineProperties(obj, reducedDescriptors);\n};\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */ const freezeMethods = (obj)=>{\n reduceDescriptors(obj, (descriptor, name)=>{\n // skip restricted props in strict mode\n if (isFunction(obj) && [\n \"arguments\",\n \"caller\",\n \"callee\"\n ].indexOf(name) !== -1) {\n return false;\n }\n const value = obj[name];\n if (!isFunction(value)) return;\n descriptor.enumerable = false;\n if (\"writable\" in descriptor) {\n descriptor.writable = false;\n return;\n }\n if (!descriptor.set) {\n descriptor.set = ()=>{\n throw Error(\"Can not rewrite read-only method '\" + name + \"'\");\n };\n }\n });\n};\nconst toObjectSet = (arrayOrString, delimiter)=>{\n const obj = {};\n const define = (arr)=>{\n arr.forEach((value)=>{\n obj[value] = true;\n });\n };\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n return obj;\n};\nconst noop = ()=>{};\nconst toFiniteNumber = (value, defaultValue)=>{\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n};\nconst ALPHA = \"abcdefghijklmnopqrstuvwxyz\";\nconst DIGIT = \"0123456789\";\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT)=>{\n let str = \"\";\n const { length } = alphabet;\n while(size--){\n str += alphabet[Math.random() * length | 0];\n }\n return str;\n};\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */ function isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === \"FormData\" && thing[Symbol.iterator]);\n}\nconst toJSONObject = (obj)=>{\n const stack = new Array(10);\n const visit = (source, i)=>{\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n if (!(\"toJSON\" in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n forEach(source, (value, key)=>{\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n stack[i] = undefined;\n return target;\n }\n }\n return source;\n };\n return visit(obj, 0);\n};\nconst isAsyncFn = kindOfTest(\"AsyncFunction\");\nconst isThenable = (thing)=>thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\nconst _setImmediate = ((setImmediateSupported, postMessageSupported)=>{\n if (setImmediateSupported) {\n return setImmediate;\n }\n return postMessageSupported ? ((token, callbacks)=>{\n _global.addEventListener(\"message\", ({ source, data })=>{\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n return (cb)=>{\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n };\n })(`axios@${Math.random()}`, []) : (cb)=>setTimeout(cb);\n})(typeof setImmediate === \"function\", isFunction(_global.postMessage));\nconst asap = typeof queueMicrotask !== \"undefined\" ? queueMicrotask.bind(_global) : typeof process !== \"undefined\" && process.nextTick || _setImmediate;\n// *********************\nconst utils$1 = {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty,\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */ function AxiosError(message, code, config, request, response) {\n Error.call(this);\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error().stack;\n }\n this.message = message;\n this.name = \"AxiosError\";\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\nutils$1.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils$1.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\nconst prototype$1 = AxiosError.prototype;\nconst descriptors = {};\n[\n \"ERR_BAD_OPTION_VALUE\",\n \"ERR_BAD_OPTION\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ERR_NETWORK\",\n \"ERR_FR_TOO_MANY_REDIRECTS\",\n \"ERR_DEPRECATED\",\n \"ERR_BAD_RESPONSE\",\n \"ERR_BAD_REQUEST\",\n \"ERR_CANCELED\",\n \"ERR_NOT_SUPPORT\",\n \"ERR_INVALID_URL\"\n].forEach((code)=>{\n descriptors[code] = {\n value: code\n };\n});\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype$1, \"isAxiosError\", {\n value: true\n});\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps)=>{\n const axiosError = Object.create(prototype$1);\n utils$1.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, (prop)=>{\n return prop !== \"isAxiosError\";\n });\n AxiosError.call(axiosError, error.message, code, config, request, response);\n axiosError.cause = error;\n axiosError.name = error.name;\n customProps && Object.assign(axiosError, customProps);\n return axiosError;\n};\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */ function isVisitable(thing) {\n return utils$1.isPlainObject(thing) || utils$1.isArray(thing);\n}\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */ function removeBrackets(key) {\n return utils$1.endsWith(key, \"[]\") ? key.slice(0, -2) : key;\n}\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */ function renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? \"[\" + token + \"]\" : token;\n }).join(dots ? \".\" : \"\");\n}\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */ function isFlatArray(arr) {\n return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\nconst predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/ /**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */ function toFormData(obj, formData, options) {\n if (!utils$1.isObject(obj)) {\n throw new TypeError(\"target must be an object\");\n }\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (FormData__default[\"default\"] || FormData)();\n // eslint-disable-next-line no-param-reassign\n options = utils$1.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils$1.isUndefined(source[option]);\n });\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== \"undefined\" && Blob;\n const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);\n if (!utils$1.isFunction(visitor)) {\n throw new TypeError(\"visitor must be a function\");\n }\n function convertValue(value) {\n if (value === null) return \"\";\n if (utils$1.isDate(value)) {\n return value.toISOString();\n }\n if (!useBlob && utils$1.isBlob(value)) {\n throw new AxiosError(\"Blob is not supported. Use a Buffer instead.\");\n }\n if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {\n return useBlob && typeof Blob === \"function\" ? new Blob([\n value\n ]) : Buffer.from(value);\n }\n return value;\n }\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array<String|Number>} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */ function defaultVisitor(value, key, path) {\n let arr = value;\n if (value && !path && typeof value === \"object\") {\n if (utils$1.endsWith(key, \"{}\")) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (utils$1.isArray(value) && isFlatArray(value) || (utils$1.isFileList(value) || utils$1.endsWith(key, \"[]\")) && (arr = utils$1.toArray(value))) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n arr.forEach(function each(el, index) {\n !(utils$1.isUndefined(el) || el === null) && formData.append(// eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([\n key\n ], index, dots) : indexes === null ? key : key + \"[]\", convertValue(el));\n });\n return false;\n }\n }\n if (isVisitable(value)) {\n return true;\n }\n formData.append(renderKey(path, key, dots), convertValue(value));\n return false;\n }\n const stack = [];\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n function build(value, path) {\n if (utils$1.isUndefined(value)) return;\n if (stack.indexOf(value) !== -1) {\n throw Error(\"Circular reference detected in \" + path.join(\".\"));\n }\n stack.push(value);\n utils$1.forEach(value, function each(el, key) {\n const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers);\n if (result === true) {\n build(el, path ? path.concat(key) : [\n key\n ]);\n }\n });\n stack.pop();\n }\n if (!utils$1.isObject(obj)) {\n throw new TypeError(\"data must be an object\");\n }\n build(obj);\n return formData;\n}\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */ function encode$1(str) {\n const charMap = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\x00\"\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */ function AxiosURLSearchParams(params, options) {\n this._pairs = [];\n params && toFormData(params, this, options);\n}\nconst prototype = AxiosURLSearchParams.prototype;\nprototype.append = function append(name, value) {\n this._pairs.push([\n name,\n value\n ]);\n};\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + \"=\" + _encode(pair[1]);\n }, \"\").join(\"&\");\n};\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */ function encode(val) {\n return encodeURIComponent(val).replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%20/g, \"+\").replace(/%5B/gi, \"[\").replace(/%5D/gi, \"]\");\n}\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */ function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/ if (!params) {\n return url;\n }\n const _encode = options && options.encode || encode;\n const serializeFn = options && options.serialize;\n let serializedParams;\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils$1.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode);\n }\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + serializedParams;\n }\n return url;\n}\nclass InterceptorManager {\n constructor(){\n this.handlers = [];\n }\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */ use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */ eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */ clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */ forEach(fn) {\n utils$1.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\nconst InterceptorManager$1 = InterceptorManager;\nconst transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\nconst URLSearchParams = url__default[\"default\"].URLSearchParams;\nconst platform$1 = {\n isNode: true,\n classes: {\n URLSearchParams,\n FormData: FormData__default[\"default\"],\n Blob: typeof Blob !== \"undefined\" && Blob || null\n },\n protocols: [\n \"http\",\n \"https\",\n \"file\",\n \"data\"\n ]\n};\nconst hasBrowserEnv = false && 0;\nconst _navigator = typeof navigator === \"object\" && navigator || undefined;\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */ const hasStandardBrowserEnv = hasBrowserEnv && (!_navigator || [\n \"ReactNative\",\n \"NativeScript\",\n \"NS\"\n].indexOf(_navigator.product) < 0);\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */ const hasStandardBrowserWebWorkerEnv = (()=>{\n return typeof WorkerGlobalScope !== \"undefined\" && // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope && typeof self.importScripts === \"function\";\n})();\nconst origin = hasBrowserEnv && window.location.href || \"http://localhost\";\nconst utils = /*#__PURE__*/ Object.freeze({\n __proto__: null,\n hasBrowserEnv: hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv: hasStandardBrowserEnv,\n navigator: _navigator,\n origin: origin\n});\nconst platform = {\n ...utils,\n ...platform$1\n};\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils$1.isBuffer(value)) {\n this.append(key, value.toString(\"base64\"));\n return false;\n }\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */ function parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils$1.matchAll(/\\w+|\\[(\\w*)]/g, name).map((match)=>{\n return match[0] === \"[]\" ? \"\" : match[1] || match[0];\n });\n}\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */ function arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for(i = 0; i < len; i++){\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */ function formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n if (name === \"__proto__\") return true;\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils$1.isArray(target) ? target.length : name;\n if (isLast) {\n if (utils$1.hasOwnProp(target, name)) {\n target[name] = [\n target[name],\n value\n ];\n } else {\n target[name] = value;\n }\n return !isNumericKey;\n }\n if (!target[name] || !utils$1.isObject(target[name])) {\n target[name] = [];\n }\n const result = buildPath(path, value, target[name], index);\n if (result && utils$1.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n return !isNumericKey;\n }\n if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n const obj = {};\n utils$1.forEachEntry(formData, (name, value)=>{\n buildPath(parsePropPath(name), value, obj, 0);\n });\n return obj;\n }\n return null;\n}\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */ function stringifySafely(rawValue, parser, encoder) {\n if (utils$1.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils$1.trim(rawValue);\n } catch (e) {\n if (e.name !== \"SyntaxError\") {\n throw e;\n }\n }\n }\n return (encoder || JSON.stringify)(rawValue);\n}\nconst defaults = {\n transitional: transitionalDefaults,\n adapter: [\n \"xhr\",\n \"http\",\n \"fetch\"\n ],\n transformRequest: [\n function transformRequest(data, headers) {\n const contentType = headers.getContentType() || \"\";\n const hasJSONContentType = contentType.indexOf(\"application/json\") > -1;\n const isObjectPayload = utils$1.isObject(data);\n if (isObjectPayload && utils$1.isHTMLForm(data)) {\n data = new FormData(data);\n }\n const isFormData = utils$1.isFormData(data);\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n if (utils$1.isArrayBuffer(data) || utils$1.isBuffer(data) || utils$1.isStream(data) || utils$1.isFile(data) || utils$1.isBlob(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n if (utils$1.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils$1.isURLSearchParams(data)) {\n headers.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\", false);\n return data.toString();\n }\n let isFileList;\n if (isObjectPayload) {\n if (contentType.indexOf(\"application/x-www-form-urlencoded\") > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf(\"multipart/form-data\") > -1) {\n const _FormData = this.env && this.env.FormData;\n return toFormData(isFileList ? {\n \"files[]\": data\n } : data, _FormData && new _FormData(), this.formSerializer);\n }\n }\n if (isObjectPayload || hasJSONContentType) {\n headers.setContentType(\"application/json\", false);\n return stringifySafely(data);\n }\n return data;\n }\n ],\n transformResponse: [\n function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === \"json\";\n if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n if (data && utils$1.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === \"SyntaxError\") {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n return data;\n }\n ],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */ timeout: 0,\n xsrfCookieName: \"XSRF-TOKEN\",\n xsrfHeaderName: \"X-XSRF-TOKEN\",\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n headers: {\n common: {\n \"Accept\": \"application/json, text/plain, */*\",\n \"Content-Type\": undefined\n }\n }\n};\nutils$1.forEach([\n \"delete\",\n \"get\",\n \"head\",\n \"post\",\n \"put\",\n \"patch\"\n], (method)=>{\n defaults.headers[method] = {};\n});\nconst defaults$1 = defaults;\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils$1.toObjectSet([\n \"age\",\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"etag\",\n \"expires\",\n \"from\",\n \"host\",\n \"if-modified-since\",\n \"if-unmodified-since\",\n \"last-modified\",\n \"location\",\n \"max-forwards\",\n \"proxy-authorization\",\n \"referer\",\n \"retry-after\",\n \"user-agent\"\n]);\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */ const parseHeaders = (rawHeaders)=>{\n const parsed = {};\n let key;\n let val;\n let i;\n rawHeaders && rawHeaders.split(\"\\n\").forEach(function parser(line) {\n i = line.indexOf(\":\");\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n if (!key || parsed[key] && ignoreDuplicateOf[key]) {\n return;\n }\n if (key === \"set-cookie\") {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [\n val\n ];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + \", \" + val : val;\n }\n });\n return parsed;\n};\nconst $internals = Symbol(\"internals\");\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);\n}\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n while(match = tokensRE.exec(str)){\n tokens[match[1]] = match[2];\n }\n return tokens;\n}\nconst isValidHeaderName = (str)=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils$1.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n if (isHeaderNameFilter) {\n value = header;\n }\n if (!utils$1.isString(value)) return;\n if (utils$1.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n if (utils$1.isRegExp(filter)) {\n return filter.test(value);\n }\n}\nfunction formatHeader(header) {\n return header.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str)=>{\n return char.toUpperCase() + str;\n });\n}\nfunction buildAccessors(obj, header) {\n const accessorName = utils$1.toCamelCase(\" \" + header);\n [\n \"get\",\n \"set\",\n \"has\"\n ].forEach((methodName)=>{\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\nclass AxiosHeaders {\n constructor(headers){\n headers && this.set(headers);\n }\n set(header, valueOrRewrite, rewrite) {\n const self1 = this;\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n if (!lHeader) {\n throw new Error(\"header name must be a non-empty string\");\n }\n const key = utils$1.findKey(self1, lHeader);\n if (!key || self1[key] === undefined || _rewrite === true || _rewrite === undefined && self1[key] !== false) {\n self1[key || _header] = normalizeValue(_value);\n }\n }\n const setHeaders = (headers, _rewrite)=>utils$1.forEach(headers, (_value, _header)=>setHeader(_value, _header, _rewrite));\n if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if (utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils$1.isHeaders(header)) {\n for (const [key, value] of header.entries()){\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n return this;\n }\n get(header, parser) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils$1.findKey(this, header);\n if (key) {\n const value = this[key];\n if (!parser) {\n return value;\n }\n if (parser === true) {\n return parseTokens(value);\n }\n if (utils$1.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n if (utils$1.isRegExp(parser)) {\n return parser.exec(value);\n }\n throw new TypeError(\"parser must be boolean|regexp|function\");\n }\n }\n }\n has(header, matcher) {\n header = normalizeHeader(header);\n if (header) {\n const key = utils$1.findKey(this, header);\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n return false;\n }\n delete(header, matcher) {\n const self1 = this;\n let deleted = false;\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n if (_header) {\n const key = utils$1.findKey(self1, _header);\n if (key && (!matcher || matchHeaderValue(self1, self1[key], key, matcher))) {\n delete self1[key];\n deleted = true;\n }\n }\n }\n if (utils$1.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n return deleted;\n }\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n while(i--){\n const key = keys[i];\n if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n return deleted;\n }\n normalize(format) {\n const self1 = this;\n const headers = {};\n utils$1.forEach(this, (value, header)=>{\n const key = utils$1.findKey(headers, header);\n if (key) {\n self1[key] = normalizeValue(value);\n delete self1[header];\n return;\n }\n const normalized = format ? formatHeader(header) : String(header).trim();\n if (normalized !== header) {\n delete self1[header];\n }\n self1[normalized] = normalizeValue(value);\n headers[normalized] = true;\n });\n return this;\n }\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n toJSON(asStrings) {\n const obj = Object.create(null);\n utils$1.forEach(this, (value, header)=>{\n value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(\", \") : value);\n });\n return obj;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([header, value])=>header + \": \" + value).join(\"\\n\");\n }\n get [Symbol.toStringTag]() {\n return \"AxiosHeaders\";\n }\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n static concat(first, ...targets) {\n const computed = new this(first);\n targets.forEach((target)=>computed.set(target));\n return computed;\n }\n static accessor(header) {\n const internals = this[$internals] = this[$internals] = {\n accessors: {}\n };\n const accessors = internals.accessors;\n const prototype = this.prototype;\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n return this;\n }\n}\nAxiosHeaders.accessor([\n \"Content-Type\",\n \"Content-Length\",\n \"Accept\",\n \"Accept-Encoding\",\n \"User-Agent\",\n \"Authorization\"\n]);\n// reserved names hotfix\nutils$1.reduceDescriptors(AxiosHeaders.prototype, ({ value }, key)=>{\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: ()=>value,\n set (headerValue) {\n this[mapped] = headerValue;\n }\n };\n});\nutils$1.freezeMethods(AxiosHeaders);\nconst AxiosHeaders$1 = AxiosHeaders;\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */ function transformData(fns, response) {\n const config = this || defaults$1;\n const context = response || config;\n const headers = AxiosHeaders$1.from(context.headers);\n let data = context.data;\n utils$1.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n headers.normalize();\n return data;\n}\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */ function CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? \"canceled\" : message, AxiosError.ERR_CANCELED, config, request);\n this.name = \"CanceledError\";\n}\nutils$1.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */ function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\"Request failed with status code \" + response.status, [\n AxiosError.ERR_BAD_REQUEST,\n AxiosError.ERR_BAD_RESPONSE\n ][Math.floor(response.status / 100) - 4], response.config, response.request, response));\n }\n}\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */ function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */ function combineURLs(baseURL, relativeURL) {\n return relativeURL ? baseURL.replace(/\\/?\\/$/, \"\") + \"/\" + relativeURL.replace(/^\\/+/, \"\") : baseURL;\n}\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */ function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\nconst VERSION = \"1.7.5\";\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || \"\";\n}\nconst DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\\s\\S]*)$/;\n/**\n * Parse data uri to a Buffer or Blob\n *\n * @param {String} uri\n * @param {?Boolean} asBlob\n * @param {?Object} options\n * @param {?Function} options.Blob\n *\n * @returns {Buffer|Blob}\n */ function fromDataURI(uri, asBlob, options) {\n const _Blob = options && options.Blob || platform.classes.Blob;\n const protocol = parseProtocol(uri);\n if (asBlob === undefined && _Blob) {\n asBlob = true;\n }\n if (protocol === \"data\") {\n uri = protocol.length ? uri.slice(protocol.length + 1) : uri;\n const match = DATA_URL_PATTERN.exec(uri);\n if (!match) {\n throw new AxiosError(\"Invalid URL\", AxiosError.ERR_INVALID_URL);\n }\n const mime = match[1];\n const isBase64 = match[2];\n const body = match[3];\n const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? \"base64\" : \"utf8\");\n if (asBlob) {\n if (!_Blob) {\n throw new AxiosError(\"Blob is not supported\", AxiosError.ERR_NOT_SUPPORT);\n }\n return new _Blob([\n buffer\n ], {\n type: mime\n });\n }\n return buffer;\n }\n throw new AxiosError(\"Unsupported protocol \" + protocol, AxiosError.ERR_NOT_SUPPORT);\n}\nconst kInternals = Symbol(\"internals\");\nclass AxiosTransformStream extends stream__default[\"default\"].Transform {\n constructor(options){\n options = utils$1.toFlatObject(options, {\n maxRate: 0,\n chunkSize: 64 * 1024,\n minChunkSize: 100,\n timeWindow: 500,\n ticksRate: 2,\n samplesCount: 15\n }, null, (prop, source)=>{\n return !utils$1.isUndefined(source[prop]);\n });\n super({\n readableHighWaterMark: options.chunkSize\n });\n const internals = this[kInternals] = {\n timeWindow: options.timeWindow,\n chunkSize: options.chunkSize,\n maxRate: options.maxRate,\n minChunkSize: options.minChunkSize,\n bytesSeen: 0,\n isCaptured: false,\n notifiedBytesLoaded: 0,\n ts: Date.now(),\n bytes: 0,\n onReadCallback: null\n };\n this.on(\"newListener\", (event)=>{\n if (event === \"progress\") {\n if (!internals.isCaptured) {\n internals.isCaptured = true;\n }\n }\n });\n }\n _read(size) {\n const internals = this[kInternals];\n if (internals.onReadCallback) {\n internals.onReadCallback();\n }\n return super._read(size);\n }\n _transform(chunk, encoding, callback) {\n const internals = this[kInternals];\n const maxRate = internals.maxRate;\n const readableHighWaterMark = this.readableHighWaterMark;\n const timeWindow = internals.timeWindow;\n const divider = 1000 / timeWindow;\n const bytesThreshold = maxRate / divider;\n const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;\n const pushChunk = (_chunk, _callback)=>{\n const bytes = Buffer.byteLength(_chunk);\n internals.bytesSeen += bytes;\n internals.bytes += bytes;\n internals.isCaptured && this.emit(\"progress\", internals.bytesSeen);\n if (this.push(_chunk)) {\n process.nextTick(_callback);\n } else {\n internals.onReadCallback = ()=>{\n internals.onReadCallback = null;\n process.nextTick(_callback);\n };\n }\n };\n const transformChunk = (_chunk, _callback)=>{\n const chunkSize = Buffer.byteLength(_chunk);\n let chunkRemainder = null;\n let maxChunkSize = readableHighWaterMark;\n let bytesLeft;\n let passed = 0;\n if (maxRate) {\n const now = Date.now();\n if (!internals.ts || (passed = now - internals.ts) >= timeWindow) {\n internals.ts = now;\n bytesLeft = bytesThreshold - internals.bytes;\n internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;\n passed = 0;\n }\n bytesLeft = bytesThreshold - internals.bytes;\n }\n if (maxRate) {\n if (bytesLeft <= 0) {\n // next time window\n return setTimeout(()=>{\n _callback(null, _chunk);\n }, timeWindow - passed);\n }\n if (bytesLeft < maxChunkSize) {\n maxChunkSize = bytesLeft;\n }\n }\n if (maxChunkSize && chunkSize > maxChunkSize && chunkSize - maxChunkSize > minChunkSize) {\n chunkRemainder = _chunk.subarray(maxChunkSize);\n _chunk = _chunk.subarray(0, maxChunkSize);\n }\n pushChunk(_chunk, chunkRemainder ? ()=>{\n process.nextTick(_callback, null, chunkRemainder);\n } : _callback);\n };\n transformChunk(chunk, function transformNextChunk(err, _chunk) {\n if (err) {\n return callback(err);\n }\n if (_chunk) {\n transformChunk(_chunk, transformNextChunk);\n } else {\n callback(null);\n }\n });\n }\n}\nconst AxiosTransformStream$1 = AxiosTransformStream;\nconst { asyncIterator } = Symbol;\nconst readBlob = async function*(blob) {\n if (blob.stream) {\n yield* blob.stream();\n } else if (blob.arrayBuffer) {\n yield await blob.arrayBuffer();\n } else if (blob[asyncIterator]) {\n yield* blob[asyncIterator]();\n } else {\n yield blob;\n }\n};\nconst readBlob$1 = readBlob;\nconst BOUNDARY_ALPHABET = utils$1.ALPHABET.ALPHA_DIGIT + \"-_\";\nconst textEncoder = new util.TextEncoder();\nconst CRLF = \"\\r\\n\";\nconst CRLF_BYTES = textEncoder.encode(CRLF);\nconst CRLF_BYTES_COUNT = 2;\nclass FormDataPart {\n constructor(name, value){\n const { escapeName } = this.constructor;\n const isStringValue = utils$1.isString(value);\n let headers = `Content-Disposition: form-data; name=\"${escapeName(name)}\"${!isStringValue && value.name ? `; filename=\"${escapeName(value.name)}\"` : \"\"}${CRLF}`;\n if (isStringValue) {\n value = textEncoder.encode(String(value).replace(/\\r?\\n|\\r\\n?/g, CRLF));\n } else {\n headers += `Content-Type: ${value.type || \"application/octet-stream\"}${CRLF}`;\n }\n this.headers = textEncoder.encode(headers + CRLF);\n this.contentLength = isStringValue ? value.byteLength : value.size;\n this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;\n this.name = name;\n this.value = value;\n }\n async *encode() {\n yield this.headers;\n const { value } = this;\n if (utils$1.isTypedArray(value)) {\n yield value;\n } else {\n yield* readBlob$1(value);\n }\n yield CRLF_BYTES;\n }\n static escapeName(name) {\n return String(name).replace(/[\\r\\n\"]/g, (match)=>({\n \"\\r\": \"%0D\",\n \"\\n\": \"%0A\",\n '\"': \"%22\"\n })[match]);\n }\n}\nconst formDataToStream = (form, headersHandler, options)=>{\n const { tag = \"form-data-boundary\", size = 25, boundary = tag + \"-\" + utils$1.generateString(size, BOUNDARY_ALPHABET) } = options || {};\n if (!utils$1.isFormData(form)) {\n throw TypeError(\"FormData instance required\");\n }\n if (boundary.length < 1 || boundary.length > 70) {\n throw Error(\"boundary must be 10-70 characters long\");\n }\n const boundaryBytes = textEncoder.encode(\"--\" + boundary + CRLF);\n const footerBytes = textEncoder.encode(\"--\" + boundary + \"--\" + CRLF + CRLF);\n let contentLength = footerBytes.byteLength;\n const parts = Array.from(form.entries()).map(([name, value])=>{\n const part = new FormDataPart(name, value);\n contentLength += part.size;\n return part;\n });\n contentLength += boundaryBytes.byteLength * parts.length;\n contentLength = utils$1.toFiniteNumber(contentLength);\n const computedHeaders = {\n \"Content-Type\": `multipart/form-data; boundary=${boundary}`\n };\n if (Number.isFinite(contentLength)) {\n computedHeaders[\"Content-Length\"] = contentLength;\n }\n headersHandler && headersHandler(computedHeaders);\n return stream.Readable.from(async function*() {\n for (const part of parts){\n yield boundaryBytes;\n yield* part.encode();\n }\n yield footerBytes;\n }());\n};\nconst formDataToStream$1 = formDataToStream;\nclass ZlibHeaderTransformStream extends stream__default[\"default\"].Transform {\n __transform(chunk, encoding, callback) {\n this.push(chunk);\n callback();\n }\n _transform(chunk, encoding, callback) {\n if (chunk.length !== 0) {\n this._transform = this.__transform;\n // Add Default Compression headers if no zlib headers are present\n if (chunk[0] !== 120) {\n const header = Buffer.alloc(2);\n header[0] = 120; // Hex: 78\n header[1] = 156; // Hex: 9C \n this.push(header, encoding);\n }\n }\n this.__transform(chunk, encoding, callback);\n }\n}\nconst ZlibHeaderTransformStream$1 = ZlibHeaderTransformStream;\nconst callbackify = (fn, reducer)=>{\n return utils$1.isAsyncFn(fn) ? function(...args) {\n const cb = args.pop();\n fn.apply(this, args).then((value)=>{\n try {\n reducer ? cb(null, ...reducer(value)) : cb(null, value);\n } catch (err) {\n cb(err);\n }\n }, cb);\n } : fn;\n};\nconst callbackify$1 = callbackify;\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */ function speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n min = min !== undefined ? min : 1000;\n return function push(chunkLength) {\n const now = Date.now();\n const startedAt = timestamps[tail];\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n bytes[head] = chunkLength;\n timestamps[head] = now;\n let i = tail;\n let bytesCount = 0;\n while(i !== head){\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n head = (head + 1) % samplesCount;\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n if (now - firstSampleTS < min) {\n return;\n }\n const passed = startedAt && now - startedAt;\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */ function throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n const invoke = (args, now = Date.now())=>{\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n };\n const throttled = (...args)=>{\n const now = Date.now();\n const passed = now - timestamp;\n if (passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(()=>{\n timer = null;\n invoke(lastArgs);\n }, threshold - passed);\n }\n }\n };\n const flush = ()=>lastArgs && invoke(lastArgs);\n return [\n throttled,\n flush\n ];\n}\nconst progressEventReducer = (listener, isDownloadStream, freq = 3)=>{\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n return throttle((e)=>{\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n bytesNotified = loaded;\n const data = {\n loaded,\n total,\n progress: total ? loaded / total : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? \"download\" : \"upload\"]: true\n };\n listener(data);\n }, freq);\n};\nconst progressEventDecorator = (total, throttled)=>{\n const lengthComputable = total != null;\n return [\n (loaded)=>throttled[0]({\n lengthComputable,\n total,\n loaded\n }),\n throttled[1]\n ];\n};\nconst asyncDecorator = (fn)=>(...args)=>utils$1.asap(()=>fn(...args));\nconst zlibOptions = {\n flush: zlib__default[\"default\"].constants.Z_SYNC_FLUSH,\n finishFlush: zlib__default[\"default\"].constants.Z_SYNC_FLUSH\n};\nconst brotliOptions = {\n flush: zlib__default[\"default\"].constants.BROTLI_OPERATION_FLUSH,\n finishFlush: zlib__default[\"default\"].constants.BROTLI_OPERATION_FLUSH\n};\nconst isBrotliSupported = utils$1.isFunction(zlib__default[\"default\"].createBrotliDecompress);\nconst { http: httpFollow, https: httpsFollow } = followRedirects__default[\"default\"];\nconst isHttps = /https:?/;\nconst supportedProtocols = platform.protocols.map((protocol)=>{\n return protocol + \":\";\n});\nconst flushOnFinish = (stream, [throttled, flush])=>{\n stream.on(\"end\", flush).on(\"error\", flush);\n return throttled;\n};\n/**\n * If the proxy or config beforeRedirects functions are defined, call them with the options\n * object.\n *\n * @param {Object<string, any>} options - The options object that was passed to the request.\n *\n * @returns {Object<string, any>}\n */ function dispatchBeforeRedirect(options, responseDetails) {\n if (options.beforeRedirects.proxy) {\n options.beforeRedirects.proxy(options);\n }\n if (options.beforeRedirects.config) {\n options.beforeRedirects.config(options, responseDetails);\n }\n}\n/**\n * If the proxy or config afterRedirects functions are defined, call them with the options\n *\n * @param {http.ClientRequestArgs} options\n * @param {AxiosProxyConfig} configProxy configuration from Axios options object\n * @param {string} location\n *\n * @returns {http.ClientRequestArgs}\n */ function setProxy(options, configProxy, location) {\n let proxy = configProxy;\n if (!proxy && proxy !== false) {\n const proxyUrl = proxyFromEnv.getProxyForUrl(location);\n if (proxyUrl) {\n proxy = new URL(proxyUrl);\n }\n }\n if (proxy) {\n // Basic proxy authorization\n if (proxy.username) {\n proxy.auth = (proxy.username || \"\") + \":\" + (proxy.password || \"\");\n }\n if (proxy.auth) {\n // Support proxy auth object form\n if (proxy.auth.username || proxy.auth.password) {\n proxy.auth = (proxy.auth.username || \"\") + \":\" + (proxy.auth.password || \"\");\n }\n const base64 = Buffer.from(proxy.auth, \"utf8\").toString(\"base64\");\n options.headers[\"Proxy-Authorization\"] = \"Basic \" + base64;\n }\n options.headers.host = options.hostname + (options.port ? \":\" + options.port : \"\");\n const proxyHost = proxy.hostname || proxy.host;\n options.hostname = proxyHost;\n // Replace 'host' since options is not a URL object\n options.host = proxyHost;\n options.port = proxy.port;\n options.path = location;\n if (proxy.protocol) {\n options.protocol = proxy.protocol.includes(\":\") ? proxy.protocol : `${proxy.protocol}:`;\n }\n }\n options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {\n // Configure proxy for redirected request, passing the original config proxy to apply\n // the exact same logic as if the redirected request was performed by axios directly.\n setProxy(redirectOptions, configProxy, redirectOptions.href);\n };\n}\nconst isHttpAdapterSupported = typeof process !== \"undefined\" && utils$1.kindOf(process) === \"process\";\n// temporary hotfix\nconst wrapAsync = (asyncExecutor)=>{\n return new Promise((resolve, reject)=>{\n let onDone;\n let isDone;\n const done = (value, isRejected)=>{\n if (isDone) return;\n isDone = true;\n onDone && onDone(value, isRejected);\n };\n const _resolve = (value)=>{\n done(value);\n resolve(value);\n };\n const _reject = (reason)=>{\n done(reason, true);\n reject(reason);\n };\n asyncExecutor(_resolve, _reject, (onDoneHandler)=>onDone = onDoneHandler).catch(_reject);\n });\n};\nconst resolveFamily = ({ address, family })=>{\n if (!utils$1.isString(address)) {\n throw TypeError(\"address must be a string\");\n }\n return {\n address,\n family: family || (address.indexOf(\".\") < 0 ? 6 : 4)\n };\n};\nconst buildAddressEntry = (address, family)=>resolveFamily(utils$1.isObject(address) ? address : {\n address,\n family\n });\n/*eslint consistent-return:0*/ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {\n return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {\n let { data, lookup, family } = config;\n const { responseType, responseEncoding } = config;\n const method = config.method.toUpperCase();\n let isDone;\n let rejected = false;\n let req;\n if (lookup) {\n const _lookup = callbackify$1(lookup, (value)=>utils$1.isArray(value) ? value : [\n value\n ]);\n // hotfix to support opt.all option which is required for node 20.x\n lookup = (hostname, opt, cb)=>{\n _lookup(hostname, opt, (err, arg0, arg1)=>{\n if (err) {\n return cb(err);\n }\n const addresses = utils$1.isArray(arg0) ? arg0.map((addr)=>buildAddressEntry(addr)) : [\n buildAddressEntry(arg0, arg1)\n ];\n opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);\n });\n };\n }\n // temporary internal emitter until the AxiosRequest class will be implemented\n const emitter = new events.EventEmitter();\n const onFinished = ()=>{\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(abort);\n }\n if (config.signal) {\n config.signal.removeEventListener(\"abort\", abort);\n }\n emitter.removeAllListeners();\n };\n onDone((value, isRejected)=>{\n isDone = true;\n if (isRejected) {\n rejected = true;\n onFinished();\n }\n });\n function abort(reason) {\n emitter.emit(\"abort\", !reason || reason.type ? new CanceledError(null, config, req) : reason);\n }\n emitter.once(\"abort\", reject);\n if (config.cancelToken || config.signal) {\n config.cancelToken && config.cancelToken.subscribe(abort);\n if (config.signal) {\n config.signal.aborted ? abort() : config.signal.addEventListener(\"abort\", abort);\n }\n }\n // Parse url\n const fullPath = buildFullPath(config.baseURL, config.url);\n const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);\n const protocol = parsed.protocol || supportedProtocols[0];\n if (protocol === \"data:\") {\n let convertedData;\n if (method !== \"GET\") {\n return settle(resolve, reject, {\n status: 405,\n statusText: \"method not allowed\",\n headers: {},\n config\n });\n }\n try {\n convertedData = fromDataURI(config.url, responseType === \"blob\", {\n Blob: config.env && config.env.Blob\n });\n } catch (err) {\n throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);\n }\n if (responseType === \"text\") {\n convertedData = convertedData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === \"utf8\") {\n convertedData = utils$1.stripBOM(convertedData);\n }\n } else if (responseType === \"stream\") {\n convertedData = stream__default[\"default\"].Readable.from(convertedData);\n }\n return settle(resolve, reject, {\n data: convertedData,\n status: 200,\n statusText: \"OK\",\n headers: new AxiosHeaders$1(),\n config\n });\n }\n if (supportedProtocols.indexOf(protocol) === -1) {\n return reject(new AxiosError(\"Unsupported protocol \" + protocol, AxiosError.ERR_BAD_REQUEST, config));\n }\n const headers = AxiosHeaders$1.from(config.headers).normalize();\n // Set User-Agent (required by some servers)\n // See https://github.com/axios/axios/issues/69\n // User-Agent is specified; handle case where no UA header is desired\n // Only set header if it hasn't been set in config\n headers.set(\"User-Agent\", \"axios/\" + VERSION, false);\n const { onUploadProgress, onDownloadProgress } = config;\n const maxRate = config.maxRate;\n let maxUploadRate = undefined;\n let maxDownloadRate = undefined;\n // support for spec compliant FormData objects\n if (utils$1.isSpecCompliantForm(data)) {\n const userBoundary = headers.getContentType(/boundary=([-_\\w\\d]{10,70})/i);\n data = formDataToStream$1(data, (formHeaders)=>{\n headers.set(formHeaders);\n }, {\n tag: `axios-${VERSION}-boundary`,\n boundary: userBoundary && userBoundary[1] || undefined\n });\n // support for https://www.npmjs.com/package/form-data api\n } else if (utils$1.isFormData(data) && utils$1.isFunction(data.getHeaders)) {\n headers.set(data.getHeaders());\n if (!headers.hasContentLength()) {\n try {\n const knownLength = await util__default[\"default\"].promisify(data.getLength).call(data);\n Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);\n /*eslint no-empty:0*/ } catch (e) {}\n }\n } else if (utils$1.isBlob(data)) {\n data.size && headers.setContentType(data.type || \"application/octet-stream\");\n headers.setContentLength(data.size || 0);\n data = stream__default[\"default\"].Readable.from(readBlob$1(data));\n } else if (data && !utils$1.isStream(data)) {\n if (Buffer.isBuffer(data)) ;\n else if (utils$1.isArrayBuffer(data)) {\n data = Buffer.from(new Uint8Array(data));\n } else if (utils$1.isString(data)) {\n data = Buffer.from(data, \"utf-8\");\n } else {\n return reject(new AxiosError(\"Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream\", AxiosError.ERR_BAD_REQUEST, config));\n }\n // Add Content-Length header if data exists\n headers.setContentLength(data.length, false);\n if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {\n return reject(new AxiosError(\"Request body larger than maxBodyLength limit\", AxiosError.ERR_BAD_REQUEST, config));\n }\n }\n const contentLength = utils$1.toFiniteNumber(headers.getContentLength());\n if (utils$1.isArray(maxRate)) {\n maxUploadRate = maxRate[0];\n maxDownloadRate = maxRate[1];\n } else {\n maxUploadRate = maxDownloadRate = maxRate;\n }\n if (data && (onUploadProgress || maxUploadRate)) {\n if (!utils$1.isStream(data)) {\n data = stream__default[\"default\"].Readable.from(data, {\n objectMode: false\n });\n }\n data = stream__default[\"default\"].pipeline([\n data,\n new AxiosTransformStream$1({\n maxRate: utils$1.toFiniteNumber(maxUploadRate)\n })\n ], utils$1.noop);\n onUploadProgress && data.on(\"progress\", flushOnFinish(data, progressEventDecorator(contentLength, progressEventReducer(asyncDecorator(onUploadProgress), false, 3))));\n }\n // HTTP basic authentication\n let auth = undefined;\n if (config.auth) {\n const username = config.auth.username || \"\";\n const password = config.auth.password || \"\";\n auth = username + \":\" + password;\n }\n if (!auth && parsed.username) {\n const urlUsername = parsed.username;\n const urlPassword = parsed.password;\n auth = urlUsername + \":\" + urlPassword;\n }\n auth && headers.delete(\"authorization\");\n let path;\n try {\n path = buildURL(parsed.pathname + parsed.search, config.params, config.paramsSerializer).replace(/^\\?/, \"\");\n } catch (err) {\n const customErr = new Error(err.message);\n customErr.config = config;\n customErr.url = config.url;\n customErr.exists = true;\n return reject(customErr);\n }\n headers.set(\"Accept-Encoding\", \"gzip, compress, deflate\" + (isBrotliSupported ? \", br\" : \"\"), false);\n const options = {\n path,\n method: method,\n headers: headers.toJSON(),\n agents: {\n http: config.httpAgent,\n https: config.httpsAgent\n },\n auth,\n protocol,\n family,\n beforeRedirect: dispatchBeforeRedirect,\n beforeRedirects: {}\n };\n // cacheable-lookup integration hotfix\n !utils$1.isUndefined(lookup) && (options.lookup = lookup);\n if (config.socketPath) {\n options.socketPath = config.socketPath;\n } else {\n options.hostname = parsed.hostname;\n options.port = parsed.port;\n setProxy(options, config.proxy, protocol + \"//\" + parsed.hostname + (parsed.port ? \":\" + parsed.port : \"\") + options.path);\n }\n let transport;\n const isHttpsRequest = isHttps.test(options.protocol);\n options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;\n if (config.transport) {\n transport = config.transport;\n } else if (config.maxRedirects === 0) {\n transport = isHttpsRequest ? https__default[\"default\"] : http__default[\"default\"];\n } else {\n if (config.maxRedirects) {\n options.maxRedirects = config.maxRedirects;\n }\n if (config.beforeRedirect) {\n options.beforeRedirects.config = config.beforeRedirect;\n }\n transport = isHttpsRequest ? httpsFollow : httpFollow;\n }\n if (config.maxBodyLength > -1) {\n options.maxBodyLength = config.maxBodyLength;\n } else {\n // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited\n options.maxBodyLength = Infinity;\n }\n if (config.insecureHTTPParser) {\n options.insecureHTTPParser = config.insecureHTTPParser;\n }\n // Create the request\n req = transport.request(options, function handleResponse(res) {\n if (req.destroyed) return;\n const streams = [\n res\n ];\n const responseLength = +res.headers[\"content-length\"];\n if (onDownloadProgress || maxDownloadRate) {\n const transformStream = new AxiosTransformStream$1({\n maxRate: utils$1.toFiniteNumber(maxDownloadRate)\n });\n onDownloadProgress && transformStream.on(\"progress\", flushOnFinish(transformStream, progressEventDecorator(responseLength, progressEventReducer(asyncDecorator(onDownloadProgress), true, 3))));\n streams.push(transformStream);\n }\n // decompress the response body transparently if required\n let responseStream = res;\n // return the last request in case of redirects\n const lastRequest = res.req || req;\n // if decompress disabled we should not decompress\n if (config.decompress !== false && res.headers[\"content-encoding\"]) {\n // if no content, but headers still say that it is encoded,\n // remove the header not confuse downstream operations\n if (method === \"HEAD\" || res.statusCode === 204) {\n delete res.headers[\"content-encoding\"];\n }\n switch((res.headers[\"content-encoding\"] || \"\").toLowerCase()){\n /*eslint default-case:0*/ case \"gzip\":\n case \"x-gzip\":\n case \"compress\":\n case \"x-compress\":\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib__default[\"default\"].createUnzip(zlibOptions));\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers[\"content-encoding\"];\n break;\n case \"deflate\":\n streams.push(new ZlibHeaderTransformStream$1());\n // add the unzipper to the body stream processing pipeline\n streams.push(zlib__default[\"default\"].createUnzip(zlibOptions));\n // remove the content-encoding in order to not confuse downstream operations\n delete res.headers[\"content-encoding\"];\n break;\n case \"br\":\n if (isBrotliSupported) {\n streams.push(zlib__default[\"default\"].createBrotliDecompress(brotliOptions));\n delete res.headers[\"content-encoding\"];\n }\n }\n }\n responseStream = streams.length > 1 ? stream__default[\"default\"].pipeline(streams, utils$1.noop) : streams[0];\n const offListeners = stream__default[\"default\"].finished(responseStream, ()=>{\n offListeners();\n onFinished();\n });\n const response = {\n status: res.statusCode,\n statusText: res.statusMessage,\n headers: new AxiosHeaders$1(res.headers),\n config,\n request: lastRequest\n };\n if (responseType === \"stream\") {\n response.data = responseStream;\n settle(resolve, reject, response);\n } else {\n const responseBuffer = [];\n let totalResponseBytes = 0;\n responseStream.on(\"data\", function handleStreamData(chunk) {\n responseBuffer.push(chunk);\n totalResponseBytes += chunk.length;\n // make sure the content length is not over the maxContentLength if specified\n if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {\n // stream.destroy() emit aborted event before calling reject() on Node.js v16\n rejected = true;\n responseStream.destroy();\n reject(new AxiosError(\"maxContentLength size of \" + config.maxContentLength + \" exceeded\", AxiosError.ERR_BAD_RESPONSE, config, lastRequest));\n }\n });\n responseStream.on(\"aborted\", function handlerStreamAborted() {\n if (rejected) {\n return;\n }\n const err = new AxiosError(\"maxContentLength size of \" + config.maxContentLength + \" exceeded\", AxiosError.ERR_BAD_RESPONSE, config, lastRequest);\n responseStream.destroy(err);\n reject(err);\n });\n responseStream.on(\"error\", function handleStreamError(err) {\n if (req.destroyed) return;\n reject(AxiosError.from(err, null, config, lastRequest));\n });\n responseStream.on(\"end\", function handleStreamEnd() {\n try {\n let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);\n if (responseType !== \"arraybuffer\") {\n responseData = responseData.toString(responseEncoding);\n if (!responseEncoding || responseEncoding === \"utf8\") {\n responseData = utils$1.stripBOM(responseData);\n }\n }\n response.data = responseData;\n } catch (err) {\n return reject(AxiosError.from(err, null, config, response.request, response));\n }\n settle(resolve, reject, response);\n });\n }\n emitter.once(\"abort\", (err)=>{\n if (!responseStream.destroyed) {\n responseStream.emit(\"error\", err);\n responseStream.destroy();\n }\n });\n });\n emitter.once(\"abort\", (err)=>{\n reject(err);\n req.destroy(err);\n });\n // Handle errors\n req.on(\"error\", function handleRequestError(err) {\n // @todo remove\n // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;\n reject(AxiosError.from(err, null, config, req));\n });\n // set tcp keep alive to prevent drop connection by peer\n req.on(\"socket\", function handleRequestSocket(socket) {\n // default interval of sending ack packet is 1 minute\n socket.setKeepAlive(true, 1000 * 60);\n });\n // Handle request timeout\n if (config.timeout) {\n // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.\n const timeout = parseInt(config.timeout, 10);\n if (Number.isNaN(timeout)) {\n reject(new AxiosError(\"error trying to parse `config.timeout` to int\", AxiosError.ERR_BAD_OPTION_VALUE, config, req));\n return;\n }\n // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.\n // And timer callback will be fired, and abort() will be invoked before connection, then get \"socket hang up\" and code ECONNRESET.\n // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.\n // And then these socket which be hang up will devouring CPU little by little.\n // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.\n req.setTimeout(timeout, function handleRequestTimeout() {\n if (isDone) return;\n let timeoutErrorMessage = config.timeout ? \"timeout of \" + config.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(timeoutErrorMessage, transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, config, req));\n abort();\n });\n }\n // Send the request\n if (utils$1.isStream(data)) {\n let ended = false;\n let errored = false;\n data.on(\"end\", ()=>{\n ended = true;\n });\n data.once(\"error\", (err)=>{\n errored = true;\n req.destroy(err);\n });\n data.on(\"close\", ()=>{\n if (!ended && !errored) {\n abort(new CanceledError(\"Request stream has been aborted\", config, req));\n }\n });\n data.pipe(req);\n } else {\n req.end(data);\n }\n });\n};\nconst isURLSameOrigin = platform.hasStandardBrowserEnv ? // Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\nfunction standardBrowserEnv() {\n const msie = platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent);\n const urlParsingNode = document.createElement(\"a\");\n let originURL;\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */ function resolveURL(url) {\n let href = url;\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute(\"href\", href);\n href = urlParsingNode.href;\n }\n urlParsingNode.setAttribute(\"href\", href);\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, \"\") : \"\",\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, \"\") : \"\",\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, \"\") : \"\",\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: urlParsingNode.pathname.charAt(0) === \"/\" ? urlParsingNode.pathname : \"/\" + urlParsingNode.pathname\n };\n }\n originURL = resolveURL(window.location.href);\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */ return function isURLSameOrigin(requestURL) {\n const parsed = utils$1.isString(requestURL) ? resolveURL(requestURL) : requestURL;\n return parsed.protocol === originURL.protocol && parsed.host === originURL.host;\n };\n}() : // Non standard browser envs (web workers, react-native) lack needed support.\nfunction nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n}();\nconst cookies = platform.hasStandardBrowserEnv ? // Standard browser envs support document.cookie\n{\n write (name, value, expires, path, domain, secure) {\n const cookie = [\n name + \"=\" + encodeURIComponent(value)\n ];\n utils$1.isNumber(expires) && cookie.push(\"expires=\" + new Date(expires).toGMTString());\n utils$1.isString(path) && cookie.push(\"path=\" + path);\n utils$1.isString(domain) && cookie.push(\"domain=\" + domain);\n secure === true && cookie.push(\"secure\");\n document.cookie = cookie.join(\"; \");\n },\n read (name) {\n const match = document.cookie.match(new RegExp(\"(^|;\\\\s*)(\" + name + \")=([^;]*)\"));\n return match ? decodeURIComponent(match[3]) : null;\n },\n remove (name) {\n this.write(name, \"\", Date.now() - 86400000);\n }\n} : // Non-standard browser env (web workers, react-native) lack needed support.\n{\n write () {},\n read () {\n return null;\n },\n remove () {}\n};\nconst headersToObject = (thing)=>thing instanceof AxiosHeaders$1 ? {\n ...thing\n } : thing;\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */ function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n function getMergedValue(target, source, caseless) {\n if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n return utils$1.merge.call({\n caseless\n }, target, source);\n } else if (utils$1.isPlainObject(source)) {\n return utils$1.merge({}, source);\n } else if (utils$1.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b)=>mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n utils$1.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue);\n });\n return config;\n}\nconst resolveConfig = (config)=>{\n const newConfig = mergeConfig({}, config);\n let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig;\n newConfig.headers = headers = AxiosHeaders$1.from(headers);\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n // HTTP basic authentication\n if (auth) {\n headers.set(\"Authorization\", \"Basic \" + btoa((auth.username || \"\") + \":\" + (auth.password ? unescape(encodeURIComponent(auth.password)) : \"\")));\n }\n let contentType;\n if (utils$1.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(\";\").map((token)=>token.trim()).filter(Boolean) : [];\n headers.setContentType([\n type || \"multipart/form-data\",\n ...tokens\n ].join(\"; \"));\n }\n }\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin(newConfig.url)) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n return newConfig;\n};\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== \"undefined\";\nconst xhrAdapter = isXHRAdapterSupported && function(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();\n let { responseType, onUploadProgress, onDownloadProgress } = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n _config.signal && _config.signal.removeEventListener(\"abort\", onCanceled);\n }\n let request = new XMLHttpRequest();\n request.open(_config.method.toUpperCase(), _config.url, true);\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders$1.from(\"getAllResponseHeaders\" in request && request.getAllResponseHeaders());\n const responseData = !responseType || responseType === \"text\" || responseType === \"json\" ? request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n // Clean up request\n request = null;\n }\n if (\"onloadend\" in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf(\"file:\") === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n reject(new AxiosError(\"Request aborted\", AxiosError.ECONNABORTED, config, request));\n // Clean up request\n request = null;\n };\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError(\"Network Error\", AxiosError.ERR_NETWORK, config, request));\n // Clean up request\n request = null;\n };\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? \"timeout of \" + _config.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(timeoutErrorMessage, transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED, config, request));\n // Clean up request\n request = null;\n };\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n // Add headers to the request\n if (\"setRequestHeader\" in request) {\n utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n // Add withCredentials to request if needed\n if (!utils$1.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n // Add responseType to request if needed\n if (responseType && responseType !== \"json\") {\n request.responseType = _config.responseType;\n }\n // Handle progress if needed\n if (onDownloadProgress) {\n [downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);\n request.addEventListener(\"progress\", downloadThrottled);\n }\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n [uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress);\n request.upload.addEventListener(\"progress\", uploadThrottled);\n request.upload.addEventListener(\"loadend\", flushUpload);\n }\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = (cancel)=>{\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener(\"abort\", onCanceled);\n }\n }\n const protocol = parseProtocol(_config.url);\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError(\"Unsupported protocol \" + protocol + \":\", AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n // Send the request\n request.send(requestData || null);\n });\n};\nconst composeSignals = (signals, timeout)=>{\n let controller = new AbortController();\n let aborted;\n const onabort = function(cancel) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = cancel instanceof Error ? cancel : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n };\n let timer = timeout && setTimeout(()=>{\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));\n }, timeout);\n const unsubscribe = ()=>{\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach((signal)=>{\n signal && (signal.removeEventListener ? signal.removeEventListener(\"abort\", onabort) : signal.unsubscribe(onabort));\n });\n signals = null;\n }\n };\n signals.forEach((signal)=>signal && signal.addEventListener && signal.addEventListener(\"abort\", onabort));\n const { signal } = controller;\n signal.unsubscribe = unsubscribe;\n return [\n signal,\n ()=>{\n timer && clearTimeout(timer);\n timer = null;\n }\n ];\n};\nconst composeSignals$1 = composeSignals;\nconst streamChunk = function*(chunk, chunkSize) {\n let len = chunk.byteLength;\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n let pos = 0;\n let end;\n while(pos < len){\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n};\nconst readBytes = async function*(iterable, chunkSize, encode) {\n for await (const chunk of iterable){\n yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : await encode(String(chunk)), chunkSize);\n }\n};\nconst trackStream = (stream, chunkSize, onProgress, onFinish, encode)=>{\n const iterator = readBytes(stream, chunkSize, encode);\n let bytes = 0;\n let done;\n let _onFinish = (e)=>{\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n };\n return new ReadableStream({\n async pull (controller) {\n try {\n const { done, value } = await iterator.next();\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel (reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n });\n};\nconst isFetchSupported = typeof fetch === \"function\" && typeof Request === \"function\" && typeof Response === \"function\";\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === \"function\";\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === \"function\" ? ((encoder)=>(str)=>encoder.encode(str))(new TextEncoder()) : async (str)=>new Uint8Array(await new Response(str).arrayBuffer()));\nconst test = (fn, ...args)=>{\n try {\n return !!fn(...args);\n } catch (e) {\n return false;\n }\n};\nconst supportsRequestStream = isReadableStreamSupported && test(()=>{\n let duplexAccessed = false;\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: \"POST\",\n get duplex () {\n duplexAccessed = true;\n return \"half\";\n }\n }).headers.has(\"Content-Type\");\n return duplexAccessed && !hasContentType;\n});\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\nconst supportsResponseStream = isReadableStreamSupported && test(()=>utils$1.isReadableStream(new Response(\"\").body));\nconst resolvers = {\n stream: supportsResponseStream && ((res)=>res.body)\n};\nisFetchSupported && ((res)=>{\n [\n \"text\",\n \"arrayBuffer\",\n \"blob\",\n \"formData\",\n \"stream\"\n ].forEach((type)=>{\n !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res)=>res[type]() : (_, config)=>{\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n });\n });\n})(new Response);\nconst getBodyLength = async (body)=>{\n if (body == null) {\n return 0;\n }\n if (utils$1.isBlob(body)) {\n return body.size;\n }\n if (utils$1.isSpecCompliantForm(body)) {\n return (await new Request(body).arrayBuffer()).byteLength;\n }\n if (utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n return body.byteLength;\n }\n if (utils$1.isURLSearchParams(body)) {\n body = body + \"\";\n }\n if (utils$1.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n};\nconst resolveBodyLength = async (headers, body)=>{\n const length = utils$1.toFiniteNumber(headers.getContentLength());\n return length == null ? getBodyLength(body) : length;\n};\nconst fetchAdapter = isFetchSupported && (async (config)=>{\n let { url, method, data, signal, cancelToken, timeout, onDownloadProgress, onUploadProgress, responseType, headers, withCredentials = \"same-origin\", fetchOptions } = resolveConfig(config);\n responseType = responseType ? (responseType + \"\").toLowerCase() : \"text\";\n let [composedSignal, stopTimeout] = signal || cancelToken || timeout ? composeSignals$1([\n signal,\n cancelToken\n ], timeout) : [];\n let finished, request;\n const onFinish = ()=>{\n !finished && setTimeout(()=>{\n composedSignal && composedSignal.unsubscribe();\n });\n finished = true;\n };\n let requestContentLength;\n try {\n if (onUploadProgress && supportsRequestStream && method !== \"get\" && method !== \"head\" && (requestContentLength = await resolveBodyLength(headers, data)) !== 0) {\n let _request = new Request(url, {\n method: \"POST\",\n body: data,\n duplex: \"half\"\n });\n let contentTypeHeader;\n if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get(\"content-type\"))) {\n headers.setContentType(contentTypeHeader);\n }\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(requestContentLength, progressEventReducer(asyncDecorator(onUploadProgress)));\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush, encodeText);\n }\n }\n if (!utils$1.isString(withCredentials)) {\n withCredentials = withCredentials ? \"include\" : \"omit\";\n }\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = \"credentials\" in Request.prototype;\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n });\n let response = await fetch(request);\n const isStreamResponse = supportsResponseStream && (responseType === \"stream\" || responseType === \"response\");\n if (supportsResponseStream && (onDownloadProgress || isStreamResponse)) {\n const options = {};\n [\n \"status\",\n \"statusText\",\n \"headers\"\n ].forEach((prop)=>{\n options[prop] = response[prop];\n });\n const responseContentLength = utils$1.toFiniteNumber(response.headers.get(\"content-length\"));\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(responseContentLength, progressEventReducer(asyncDecorator(onDownloadProgress), true)) || [];\n response = new Response(trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, ()=>{\n flush && flush();\n isStreamResponse && onFinish();\n }, encodeText), options);\n }\n responseType = responseType || \"text\";\n let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || \"text\"](response, config);\n !isStreamResponse && onFinish();\n stopTimeout && stopTimeout();\n return await new Promise((resolve, reject)=>{\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders$1.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n });\n });\n } catch (err) {\n onFinish();\n if (err && err.name === \"TypeError\" && /fetch/i.test(err.message)) {\n throw Object.assign(new AxiosError(\"Network Error\", AxiosError.ERR_NETWORK, config, request), {\n cause: err.cause || err\n });\n }\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n};\nutils$1.forEach(knownAdapters, (fn, value)=>{\n if (fn) {\n try {\n Object.defineProperty(fn, \"name\", {\n value\n });\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, \"adapterName\", {\n value\n });\n }\n});\nconst renderReason = (reason)=>`- ${reason}`;\nconst isResolvedHandle = (adapter)=>utils$1.isFunction(adapter) || adapter === null || adapter === false;\nconst adapters = {\n getAdapter: (adapters)=>{\n adapters = utils$1.isArray(adapters) ? adapters : [\n adapters\n ];\n const { length } = adapters;\n let nameOrAdapter;\n let adapter;\n const rejectedReasons = {};\n for(let i = 0; i < length; i++){\n nameOrAdapter = adapters[i];\n let id;\n adapter = nameOrAdapter;\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n if (adapter) {\n break;\n }\n rejectedReasons[id || \"#\" + i] = adapter;\n }\n if (!adapter) {\n const reasons = Object.entries(rejectedReasons).map(([id, state])=>`adapter ${id} ` + (state === false ? \"is not supported by the environment\" : \"is not available in the build\"));\n let s = length ? reasons.length > 1 ? \"since :\\n\" + reasons.map(renderReason).join(\"\\n\") : \" \" + renderReason(reasons[0]) : \"as no adapter specified\";\n throw new AxiosError(`There is no suitable adapter to dispatch the request ` + s, \"ERR_NOT_SUPPORT\");\n }\n return adapter;\n },\n adapters: knownAdapters\n};\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */ function throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */ function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n config.headers = AxiosHeaders$1.from(config.headers);\n // Transform request data\n config.data = transformData.call(config, config.transformRequest);\n if ([\n \"post\",\n \"put\",\n \"patch\"\n ].indexOf(config.method) !== -1) {\n config.headers.setContentType(\"application/x-www-form-urlencoded\", false);\n }\n const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n // Transform response data\n response.data = transformData.call(config, config.transformResponse, response);\n response.headers = AxiosHeaders$1.from(response.headers);\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(config, config.transformResponse, reason.response);\n reason.response.headers = AxiosHeaders$1.from(reason.response.headers);\n }\n }\n return Promise.reject(reason);\n });\n}\nconst validators$1 = {};\n// eslint-disable-next-line func-names\n[\n \"object\",\n \"boolean\",\n \"number\",\n \"function\",\n \"string\",\n \"symbol\"\n].forEach((type, i)=>{\n validators$1[type] = function validator(thing) {\n return typeof thing === type || \"a\" + (i < 1 ? \"n \" : \" \") + type;\n };\n});\nconst deprecatedWarnings = {};\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */ validators$1.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return \"[Axios v\" + VERSION + \"] Transitional option '\" + opt + \"'\" + desc + (message ? \". \" + message : \"\");\n }\n // eslint-disable-next-line func-names\n return (value, opt, opts)=>{\n if (validator === false) {\n throw new AxiosError(formatMessage(opt, \" has been removed\" + (version ? \" in \" + version : \"\")), AxiosError.ERR_DEPRECATED);\n }\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(formatMessage(opt, \" has been deprecated since v\" + version + \" and will be removed in the near future\"));\n }\n return validator ? validator(value, opt, opts) : true;\n };\n};\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */ function assertOptions(options, schema, allowUnknown) {\n if (typeof options !== \"object\") {\n throw new AxiosError(\"options must be an object\", AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while(i-- > 0){\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError(\"option \" + opt + \" must be \" + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError(\"Unknown option \" + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\nconst validator = {\n assertOptions,\n validators: validators$1\n};\nconst validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */ class Axios {\n constructor(instanceConfig){\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager$1(),\n response: new InterceptorManager$1()\n };\n }\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */ async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : dummy = new Error();\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, \"\") : \"\";\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, \"\"))) {\n err.stack += \"\\n\" + stack;\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n throw err;\n }\n }\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/ // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === \"string\") {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n config = mergeConfig(this.defaults, config);\n const { transitional, paramsSerializer, headers } = config;\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n if (paramsSerializer != null) {\n if (utils$1.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n // Set config.method\n config.method = (config.method || this.defaults.method || \"get\").toLowerCase();\n // Flatten headers\n let contextHeaders = headers && utils$1.merge(headers.common, headers[config.method]);\n headers && utils$1.forEach([\n \"delete\",\n \"get\",\n \"head\",\n \"post\",\n \"put\",\n \"patch\",\n \"common\"\n ], (method)=>{\n delete headers[method];\n });\n config.headers = AxiosHeaders$1.concat(contextHeaders, headers);\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === \"function\" && interceptor.runWhen(config) === false) {\n return;\n }\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n let promise;\n let i = 0;\n let len;\n if (!synchronousRequestInterceptors) {\n const chain = [\n dispatchRequest.bind(this),\n undefined\n ];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n promise = Promise.resolve(config);\n while(i < len){\n promise = promise.then(chain[i++], chain[i++]);\n }\n return promise;\n }\n len = requestInterceptorChain.length;\n let newConfig = config;\n i = 0;\n while(i < len){\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n i = 0;\n len = responseInterceptorChain.length;\n while(i < len){\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n return promise;\n }\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n// Provide aliases for supported request methods\nutils$1.forEach([\n \"delete\",\n \"get\",\n \"head\",\n \"options\"\n], function forEachMethodNoData(method) {\n /*eslint func-names:0*/ Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\nutils$1.forEach([\n \"post\",\n \"put\",\n \"patch\"\n], function forEachMethodWithData(method) {\n /*eslint func-names:0*/ function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n \"Content-Type\": \"multipart/form-data\"\n } : {},\n url,\n data\n }));\n };\n }\n Axios.prototype[method] = generateHTTPMethod();\n Axios.prototype[method + \"Form\"] = generateHTTPMethod(true);\n});\nconst Axios$1 = Axios;\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */ class CancelToken {\n constructor(executor){\n if (typeof executor !== \"function\") {\n throw new TypeError(\"executor must be a function.\");\n }\n let resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n const token = this;\n // eslint-disable-next-line func-names\n this.promise.then((cancel)=>{\n if (!token._listeners) return;\n let i = token._listeners.length;\n while(i-- > 0){\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n // eslint-disable-next-line func-names\n this.promise.then = (onfulfilled)=>{\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise((resolve)=>{\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n return promise;\n };\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */ throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n /**\n * Subscribe to the cancel signal\n */ subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [\n listener\n ];\n }\n }\n /**\n * Unsubscribe from the cancel signal\n */ unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */ static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\nconst CancelToken$1 = CancelToken;\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */ function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */ function isAxiosError(payload) {\n return utils$1.isObject(payload) && payload.isAxiosError === true;\n}\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511\n};\nObject.entries(HttpStatusCode).forEach(([key, value])=>{\n HttpStatusCode[value] = key;\n});\nconst HttpStatusCode$1 = HttpStatusCode;\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */ function createInstance(defaultConfig) {\n const context = new Axios$1(defaultConfig);\n const instance = bind(Axios$1.prototype.request, context);\n // Copy axios.prototype to instance\n utils$1.extend(instance, Axios$1.prototype, context, {\n allOwnKeys: true\n });\n // Copy context to instance\n utils$1.extend(instance, context, null, {\n allOwnKeys: true\n });\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n return instance;\n}\n// Create the default instance to be exported\nconst axios = createInstance(defaults$1);\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = spread;\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\naxios.AxiosHeaders = AxiosHeaders$1;\naxios.formToJSON = (thing)=>formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\naxios.getAdapter = adapters.getAdapter;\naxios.HttpStatusCode = HttpStatusCode$1;\naxios.default = axios;\nmodule.exports = axios; //# sourceMappingURL=axios.cjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvYXhpb3MvZGlzdC9ub2RlL2F4aW9zLmNqcyIsIm1hcHBpbmdzIjoiQUFBQSxrRUFBa0U7QUFDbEU7QUFFQSxNQUFNQSxhQUFhQyxtQkFBT0EsQ0FBQztBQUMzQixNQUFNQyxNQUFNRCxtQkFBT0EsQ0FBQztBQUNwQixNQUFNRSxlQUFlRixtQkFBT0EsQ0FBQztBQUM3QixNQUFNRyxPQUFPSCxtQkFBT0EsQ0FBQztBQUNyQixNQUFNSSxRQUFRSixtQkFBT0EsQ0FBQztBQUN0QixNQUFNSyxPQUFPTCxtQkFBT0EsQ0FBQztBQUNyQixNQUFNTSxrQkFBa0JOLG1CQUFPQSxDQUFDO0FBQ2hDLE1BQU1PLE9BQU9QLG1CQUFPQSxDQUFDO0FBQ3JCLE1BQU1RLFNBQVNSLG1CQUFPQSxDQUFDO0FBQ3ZCLE1BQU1TLFNBQVNULG1CQUFPQSxDQUFDO0FBRXZCLFNBQVNVLHNCQUF1QkMsQ0FBQztJQUFJLE9BQU9BLEtBQUssT0FBT0EsTUFBTSxZQUFZLGFBQWFBLElBQUlBLElBQUk7UUFBRSxXQUFXQTtJQUFFO0FBQUc7QUFFakgsTUFBTUMsb0JBQW9CLFdBQVcsR0FBRUYsc0JBQXNCWDtBQUM3RCxNQUFNYyxlQUFlLFdBQVcsR0FBRUgsc0JBQXNCVDtBQUN4RCxNQUFNYSxnQkFBZ0IsV0FBVyxHQUFFSixzQkFBc0JQO0FBQ3pELE1BQU1ZLGlCQUFpQixXQUFXLEdBQUVMLHNCQUFzQk47QUFDMUQsTUFBTVksZ0JBQWdCLFdBQVcsR0FBRU4sc0JBQXNCTDtBQUN6RCxNQUFNWSwyQkFBMkIsV0FBVyxHQUFFUCxzQkFBc0JKO0FBQ3BFLE1BQU1ZLGdCQUFnQixXQUFXLEdBQUVSLHNCQUFzQkg7QUFDekQsTUFBTVksa0JBQWtCLFdBQVcsR0FBRVQsc0JBQXNCRjtBQUUzRCxTQUFTWSxLQUFLQyxFQUFFLEVBQUVDLE9BQU87SUFDdkIsT0FBTyxTQUFTQztRQUNkLE9BQU9GLEdBQUdHLEtBQUssQ0FBQ0YsU0FBU0c7SUFDM0I7QUFDRjtBQUVBLHVF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LFNBQVN0QyxTQUFTQTtBQUU3Rms2QixNQUFNcEksVUFBVSxHQUFHRCxTQUFTQyxVQUFVO0FBRXRDb0ksTUFBTXBFLGNBQWMsR0FBR2dFO0FBRXZCSSxNQUFNSSxPQUFPLEdBQUdKO0FBRWhCSyxPQUFPQyxPQUFPLEdBQUdOLE9BQ2pCLGtDQUFrQyIsInNvdXJjZXMiOlsid2VicGFjazovL25leHRjaGF0Ly4vbm9kZV9tb2R1bGVzL2F4aW9zL2Rpc3Qvbm9kZS9heGlvcy5janM/YzEyNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBeGlvcyB2MS43LjUgQ29weXJpZ2h0IChjKSAyMDI0IE1hdHQgWmFicmlza2llIGFuZCBjb250cmlidXRvcnNcbid1c2Ugc3RyaWN0JztcblxuY29uc3QgRm9ybURhdGEkMSA9IHJlcXVpcmUoJ2Zvcm0tZGF0YScpO1xuY29uc3QgdXJsID0gcmVxdWlyZSgndXJsJyk7XG5jb25zdCBwcm94eUZyb21FbnYgPSByZXF1aXJlKCdwcm94eS1mcm9tLWVudicpO1xuY29uc3QgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBmb2xsb3dSZWRpcmVjdHMgPSByZXF1aXJlKCdmb2xsb3ctcmVkaXJlY3RzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBldmVudHMgPSByZXF1aXJlKCdldmVudHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0TGVnYWN5IChlKSB7IHJldHVybiBlICYmIHR5cGVvZiBlID09PSAnb2JqZWN0JyAmJiAnZGVmYXVsdCcgaW4gZSA/IGUgOiB7ICdkZWZhdWx0JzogZSB9OyB9XG5cbmNvbnN0IEZvcm1EYXRhX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShGb3JtRGF0YSQxKTtcbmNvbnN0IHVybF9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3kodXJsKTtcbmNvbnN0IGh0dHBfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KGh0dHApO1xuY29uc3QgaHR0cHNfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KGh0dHBzKTtcbmNvbnN0IHV0aWxfX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KHV0aWwpO1xuY29uc3QgZm9sbG93UmVkaXJlY3RzX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19pbnRlcm9wRGVmYXVsdExlZ2FjeShmb2xsb3dSZWRpcmVjdHMpO1xuY29uc3QgemxpYl9fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9faW50ZXJvcERlZmF1bHRMZWdhY3koemxpYik7XG5jb25zdCBzdHJlYW1fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BEZWZhdWx0TGVnYWN5KHN0cmVhbSk7XG5cbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn07XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSB0eXBlID0+IHRoaW5nID0+IHR5cGVvZiB0aGluZyA9PT0gdHlwZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgaXNGdW5jdGlvbih2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQXJyYXlCdWZmZXIgPSBraW5kT2ZUZXN0KCdBcnJheUJ1ZmZlcicpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAoaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmluZyA9IHR5cGVPZlRlc3QoJ3N0cmluZycpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IHRoaW5nID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoa2luZE9mKHZhbCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gWydSZWFkYWJsZVN0cmVhbScsICdSZXF1ZXN0JywgJ1Jlc3BvbnNlJywgJ0hlYWRlcnMnXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0gJiYgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5c11cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuY29uc3QgZXh0ZW5kID0gKGEsIGIsIHRoaXNBcmcsIHthbGxPd25LZXlzfT0ge30pID0+IHtcbiAgZm9yRWFjaChiLCAodmFsLCBrZXkpID0+IHtcbiAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSwge2FsbE93bktleXN9KTtcbiAgcmV0dXJuIGE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufTtcblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoVHlwZWRBcnJheSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiB0aGluZyA9PiB7XG4gICAgcmV0dXJuIFR5cGVkQXJyYXkgJiYgdGhpbmcgaW5zdGFuY2VvZiBUeXBlZEFycmF5O1xuICB9O1xufSkodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpKTtcblxuLyoqXG4gKiBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBrZXkgYW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoRW50cnkgPSAob2JqLCBmbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBvYmogJiYgb2JqW1N5bWJvbC5pdGVyYXRvcl07XG5cbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3IuY2FsbChvYmopO1xuXG4gIGxldCByZXN1bHQ7XG5cbiAgd2hpbGUgKChyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59O1xuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufTtcblxuY29uc3QgQUxQSEEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonO1xuXG5jb25zdCBESUdJVCA9ICcwMTIzNDU2Nzg5JztcblxuY29uc3QgQUxQSEFCRVQgPSB7XG4gIERJR0lULFxuICBBTFBIQSxcbiAgQUxQSEFfRElHSVQ6IEFMUEhBICsgQUxQSEEudG9VcHBlckNhc2UoKSArIERJR0lUXG59O1xuXG5jb25zdCBnZW5lcmF0ZVN0cmluZyA9IChzaXplID0gMTYsIGFscGhhYmV0ID0gQUxQSEFCRVQuQUxQSEFfRElHSVQpID0+IHtcbiAgbGV0IHN0ciA9ICcnO1xuICBjb25zdCB7bGVuZ3RofSA9IGFscGhhYmV0O1xuICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgc3RyICs9IGFscGhhYmV0W01hdGgucmFuZG9tKCkgKiBsZW5ndGh8MF07XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgdGhpbmcgaXMgYSBGb3JtRGF0YSBvYmplY3QsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpbmcgLSBUaGUgdGhpbmcgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3BlY0NvbXBsaWFudEZvcm0odGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nICYmIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiB0aGluZ1tTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmIHRoaW5nW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH07XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59O1xuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgPyAoKHRva2VuLCBjYWxsYmFja3MpID0+IHtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7c291cmNlLCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gX2dsb2JhbCAmJiBkYXRhID09PSB0b2tlbikge1xuICAgICAgICBjYWxsYmFja3MubGVuZ3RoICYmIGNhbGxiYWNrcy5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZSh0b2tlbiwgXCIqXCIpO1xuICAgIH1cbiAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSkgOiAoY2IpID0+IHNldFRpbWVvdXQoY2IpO1xufSkoXG4gIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsXG4gIGlzRnVuY3Rpb24oX2dsb2JhbC5wb3N0TWVzc2FnZSlcbik7XG5cbmNvbnN0IGFzYXAgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnID9cbiAgcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKSA6ICggdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2sgfHwgX3NldEltbWVkaWF0ZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG5jb25zdCB1dGlscyQxID0ge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZXF1ZXN0LFxuICBpc1Jlc3BvbnNlLFxuICBpc0hlYWRlcnMsXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RhdGUsXG4gIGlzRmlsZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1R5cGVkQXJyYXksXG4gIGlzRmlsZUxpc3QsXG4gIGZvckVhY2gsXG4gIG1lcmdlLFxuICBleHRlbmQsXG4gIHRyaW0sXG4gIHN0cmlwQk9NLFxuICBpbmhlcml0cyxcbiAgdG9GbGF0T2JqZWN0LFxuICBraW5kT2YsXG4gIGtpbmRPZlRlc3QsXG4gIGVuZHNXaXRoLFxuICB0b0FycmF5LFxuICBmb3JFYWNoRW50cnksXG4gIG1hdGNoQWxsLFxuICBpc0hUTUxGb3JtLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaGFzT3duUHJvcDogaGFzT3duUHJvcGVydHksIC8vIGFuIGFsaWFzIHRvIGF2b2lkIEVTTGludCBuby1wcm90b3R5cGUtYnVpbHRpbnMgZGV0ZWN0aW9uXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIEFMUEhBQkVULFxuICBnZW5lcmF0ZVN0cmluZyxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcFxufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIEF4aW9zRXJyb3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICBpZiAocmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXMgPyByZXNwb25zZS5zdGF0dXMgOiBudWxsO1xuICB9XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMkMS50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUkMSA9IEF4aW9zRXJyb3IucHJvdG90eXBlO1xuY29uc3QgZGVzY3JpcHRvcnMgPSB7fTtcblxuW1xuICAnRVJSX0JBRF9PUFRJT05fVkFMVUUnLFxuICAnRVJSX0JBRF9PUFRJT04nLFxuICAnRUNPTk5BQk9SVEVEJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFUlJfTkVUV09SSycsXG4gICdFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTJyxcbiAgJ0VSUl9ERVBSRUNBVEVEJyxcbiAgJ0VSUl9CQURfUkVTUE9OU0UnLFxuICAnRVJSX0JBRF9SRVFVRVNUJyxcbiAgJ0VSUl9DQU5DRUxFRCcsXG4gICdFUlJfTk9UX1NVUFBPUlQnLFxuICAnRVJSX0lOVkFMSURfVVJMJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbl0uZm9yRWFjaChjb2RlID0+IHtcbiAgZGVzY3JpcHRvcnNbY29kZV0gPSB7dmFsdWU6IGNvZGV9O1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF4aW9zRXJyb3IsIGRlc2NyaXB0b3JzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUkMSwgJ2lzQXhpb3NFcnJvcicsIHt2YWx1ZTogdHJ1ZX0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuQXhpb3NFcnJvci5mcm9tID0gKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykgPT4ge1xuICBjb25zdCBheGlvc0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUkMSk7XG5cbiAgdXRpbHMkMS50b0ZsYXRPYmplY3QoZXJyb3IsIGF4aW9zRXJyb3IsIGZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSBFcnJvci5wcm90b3R5cGU7XG4gIH0sIHByb3AgPT4ge1xuICAgIHJldHVybiBwcm9wICE9PSAnaXNBeGlvc0Vycm9yJztcbiAgfSk7XG5cbiAgQXhpb3NFcnJvci5jYWxsKGF4aW9zRXJyb3IsIGVycm9yLm1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gIGF4aW9zRXJyb3IuY2F1c2UgPSBlcnJvcjtcblxuICBheGlvc0Vycm9yLm5hbWUgPSBlcnJvci5uYW1lO1xuXG4gIGN1c3RvbVByb3BzICYmIE9iamVjdC5hc3NpZ24oYXhpb3NFcnJvciwgY3VzdG9tUHJvcHMpO1xuXG4gIHJldHVybiBheGlvc0Vycm9yO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscyQxLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzJDEuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMkMS50b0ZsYXRPYmplY3QodXRpbHMkMSwge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzJDEuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChGb3JtRGF0YV9fZGVmYXVsdFtcImRlZmF1bHRcIl0gfHwgRm9ybURhdGEpKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG9wdGlvbnMgPSB1dGlscyQxLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBpbmRleGVzOiBmYWxzZVxuICB9LCBmYWxzZSwgZnVuY3Rpb24gZGVmaW5lZChvcHRpb24sIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIHJldHVybiAhdXRpbHMkMS5pc1VuZGVmaW5lZChzb3VyY2Vbb3B0aW9uXSk7XG4gIH0pO1xuXG4gIGNvbnN0IG1ldGFUb2tlbnMgPSBvcHRpb25zLm1ldGFUb2tlbnM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICBjb25zdCB2aXNpdG9yID0gb3B0aW9ucy52aXNpdG9yIHx8IGRlZmF1bHRWaXNpdG9yO1xuICBjb25zdCBkb3RzID0gb3B0aW9ucy5kb3RzO1xuICBjb25zdCBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzO1xuICBjb25zdCBfQmxvYiA9IG9wdGlvbnMuQmxvYiB8fCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgQmxvYjtcbiAgY29uc3QgdXNlQmxvYiA9IF9CbG9iICYmIHV0aWxzJDEuaXNTcGVjQ29tcGxpYW50Rm9ybShmb3JtRGF0YSk7XG5cbiAgaWYgKCF1dGlscyQxLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMkMS5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZUJsb2IgJiYgdXRpbHMkMS5pc0Jsb2IodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscyQxLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1c2VCbG9iICYmIHR5cGVvZiBCbG9iID09PSAnZnVuY3Rpb24nID8gbmV3IEJsb2IoW3ZhbHVlXSkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmlzaXRvci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gICAqIEB0aGlzIHtGb3JtRGF0YX1cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBlYWNoIHByb3Agb2YgdGhlIHZhbHVlIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0VmlzaXRvcih2YWx1ZSwga2V5LCBwYXRoKSB7XG4gICAgbGV0IGFyciA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICFwYXRoICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1dGlscyQxLmVuZHNXaXRoKGtleSwgJ3t9JykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IG1ldGFUb2tlbnMgPyBrZXkgOiBrZXkuc2xpY2UoMCwgLTIpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAodXRpbHMkMS5pc0FycmF5KHZhbHVlKSAmJiBpc0ZsYXRBcnJheSh2YWx1ZSkpIHx8XG4gICAgICAgICgodXRpbHMkMS5pc0ZpbGVMaXN0KHZhbHVlKSB8fCB1dGlscyQxLmVuZHNXaXRoKGtleSwgJ1tdJykpICYmIChhcnIgPSB1dGlscyQxLnRvQXJyYXkodmFsdWUpKVxuICAgICAgICApKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSByZW1vdmVCcmFja2V0cyhrZXkpO1xuXG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIGVhY2goZWwsIGluZGV4KSB7XG4gICAgICAgICAgISh1dGlscyQxLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgICAgICBpbmRleGVzID09PSB0cnVlID8gcmVuZGVyS2V5KFtrZXldLCBpbmRleCwgZG90cykgOiAoaW5kZXhlcyA9PT0gbnVsbCA/IGtleSA6IGtleSArICdbXScpLFxuICAgICAgICAgICAgY29udmVydFZhbHVlKGVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmlzaXRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrID0gW107XG5cbiAgY29uc3QgZXhwb3NlZEhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHByZWRpY2F0ZXMsIHtcbiAgICBkZWZhdWx0VmlzaXRvcixcbiAgICBjb252ZXJ0VmFsdWUsXG4gICAgaXNWaXNpdGFibGVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYnVpbGQodmFsdWUsIHBhdGgpIHtcbiAgICBpZiAodXRpbHMkMS5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybjtcblxuICAgIGlmIChzdGFjay5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIHRocm93IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJyArIHBhdGguam9pbignLicpKTtcbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbHVlKTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gZWFjaChlbCwga2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAhKHV0aWxzJDEuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiB2aXNpdG9yLmNhbGwoXG4gICAgICAgIGZvcm1EYXRhLCBlbCwgdXRpbHMkMS5pc1N0cmluZyhrZXkpID8ga2V5LnRyaW0oKSA6IGtleSwgcGF0aCwgZXhwb3NlZEhlbHBlcnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgYnVpbGQoZWwsIHBhdGggPyBwYXRoLmNvbmNhdChrZXkpIDogW2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3RhY2sucG9wKCk7XG4gIH1cblxuICBpZiAoIXV0aWxzJDEuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RhdGEgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIGJ1aWxkKG9iaik7XG5cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG4vKipcbiAqIEl0IGVuY29kZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdW5yZXNlcnZlZCBzZXQgd2l0aFxuICogdGhlaXIgcGVyY2VudC1lbmNvZGVkIGVxdWl2YWxlbnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlJDEoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUkMSk7XG4gIH0gOiBlbmNvZGUkMTtcblxuICByZXR1cm4gdGhpcy5fcGFpcnMubWFwKGZ1bmN0aW9uIGVhY2gocGFpcikge1xuICAgIHJldHVybiBfZW5jb2RlKHBhaXJbMF0pICsgJz0nICsgX2VuY29kZShwYWlyWzFdKTtcbiAgfSwgJycpLmpvaW4oJyYnKTtcbn07XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY2hhcmFjdGVycyBgOmAsIGAkYCwgYCxgLCBgK2AsIGBbYCwgYW5kIGBdYCB3aXRoIHRoZWlyXG4gKiBVUkkgZW5jb2RlZCBjb3VudGVycGFydHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHBhcmFtIHs/b2JqZWN0fSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMkMS5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpID9cbiAgICAgIHBhcmFtcy50b1N0cmluZygpIDpcbiAgICAgIG5ldyBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpLnRvU3RyaW5nKF9lbmNvZGUpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICBjb25zdCBoYXNobWFya0luZGV4ID0gdXJsLmluZGV4T2YoXCIjXCIpO1xuXG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgc2VyaWFsaXplZFBhcmFtcztcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbmNsYXNzIEludGVyY2VwdG9yTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgKi9cbiAgdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgICAgZnVsZmlsbGVkLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnRlcmNlcHRvciB3YXMgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICAgIGZuKGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IEludGVyY2VwdG9yTWFuYWdlciQxID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuXG5jb25zdCB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcblxuY29uc3QgVVJMU2VhcmNoUGFyYW1zID0gdXJsX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5VUkxTZWFyY2hQYXJhbXM7XG5cbmNvbnN0IHBsYXRmb3JtJDEgPSB7XG4gIGlzTm9kZTogdHJ1ZSxcbiAgY2xhc3Nlczoge1xuICAgIFVSTFNlYXJjaFBhcmFtcyxcbiAgICBGb3JtRGF0YTogRm9ybURhdGFfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLFxuICAgIEJsb2I6IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBCbG9iIHx8IG51bGxcbiAgfSxcbiAgcHJvdG9jb2xzOiBbICdodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnZGF0YScgXVxufTtcblxuY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IF9uYXZpZ2F0b3IgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IgfHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyRW52ID0gaGFzQnJvd3NlckVudiAmJlxuICAoIV9uYXZpZ2F0b3IgfHwgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKF9uYXZpZ2F0b3IucHJvZHVjdCkgPCAwKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuY29uc3Qgb3JpZ2luID0gaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmNvbnN0IHV0aWxzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIGhhc0Jyb3dzZXJFbnY6IGhhc0Jyb3dzZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjogaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJFbnY6IGhhc1N0YW5kYXJkQnJvd3NlckVudixcbiAgbmF2aWdhdG9yOiBfbmF2aWdhdG9yLFxuICBvcmlnaW46IG9yaWdpblxufSk7XG5cbmNvbnN0IHBsYXRmb3JtID0ge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm0kMVxufTtcblxuZnVuY3Rpb24gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b0Zvcm1EYXRhKGRhdGEsIG5ldyBwbGF0Zm9ybS5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcygpLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aXNpdG9yOiBmdW5jdGlvbih2YWx1ZSwga2V5LCBwYXRoLCBoZWxwZXJzKSB7XG4gICAgICBpZiAocGxhdGZvcm0uaXNOb2RlICYmIHV0aWxzJDEuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscyQxLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZywgbmFtZSkubWFwKG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gPT09ICdbXScgPyAnJyA6IG1hdGNoWzFdIHx8IG1hdGNoWzBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscyQxLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzJDEuaXNPYmplY3QodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXRbbmFtZV0sIGluZGV4KTtcblxuICAgIGlmIChyZXN1bHQgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IGFycmF5VG9PYmplY3QodGFyZ2V0W25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzJDEuaXNGdW5jdGlvbihmb3JtRGF0YS5lbnRyaWVzKSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoRW50cnkoZm9ybURhdGEsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgYnVpbGRQYXRoKHBhcnNlUHJvcFBhdGgobmFtZSksIHZhbHVlLCBvYmosIDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nLCB0cmllcyB0byBwYXJzZSBpdCwgYW5kIGlmIGl0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmF3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIHJhd1ZhbHVlLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMkMS5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMkMS50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscyQxLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCAmJiB1dGlscyQxLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscyQxLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmICh1dGlscyQxLmlzUmVzcG9uc2UoZGF0YSkgfHwgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscyQxLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2JcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCddLCAobWV0aG9kKSA9PiB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbmNvbnN0IGRlZmF1bHRzJDEgPSBkZWZhdWx0cztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscyQxLnRvT2JqZWN0U2V0KFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJhd0hlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbmNvbnN0IHBhcnNlSGVhZGVycyA9IHJhd0hlYWRlcnMgPT4ge1xuICBjb25zdCBwYXJzZWQgPSB7fTtcbiAgbGV0IGtleTtcbiAgbGV0IHZhbDtcbiAgbGV0IGk7XG5cbiAgcmF3SGVhZGVycyAmJiByYXdIZWFkZXJzLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7XG5cbiAgICBpZiAoIWtleSB8fCAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2Zba2V5XSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSkge1xuICAgICAgICBwYXJzZWRba2V5XS5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IFt2YWxdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKG5vcm1hbGl6ZVZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5zKHN0cikge1xuICBjb25zdCB0b2tlbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCB0b2tlbnNSRSA9IC8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2c7XG4gIGxldCBtYXRjaDtcblxuICB3aGlsZSAoKG1hdGNoID0gdG9rZW5zUkUuZXhlYyhzdHIpKSkge1xuICAgIHRva2Vuc1ttYXRjaFsxXV0gPSBtYXRjaFsyXTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbmNvbnN0IGlzVmFsaWRIZWFkZXJOYW1lID0gKHN0cikgPT4gL15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChzdHIudHJpbSgpKTtcblxuZnVuY3Rpb24gbWF0Y2hIZWFkZXJWYWx1ZShjb250ZXh0LCB2YWx1ZSwgaGVhZGVyLCBmaWx0ZXIsIGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcywgdmFsdWUsIGhlYWRlcik7XG4gIH1cblxuICBpZiAoaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gICAgdmFsdWUgPSBoZWFkZXI7XG4gIH1cblxuICBpZiAoIXV0aWxzJDEuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzJDEuaXNTdHJpbmcoZmlsdGVyKSkge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGZpbHRlcikgIT09IC0xO1xuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNSZWdFeHAoZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIudGVzdCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0SGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywgKHcsIGNoYXIsIHN0cikgPT4ge1xuICAgICAgcmV0dXJuIGNoYXIudG9VcHBlckNhc2UoKSArIHN0cjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBY2Nlc3NvcnMob2JqLCBoZWFkZXIpIHtcbiAgY29uc3QgYWNjZXNzb3JOYW1lID0gdXRpbHMkMS50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoc2VsZiwgbEhlYWRlcik7XG5cbiAgICAgIGlmKCFrZXkgfHwgc2VsZltrZXldID09PSB1bmRlZmluZWQgfHwgX3Jld3JpdGUgPT09IHRydWUgfHwgKF9yZXdyaXRlID09PSB1bmRlZmluZWQgJiYgc2VsZltrZXldICE9PSBmYWxzZSkpIHtcbiAgICAgICAgc2VsZltrZXkgfHwgX2hlYWRlcl0gPSBub3JtYWxpemVWYWx1ZShfdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldEhlYWRlcnMgPSAoaGVhZGVycywgX3Jld3JpdGUpID0+XG4gICAgICB1dGlscyQxLmZvckVhY2goaGVhZGVycywgKF92YWx1ZSwgX2hlYWRlcikgPT4gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpKTtcblxuICAgIGlmICh1dGlscyQxLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZih1dGlscyQxLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscyQxLmlzSGVhZGVycyhoZWFkZXIpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBoZWFkZXIuZW50cmllcygpKSB7XG4gICAgICAgIHNldEhlYWRlcih2YWx1ZSwga2V5LCByZXdyaXRlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyICE9IG51bGwgJiYgc2V0SGVhZGVyKHZhbHVlT3JSZXdyaXRlLCBoZWFkZXIsIHJld3JpdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KGhlYWRlciwgcGFyc2VyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZXIgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbnModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzJDEuaXNSZWdFeHAocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhcyhoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICByZXR1cm4gISEoa2V5ICYmIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZShoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gZGVsZXRlSGVhZGVyKF9oZWFkZXIpIHtcbiAgICAgIF9oZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmIChfaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5KGhlYWRlcikpIHtcbiAgICAgIGhlYWRlci5mb3JFYWNoKGRlbGV0ZUhlYWRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZUhlYWRlcihoZWFkZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgY2xlYXIobWF0Y2hlcikge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlciwgdHJ1ZSkpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNba2V5XTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBub3JtYWxpemUoZm9ybWF0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9O1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiAob2JqW2hlYWRlcl0gPSBhc1N0cmluZ3MgJiYgdXRpbHMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmpvaW4oJywgJykgOiB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtoZWFkZXIsIHZhbHVlXSkgPT4gaGVhZGVyICsgJzogJyArIHZhbHVlKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0F4aW9zSGVhZGVycyc7XG4gIH1cblxuICBzdGF0aWMgZnJvbSh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIHRoaXMgPyB0aGluZyA6IG5ldyB0aGlzKHRoaW5nKTtcbiAgfVxuXG4gIHN0YXRpYyBjb25jYXQoZmlyc3QsIC4uLnRhcmdldHMpIHtcbiAgICBjb25zdCBjb21wdXRlZCA9IG5ldyB0aGlzKGZpcnN0KTtcblxuICAgIHRhcmdldHMuZm9yRWFjaCgodGFyZ2V0KSA9PiBjb21wdXRlZC5zZXQodGFyZ2V0KSk7XG5cbiAgICByZXR1cm4gY29tcHV0ZWQ7XG4gIH1cblxuICBzdGF0aWMgYWNjZXNzb3IoaGVhZGVyKSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gdGhpc1skaW50ZXJuYWxzXSA9ICh0aGlzWyRpbnRlcm5hbHNdID0ge1xuICAgICAgYWNjZXNzb3JzOiB7fVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gaW50ZXJuYWxzLmFjY2Vzc29ycztcbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcblxuICAgIGZ1bmN0aW9uIGRlZmluZUFjY2Vzc29yKF9oZWFkZXIpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghYWNjZXNzb3JzW2xIZWFkZXJdKSB7XG4gICAgICAgIGJ1aWxkQWNjZXNzb3JzKHByb3RvdHlwZSwgX2hlYWRlcik7XG4gICAgICAgIGFjY2Vzc29yc1tsSGVhZGVyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbHMkMS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzJDEucmVkdWNlRGVzY3JpcHRvcnMoQXhpb3NIZWFkZXJzLnByb3RvdHlwZSwgKHt2YWx1ZX0sIGtleSkgPT4ge1xuICBsZXQgbWFwcGVkID0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7IC8vIG1hcCBgc2V0YCA9PiBgU2V0YFxuICByZXR1cm4ge1xuICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgc2V0KGhlYWRlclZhbHVlKSB7XG4gICAgICB0aGlzW21hcHBlZF0gPSBoZWFkZXJWYWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG51dGlscyQxLmZyZWV6ZU1ldGhvZHMoQXhpb3NIZWFkZXJzKTtcblxuY29uc3QgQXhpb3NIZWFkZXJzJDEgPSBBeGlvc0hlYWRlcnM7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShmbnMsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHRoaXMgfHwgZGVmYXVsdHMkMTtcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMkMS5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn1cblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICBbQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyZXNwb25zZS5zdGF0dXMgLyAxMDApIC0gNF0sXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8/XFwvJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG5cbmNvbnN0IFZFUlNJT04gPSBcIjEuNy41XCI7XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdG9jb2wodXJsKSB7XG4gIGNvbnN0IG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWModXJsKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xufVxuXG5jb25zdCBEQVRBX1VSTF9QQVRURVJOID0gL14oPzooW147XSspOyk/KD86W147XSs7KT8oYmFzZTY0fCksKFtcXHNcXFNdKikkLztcblxuLyoqXG4gKiBQYXJzZSBkYXRhIHVyaSB0byBhIEJ1ZmZlciBvciBCbG9iXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gYXNCbG9iXG4gKiBAcGFyYW0gez9PYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBvcHRpb25zLkJsb2JcbiAqXG4gKiBAcmV0dXJucyB7QnVmZmVyfEJsb2J9XG4gKi9cbmZ1bmN0aW9uIGZyb21EYXRhVVJJKHVyaSwgYXNCbG9iLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucyAmJiBvcHRpb25zLkJsb2IgfHwgcGxhdGZvcm0uY2xhc3Nlcy5CbG9iO1xuICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2wodXJpKTtcblxuICBpZiAoYXNCbG9iID09PSB1bmRlZmluZWQgJiYgX0Jsb2IpIHtcbiAgICBhc0Jsb2IgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb3RvY29sID09PSAnZGF0YScpIHtcbiAgICB1cmkgPSBwcm90b2NvbC5sZW5ndGggPyB1cmkuc2xpY2UocHJvdG9jb2wubGVuZ3RoICsgMSkgOiB1cmk7XG5cbiAgICBjb25zdCBtYXRjaCA9IERBVEFfVVJMX1BBVFRFUk4uZXhlYyh1cmkpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0ludmFsaWQgVVJMJywgQXhpb3NFcnJvci5FUlJfSU5WQUxJRF9VUkwpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbWUgPSBtYXRjaFsxXTtcbiAgICBjb25zdCBpc0Jhc2U2NCA9IG1hdGNoWzJdO1xuICAgIGNvbnN0IGJvZHkgPSBtYXRjaFszXTtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkZWNvZGVVUklDb21wb25lbnQoYm9keSksIGlzQmFzZTY0ID8gJ2Jhc2U2NCcgOiAndXRmOCcpO1xuXG4gICAgaWYgKGFzQmxvYikge1xuICAgICAgaWYgKCFfQmxvYikge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkJywgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IF9CbG9iKFtidWZmZXJdLCB7dHlwZTogbWltZX0pO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICB0aHJvdyBuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sLCBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCk7XG59XG5cbmNvbnN0IGtJbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5jbGFzcyBBeGlvc1RyYW5zZm9ybVN0cmVhbSBleHRlbmRzIHN0cmVhbV9fZGVmYXVsdFtcImRlZmF1bHRcIl0uVHJhbnNmb3Jte1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHV0aWxzJDEudG9GbGF0T2JqZWN0KG9wdGlvbnMsIHtcbiAgICAgIG1heFJhdGU6IDAsXG4gICAgICBjaHVua1NpemU6IDY0ICogMTAyNCxcbiAgICAgIG1pbkNodW5rU2l6ZTogMTAwLFxuICAgICAgdGltZVdpbmRvdzogNTAwLFxuICAgICAgdGlja3NSYXRlOiAyLFxuICAgICAgc2FtcGxlc0NvdW50OiAxNVxuICAgIH0sIG51bGwsIChwcm9wLCBzb3VyY2UpID0+IHtcbiAgICAgIHJldHVybiAhdXRpbHMkMS5pc1VuZGVmaW5lZChzb3VyY2VbcHJvcF0pO1xuICAgIH0pO1xuXG4gICAgc3VwZXIoe1xuICAgICAgcmVhZGFibGVIaWdoV2F0ZXJNYXJrOiBvcHRpb25zLmNodW5rU2l6ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgaW50ZXJuYWxzID0gdGhpc1trSW50ZXJuYWxzXSA9IHtcbiAgICAgIHRpbWVXaW5kb3c6IG9wdGlvbnMudGltZVdpbmRvdyxcbiAgICAgIGNodW5rU2l6ZTogb3B0aW9ucy5jaHVua1NpemUsXG4gICAgICBtYXhSYXRlOiBvcHRpb25zLm1heFJhdGUsXG4gICAgICBtaW5DaHVua1NpemU6IG9wdGlvbnMubWluQ2h1bmtTaXplLFxuICAgICAgYnl0ZXNTZWVuOiAwLFxuICAgICAgaXNDYXB0dXJlZDogZmFsc2UsXG4gICAgICBub3RpZmllZEJ5dGVzTG9hZGVkOiAwLFxuICAgICAgdHM6IERhdGUubm93KCksXG4gICAgICBieXRlczogMCxcbiAgICAgIG9uUmVhZENhbGxiYWNrOiBudWxsXG4gICAgfTtcblxuICAgIHRoaXMub24oJ25ld0xpc3RlbmVyJywgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50ID09PSAncHJvZ3Jlc3MnKSB7XG4gICAgICAgIGlmICghaW50ZXJuYWxzLmlzQ2FwdHVyZWQpIHtcbiAgICAgICAgICBpbnRlcm5hbHMuaXNDYXB0dXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9yZWFkKHNpemUpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzW2tJbnRlcm5hbHNdO1xuXG4gICAgaWYgKGludGVybmFscy5vblJlYWRDYWxsYmFjaykge1xuICAgICAgaW50ZXJuYWxzLm9uUmVhZENhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLl9yZWFkKHNpemUpO1xuICB9XG5cbiAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gdGhpc1trSW50ZXJuYWxzXTtcbiAgICBjb25zdCBtYXhSYXRlID0gaW50ZXJuYWxzLm1heFJhdGU7XG5cbiAgICBjb25zdCByZWFkYWJsZUhpZ2hXYXRlck1hcmsgPSB0aGlzLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcblxuICAgIGNvbnN0IHRpbWVXaW5kb3cgPSBpbnRlcm5hbHMudGltZVdpbmRvdztcblxuICAgIGNvbnN0IGRpdmlkZXIgPSAxMDAwIC8gdGltZVdpbmRvdztcbiAgICBjb25zdCBieXRlc1RocmVzaG9sZCA9IChtYXhSYXRlIC8gZGl2aWRlcik7XG4gICAgY29uc3QgbWluQ2h1bmtTaXplID0gaW50ZXJuYWxzLm1pbkNodW5rU2l6ZSAhPT0gZmFsc2UgPyBNYXRoLm1heChpbnRlcm5hbHMubWluQ2h1bmtTaXplLCBieXRlc1RocmVzaG9sZCAqIDAuMDEpIDogMDtcblxuICAgIGNvbnN0IHB1c2hDaHVuayA9IChfY2h1bmssIF9jYWxsYmFjaykgPT4ge1xuICAgICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChfY2h1bmspO1xuICAgICAgaW50ZXJuYWxzLmJ5dGVzU2VlbiArPSBieXRlcztcbiAgICAgIGludGVybmFscy5ieXRlcyArPSBieXRlcztcblxuICAgICAgaW50ZXJuYWxzLmlzQ2FwdHVyZWQgJiYgdGhpcy5lbWl0KCdwcm9ncmVzcycsIGludGVybmFscy5ieXRlc1NlZW4pO1xuXG4gICAgICBpZiAodGhpcy5wdXNoKF9jaHVuaykpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhfY2FsbGJhY2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJuYWxzLm9uUmVhZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgIGludGVybmFscy5vblJlYWRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhfY2FsbGJhY2spO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1DaHVuayA9IChfY2h1bmssIF9jYWxsYmFjaykgPT4ge1xuICAgICAgY29uc3QgY2h1bmtTaXplID0gQnVmZmVyLmJ5dGVMZW5ndGgoX2NodW5rKTtcbiAgICAgIGxldCBjaHVua1JlbWFpbmRlciA9IG51bGw7XG4gICAgICBsZXQgbWF4Q2h1bmtTaXplID0gcmVhZGFibGVIaWdoV2F0ZXJNYXJrO1xuICAgICAgbGV0IGJ5dGVzTGVmdDtcbiAgICAgIGxldCBwYXNzZWQgPSAwO1xuXG4gICAgICBpZiAobWF4UmF0ZSkge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmICghaW50ZXJuYWxzLnRzIHx8IChwYXNzZWQgPSAobm93IC0gaW50ZXJuYWxzLnRzKSkgPj0gdGltZVdpbmRvdykge1xuICAgICAgICAgIGludGVybmFscy50cyA9IG5vdztcbiAgICAgICAgICBieXRlc0xlZnQgPSBieXRlc1RocmVzaG9sZCAtIGludGVybmFscy5ieXRlcztcbiAgICAgICAgICBpbnRlcm5hbHMuYnl0ZXMgPSBieXRlc0xlZnQgPCAwID8gLWJ5dGVzTGVmdCA6IDA7XG4gICAgICAgICAgcGFzc2VkID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ5dGVzTGVmdCA9IGJ5dGVzVGhyZXNob2xkIC0gaW50ZXJuYWxzLmJ5dGVzO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4UmF0ZSkge1xuICAgICAgICBpZiAoYnl0ZXNMZWZ0IDw9IDApIHtcbiAgICAgICAgICAvLyBuZXh0IHRpbWUgd2luZG93XG4gICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgX2NhbGxiYWNrKG51bGwsIF9jaHVuayk7XG4gICAgICAgICAgfSwgdGltZVdpbmRvdyAtIHBhc3NlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnl0ZXNMZWZ0IDwgbWF4Q2h1bmtTaXplKSB7XG4gICAgICAgICAgbWF4Q2h1bmtTaXplID0gYnl0ZXNMZWZ0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhDaHVua1NpemUgJiYgY2h1bmtTaXplID4gbWF4Q2h1bmtTaXplICYmIChjaHVua1NpemUgLSBtYXhDaHVua1NpemUpID4gbWluQ2h1bmtTaXplKSB7XG4gICAgICAgIGNodW5rUmVtYWluZGVyID0gX2NodW5rLnN1YmFycmF5KG1heENodW5rU2l6ZSk7XG4gICAgICAgIF9jaHVuayA9IF9jaHVuay5zdWJhcnJheSgwLCBtYXhDaHVua1NpemUpO1xuICAgICAgfVxuXG4gICAgICBwdXNoQ2h1bmsoX2NodW5rLCBjaHVua1JlbWFpbmRlciA/ICgpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhfY2FsbGJhY2ssIG51bGwsIGNodW5rUmVtYWluZGVyKTtcbiAgICAgIH0gOiBfY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICB0cmFuc2Zvcm1DaHVuayhjaHVuaywgZnVuY3Rpb24gdHJhbnNmb3JtTmV4dENodW5rKGVyciwgX2NodW5rKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2NodW5rKSB7XG4gICAgICAgIHRyYW5zZm9ybUNodW5rKF9jaHVuaywgdHJhbnNmb3JtTmV4dENodW5rKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IEF4aW9zVHJhbnNmb3JtU3RyZWFtJDEgPSBBeGlvc1RyYW5zZm9ybVN0cmVhbTtcblxuY29uc3Qge2FzeW5jSXRlcmF0b3J9ID0gU3ltYm9sO1xuXG5jb25zdCByZWFkQmxvYiA9IGFzeW5jIGZ1bmN0aW9uKiAoYmxvYikge1xuICBpZiAoYmxvYi5zdHJlYW0pIHtcbiAgICB5aWVsZCogYmxvYi5zdHJlYW0oKTtcbiAgfSBlbHNlIGlmIChibG9iLmFycmF5QnVmZmVyKSB7XG4gICAgeWllbGQgYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICB9IGVsc2UgaWYgKGJsb2JbYXN5bmNJdGVyYXRvcl0pIHtcbiAgICB5aWVsZCogYmxvYlthc3luY0l0ZXJhdG9yXSgpO1xuICB9IGVsc2Uge1xuICAgIHlpZWxkIGJsb2I7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRCbG9iJDEgPSByZWFkQmxvYjtcblxuY29uc3QgQk9VTkRBUllfQUxQSEFCRVQgPSB1dGlscyQxLkFMUEhBQkVULkFMUEhBX0RJR0lUICsgJy1fJztcblxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgdXRpbC5UZXh0RW5jb2RlcigpO1xuXG5jb25zdCBDUkxGID0gJ1xcclxcbic7XG5jb25zdCBDUkxGX0JZVEVTID0gdGV4dEVuY29kZXIuZW5jb2RlKENSTEYpO1xuY29uc3QgQ1JMRl9CWVRFU19DT1VOVCA9IDI7XG5cbmNsYXNzIEZvcm1EYXRhUGFydCB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3Qge2VzY2FwZU5hbWV9ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCBpc1N0cmluZ1ZhbHVlID0gdXRpbHMkMS5pc1N0cmluZyh2YWx1ZSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIke2VzY2FwZU5hbWUobmFtZSl9XCIke1xuICAgICAgIWlzU3RyaW5nVmFsdWUgJiYgdmFsdWUubmFtZSA/IGA7IGZpbGVuYW1lPVwiJHtlc2NhcGVOYW1lKHZhbHVlLm5hbWUpfVwiYCA6ICcnXG4gICAgfSR7Q1JMRn1gO1xuXG4gICAgaWYgKGlzU3RyaW5nVmFsdWUpIHtcbiAgICAgIHZhbHVlID0gdGV4dEVuY29kZXIuZW5jb2RlKFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxyP1xcbnxcXHJcXG4/L2csIENSTEYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVycyArPSBgQ29udGVudC1UeXBlOiAke3ZhbHVlLnR5cGUgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIn0ke0NSTEZ9YDtcbiAgICB9XG5cbiAgICB0aGlzLmhlYWRlcnMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoaGVhZGVycyArIENSTEYpO1xuXG4gICAgdGhpcy5jb250ZW50TGVuZ3RoID0gaXNTdHJpbmdWYWx1ZSA/IHZhbHVlLmJ5dGVMZW5ndGggOiB2YWx1ZS5zaXplO1xuXG4gICAgdGhpcy5zaXplID0gdGhpcy5oZWFkZXJzLmJ5dGVMZW5ndGggKyB0aGlzLmNvbnRlbnRMZW5ndGggKyBDUkxGX0JZVEVTX0NPVU5UO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBhc3luYyAqZW5jb2RlKCl7XG4gICAgeWllbGQgdGhpcy5oZWFkZXJzO1xuXG4gICAgY29uc3Qge3ZhbHVlfSA9IHRoaXM7XG5cbiAgICBpZih1dGlscyQxLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCogcmVhZEJsb2IkMSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgeWllbGQgQ1JMRl9CWVRFUztcbiAgfVxuXG4gIHN0YXRpYyBlc2NhcGVOYW1lKG5hbWUpIHtcbiAgICAgIHJldHVybiBTdHJpbmcobmFtZSkucmVwbGFjZSgvW1xcclxcblwiXS9nLCAobWF0Y2gpID0+ICh7XG4gICAgICAgICdcXHInIDogJyUwRCcsXG4gICAgICAgICdcXG4nIDogJyUwQScsXG4gICAgICAgICdcIicgOiAnJTIyJyxcbiAgICAgIH1bbWF0Y2hdKSk7XG4gIH1cbn1cblxuY29uc3QgZm9ybURhdGFUb1N0cmVhbSA9IChmb3JtLCBoZWFkZXJzSGFuZGxlciwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgdGFnID0gJ2Zvcm0tZGF0YS1ib3VuZGFyeScsXG4gICAgc2l6ZSA9IDI1LFxuICAgIGJvdW5kYXJ5ID0gdGFnICsgJy0nICsgdXRpbHMkMS5nZW5lcmF0ZVN0cmluZyhzaXplLCBCT1VOREFSWV9BTFBIQUJFVClcbiAgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYoIXV0aWxzJDEuaXNGb3JtRGF0YShmb3JtKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignRm9ybURhdGEgaW5zdGFuY2UgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGlmIChib3VuZGFyeS5sZW5ndGggPCAxIHx8IGJvdW5kYXJ5Lmxlbmd0aCA+IDcwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2JvdW5kYXJ5IG11c3QgYmUgMTAtNzAgY2hhcmFjdGVycyBsb25nJylcbiAgfVxuXG4gIGNvbnN0IGJvdW5kYXJ5Qnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoJy0tJyArIGJvdW5kYXJ5ICsgQ1JMRik7XG4gIGNvbnN0IGZvb3RlckJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKCctLScgKyBib3VuZGFyeSArICctLScgKyBDUkxGICsgQ1JMRik7XG4gIGxldCBjb250ZW50TGVuZ3RoID0gZm9vdGVyQnl0ZXMuYnl0ZUxlbmd0aDtcblxuICBjb25zdCBwYXJ0cyA9IEFycmF5LmZyb20oZm9ybS5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHBhcnQgPSBuZXcgRm9ybURhdGFQYXJ0KG5hbWUsIHZhbHVlKTtcbiAgICBjb250ZW50TGVuZ3RoICs9IHBhcnQuc2l6ZTtcbiAgICByZXR1cm4gcGFydDtcbiAgfSk7XG5cbiAgY29udGVudExlbmd0aCArPSBib3VuZGFyeUJ5dGVzLmJ5dGVMZW5ndGggKiBwYXJ0cy5sZW5ndGg7XG5cbiAgY29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIoY29udGVudExlbmd0aCk7XG5cbiAgY29uc3QgY29tcHV0ZWRIZWFkZXJzID0ge1xuICAgICdDb250ZW50LVR5cGUnOiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JHtib3VuZGFyeX1gXG4gIH07XG5cbiAgaWYgKE51bWJlci5pc0Zpbml0ZShjb250ZW50TGVuZ3RoKSkge1xuICAgIGNvbXB1dGVkSGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IGNvbnRlbnRMZW5ndGg7XG4gIH1cblxuICBoZWFkZXJzSGFuZGxlciAmJiBoZWFkZXJzSGFuZGxlcihjb21wdXRlZEhlYWRlcnMpO1xuXG4gIHJldHVybiBzdHJlYW0uUmVhZGFibGUuZnJvbSgoYXN5bmMgZnVuY3Rpb24gKigpIHtcbiAgICBmb3IoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgeWllbGQgYm91bmRhcnlCeXRlcztcbiAgICAgIHlpZWxkKiBwYXJ0LmVuY29kZSgpO1xuICAgIH1cblxuICAgIHlpZWxkIGZvb3RlckJ5dGVzO1xuICB9KSgpKTtcbn07XG5cbmNvbnN0IGZvcm1EYXRhVG9TdHJlYW0kMSA9IGZvcm1EYXRhVG9TdHJlYW07XG5cbmNsYXNzIFpsaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW0gZXh0ZW5kcyBzdHJlYW1fX2RlZmF1bHRbXCJkZWZhdWx0XCJdLlRyYW5zZm9ybSB7XG4gIF9fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoY2h1bmsubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0aGlzLl9fdHJhbnNmb3JtO1xuXG4gICAgICAvLyBBZGQgRGVmYXVsdCBDb21wcmVzc2lvbiBoZWFkZXJzIGlmIG5vIHpsaWIgaGVhZGVycyBhcmUgcHJlc2VudFxuICAgICAgaWYgKGNodW5rWzBdICE9PSAxMjApIHsgLy8gSGV4OiA3OFxuICAgICAgICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgICAgIGhlYWRlclswXSA9IDEyMDsgLy8gSGV4OiA3OFxuICAgICAgICBoZWFkZXJbMV0gPSAxNTY7IC8vIEhleDogOUMgXG4gICAgICAgIHRoaXMucHVzaChoZWFkZXIsIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spO1xuICB9XG59XG5cbmNvbnN0IFpsaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW0kMSA9IFpsaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW07XG5cbmNvbnN0IGNhbGxiYWNraWZ5ID0gKGZuLCByZWR1Y2VyKSA9PiB7XG4gIHJldHVybiB1dGlscyQxLmlzQXN5bmNGbihmbikgPyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGNvbnN0IGNiID0gYXJncy5wb3AoKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVkdWNlciA/IGNiKG51bGwsIC4uLnJlZHVjZXIodmFsdWUpKSA6IGNiKG51bGwsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYihlcnIpO1xuICAgICAgfVxuICAgIH0sIGNiKTtcbiAgfSA6IGZuO1xufTtcblxuY29uc3QgY2FsbGJhY2tpZnkkMSA9IGNhbGxiYWNraWZ5O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoYnl0ZXNDb3VudCAqIDEwMDAgLyBwYXNzZWQpIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRocm90dGxlIGRlY29yYXRvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmcmVxXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZm4sIGZyZXEpIHtcbiAgbGV0IHRpbWVzdGFtcCA9IDA7XG4gIGxldCB0aHJlc2hvbGQgPSAxMDAwIC8gZnJlcTtcbiAgbGV0IGxhc3RBcmdzO1xuICBsZXQgdGltZXI7XG5cbiAgY29uc3QgaW52b2tlID0gKGFyZ3MsIG5vdyA9IERhdGUubm93KCkpID0+IHtcbiAgICB0aW1lc3RhbXAgPSBub3c7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH07XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncyk7XG4gICAgICAgIH0sIHRocmVzaG9sZCAtIHBhc3NlZCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4gbGFzdEFyZ3MgJiYgaW52b2tlKGxhc3RBcmdzKTtcblxuICByZXR1cm4gW3Rocm90dGxlZCwgZmx1c2hdO1xufVxuXG5jb25zdCBwcm9ncmVzc0V2ZW50UmVkdWNlciA9IChsaXN0ZW5lciwgaXNEb3dubG9hZFN0cmVhbSwgZnJlcSA9IDMpID0+IHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gdGhyb3R0bGUoZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZSxcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRvdGFsICE9IG51bGwsXG4gICAgICBbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ106IHRydWVcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufTtcblxuY29uc3QgcHJvZ3Jlc3NFdmVudERlY29yYXRvciA9ICh0b3RhbCwgdGhyb3R0bGVkKSA9PiB7XG4gIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPSBudWxsO1xuXG4gIHJldHVybiBbKGxvYWRlZCkgPT4gdGhyb3R0bGVkWzBdKHtcbiAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgIHRvdGFsLFxuICAgIGxvYWRlZFxuICB9KSwgdGhyb3R0bGVkWzFdXTtcbn07XG5cbmNvbnN0IGFzeW5jRGVjb3JhdG9yID0gKGZuKSA9PiAoLi4uYXJncykgPT4gdXRpbHMkMS5hc2FwKCgpID0+IGZuKC4uLmFyZ3MpKTtcblxuY29uc3QgemxpYk9wdGlvbnMgPSB7XG4gIGZsdXNoOiB6bGliX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5jb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICBmaW5pc2hGbHVzaDogemxpYl9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY29uc3RhbnRzLlpfU1lOQ19GTFVTSFxufTtcblxuY29uc3QgYnJvdGxpT3B0aW9ucyA9IHtcbiAgZmx1c2g6IHpsaWJfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNvbnN0YW50cy5CUk9UTElfT1BFUkFUSU9OX0ZMVVNILFxuICBmaW5pc2hGbHVzaDogemxpYl9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY29uc3RhbnRzLkJST1RMSV9PUEVSQVRJT05fRkxVU0hcbn07XG5cbmNvbnN0IGlzQnJvdGxpU3VwcG9ydGVkID0gdXRpbHMkMS5pc0Z1bmN0aW9uKHpsaWJfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MpO1xuXG5jb25zdCB7aHR0cDogaHR0cEZvbGxvdywgaHR0cHM6IGh0dHBzRm9sbG93fSA9IGZvbGxvd1JlZGlyZWN0c19fZGVmYXVsdFtcImRlZmF1bHRcIl07XG5cbmNvbnN0IGlzSHR0cHMgPSAvaHR0cHM6Py87XG5cbmNvbnN0IHN1cHBvcnRlZFByb3RvY29scyA9IHBsYXRmb3JtLnByb3RvY29scy5tYXAocHJvdG9jb2wgPT4ge1xuICByZXR1cm4gcHJvdG9jb2wgKyAnOic7XG59KTtcblxuY29uc3QgZmx1c2hPbkZpbmlzaCA9IChzdHJlYW0sIFt0aHJvdHRsZWQsIGZsdXNoXSkgPT4ge1xuICBzdHJlYW1cbiAgICAub24oJ2VuZCcsIGZsdXNoKVxuICAgIC5vbignZXJyb3InLCBmbHVzaCk7XG5cbiAgcmV0dXJuIHRocm90dGxlZDtcbn07XG5cbi8qKlxuICogSWYgdGhlIHByb3h5IG9yIGNvbmZpZyBiZWZvcmVSZWRpcmVjdHMgZnVuY3Rpb25zIGFyZSBkZWZpbmVkLCBjYWxsIHRoZW0gd2l0aCB0aGUgb3B0aW9uc1xuICogb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT59XG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoQmVmb3JlUmVkaXJlY3Qob3B0aW9ucywgcmVzcG9uc2VEZXRhaWxzKSB7XG4gIGlmIChvcHRpb25zLmJlZm9yZVJlZGlyZWN0cy5wcm94eSkge1xuICAgIG9wdGlvbnMuYmVmb3JlUmVkaXJlY3RzLnByb3h5KG9wdGlvbnMpO1xuICB9XG4gIGlmIChvcHRpb25zLmJlZm9yZVJlZGlyZWN0cy5jb25maWcpIHtcbiAgICBvcHRpb25zLmJlZm9yZVJlZGlyZWN0cy5jb25maWcob3B0aW9ucywgcmVzcG9uc2VEZXRhaWxzKTtcbiAgfVxufVxuXG4vKipcbiAqIElmIHRoZSBwcm94eSBvciBjb25maWcgYWZ0ZXJSZWRpcmVjdHMgZnVuY3Rpb25zIGFyZSBkZWZpbmVkLCBjYWxsIHRoZW0gd2l0aCB0aGUgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7aHR0cC5DbGllbnRSZXF1ZXN0QXJnc30gb3B0aW9uc1xuICogQHBhcmFtIHtBeGlvc1Byb3h5Q29uZmlnfSBjb25maWdQcm94eSBjb25maWd1cmF0aW9uIGZyb20gQXhpb3Mgb3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICpcbiAqIEByZXR1cm5zIHtodHRwLkNsaWVudFJlcXVlc3RBcmdzfVxuICovXG5mdW5jdGlvbiBzZXRQcm94eShvcHRpb25zLCBjb25maWdQcm94eSwgbG9jYXRpb24pIHtcbiAgbGV0IHByb3h5ID0gY29uZmlnUHJveHk7XG4gIGlmICghcHJveHkgJiYgcHJveHkgIT09IGZhbHNlKSB7XG4gICAgY29uc3QgcHJveHlVcmwgPSBwcm94eUZyb21FbnYuZ2V0UHJveHlGb3JVcmwobG9jYXRpb24pO1xuICAgIGlmIChwcm94eVVybCkge1xuICAgICAgcHJveHkgPSBuZXcgVVJMKHByb3h5VXJsKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb3h5KSB7XG4gICAgLy8gQmFzaWMgcHJveHkgYXV0aG9yaXphdGlvblxuICAgIGlmIChwcm94eS51c2VybmFtZSkge1xuICAgICAgcHJveHkuYXV0aCA9IChwcm94eS51c2VybmFtZSB8fCAnJykgKyAnOicgKyAocHJveHkucGFzc3dvcmQgfHwgJycpO1xuICAgIH1cblxuICAgIGlmIChwcm94eS5hdXRoKSB7XG4gICAgICAvLyBTdXBwb3J0IHByb3h5IGF1dGggb2JqZWN0IGZvcm1cbiAgICAgIGlmIChwcm94eS5hdXRoLnVzZXJuYW1lIHx8IHByb3h5LmF1dGgucGFzc3dvcmQpIHtcbiAgICAgICAgcHJveHkuYXV0aCA9IChwcm94eS5hdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChwcm94eS5hdXRoLnBhc3N3b3JkIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2U2NCA9IEJ1ZmZlclxuICAgICAgICAuZnJvbShwcm94eS5hdXRoLCAndXRmOCcpXG4gICAgICAgIC50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICBvcHRpb25zLmhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnICsgYmFzZTY0O1xuICAgIH1cblxuICAgIG9wdGlvbnMuaGVhZGVycy5ob3N0ID0gb3B0aW9ucy5ob3N0bmFtZSArIChvcHRpb25zLnBvcnQgPyAnOicgKyBvcHRpb25zLnBvcnQgOiAnJyk7XG4gICAgY29uc3QgcHJveHlIb3N0ID0gcHJveHkuaG9zdG5hbWUgfHwgcHJveHkuaG9zdDtcbiAgICBvcHRpb25zLmhvc3RuYW1lID0gcHJveHlIb3N0O1xuICAgIC8vIFJlcGxhY2UgJ2hvc3QnIHNpbmNlIG9wdGlvbnMgaXMgbm90IGEgVVJMIG9iamVjdFxuICAgIG9wdGlvbnMuaG9zdCA9IHByb3h5SG9zdDtcbiAgICBvcHRpb25zLnBvcnQgPSBwcm94eS5wb3J0O1xuICAgIG9wdGlvbnMucGF0aCA9IGxvY2F0aW9uO1xuICAgIGlmIChwcm94eS5wcm90b2NvbCkge1xuICAgICAgb3B0aW9ucy5wcm90b2NvbCA9IHByb3h5LnByb3RvY29sLmluY2x1ZGVzKCc6JykgPyBwcm94eS5wcm90b2NvbCA6IGAke3Byb3h5LnByb3RvY29sfTpgO1xuICAgIH1cbiAgfVxuXG4gIG9wdGlvbnMuYmVmb3JlUmVkaXJlY3RzLnByb3h5ID0gZnVuY3Rpb24gYmVmb3JlUmVkaXJlY3QocmVkaXJlY3RPcHRpb25zKSB7XG4gICAgLy8gQ29uZmlndXJlIHByb3h5IGZvciByZWRpcmVjdGVkIHJlcXVlc3QsIHBhc3NpbmcgdGhlIG9yaWdpbmFsIGNvbmZpZyBwcm94eSB0byBhcHBseVxuICAgIC8vIHRoZSBleGFjdCBzYW1lIGxvZ2ljIGFzIGlmIHRoZSByZWRpcmVjdGVkIHJlcXVlc3Qgd2FzIHBlcmZvcm1lZCBieSBheGlvcyBkaXJlY3RseS5cbiAgICBzZXRQcm94eShyZWRpcmVjdE9wdGlvbnMsIGNvbmZpZ1Byb3h5LCByZWRpcmVjdE9wdGlvbnMuaHJlZik7XG4gIH07XG59XG5cbmNvbnN0IGlzSHR0cEFkYXB0ZXJTdXBwb3J0ZWQgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdXRpbHMkMS5raW5kT2YocHJvY2VzcykgPT09ICdwcm9jZXNzJztcblxuLy8gdGVtcG9yYXJ5IGhvdGZpeFxuXG5jb25zdCB3cmFwQXN5bmMgPSAoYXN5bmNFeGVjdXRvcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBvbkRvbmU7XG4gICAgbGV0IGlzRG9uZTtcblxuICAgIGNvbnN0IGRvbmUgPSAodmFsdWUsIGlzUmVqZWN0ZWQpID0+IHtcbiAgICAgIGlmIChpc0RvbmUpIHJldHVybjtcbiAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICBvbkRvbmUgJiYgb25Eb25lKHZhbHVlLCBpc1JlamVjdGVkKTtcbiAgICB9O1xuXG4gICAgY29uc3QgX3Jlc29sdmUgPSAodmFsdWUpID0+IHtcbiAgICAgIGRvbmUodmFsdWUpO1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IF9yZWplY3QgPSAocmVhc29uKSA9PiB7XG4gICAgICBkb25lKHJlYXNvbiwgdHJ1ZSk7XG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9O1xuXG4gICAgYXN5bmNFeGVjdXRvcihfcmVzb2x2ZSwgX3JlamVjdCwgKG9uRG9uZUhhbmRsZXIpID0+IChvbkRvbmUgPSBvbkRvbmVIYW5kbGVyKSkuY2F0Y2goX3JlamVjdCk7XG4gIH0pXG59O1xuXG5jb25zdCByZXNvbHZlRmFtaWx5ID0gKHthZGRyZXNzLCBmYW1pbHl9KSA9PiB7XG4gIGlmICghdXRpbHMkMS5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignYWRkcmVzcyBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cbiAgcmV0dXJuICh7XG4gICAgYWRkcmVzcyxcbiAgICBmYW1pbHk6IGZhbWlseSB8fCAoYWRkcmVzcy5pbmRleE9mKCcuJykgPCAwID8gNiA6IDQpXG4gIH0pO1xufTtcblxuY29uc3QgYnVpbGRBZGRyZXNzRW50cnkgPSAoYWRkcmVzcywgZmFtaWx5KSA9PiByZXNvbHZlRmFtaWx5KHV0aWxzJDEuaXNPYmplY3QoYWRkcmVzcykgPyBhZGRyZXNzIDoge2FkZHJlc3MsIGZhbWlseX0pO1xuXG4vKmVzbGludCBjb25zaXN0ZW50LXJldHVybjowKi9cbmNvbnN0IGh0dHBBZGFwdGVyID0gaXNIdHRwQWRhcHRlclN1cHBvcnRlZCAmJiBmdW5jdGlvbiBodHRwQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIHdyYXBBc3luYyhhc3luYyBmdW5jdGlvbiBkaXNwYXRjaEh0dHBSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCwgb25Eb25lKSB7XG4gICAgbGV0IHtkYXRhLCBsb29rdXAsIGZhbWlseX0gPSBjb25maWc7XG4gICAgY29uc3Qge3Jlc3BvbnNlVHlwZSwgcmVzcG9uc2VFbmNvZGluZ30gPSBjb25maWc7XG4gICAgY29uc3QgbWV0aG9kID0gY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgIGxldCBpc0RvbmU7XG4gICAgbGV0IHJlamVjdGVkID0gZmFsc2U7XG4gICAgbGV0IHJlcTtcblxuICAgIGlmIChsb29rdXApIHtcbiAgICAgIGNvbnN0IF9sb29rdXAgPSBjYWxsYmFja2lmeSQxKGxvb2t1cCwgKHZhbHVlKSA9PiB1dGlscyQxLmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcbiAgICAgIC8vIGhvdGZpeCB0byBzdXBwb3J0IG9wdC5hbGwgb3B0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBub2RlIDIwLnhcbiAgICAgIGxvb2t1cCA9IChob3N0bmFtZSwgb3B0LCBjYikgPT4ge1xuICAgICAgICBfbG9va3VwKGhvc3RuYW1lLCBvcHQsIChlcnIsIGFyZzAsIGFyZzEpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRyZXNzZXMgPSB1dGlscyQxLmlzQXJyYXkoYXJnMCkgPyBhcmcwLm1hcChhZGRyID0+IGJ1aWxkQWRkcmVzc0VudHJ5KGFkZHIpKSA6IFtidWlsZEFkZHJlc3NFbnRyeShhcmcwLCBhcmcxKV07XG5cbiAgICAgICAgICBvcHQuYWxsID8gY2IoZXJyLCBhZGRyZXNzZXMpIDogY2IoZXJyLCBhZGRyZXNzZXNbMF0uYWRkcmVzcywgYWRkcmVzc2VzWzBdLmZhbWlseSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyB0ZW1wb3JhcnkgaW50ZXJuYWwgZW1pdHRlciB1bnRpbCB0aGUgQXhpb3NSZXF1ZXN0IGNsYXNzIHdpbGwgYmUgaW1wbGVtZW50ZWRcbiAgICBjb25zdCBlbWl0dGVyID0gbmV3IGV2ZW50cy5FdmVudEVtaXR0ZXIoKTtcblxuICAgIGNvbnN0IG9uRmluaXNoZWQgPSAoKSA9PiB7XG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShhYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcuc2lnbmFsKSB7XG4gICAgICAgIGNvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfTtcblxuICAgIG9uRG9uZSgodmFsdWUsIGlzUmVqZWN0ZWQpID0+IHtcbiAgICAgIGlzRG9uZSA9IHRydWU7XG4gICAgICBpZiAoaXNSZWplY3RlZCkge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFib3J0KHJlYXNvbikge1xuICAgICAgZW1pdHRlci5lbWl0KCdhYm9ydCcsICFyZWFzb24gfHwgcmVhc29uLnR5cGUgPyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcsIHJlcSkgOiByZWFzb24pO1xuICAgIH1cblxuICAgIGVtaXR0ZXIub25jZSgnYWJvcnQnLCByZWplY3QpO1xuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbiB8fCBjb25maWcuc2lnbmFsKSB7XG4gICAgICBjb25maWcuY2FuY2VsVG9rZW4gJiYgY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShhYm9ydCk7XG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBjb25maWcuc2lnbmFsLmFib3J0ZWQgPyBhYm9ydCgpIDogY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXJzZSB1cmxcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwoZnVsbFBhdGgsIHBsYXRmb3JtLmhhc0Jyb3dzZXJFbnYgPyBwbGF0Zm9ybS5vcmlnaW4gOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VkLnByb3RvY29sIHx8IHN1cHBvcnRlZFByb3RvY29sc1swXTtcblxuICAgIGlmIChwcm90b2NvbCA9PT0gJ2RhdGE6Jykge1xuICAgICAgbGV0IGNvbnZlcnRlZERhdGE7XG5cbiAgICAgIGlmIChtZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIHJldHVybiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB7XG4gICAgICAgICAgc3RhdHVzOiA0MDUsXG4gICAgICAgICAgc3RhdHVzVGV4dDogJ21ldGhvZCBub3QgYWxsb3dlZCcsXG4gICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb252ZXJ0ZWREYXRhID0gZnJvbURhdGFVUkkoY29uZmlnLnVybCwgcmVzcG9uc2VUeXBlID09PSAnYmxvYicsIHtcbiAgICAgICAgICBCbG9iOiBjb25maWcuZW52ICYmIGNvbmZpZy5lbnYuQmxvYlxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZXJyLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnZlcnRlZERhdGEgPSBjb252ZXJ0ZWREYXRhLnRvU3RyaW5nKHJlc3BvbnNlRW5jb2RpbmcpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2VFbmNvZGluZyB8fCByZXNwb25zZUVuY29kaW5nID09PSAndXRmOCcpIHtcbiAgICAgICAgICBjb252ZXJ0ZWREYXRhID0gdXRpbHMkMS5zdHJpcEJPTShjb252ZXJ0ZWREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nKSB7XG4gICAgICAgIGNvbnZlcnRlZERhdGEgPSBzdHJlYW1fX2RlZmF1bHRbXCJkZWZhdWx0XCJdLlJlYWRhYmxlLmZyb20oY29udmVydGVkRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB7XG4gICAgICAgIGRhdGE6IGNvbnZlcnRlZERhdGEsXG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBzdGF0dXNUZXh0OiAnT0snLFxuICAgICAgICBoZWFkZXJzOiBuZXcgQXhpb3NIZWFkZXJzJDEoKSxcbiAgICAgICAgY29uZmlnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydGVkUHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIHByb3RvY29sICcgKyBwcm90b2NvbCxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsXG4gICAgICAgIGNvbmZpZ1xuICAgICAgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuXG4gICAgLy8gU2V0IFVzZXItQWdlbnQgKHJlcXVpcmVkIGJ5IHNvbWUgc2VydmVycylcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zL2lzc3Vlcy82OVxuICAgIC8vIFVzZXItQWdlbnQgaXMgc3BlY2lmaWVkOyBoYW5kbGUgY2FzZSB3aGVyZSBubyBVQSBoZWFkZXIgaXMgZGVzaXJlZFxuICAgIC8vIE9ubHkgc2V0IGhlYWRlciBpZiBpdCBoYXNuJ3QgYmVlbiBzZXQgaW4gY29uZmlnXG4gICAgaGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnYXhpb3MvJyArIFZFUlNJT04sIGZhbHNlKTtcblxuICAgIGNvbnN0IHtvblVwbG9hZFByb2dyZXNzLCBvbkRvd25sb2FkUHJvZ3Jlc3N9ID0gY29uZmlnO1xuICAgIGNvbnN0IG1heFJhdGUgPSBjb25maWcubWF4UmF0ZTtcbiAgICBsZXQgbWF4VXBsb2FkUmF0ZSA9IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4RG93bmxvYWRSYXRlID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gc3VwcG9ydCBmb3Igc3BlYyBjb21wbGlhbnQgRm9ybURhdGEgb2JqZWN0c1xuICAgIGlmICh1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oZGF0YSkpIHtcbiAgICAgIGNvbnN0IHVzZXJCb3VuZGFyeSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoL2JvdW5kYXJ5PShbLV9cXHdcXGRdezEwLDcwfSkvaSk7XG5cbiAgICAgIGRhdGEgPSBmb3JtRGF0YVRvU3RyZWFtJDEoZGF0YSwgKGZvcm1IZWFkZXJzKSA9PiB7XG4gICAgICAgIGhlYWRlcnMuc2V0KGZvcm1IZWFkZXJzKTtcbiAgICAgIH0sIHtcbiAgICAgICAgdGFnOiBgYXhpb3MtJHtWRVJTSU9OfS1ib3VuZGFyeWAsXG4gICAgICAgIGJvdW5kYXJ5OiB1c2VyQm91bmRhcnkgJiYgdXNlckJvdW5kYXJ5WzFdIHx8IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICAvLyBzdXBwb3J0IGZvciBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9mb3JtLWRhdGEgYXBpXG4gICAgfSBlbHNlIGlmICh1dGlscyQxLmlzRm9ybURhdGEoZGF0YSkgJiYgdXRpbHMkMS5pc0Z1bmN0aW9uKGRhdGEuZ2V0SGVhZGVycykpIHtcbiAgICAgIGhlYWRlcnMuc2V0KGRhdGEuZ2V0SGVhZGVycygpKTtcblxuICAgICAgaWYgKCFoZWFkZXJzLmhhc0NvbnRlbnRMZW5ndGgoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGtub3duTGVuZ3RoID0gYXdhaXQgdXRpbF9fZGVmYXVsdFtcImRlZmF1bHRcIl0ucHJvbWlzaWZ5KGRhdGEuZ2V0TGVuZ3RoKS5jYWxsKGRhdGEpO1xuICAgICAgICAgIE51bWJlci5pc0Zpbml0ZShrbm93bkxlbmd0aCkgJiYga25vd25MZW5ndGggPj0gMCAmJiBoZWFkZXJzLnNldENvbnRlbnRMZW5ndGgoa25vd25MZW5ndGgpO1xuICAgICAgICAgIC8qZXNsaW50IG5vLWVtcHR5OjAqL1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNCbG9iKGRhdGEpKSB7XG4gICAgICBkYXRhLnNpemUgJiYgaGVhZGVycy5zZXRDb250ZW50VHlwZShkYXRhLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpO1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50TGVuZ3RoKGRhdGEuc2l6ZSB8fCAwKTtcbiAgICAgIGRhdGEgPSBzdHJlYW1fX2RlZmF1bHRbXCJkZWZhdWx0XCJdLlJlYWRhYmxlLmZyb20ocmVhZEJsb2IkMShkYXRhKSk7XG4gICAgfSBlbHNlIGlmIChkYXRhICYmICF1dGlscyQxLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSA7IGVsc2UgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgICBkYXRhID0gQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoZGF0YSkpO1xuICAgICAgfSBlbHNlIGlmICh1dGlscyQxLmlzU3RyaW5nKGRhdGEpKSB7XG4gICAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCAndXRmLTgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgJ0RhdGEgYWZ0ZXIgdHJhbnNmb3JtYXRpb24gbXVzdCBiZSBhIHN0cmluZywgYW4gQXJyYXlCdWZmZXIsIGEgQnVmZmVyLCBvciBhIFN0cmVhbScsXG4gICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgICkpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgQ29udGVudC1MZW5ndGggaGVhZGVyIGlmIGRhdGEgZXhpc3RzXG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRMZW5ndGgoZGF0YS5sZW5ndGgsIGZhbHNlKTtcblxuICAgICAgaWYgKGNvbmZpZy5tYXhCb2R5TGVuZ3RoID4gLTEgJiYgZGF0YS5sZW5ndGggPiBjb25maWcubWF4Qm9keUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgICdSZXF1ZXN0IGJvZHkgbGFyZ2VyIHRoYW4gbWF4Qm9keUxlbmd0aCBsaW1pdCcsXG4gICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgICkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXkobWF4UmF0ZSkpIHtcbiAgICAgIG1heFVwbG9hZFJhdGUgPSBtYXhSYXRlWzBdO1xuICAgICAgbWF4RG93bmxvYWRSYXRlID0gbWF4UmF0ZVsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF4VXBsb2FkUmF0ZSA9IG1heERvd25sb2FkUmF0ZSA9IG1heFJhdGU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgKG9uVXBsb2FkUHJvZ3Jlc3MgfHwgbWF4VXBsb2FkUmF0ZSkpIHtcbiAgICAgIGlmICghdXRpbHMkMS5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICBkYXRhID0gc3RyZWFtX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5SZWFkYWJsZS5mcm9tKGRhdGEsIHtvYmplY3RNb2RlOiBmYWxzZX0pO1xuICAgICAgfVxuXG4gICAgICBkYXRhID0gc3RyZWFtX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5waXBlbGluZShbZGF0YSwgbmV3IEF4aW9zVHJhbnNmb3JtU3RyZWFtJDEoe1xuICAgICAgICBtYXhSYXRlOiB1dGlscyQxLnRvRmluaXRlTnVtYmVyKG1heFVwbG9hZFJhdGUpXG4gICAgICB9KV0sIHV0aWxzJDEubm9vcCk7XG5cbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgZGF0YS5vbigncHJvZ3Jlc3MnLCBmbHVzaE9uRmluaXNoKFxuICAgICAgICBkYXRhLFxuICAgICAgICBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25VcGxvYWRQcm9ncmVzcyksIGZhbHNlLCAzKVxuICAgICAgICApXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gICAgbGV0IGF1dGggPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcbiAgICAgIGF1dGggPSB1c2VybmFtZSArICc6JyArIHBhc3N3b3JkO1xuICAgIH1cblxuICAgIGlmICghYXV0aCAmJiBwYXJzZWQudXNlcm5hbWUpIHtcbiAgICAgIGNvbnN0IHVybFVzZXJuYW1lID0gcGFyc2VkLnVzZXJuYW1lO1xuICAgICAgY29uc3QgdXJsUGFzc3dvcmQgPSBwYXJzZWQucGFzc3dvcmQ7XG4gICAgICBhdXRoID0gdXJsVXNlcm5hbWUgKyAnOicgKyB1cmxQYXNzd29yZDtcbiAgICB9XG5cbiAgICBhdXRoICYmIGhlYWRlcnMuZGVsZXRlKCdhdXRob3JpemF0aW9uJyk7XG5cbiAgICBsZXQgcGF0aDtcblxuICAgIHRyeSB7XG4gICAgICBwYXRoID0gYnVpbGRVUkwoXG4gICAgICAgIHBhcnNlZC5wYXRobmFtZSArIHBhcnNlZC5zZWFyY2gsXG4gICAgICAgIGNvbmZpZy5wYXJhbXMsXG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyXG4gICAgICApLnJlcGxhY2UoL15cXD8vLCAnJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBjdXN0b21FcnIgPSBuZXcgRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgY3VzdG9tRXJyLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgIGN1c3RvbUVyci51cmwgPSBjb25maWcudXJsO1xuICAgICAgY3VzdG9tRXJyLmV4aXN0cyA9IHRydWU7XG4gICAgICByZXR1cm4gcmVqZWN0KGN1c3RvbUVycik7XG4gICAgfVxuXG4gICAgaGVhZGVycy5zZXQoXG4gICAgICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAgICdnemlwLCBjb21wcmVzcywgZGVmbGF0ZScgKyAoaXNCcm90bGlTdXBwb3J0ZWQgPyAnLCBicicgOiAnJyksIGZhbHNlXG4gICAgICApO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMudG9KU09OKCksXG4gICAgICBhZ2VudHM6IHsgaHR0cDogY29uZmlnLmh0dHBBZ2VudCwgaHR0cHM6IGNvbmZpZy5odHRwc0FnZW50IH0sXG4gICAgICBhdXRoLFxuICAgICAgcHJvdG9jb2wsXG4gICAgICBmYW1pbHksXG4gICAgICBiZWZvcmVSZWRpcmVjdDogZGlzcGF0Y2hCZWZvcmVSZWRpcmVjdCxcbiAgICAgIGJlZm9yZVJlZGlyZWN0czoge31cbiAgICB9O1xuXG4gICAgLy8gY2FjaGVhYmxlLWxvb2t1cCBpbnRlZ3JhdGlvbiBob3RmaXhcbiAgICAhdXRpbHMkMS5pc1VuZGVmaW5lZChsb29rdXApICYmIChvcHRpb25zLmxvb2t1cCA9IGxvb2t1cCk7XG5cbiAgICBpZiAoY29uZmlnLnNvY2tldFBhdGgpIHtcbiAgICAgIG9wdGlvbnMuc29ja2V0UGF0aCA9IGNvbmZpZy5zb2NrZXRQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLmhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lO1xuICAgICAgb3B0aW9ucy5wb3J0ID0gcGFyc2VkLnBvcnQ7XG4gICAgICBzZXRQcm94eShvcHRpb25zLCBjb25maWcucHJveHksIHByb3RvY29sICsgJy8vJyArIHBhcnNlZC5ob3N0bmFtZSArIChwYXJzZWQucG9ydCA/ICc6JyArIHBhcnNlZC5wb3J0IDogJycpICsgb3B0aW9ucy5wYXRoKTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNwb3J0O1xuICAgIGNvbnN0IGlzSHR0cHNSZXF1ZXN0ID0gaXNIdHRwcy50ZXN0KG9wdGlvbnMucHJvdG9jb2wpO1xuICAgIG9wdGlvbnMuYWdlbnQgPSBpc0h0dHBzUmVxdWVzdCA/IGNvbmZpZy5odHRwc0FnZW50IDogY29uZmlnLmh0dHBBZ2VudDtcbiAgICBpZiAoY29uZmlnLnRyYW5zcG9ydCkge1xuICAgICAgdHJhbnNwb3J0ID0gY29uZmlnLnRyYW5zcG9ydDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5tYXhSZWRpcmVjdHMgPT09IDApIHtcbiAgICAgIHRyYW5zcG9ydCA9IGlzSHR0cHNSZXF1ZXN0ID8gaHR0cHNfX2RlZmF1bHRbXCJkZWZhdWx0XCJdIDogaHR0cF9fZGVmYXVsdFtcImRlZmF1bHRcIl07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb25maWcubWF4UmVkaXJlY3RzKSB7XG4gICAgICAgIG9wdGlvbnMubWF4UmVkaXJlY3RzID0gY29uZmlnLm1heFJlZGlyZWN0cztcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuYmVmb3JlUmVkaXJlY3QpIHtcbiAgICAgICAgb3B0aW9ucy5iZWZvcmVSZWRpcmVjdHMuY29uZmlnID0gY29uZmlnLmJlZm9yZVJlZGlyZWN0O1xuICAgICAgfVxuICAgICAgdHJhbnNwb3J0ID0gaXNIdHRwc1JlcXVlc3QgPyBodHRwc0ZvbGxvdyA6IGh0dHBGb2xsb3c7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5tYXhCb2R5TGVuZ3RoID4gLTEpIHtcbiAgICAgIG9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IGNvbmZpZy5tYXhCb2R5TGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb2xsb3ctcmVkaXJlY3RzIGRvZXMgbm90IHNraXAgY29tcGFyaXNvbiwgc28gaXQgc2hvdWxkIGFsd2F5cyBzdWNjZWVkIGZvciBheGlvcyAtMSB1bmxpbWl0ZWRcbiAgICAgIG9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuaW5zZWN1cmVIVFRQUGFyc2VyKSB7XG4gICAgICBvcHRpb25zLmluc2VjdXJlSFRUUFBhcnNlciA9IGNvbmZpZy5pbnNlY3VyZUhUVFBQYXJzZXI7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0XG4gICAgcmVxID0gdHJhbnNwb3J0LnJlcXVlc3Qob3B0aW9ucywgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzKSB7XG4gICAgICBpZiAocmVxLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzdHJlYW1zID0gW3Jlc107XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlTGVuZ3RoID0gK3Jlcy5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xuXG4gICAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzIHx8IG1heERvd25sb2FkUmF0ZSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1TdHJlYW0gPSBuZXcgQXhpb3NUcmFuc2Zvcm1TdHJlYW0kMSh7XG4gICAgICAgICAgbWF4UmF0ZTogdXRpbHMkMS50b0Zpbml0ZU51bWJlcihtYXhEb3dubG9hZFJhdGUpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG9uRG93bmxvYWRQcm9ncmVzcyAmJiB0cmFuc2Zvcm1TdHJlYW0ub24oJ3Byb2dyZXNzJywgZmx1c2hPbkZpbmlzaChcbiAgICAgICAgICB0cmFuc2Zvcm1TdHJlYW0sXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICAgIHJlc3BvbnNlTGVuZ3RoLFxuICAgICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSwgMylcbiAgICAgICAgICApXG4gICAgICAgICkpO1xuXG4gICAgICAgIHN0cmVhbXMucHVzaCh0cmFuc2Zvcm1TdHJlYW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBkZWNvbXByZXNzIHRoZSByZXNwb25zZSBib2R5IHRyYW5zcGFyZW50bHkgaWYgcmVxdWlyZWRcbiAgICAgIGxldCByZXNwb25zZVN0cmVhbSA9IHJlcztcblxuICAgICAgLy8gcmV0dXJuIHRoZSBsYXN0IHJlcXVlc3QgaW4gY2FzZSBvZiByZWRpcmVjdHNcbiAgICAgIGNvbnN0IGxhc3RSZXF1ZXN0ID0gcmVzLnJlcSB8fCByZXE7XG5cbiAgICAgIC8vIGlmIGRlY29tcHJlc3MgZGlzYWJsZWQgd2Ugc2hvdWxkIG5vdCBkZWNvbXByZXNzXG4gICAgICBpZiAoY29uZmlnLmRlY29tcHJlc3MgIT09IGZhbHNlICYmIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10pIHtcbiAgICAgICAgLy8gaWYgbm8gY29udGVudCwgYnV0IGhlYWRlcnMgc3RpbGwgc2F5IHRoYXQgaXQgaXMgZW5jb2RlZCxcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBoZWFkZXIgbm90IGNvbmZ1c2UgZG93bnN0cmVhbSBvcGVyYXRpb25zXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdIRUFEJyB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMjA0KSB7XG4gICAgICAgICAgZGVsZXRlIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ107XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKChyZXMuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIC8qZXNsaW50IGRlZmF1bHQtY2FzZTowKi9cbiAgICAgICAgY2FzZSAnZ3ppcCc6XG4gICAgICAgIGNhc2UgJ3gtZ3ppcCc6XG4gICAgICAgIGNhc2UgJ2NvbXByZXNzJzpcbiAgICAgICAgY2FzZSAneC1jb21wcmVzcyc6XG4gICAgICAgICAgLy8gYWRkIHRoZSB1bnppcHBlciB0byB0aGUgYm9keSBzdHJlYW0gcHJvY2Vzc2luZyBwaXBlbGluZVxuICAgICAgICAgIHN0cmVhbXMucHVzaCh6bGliX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5jcmVhdGVVbnppcCh6bGliT3B0aW9ucykpO1xuXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjb250ZW50LWVuY29kaW5nIGluIG9yZGVyIHRvIG5vdCBjb25mdXNlIGRvd25zdHJlYW0gb3BlcmF0aW9uc1xuICAgICAgICAgIGRlbGV0ZSByZXMuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkZWZsYXRlJzpcbiAgICAgICAgICBzdHJlYW1zLnB1c2gobmV3IFpsaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW0kMSgpKTtcblxuICAgICAgICAgIC8vIGFkZCB0aGUgdW56aXBwZXIgdG8gdGhlIGJvZHkgc3RyZWFtIHByb2Nlc3NpbmcgcGlwZWxpbmVcbiAgICAgICAgICBzdHJlYW1zLnB1c2goemxpYl9fZGVmYXVsdFtcImRlZmF1bHRcIl0uY3JlYXRlVW56aXAoemxpYk9wdGlvbnMpKTtcblxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY29udGVudC1lbmNvZGluZyBpbiBvcmRlciB0byBub3QgY29uZnVzZSBkb3duc3RyZWFtIG9wZXJhdGlvbnNcbiAgICAgICAgICBkZWxldGUgcmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYnInOlxuICAgICAgICAgIGlmIChpc0Jyb3RsaVN1cHBvcnRlZCkge1xuICAgICAgICAgICAgc3RyZWFtcy5wdXNoKHpsaWJfX2RlZmF1bHRbXCJkZWZhdWx0XCJdLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoYnJvdGxpT3B0aW9ucykpO1xuICAgICAgICAgICAgZGVsZXRlIHJlcy5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlU3RyZWFtID0gc3RyZWFtcy5sZW5ndGggPiAxID8gc3RyZWFtX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5waXBlbGluZShzdHJlYW1zLCB1dGlscyQxLm5vb3ApIDogc3RyZWFtc1swXTtcblxuICAgICAgY29uc3Qgb2ZmTGlzdGVuZXJzID0gc3RyZWFtX19kZWZhdWx0W1wiZGVmYXVsdFwiXS5maW5pc2hlZChyZXNwb25zZVN0cmVhbSwgKCkgPT4ge1xuICAgICAgICBvZmZMaXN0ZW5lcnMoKTtcbiAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXMuc3RhdHVzTWVzc2FnZSxcbiAgICAgICAgaGVhZGVyczogbmV3IEF4aW9zSGVhZGVycyQxKHJlcy5oZWFkZXJzKSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0OiBsYXN0UmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScpIHtcbiAgICAgICAgcmVzcG9uc2UuZGF0YSA9IHJlc3BvbnNlU3RyZWFtO1xuICAgICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNwb25zZUJ1ZmZlciA9IFtdO1xuICAgICAgICBsZXQgdG90YWxSZXNwb25zZUJ5dGVzID0gMDtcblxuICAgICAgICByZXNwb25zZVN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIGhhbmRsZVN0cmVhbURhdGEoY2h1bmspIHtcbiAgICAgICAgICByZXNwb25zZUJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgICB0b3RhbFJlc3BvbnNlQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGxlbmd0aCBpcyBub3Qgb3ZlciB0aGUgbWF4Q29udGVudExlbmd0aCBpZiBzcGVjaWZpZWRcbiAgICAgICAgICBpZiAoY29uZmlnLm1heENvbnRlbnRMZW5ndGggPiAtMSAmJiB0b3RhbFJlc3BvbnNlQnl0ZXMgPiBjb25maWcubWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgLy8gc3RyZWFtLmRlc3Ryb3koKSBlbWl0IGFib3J0ZWQgZXZlbnQgYmVmb3JlIGNhbGxpbmcgcmVqZWN0KCkgb24gTm9kZS5qcyB2MTZcbiAgICAgICAgICAgIHJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3BvbnNlU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignbWF4Q29udGVudExlbmd0aCBzaXplIG9mICcgKyBjb25maWcubWF4Q29udGVudExlbmd0aCArICcgZXhjZWVkZWQnLFxuICAgICAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIGNvbmZpZywgbGFzdFJlcXVlc3QpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlU3RyZWFtLm9uKCdhYm9ydGVkJywgZnVuY3Rpb24gaGFuZGxlclN0cmVhbUFib3J0ZWQoKSB7XG4gICAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgICAgICAnbWF4Q29udGVudExlbmd0aCBzaXplIG9mICcgKyBjb25maWcubWF4Q29udGVudExlbmd0aCArICcgZXhjZWVkZWQnLFxuICAgICAgICAgICAgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgbGFzdFJlcXVlc3RcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlc3BvbnNlU3RyZWFtLmRlc3Ryb3koZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzcG9uc2VTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gaGFuZGxlU3RyZWFtRXJyb3IoZXJyKSB7XG4gICAgICAgICAgaWYgKHJlcS5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgICAgICByZWplY3QoQXhpb3NFcnJvci5mcm9tKGVyciwgbnVsbCwgY29uZmlnLCBsYXN0UmVxdWVzdCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZVN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gaGFuZGxlU3RyZWFtRW5kKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VCdWZmZXIubGVuZ3RoID09PSAxID8gcmVzcG9uc2VCdWZmZXJbMF0gOiBCdWZmZXIuY29uY2F0KHJlc3BvbnNlQnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgIT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEYXRhLnRvU3RyaW5nKHJlc3BvbnNlRW5jb2RpbmcpO1xuICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlRW5jb2RpbmcgfHwgcmVzcG9uc2VFbmNvZGluZyA9PT0gJ3V0ZjgnKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VEYXRhID0gdXRpbHMkMS5zdHJpcEJPTShyZXNwb25zZURhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNwb25zZS5kYXRhID0gcmVzcG9uc2VEYXRhO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChBeGlvc0Vycm9yLmZyb20oZXJyLCBudWxsLCBjb25maWcsIHJlc3BvbnNlLnJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGVtaXR0ZXIub25jZSgnYWJvcnQnLCBlcnIgPT4ge1xuICAgICAgICBpZiAoIXJlc3BvbnNlU3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgICAgIHJlc3BvbnNlU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICByZXNwb25zZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZW1pdHRlci5vbmNlKCdhYm9ydCcsIGVyciA9PiB7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICAgIHJlcS5kZXN0cm95KGVycik7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZXJyb3JzXG4gICAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3RFcnJvcihlcnIpIHtcbiAgICAgIC8vIEB0b2RvIHJlbW92ZVxuICAgICAgLy8gaWYgKHJlcS5hYm9ydGVkICYmIGVyci5jb2RlICE9PSBBeGlvc0Vycm9yLkVSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMpIHJldHVybjtcbiAgICAgIHJlamVjdChBeGlvc0Vycm9yLmZyb20oZXJyLCBudWxsLCBjb25maWcsIHJlcSkpO1xuICAgIH0pO1xuXG4gICAgLy8gc2V0IHRjcCBrZWVwIGFsaXZlIHRvIHByZXZlbnQgZHJvcCBjb25uZWN0aW9uIGJ5IHBlZXJcbiAgICByZXEub24oJ3NvY2tldCcsIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3RTb2NrZXQoc29ja2V0KSB7XG4gICAgICAvLyBkZWZhdWx0IGludGVydmFsIG9mIHNlbmRpbmcgYWNrIHBhY2tldCBpcyAxIG1pbnV0ZVxuICAgICAgc29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlLCAxMDAwICogNjApO1xuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHJlcXVlc3QgdGltZW91dFxuICAgIGlmIChjb25maWcudGltZW91dCkge1xuICAgICAgLy8gVGhpcyBpcyBmb3JjaW5nIGEgaW50IHRpbWVvdXQgdG8gYXZvaWQgcHJvYmxlbXMgaWYgdGhlIGByZXFgIGludGVyZmFjZSBkb2Vzbid0IGhhbmRsZSBvdGhlciB0eXBlcy5cbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBwYXJzZUludChjb25maWcudGltZW91dCwgMTApO1xuXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHRpbWVvdXQpKSB7XG4gICAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgICAnZXJyb3IgdHJ5aW5nIHRvIHBhcnNlIGBjb25maWcudGltZW91dGAgdG8gaW50JyxcbiAgICAgICAgICBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXFcbiAgICAgICAgKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTb21ldGltZSwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgdmVyeSBzbG93LCBhbmQgZG9lcyBub3QgcmVzcG9uZCwgdGhlIGNvbm5lY3QgZXZlbnQgd2lsbCBiZSBibG9jayBieSBldmVudCBsb29wIHN5c3RlbS5cbiAgICAgIC8vIEFuZCB0aW1lciBjYWxsYmFjayB3aWxsIGJlIGZpcmVkLCBhbmQgYWJvcnQoKSB3aWxsIGJlIGludm9rZWQgYmVmb3JlIGNvbm5lY3Rpb24sIHRoZW4gZ2V0IFwic29ja2V0IGhhbmcgdXBcIiBhbmQgY29kZSBFQ09OTlJFU0VULlxuICAgICAgLy8gQXQgdGhpcyB0aW1lLCBpZiB3ZSBoYXZlIGEgbGFyZ2UgbnVtYmVyIG9mIHJlcXVlc3QsIG5vZGVqcyB3aWxsIGhhbmcgdXAgc29tZSBzb2NrZXQgb24gYmFja2dyb3VuZC4gYW5kIHRoZSBudW1iZXIgd2lsbCB1cCBhbmQgdXAuXG4gICAgICAvLyBBbmQgdGhlbiB0aGVzZSBzb2NrZXQgd2hpY2ggYmUgaGFuZyB1cCB3aWxsIGRldm91cmluZyBDUFUgbGl0dGxlIGJ5IGxpdHRsZS5cbiAgICAgIC8vIENsaWVudFJlcXVlc3Quc2V0VGltZW91dCB3aWxsIGJlIGZpcmVkIG9uIHRoZSBzcGVjaWZ5IG1pbGxpc2Vjb25kcywgYW5kIGNhbiBtYWtlIHN1cmUgdGhhdCBhYm9ydCgpIHdpbGwgYmUgZmlyZWQgYWZ0ZXIgY29ubmVjdC5cbiAgICAgIHJlcS5zZXRUaW1lb3V0KHRpbWVvdXQsIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3RUaW1lb3V0KCkge1xuICAgICAgICBpZiAoaXNEb25lKSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnIDogJ3RpbWVvdXQgZXhjZWVkZWQnO1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBjb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgICBpZiAoY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UsXG4gICAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXFcbiAgICAgICAgKSk7XG4gICAgICAgIGFib3J0KCk7XG4gICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICBpZiAodXRpbHMkMS5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgbGV0IGVuZGVkID0gZmFsc2U7XG4gICAgICBsZXQgZXJyb3JlZCA9IGZhbHNlO1xuXG4gICAgICBkYXRhLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGVuZGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBkYXRhLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgZXJyb3JlZCA9IHRydWU7XG4gICAgICAgIHJlcS5kZXN0cm95KGVycik7XG4gICAgICB9KTtcblxuICAgICAgZGF0YS5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGlmICghZW5kZWQgJiYgIWVycm9yZWQpIHtcbiAgICAgICAgICBhYm9ydChuZXcgQ2FuY2VsZWRFcnJvcignUmVxdWVzdCBzdHJlYW0gaGFzIGJlZW4gYWJvcnRlZCcsIGNvbmZpZywgcmVxKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBkYXRhLnBpcGUocmVxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxLmVuZChkYXRhKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgaXNVUkxTYW1lT3JpZ2luID0gcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4vLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICBjb25zdCBtc2llID0gcGxhdGZvcm0ubmF2aWdhdG9yICYmIC8obXNpZXx0cmlkZW50KS9pLnRlc3QocGxhdGZvcm0ubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgY29uc3QgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGV0IG9yaWdpblVSTDtcblxuICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXRzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIGxldCBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSAodXRpbHMkMS5pc1N0cmluZyhyZXF1ZXN0VVJMKSkgPyByZXNvbHZlVVJMKHJlcXVlc3RVUkwpIDogcmVxdWVzdFVSTDtcbiAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcbiAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH0pKCk7XG5cbmNvbnN0IGNvb2tpZXMgPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscyQxLmlzTnVtYmVyKGV4cGlyZXMpICYmIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcblxuICAgICAgdXRpbHMkMS5pc1N0cmluZyhwYXRoKSAmJiBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cbiAgICAgIHV0aWxzJDEuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzJDEgPyB7IC4uLnRoaW5nIH0gOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIsIGNhc2VsZXNzKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIpID0+IG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYiksIHRydWUpXG4gIH07XG5cbiAgdXRpbHMkMS5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMkMS5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuY29uc3QgcmVzb2x2ZUNvbmZpZyA9IChjb25maWcpID0+IHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgbGV0IHtkYXRhLCB3aXRoWFNSRlRva2VuLCB4c3JmSGVhZGVyTmFtZSwgeHNyZkNvb2tpZU5hbWUsIGhlYWRlcnMsIGF1dGh9ID0gbmV3Q29uZmlnO1xuXG4gIG5ld0NvbmZpZy5oZWFkZXJzID0gaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKGJ1aWxkRnVsbFBhdGgobmV3Q29uZmlnLmJhc2VVUkwsIG5ld0NvbmZpZy51cmwpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscyQxLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZykpO1xuXG4gICAgaWYgKHdpdGhYU1JGVG9rZW4gfHwgKHdpdGhYU1JGVG9rZW4gIT09IGZhbHNlICYmIGlzVVJMU2FtZU9yaWdpbihuZXdDb25maWcudXJsKSkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufTtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxuY29uc3QgeGhyQWRhcHRlciA9IGlzWEhSQWRhcHRlclN1cHBvcnRlZCAmJiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBkaXNwYXRjaFhoclJlcXVlc3QocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcbiAgICBsZXQgcmVxdWVzdERhdGEgPSBfY29uZmlnLmRhdGE7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKF9jb25maWcuaGVhZGVycykubm9ybWFsaXplKCk7XG4gICAgbGV0IHtyZXNwb25zZVR5cGUsIG9uVXBsb2FkUHJvZ3Jlc3MsIG9uRG93bmxvYWRQcm9ncmVzc30gPSBfY29uZmlnO1xuICAgIGxldCBvbkNhbmNlbGVkO1xuICAgIGxldCB1cGxvYWRUaHJvdHRsZWQsIGRvd25sb2FkVGhyb3R0bGVkO1xuICAgIGxldCBmbHVzaFVwbG9hZCwgZmx1c2hEb3dubG9hZDtcblxuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBmbHVzaFVwbG9hZCAmJiBmbHVzaFVwbG9hZCgpOyAvLyBmbHVzaCBldmVudHNcbiAgICAgIGZsdXNoRG93bmxvYWQgJiYgZmx1c2hEb3dubG9hZCgpOyAvLyBmbHVzaCBldmVudHNcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuXG4gICAgICBfY29uZmlnLnNpZ25hbCAmJiBfY29uZmlnLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICByZXF1ZXN0Lm9wZW4oX2NvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgX2NvbmZpZy51cmwsIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBfY29uZmlnLnRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oXG4gICAgICAgICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgJiYgcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9ICFyZXNwb25zZVR5cGUgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgcmVzcG9uc2VUeXBlID09PSAnanNvbicgP1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGV4dCA6IHJlcXVlc3QucmVzcG9uc2U7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9O1xuXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCByZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XG4gICAgICAvLyBVc2Ugb25sb2FkZW5kIGlmIGF2YWlsYWJsZVxuICAgICAgcmVxdWVzdC5vbmxvYWRlbmQgPSBvbmxvYWRlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGUgdG8gZW11bGF0ZSBvbmxvYWRlbmRcbiAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xuICAgICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWFkeXN0YXRlIGhhbmRsZXIgaXMgY2FsbGluZyBiZWZvcmUgb25lcnJvciBvciBvbnRpbWVvdXQgaGFuZGxlcnMsXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcbiAgICAgICAgc2V0VGltZW91dChvbmxvYWRlbmQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYnJvd3NlciByZXF1ZXN0IGNhbmNlbGxhdGlvbiAoYXMgb3Bwb3NlZCB0byBhIG1hbnVhbCBjYW5jZWxsYXRpb24pXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcsIEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBsb3cgbGV2ZWwgbmV0d29yayBlcnJvcnNcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcbiAgICAgIC8vIFJlYWwgZXJyb3JzIGFyZSBoaWRkZW4gZnJvbSB1cyBieSB0aGUgYnJvd3NlclxuICAgICAgLy8gb25lcnJvciBzaG91bGQgb25seSBmaXJlIGlmIGl0J3MgYSBuZXR3b3JrIGVycm9yXG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XG4gICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge1xuICAgICAgbGV0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgX2NvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJyA6ICd0aW1lb3V0IGV4Y2VlZGVkJztcbiAgICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IF9jb25maWcudHJhbnNpdGlvbmFsIHx8IHRyYW5zaXRpb25hbERlZmF1bHRzO1xuICAgICAgaWYgKF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/IEF4aW9zRXJyb3IuRVRJTUVET1VUIDogQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgIHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQgJiYgcmVxdWVzdEhlYWRlcnMuc2V0Q29udGVudFR5cGUobnVsbCk7XG5cbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xuICAgICAgdXRpbHMkMS5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLnRvSlNPTigpLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKF9jb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIV9jb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAocmVzcG9uc2VUeXBlICYmIHJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IF9jb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAoW2Rvd25sb2FkVGhyb3R0bGVkLCBmbHVzaERvd25sb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSkpO1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGRvd25sb2FkVGhyb3R0bGVkKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmIChvblVwbG9hZFByb2dyZXNzICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAoW3VwbG9hZFRocm90dGxlZCwgZmx1c2hVcGxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25VcGxvYWRQcm9ncmVzcykpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHVwbG9hZFRocm90dGxlZCk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbHVzaFVwbG9hZCk7XG4gICAgfVxuXG4gICAgaWYgKF9jb25maWcuY2FuY2VsVG9rZW4gfHwgX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBvbkNhbmNlbGVkID0gY2FuY2VsID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCghY2FuY2VsIHx8IGNhbmNlbC50eXBlID8gbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnLCByZXF1ZXN0KSA6IGNhbmNlbCk7XG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgaWYgKF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAgIF9jb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBfY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChfY29uZmlnLnVybCk7XG5cbiAgICBpZiAocHJvdG9jb2wgJiYgcGxhdGZvcm0ucHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gIH0pO1xufTtcblxuY29uc3QgY29tcG9zZVNpZ25hbHMgPSAoc2lnbmFscywgdGltZW91dCkgPT4ge1xuICBsZXQgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgYWJvcnRlZDtcblxuICBjb25zdCBvbmFib3J0ID0gZnVuY3Rpb24gKGNhbmNlbCkge1xuICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgY29uc3QgZXJyID0gY2FuY2VsIGluc3RhbmNlb2YgRXJyb3IgPyBjYW5jZWwgOiB0aGlzLnJlYXNvbjtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyIGluc3RhbmNlb2YgQXhpb3NFcnJvciA/IGVyciA6IG5ldyBDYW5jZWxlZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIpKTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IHRpbWVyID0gdGltZW91dCAmJiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBvbmFib3J0KG5ldyBBeGlvc0Vycm9yKGB0aW1lb3V0ICR7dGltZW91dH0gb2YgbXMgZXhjZWVkZWRgLCBBeGlvc0Vycm9yLkVUSU1FRE9VVCkpO1xuICB9LCB0aW1lb3V0KTtcblxuICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICBpZiAoc2lnbmFscykge1xuICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaChzaWduYWwgPT4ge1xuICAgICAgICBzaWduYWwgJiZcbiAgICAgICAgKHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyID8gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkgOiBzaWduYWwudW5zdWJzY3JpYmUob25hYm9ydCkpO1xuICAgICAgfSk7XG4gICAgICBzaWduYWxzID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgc2lnbmFscy5mb3JFYWNoKChzaWduYWwpID0+IHNpZ25hbCAmJiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KSk7XG5cbiAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gIHNpZ25hbC51bnN1YnNjcmliZSA9IHVuc3Vic2NyaWJlO1xuXG4gIHJldHVybiBbc2lnbmFsLCAoKSA9PiB7XG4gICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB0aW1lciA9IG51bGw7XG4gIH1dO1xufTtcblxuY29uc3QgY29tcG9zZVNpZ25hbHMkMSA9IGNvbXBvc2VTaWduYWxzO1xuXG5jb25zdCBzdHJlYW1DaHVuayA9IGZ1bmN0aW9uKiAoY2h1bmssIGNodW5rU2l6ZSkge1xuICBsZXQgbGVuID0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICBpZiAoIWNodW5rU2l6ZSB8fCBsZW4gPCBjaHVua1NpemUpIHtcbiAgICB5aWVsZCBjaHVuaztcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcG9zID0gMDtcbiAgbGV0IGVuZDtcblxuICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgZW5kID0gcG9zICsgY2h1bmtTaXplO1xuICAgIHlpZWxkIGNodW5rLnNsaWNlKHBvcywgZW5kKTtcbiAgICBwb3MgPSBlbmQ7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRCeXRlcyA9IGFzeW5jIGZ1bmN0aW9uKiAoaXRlcmFibGUsIGNodW5rU2l6ZSwgZW5jb2RlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSA/IGNodW5rIDogKGF3YWl0IGVuY29kZShTdHJpbmcoY2h1bmspKSksIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHRyYWNrU3RyZWFtID0gKHN0cmVhbSwgY2h1bmtTaXplLCBvblByb2dyZXNzLCBvbkZpbmlzaCwgZW5jb2RlKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gcmVhZEJ5dGVzKHN0cmVhbSwgY2h1bmtTaXplLCBlbmNvZGUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufTtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbmNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiYgdGVzdCgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICB0ZXN0KCgpID0+IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzJDEuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSk7XG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscyQxLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICByZXR1cm4gKGF3YWl0IG5ldyBSZXF1ZXN0KGJvZHkpLmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscyQxLmlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpIHx8IHV0aWxzJDEuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgIHJldHVybiBib2R5LmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKGJvZHkpKSB7XG4gICAgYm9keSA9IGJvZHkgKyAnJztcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNTdHJpbmcoYm9keSkpIHtcbiAgICByZXR1cm4gKGF3YWl0IGVuY29kZVRleHQoYm9keSkpLmJ5dGVMZW5ndGg7XG4gIH1cbn07XG5cbmNvbnN0IHJlc29sdmVCb2R5TGVuZ3RoID0gYXN5bmMgKGhlYWRlcnMsIGJvZHkpID0+IHtcbiAgY29uc3QgbGVuZ3RoID0gdXRpbHMkMS50b0Zpbml0ZU51bWJlcihoZWFkZXJzLmdldENvbnRlbnRMZW5ndGgoKSk7XG5cbiAgcmV0dXJuIGxlbmd0aCA9PSBudWxsID8gZ2V0Qm9keUxlbmd0aChib2R5KSA6IGxlbmd0aDtcbn07XG5cbmNvbnN0IGZldGNoQWRhcHRlciA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IFtjb21wb3NlZFNpZ25hbCwgc3RvcFRpbWVvdXRdID0gKHNpZ25hbCB8fCBjYW5jZWxUb2tlbiB8fCB0aW1lb3V0KSA/XG4gICAgY29tcG9zZVNpZ25hbHMkMShbc2lnbmFsLCBjYW5jZWxUb2tlbl0sIHRpbWVvdXQpIDogW107XG5cbiAgbGV0IGZpbmlzaGVkLCByZXF1ZXN0O1xuXG4gIGNvbnN0IG9uRmluaXNoID0gKCkgPT4ge1xuICAgICFmaW5pc2hlZCAmJiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG5cbiAgICBmaW5pc2hlZCA9IHRydWU7XG4gIH07XG5cbiAgbGV0IHJlcXVlc3RDb250ZW50TGVuZ3RoO1xuXG4gIHRyeSB7XG4gICAgaWYgKFxuICAgICAgb25VcGxvYWRQcm9ncmVzcyAmJiBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gJiYgbWV0aG9kICE9PSAnZ2V0JyAmJiBtZXRob2QgIT09ICdoZWFkJyAmJlxuICAgICAgKHJlcXVlc3RDb250ZW50TGVuZ3RoID0gYXdhaXQgcmVzb2x2ZUJvZHlMZW5ndGgoaGVhZGVycywgZGF0YSkpICE9PSAwXG4gICAgKSB7XG4gICAgICBsZXQgX3JlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGRhdGEsXG4gICAgICAgIGR1cGxleDogXCJoYWxmXCJcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgY29udGVudFR5cGVIZWFkZXI7XG5cbiAgICAgIGlmICh1dGlscyQxLmlzRm9ybURhdGEoZGF0YSkgJiYgKGNvbnRlbnRUeXBlSGVhZGVyID0gX3JlcXVlc3QuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSkge1xuICAgICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSGVhZGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9yZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25VcGxvYWRQcm9ncmVzcykpXG4gICAgICAgICk7XG5cbiAgICAgICAgZGF0YSA9IHRyYWNrU3RyZWFtKF9yZXF1ZXN0LmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25Qcm9ncmVzcywgZmx1c2gsIGVuY29kZVRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXRpbHMkMS5pc1N0cmluZyh3aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICB3aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnb21pdCc7XG4gICAgfVxuXG4gICAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIHRocm93cyB3aGVuIGNyZWRlbnRpYWxzIGFyZSBkZWZpbmVkXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG91ZGZsYXJlL3dvcmtlcmQvaXNzdWVzLzkwMlxuICAgIGNvbnN0IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPSBcImNyZWRlbnRpYWxzXCIgaW4gUmVxdWVzdC5wcm90b3R5cGU7IFxuICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgIC4uLmZldGNoT3B0aW9ucyxcbiAgICAgIHNpZ25hbDogY29tcG9zZWRTaWduYWwsXG4gICAgICBtZXRob2Q6IG1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgaGVhZGVyczogaGVhZGVycy5ub3JtYWxpemUoKS50b0pTT04oKSxcbiAgICAgIGJvZHk6IGRhdGEsXG4gICAgICBkdXBsZXg6IFwiaGFsZlwiLFxuICAgICAgY3JlZGVudGlhbHM6IGlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQgPyB3aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuXG4gICAgY29uc3QgaXNTdHJlYW1SZXNwb25zZSA9IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKHJlc3BvbnNlVHlwZSA9PT0gJ3N0cmVhbScgfHwgcmVzcG9uc2VUeXBlID09PSAncmVzcG9uc2UnKTtcblxuICAgIGlmIChzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChvbkRvd25sb2FkUHJvZ3Jlc3MgfHwgaXNTdHJlYW1SZXNwb25zZSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgIHJlc3BvbnNlQ29udGVudExlbmd0aCxcbiAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSlcbiAgICAgICkgfHwgW107XG5cbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICB0cmFja1N0cmVhbShyZXNwb25zZS5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgIGlzU3RyZWFtUmVzcG9uc2UgJiYgb25GaW5pc2goKTtcbiAgICAgICAgfSwgZW5jb2RlVGV4dCksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlIHx8ICd0ZXh0JztcblxuICAgIGxldCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNvbHZlcnNbdXRpbHMkMS5maW5kS2V5KHJlc29sdmVycywgcmVzcG9uc2VUeXBlKSB8fCAndGV4dCddKHJlc3BvbnNlLCBjb25maWcpO1xuXG4gICAgIWlzU3RyZWFtUmVzcG9uc2UgJiYgb25GaW5pc2goKTtcblxuICAgIHN0b3BUaW1lb3V0ICYmIHN0b3BUaW1lb3V0KCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pO1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG9uRmluaXNoKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn07XG5cbnV0aWxzJDEuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzJDEuaXNGdW5jdGlvbihhZGFwdGVyKSB8fCBhZGFwdGVyID09PSBudWxsIHx8IGFkYXB0ZXIgPT09IGZhbHNlO1xuXG5jb25zdCBhZGFwdGVycyA9IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzKSA9PiB7XG4gICAgYWRhcHRlcnMgPSB1dGlscyQxLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59O1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaWduYWwgJiYgY29uZmlnLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzJDEuYWRhcHRlcik7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICByZXNwb25zZVxuICAgICk7XG5cbiAgICByZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShyZXNwb25zZS5oZWFkZXJzKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSxcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2VcbiAgICAgICAgKTtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG5cbmNvbnN0IHZhbGlkYXRvcnMkMSA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9ycyQxW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxuY29uc3QgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMkMS50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiAodmFsdWUsIG9wdCwgb3B0cykgPT4ge1xuICAgIGlmICh2YWxpZGF0b3IgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShvcHQsICcgaGFzIGJlZW4gcmVtb3ZlZCcgKyAodmVyc2lvbiA/ICcgaW4gJyArIHZlcnNpb24gOiAnJykpLFxuICAgICAgICBBeGlvc0Vycm9yLkVSUl9ERVBSRUNBVEVEXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYVxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBjb25zdCBvcHQgPSBrZXlzW2ldO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHNjaGVtYVtvcHRdO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTik7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHZhbGlkYXRvciA9IHtcbiAgYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yczogdmFsaWRhdG9ycyQxXG59O1xuXG5jb25zdCB2YWxpZGF0b3JzID0gdmFsaWRhdG9yLnZhbGlkYXRvcnM7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmNsYXNzIEF4aW9zIHtcbiAgY29uc3RydWN0b3IoaW5zdGFuY2VDb25maWcpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyJDEoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyJDEoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15O1xuXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZHVtbXkgPSB7fSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgKz0gJ1xcbicgKyBzdGFjaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNhc2Ugd2hlcmUgXCJzdGFja1wiIGlzIGFuIHVuLXdyaXRhYmxlIHByb3BlcnR5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcubWV0aG9kXG4gICAgY29uZmlnLm1ldGhvZCA9IChjb25maWcubWV0aG9kIHx8IHRoaXMuZGVmYXVsdHMubWV0aG9kIHx8ICdnZXQnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gICAgbGV0IGNvbnRleHRIZWFkZXJzID0gaGVhZGVycyAmJiB1dGlscyQxLm1lcmdlKFxuICAgICAgaGVhZGVycy5jb21tb24sXG4gICAgICBoZWFkZXJzW2NvbmZpZy5tZXRob2RdXG4gICAgKTtcblxuICAgIGhlYWRlcnMgJiYgdXRpbHMkMS5mb3JFYWNoKFxuICAgICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgICAobWV0aG9kKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW21ldGhvZF07XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuY29uY2F0KGNvbnRleHRIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGZpbHRlciBvdXQgc2tpcHBlZCBpbnRlcmNlcHRvcnNcbiAgICBjb25zdCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIGxldCBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiB1bnNoaWZ0UmVxdWVzdEludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgaWYgKHR5cGVvZiBpbnRlcmNlcHRvci5ydW5XaGVuID09PSAnZnVuY3Rpb24nICYmIGludGVyY2VwdG9yLnJ1bldoZW4oY29uZmlnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgPSBzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3Iuc3luY2hyb25vdXM7XG5cbiAgICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcHJvbWlzZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbjtcblxuICAgIGlmICghc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QuYmluZCh0aGlzKSwgdW5kZWZpbmVkXTtcbiAgICAgIGNoYWluLnVuc2hpZnQuYXBwbHkoY2hhaW4sIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGNoYWluLnB1c2guYXBwbHkoY2hhaW4sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBsZW4gPSBjaGFpbi5sZW5ndGg7XG5cbiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbltpKytdLCBjaGFpbltpKytdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgbGVuID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgbGV0IG5ld0NvbmZpZyA9IGNvbmZpZztcblxuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIGNvbnN0IG9uRnVsZmlsbGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIGNvbnN0IG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uUmVqZWN0ZWQuY2FsbCh0aGlzLCBlcnJvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0LmNhbGwodGhpcywgbmV3Q29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG5cbiAgICBpID0gMDtcbiAgICBsZW4gPSByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4ocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10sIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGdldFVyaShjb25maWcpIHtcbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYnVpbGRGdWxsUGF0aChjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscyQxLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMkMS5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlSFRUUE1ldGhvZChpc0Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaHR0cE1ldGhvZCh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBpc0Zvcm0gPyB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xuICAgICAgICB9IDoge30sXG4gICAgICAgIHVybCxcbiAgICAgICAgZGF0YVxuICAgICAgfSkpO1xuICAgIH07XG4gIH1cblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCgpO1xuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2QgKyAnRm9ybSddID0gZ2VuZXJhdGVIVFRQTWV0aG9kKHRydWUpO1xufSk7XG5cbmNvbnN0IEF4aW9zJDEgPSBBeGlvcztcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oY2FuY2VsID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSBvbmZ1bGZpbGxlZCA9PiB7XG4gICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBDYW5jZWxUb2tlbiQxID0gQ2FuY2VsVG9rZW47XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMkMS5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuXG5jb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuY29uc3QgSHR0cFN0YXR1c0NvZGUkMSA9IEh0dHBTdGF0dXNDb2RlO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybnMge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgQXhpb3MkMShkZWZhdWx0Q29uZmlnKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBiaW5kKEF4aW9zJDEucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzJDEuZXh0ZW5kKGluc3RhbmNlLCBBeGlvcyQxLnByb3RvdHlwZSwgY29udGV4dCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMkMS5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyQxKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zJDE7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IENhbmNlbGVkRXJyb3I7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuJDE7XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzJDE7XG5cbmF4aW9zLmZvcm1Ub0pTT04gPSB0aGluZyA9PiBmb3JtRGF0YVRvSlNPTih1dGlscyQxLmlzSFRNTEZvcm0odGhpbmcpID8gbmV3IEZvcm1EYXRhKHRoaW5nKSA6IHRoaW5nKTtcblxuYXhpb3MuZ2V0QWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXI7XG5cbmF4aW9zLkh0dHBTdGF0dXNDb2RlID0gSHR0cFN0YXR1c0NvZGUkMTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXhpb3MuY2pzLm1hcFxuIl0sIm5hbWVzIjpbIkZvcm1EYXRhJDEiLCJyZXF1aXJlIiwidXJsIiwicHJveHlGcm9tRW52IiwiaHR0cCIsImh0dHBzIiwidXRpbCIsImZvbGxvd1JlZGlyZWN0cyIsInpsaWIiLCJzdHJlYW0iLCJldmVudHMiLCJfaW50ZXJvcERlZmF1bHRMZWdhY3kiLCJlIiwiRm9ybURhdGFfX2RlZmF1bHQiLCJ1cmxfX2RlZmF1bHQiLCJodHRwX19kZWZhdWx0IiwiaHR0cHNfX2RlZmF1bHQiLCJ1dGlsX19kZWZhdWx0IiwiZm9sbG93UmVkaXJlY3RzX19kZWZhdWx0IiwiemxpYl9fZGVmYXVsdCIsInN0cmVhbV9fZGVmYXVsdCIsImJpbmQiLCJmbiIsInRoaXNBcmciLCJ3cmFwIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJ0b1N0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwia2luZE9mIiwiY2FjaGUiLCJ0aGluZyIsInN0ciIsImNhbGwiLCJzbGljZSIsInRvTG93ZXJDYXNlIiwiY3JlYXRlIiwia2luZE9mVGVzdCIsInR5cGUiLCJ0eXBlT2ZUZXN0IiwiaXNBcnJheSIsIkFycmF5IiwiaXNVbmRlZmluZWQiLCJpc0J1ZmZlciIsInZhbCIsImNvbnN0cnVjdG9yIiwiaXNGdW5jdGlvbiIsImlzQXJyYXlCdWZmZXIiLCJpc0FycmF5QnVmZmVyVmlldyIsInJlc3VsdCIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiYnVmZmVyIiwiaXNTdHJpbmciLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNCb29sZWFuIiwiaXNQbGFpbk9iamVjdCIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc0RhdGUiLCJpc0ZpbGUiLCJpc0Jsb2IiLCJpc0ZpbGVMaXN0IiwiaXNTdHJlYW0iLCJwaXBlIiwiaXNGb3JtRGF0YSIsImtpbmQiLCJGb3JtRGF0YSIsImFwcGVuZCIsImlzVVJMU2VhcmNoUGFyYW1zIiwiaXNSZWFkYWJsZVN0cmVhbSIsImlzUmVxdWVzdCIsImlzUmVzcG9uc2UiLCJpc0hlYWRlcnMiLCJtYXAiLCJ0cmltIiwicmVwbGFjZSIsImZvckVhY2giLCJvYmoiLCJhbGxPd25LZXlzIiwiaSIsImwiLCJsZW5ndGgiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImxlbiIsImtleSIsImZpbmRLZXkiLCJfa2V5IiwiX2dsb2JhbCIsImdsb2JhbFRoaXMiLCJzZWxmIiwid2luZG93IiwiZ2xvYmFsIiwiaXNDb250ZXh0RGVmaW5lZCIsImNvbnRleHQiLCJtZXJnZSIsImNhc2VsZXNzIiwiYXNzaWduVmFsdWUiLCJ0YXJnZXRLZXkiLCJleHRlbmQiLCJhIiwiYiIsInN0cmlwQk9NIiwiY29udGVudCIsImNoYXJDb2RlQXQiLCJpbmhlcml0cyIsInN1cGVyQ29uc3RydWN0b3IiLCJwcm9wcyIsImRlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImFzc2lnbiIsInRvRmxhdE9iamVjdCIsInNvdXJjZU9iaiIsImRlc3RPYmoiLCJmaWx0ZXIiLCJwcm9wRmlsdGVyIiwicHJvcCIsIm1lcmdlZCIsImVuZHNXaXRoIiwic2VhcmNoU3RyaW5nIiwicG9zaXRpb24iLCJTdHJpbmciLCJ1bmRlZmluZWQiLCJsYXN0SW5kZXgiLCJpbmRleE9mIiwidG9BcnJheSIsImFyciIsImlzVHlwZWRBcnJheSIsIlR5cGVkQXJyYXkiLCJVaW50OEFycmF5IiwiZm9yRWFjaEVudHJ5IiwiZ2VuZXJhdG9yIiwibmV4dCIsImRvbmUiLCJwYWlyIiwibWF0Y2hBbGwiLCJyZWdFeHAiLCJtYXRjaGVzIiwiZXhlYyIsInB1c2giLCJpc0hUTUxGb3JtIiwidG9DYW1lbENhc2UiLCJyZXBsYWNlciIsIm0iLCJwMSIsInAyIiwidG9VcHBlckNhc2UiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUmVnRXhwIiwicmVkdWNlRGVzY3JpcHRvcnMiLCJyZWR1Y2VyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsInJlZHVjZWREZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJuYW1lIiwicmV0IiwiZGVmaW5lUHJvcGVydGllcyIsImZyZWV6ZU1ldGhvZHMiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJzZXQiLCJFcnJvciIsInRvT2JqZWN0U2V0IiwiYXJyYXlPclN0cmluZyIsImRlbGltaXRlciIsImRlZmluZSIsInNwbGl0Iiwibm9vcCIsInRvRmluaXRlTnVtYmVyIiwiZGVmYXVsdFZhbHVlIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJBTFBIQSIsIkRJR0lUIiwiQUxQSEFCRVQiLCJBTFBIQV9ESUdJVCIsImdlbmVyYXRlU3RyaW5nIiwic2l6ZSIsImFscGhhYmV0IiwiTWF0aCIsInJhbmRvbSIsImlzU3BlY0NvbXBsaWFudEZvcm0iLCJ0b0pTT05PYmplY3QiLCJzdGFjayIsInZpc2l0Iiwic291cmNlIiwidGFyZ2V0IiwicmVkdWNlZFZhbHVlIiwiaXNBc3luY0ZuIiwiaXNUaGVuYWJsZSIsInRoZW4iLCJjYXRjaCIsIl9zZXRJbW1lZGlhdGUiLCJzZXRJbW1lZGlhdGVTdXBwb3J0ZWQiLCJwb3N0TWVzc2FnZVN1cHBvcnRlZCIsInNldEltbWVkaWF0ZSIsInRva2VuIiwiY2FsbGJhY2tzIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJzaGlmdCIsImNiIiwicG9zdE1lc3NhZ2UiLCJzZXRUaW1lb3V0IiwiYXNhcCIsInF1ZXVlTWljcm90YXNrIiwicHJvY2VzcyIsIm5leHRUaWNrIiwidXRpbHMkMSIsImhhc093blByb3AiLCJBeGlvc0Vycm9yIiwibWVzc2FnZSIsImNvZGUiLCJjb25maWciLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJjYXB0dXJlU3RhY2tUcmFjZSIsInN0YXR1cyIsInRvSlNPTiIsImRlc2NyaXB0aW9uIiwibnVtYmVyIiwiZmlsZU5hbWUiLCJsaW5lTnVtYmVyIiwiY29sdW1uTnVtYmVyIiwicHJvdG90eXBlJDEiLCJmcm9tIiwiZXJyb3IiLCJjdXN0b21Qcm9wcyIsImF4aW9zRXJyb3IiLCJjYXVzZSIsImlzVmlzaXRhYmxlIiwicmVtb3ZlQnJhY2tldHMiLCJyZW5kZXJLZXkiLCJwYXRoIiwiZG90cyIsImNvbmNhdCIsImVhY2giLCJqb2luIiwiaXNGbGF0QXJyYXkiLCJzb21lIiwicHJlZGljYXRlcyIsInRlc3QiLCJ0b0Zvcm1EYXRhIiwiZm9ybURhdGEiLCJvcHRpb25zIiwiVHlwZUVycm9yIiwibWV0YVRva2VucyIsImluZGV4ZXMiLCJkZWZpbmVkIiwib3B0aW9uIiwidmlzaXRvciIsImRlZmF1bHRWaXNpdG9yIiwiX0Jsb2IiLCJCbG9iIiwidXNlQmxvYiIsImNvbnZlcnRWYWx1ZSIsInRvSVNPU3RyaW5nIiwiQnVmZmVyIiwiSlNPTiIsInN0cmluZ2lmeSIsImVsIiwiaW5kZXgiLCJleHBvc2VkSGVscGVycyIsImJ1aWxkIiwicG9wIiwiZW5jb2RlJDEiLCJjaGFyTWFwIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibWF0Y2giLCJBeGlvc1VSTFNlYXJjaFBhcmFtcyIsInBhcmFtcyIsIl9wYWlycyIsImVuY29kZXIiLCJfZW5jb2RlIiwiZW5jb2RlIiwiYnVpbGRVUkwiLCJzZXJpYWxpemVGbiIsInNlcmlhbGl6ZSIsInNlcmlhbGl6ZWRQYXJhbXMiLCJoYXNobWFya0luZGV4IiwiSW50ZXJjZXB0b3JNYW5hZ2VyIiwiaGFuZGxlcnMiLCJ1c2UiLCJmdWxmaWxsZWQiLCJyZWplY3RlZCIsInN5bmNocm9ub3VzIiwicnVuV2hlbiIsImVqZWN0IiwiaWQiLCJjbGVhciIsImZvckVhY2hIYW5kbGVyIiwiaCIsIkludGVyY2VwdG9yTWFuYWdlciQxIiwidHJhbnNpdGlvbmFsRGVmYXVsdHMiLCJzaWxlbnRKU09OUGFyc2luZyIsImZvcmNlZEpTT05QYXJzaW5nIiwiY2xhcmlmeVRpbWVvdXRFcnJvciIsIlVSTFNlYXJjaFBhcmFtcyIsInBsYXRmb3JtJDEiLCJpc05vZGUiLCJjbGFzc2VzIiwicHJvdG9jb2xzIiwiaGFzQnJvd3NlckVudiIsImRvY3VtZW50IiwiX25hdmlnYXRvciIsIm5hdmlnYXRvciIsImhhc1N0YW5kYXJkQnJvd3NlckVudiIsInByb2R1Y3QiLCJoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYiLCJXb3JrZXJHbG9iYWxTY29wZSIsImltcG9ydFNjcmlwdHMiLCJvcmlnaW4iLCJsb2NhdGlvbiIsImhyZWYiLCJ1dGlscyIsImZyZWV6ZSIsIl9fcHJvdG9fXyIsInBsYXRmb3JtIiwidG9VUkxFbmNvZGVkRm9ybSIsImhlbHBlcnMiLCJwYXJzZVByb3BQYXRoIiwiYXJyYXlUb09iamVjdCIsImZvcm1EYXRhVG9KU09OIiwiYnVpbGRQYXRoIiwiaXNOdW1lcmljS2V5IiwiaXNMYXN0IiwiZW50cmllcyIsInN0cmluZ2lmeVNhZmVseSIsInJhd1ZhbHVlIiwicGFyc2VyIiwicGFyc2UiLCJkZWZhdWx0cyIsInRyYW5zaXRpb25hbCIsImFkYXB0ZXIiLCJ0cmFuc2Zvcm1SZXF1ZXN0IiwiaGVhZGVycyIsImNvbnRlbnRUeXBlIiwiZ2V0Q29udGVudFR5cGUiLCJoYXNKU09OQ29udGVudFR5cGUiLCJpc09iamVjdFBheWxvYWQiLCJzZXRDb250ZW50VHlwZSIsImZvcm1TZXJpYWxpemVyIiwiX0Zvcm1EYXRhIiwiZW52IiwidHJhbnNmb3JtUmVzcG9uc2UiLCJKU09OUmVxdWVzdGVkIiwicmVzcG9uc2VUeXBlIiwic3RyaWN0SlNPTlBhcnNpbmciLCJFUlJfQkFEX1JFU1BPTlNFIiwidGltZW91dCIsInhzcmZDb29raWVOYW1lIiwieHNyZkhlYWRlck5hbWUiLCJtYXhDb250ZW50TGVuZ3RoIiwibWF4Qm9keUxlbmd0aCIsInZhbGlkYXRlU3RhdHVzIiwiY29tbW9uIiwibWV0aG9kIiwiZGVmYXVsdHMkMSIsImlnbm9yZUR1cGxpY2F0ZU9mIiwicGFyc2VIZWFkZXJzIiwicmF3SGVhZGVycyIsInBhcnNlZCIsImxpbmUiLCJzdWJzdHJpbmciLCIkaW50ZXJuYWxzIiwibm9ybWFsaXplSGVhZGVyIiwiaGVhZGVyIiwibm9ybWFsaXplVmFsdWUiLCJwYXJzZVRva2VucyIsInRva2VucyIsInRva2Vuc1JFIiwiaXNWYWxpZEhlYWRlck5hbWUiLCJtYXRjaEhlYWRlclZhbHVlIiwiaXNIZWFkZXJOYW1lRmlsdGVyIiwiZm9ybWF0SGVhZGVyIiwidyIsImNoYXIiLCJidWlsZEFjY2Vzc29ycyIsImFjY2Vzc29yTmFtZSIsIm1ldGhvZE5hbWUiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJjb25maWd1cmFibGUiLCJBeGlvc0hlYWRlcnMiLCJ2YWx1ZU9yUmV3cml0ZSIsInJld3JpdGUiLCJzZXRIZWFkZXIiLCJfdmFsdWUiLCJfaGVhZGVyIiwiX3Jld3JpdGUiLCJsSGVhZGVyIiwic2V0SGVhZGVycyIsImdldCIsImhhcyIsIm1hdGNoZXIiLCJkZWxldGUiLCJkZWxldGVkIiwiZGVsZXRlSGVhZGVyIiwibm9ybWFsaXplIiwiZm9ybWF0Iiwibm9ybWFsaXplZCIsInRhcmdldHMiLCJhc1N0cmluZ3MiLCJmaXJzdCIsImNvbXB1dGVkIiwiYWNjZXNzb3IiLCJpbnRlcm5hbHMiLCJhY2Nlc3NvcnMiLCJkZWZpbmVBY2Nlc3NvciIsIm1hcHBlZCIsImhlYWRlclZhbHVlIiwiQXhpb3NIZWFkZXJzJDEiLCJ0cmFuc2Zvcm1EYXRhIiwiZm5zIiwidHJhbnNmb3JtIiwiaXNDYW5jZWwiLCJfX0NBTkNFTF9fIiwiQ2FuY2VsZWRFcnJvciIsIkVSUl9DQU5DRUxFRCIsInNldHRsZSIsInJlc29sdmUiLCJyZWplY3QiLCJFUlJfQkFEX1JFUVVFU1QiLCJmbG9vciIsImlzQWJzb2x1dGVVUkwiLCJjb21iaW5lVVJMcyIsImJhc2VVUkwiLCJyZWxhdGl2ZVVSTCIsImJ1aWxkRnVsbFBhdGgiLCJyZXF1ZXN0ZWRVUkwiLCJWRVJTSU9OIiwicGFyc2VQcm90b2NvbCIsIkRBVEFfVVJMX1BBVFRFUk4iLCJmcm9tRGF0YVVSSSIsInVyaSIsImFzQmxvYiIsInByb3RvY29sIiwiRVJSX0lOVkFMSURfVVJMIiwibWltZSIsImlzQmFzZTY0IiwiYm9keSIsImRlY29kZVVSSUNvbXBvbmVudCIsIkVSUl9OT1RfU1VQUE9SVCIsImtJbnRlcm5hbHMiLCJBeGlvc1RyYW5zZm9ybVN0cmVhbSIsIlRyYW5zZm9ybSIsIm1heFJhdGUiLCJjaHVua1NpemUiLCJtaW5DaHVua1NpemUiLCJ0aW1lV2luZG93IiwidGlja3NSYXRlIiwic2FtcGxlc0NvdW50IiwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIiwiYnl0ZXNTZWVuIiwiaXNDYXB0dXJlZCIsIm5vdGlmaWVkQnl0ZXNMb2FkZWQiLCJ0cyIsIkRhdGUiLCJub3ciLCJieXRlcyIsIm9uUmVhZENhbGxiYWNrIiwib24iLCJldmVudCIsIl9yZWFkIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZW5jb2RpbmciLCJjYWxsYmFjayIsImRpdmlkZXIiLCJieXRlc1RocmVzaG9sZCIsIm1heCIsInB1c2hDaHVuayIsIl9jaHVuayIsIl9jYWxsYmFjayIsImJ5dGVMZW5ndGgiLCJlbWl0IiwidHJhbnNmb3JtQ2h1bmsiLCJjaHVua1JlbWFpbmRlciIsIm1heENodW5rU2l6ZSIsImJ5dGVzTGVmdCIsInBhc3NlZCIsInN1YmFycmF5IiwidHJhbnNmb3JtTmV4dENodW5rIiwiZXJyIiwiQXhpb3NUcmFuc2Zvcm1TdHJlYW0kMSIsImFzeW5jSXRlcmF0b3IiLCJyZWFkQmxvYiIsImJsb2IiLCJhcnJheUJ1ZmZlciIsInJlYWRCbG9iJDEiLCJCT1VOREFSWV9BTFBIQUJFVCIsInRleHRFbmNvZGVyIiwiVGV4dEVuY29kZXIiLCJDUkxGIiwiQ1JMRl9CWVRFUyIsIkNSTEZfQllURVNfQ09VTlQiLCJGb3JtRGF0YVBhcnQiLCJlc2NhcGVOYW1lIiwiaXNTdHJpbmdWYWx1ZSIsImNvbnRlbnRMZW5ndGgiLCJmb3JtRGF0YVRvU3RyZWFtIiwiZm9ybSIsImhlYWRlcnNIYW5kbGVyIiwidGFnIiwiYm91bmRhcnkiLCJib3VuZGFyeUJ5dGVzIiwiZm9vdGVyQnl0ZXMiLCJwYXJ0cyIsInBhcnQiLCJjb21wdXRlZEhlYWRlcnMiLCJSZWFkYWJsZSIsImZvcm1EYXRhVG9TdHJlYW0kMSIsIlpsaWJIZWFkZXJUcmFuc2Zvcm1TdHJlYW0iLCJfX3RyYW5zZm9ybSIsImFsbG9jIiwiWmxpYkhlYWRlclRyYW5zZm9ybVN0cmVhbSQxIiwiY2FsbGJhY2tpZnkiLCJhcmdzIiwiY2FsbGJhY2tpZnkkMSIsInNwZWVkb21ldGVyIiwibWluIiwidGltZXN0YW1wcyIsImhlYWQiLCJ0YWlsIiwiZmlyc3RTYW1wbGVUUyIsImNodW5rTGVuZ3RoIiwic3RhcnRlZEF0IiwiYnl0ZXNDb3VudCIsInJvdW5kIiwidGhyb3R0bGUiLCJmcmVxIiwidGltZXN0YW1wIiwidGhyZXNob2xkIiwibGFzdEFyZ3MiLCJ0aW1lciIsImludm9rZSIsImNsZWFyVGltZW91dCIsInRocm90dGxlZCIsImZsdXNoIiwicHJvZ3Jlc3NFdmVudFJlZHVjZXIiLCJsaXN0ZW5lciIsImlzRG93bmxvYWRTdHJlYW0iLCJieXRlc05vdGlmaWVkIiwiX3NwZWVkb21ldGVyIiwibG9hZGVkIiwidG90YWwiLCJsZW5ndGhDb21wdXRhYmxlIiwicHJvZ3Jlc3NCeXRlcyIsInJhdGUiLCJpblJhbmdlIiwicHJvZ3Jlc3MiLCJlc3RpbWF0ZWQiLCJwcm9ncmVzc0V2ZW50RGVjb3JhdG9yIiwiYXN5bmNEZWNvcmF0b3IiLCJ6bGliT3B0aW9ucyIsImNvbnN0YW50cyIsIlpfU1lOQ19GTFVTSCIsImZpbmlzaEZsdXNoIiwiYnJvdGxpT3B0aW9ucyIsIkJST1RMSV9PUEVSQVRJT05fRkxVU0giLCJpc0Jyb3RsaVN1cHBvcnRlZCIsImNyZWF0ZUJyb3RsaURlY29tcHJlc3MiLCJodHRwRm9sbG93IiwiaHR0cHNGb2xsb3ciLCJpc0h0dHBzIiwic3VwcG9ydGVkUHJvdG9jb2xzIiwiZmx1c2hPbkZpbmlzaCIsImRpc3BhdGNoQmVmb3JlUmVkaXJlY3QiLCJyZXNwb25zZURldGFpbHMiLCJiZWZvcmVSZWRpcmVjdHMiLCJwcm94eSIsInNldFByb3h5IiwiY29uZmlnUHJveHkiLCJwcm94eVVybCIsImdldFByb3h5Rm9yVXJsIiwiVVJMIiwidXNlcm5hbWUiLCJhdXRoIiwicGFzc3dvcmQiLCJiYXNlNjQiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicHJveHlIb3N0IiwiaW5jbHVkZXMiLCJiZWZvcmVSZWRpcmVjdCIsInJlZGlyZWN0T3B0aW9ucyIsImlzSHR0cEFkYXB0ZXJTdXBwb3J0ZWQiLCJ3cmFwQXN5bmMiLCJhc3luY0V4ZWN1dG9yIiwiUHJvbWlzZSIsIm9uRG9uZSIsImlzRG9uZSIsImlzUmVqZWN0ZWQiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZWFzb24iLCJvbkRvbmVIYW5kbGVyIiwicmVzb2x2ZUZhbWlseSIsImFkZHJlc3MiLCJmYW1pbHkiLCJidWlsZEFkZHJlc3NFbnRyeSIsImh0dHBBZGFwdGVyIiwiZGlzcGF0Y2hIdHRwUmVxdWVzdCIsImxvb2t1cCIsInJlc3BvbnNlRW5jb2RpbmciLCJyZXEiLCJfbG9va3VwIiwib3B0IiwiYXJnMCIsImFkZHJlc3NlcyIsImFkZHIiLCJhbGwiLCJlbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwib25GaW5pc2hlZCIsImNhbmNlbFRva2VuIiwidW5zdWJzY3JpYmUiLCJhYm9ydCIsInNpZ25hbCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJvbmNlIiwic3Vic2NyaWJlIiwiYWJvcnRlZCIsImZ1bGxQYXRoIiwiY29udmVydGVkRGF0YSIsInN0YXR1c1RleHQiLCJvblVwbG9hZFByb2dyZXNzIiwib25Eb3dubG9hZFByb2dyZXNzIiwibWF4VXBsb2FkUmF0ZSIsIm1heERvd25sb2FkUmF0ZSIsInVzZXJCb3VuZGFyeSIsImZvcm1IZWFkZXJzIiwiZ2V0SGVhZGVycyIsImhhc0NvbnRlbnRMZW5ndGgiLCJrbm93bkxlbmd0aCIsInByb21pc2lmeSIsImdldExlbmd0aCIsInNldENvbnRlbnRMZW5ndGgiLCJnZXRDb250ZW50TGVuZ3RoIiwib2JqZWN0TW9kZSIsInBpcGVsaW5lIiwidXJsVXNlcm5hbWUiLCJ1cmxQYXNzd29yZCIsInBhdGhuYW1lIiwic2VhcmNoIiwicGFyYW1zU2VyaWFsaXplciIsImN1c3RvbUVyciIsImV4aXN0cyIsImFnZW50cyIsImh0dHBBZ2VudCIsImh0dHBzQWdlbnQiLCJzb2NrZXRQYXRoIiwidHJhbnNwb3J0IiwiaXNIdHRwc1JlcXVlc3QiLCJhZ2VudCIsIm1heFJlZGlyZWN0cyIsIkluZmluaXR5IiwiaW5zZWN1cmVIVFRQUGFyc2VyIiwiaGFuZGxlUmVzcG9uc2UiLCJyZXMiLCJkZXN0cm95ZWQiLCJzdHJlYW1zIiwicmVzcG9uc2VMZW5ndGgiLCJ0cmFuc2Zvcm1TdHJlYW0iLCJyZXNwb25zZVN0cmVhbSIsImxhc3RSZXF1ZXN0IiwiZGVjb21wcmVzcyIsInN0YXR1c0NvZGUiLCJjcmVhdGVVbnppcCIsIm9mZkxpc3RlbmVycyIsImZpbmlzaGVkIiwic3RhdHVzTWVzc2FnZSIsInJlc3BvbnNlQnVmZmVyIiwidG90YWxSZXNwb25zZUJ5dGVzIiwiaGFuZGxlU3RyZWFtRGF0YSIsImRlc3Ryb3kiLCJoYW5kbGVyU3RyZWFtQWJvcnRlZCIsImhhbmRsZVN0cmVhbUVycm9yIiwiaGFuZGxlU3RyZWFtRW5kIiwicmVzcG9uc2VEYXRhIiwiaGFuZGxlUmVxdWVzdEVycm9yIiwiaGFuZGxlUmVxdWVzdFNvY2tldCIsInNvY2tldCIsInNldEtlZXBBbGl2ZSIsInBhcnNlSW50IiwiaXNOYU4iLCJFUlJfQkFEX09QVElPTl9WQUxVRSIsImhhbmRsZVJlcXVlc3RUaW1lb3V0IiwidGltZW91dEVycm9yTWVzc2FnZSIsIkVUSU1FRE9VVCIsIkVDT05OQUJPUlRFRCIsImVuZGVkIiwiZXJyb3JlZCIsImVuZCIsImlzVVJMU2FtZU9yaWdpbiIsInN0YW5kYXJkQnJvd3NlckVudiIsIm1zaWUiLCJ1c2VyQWdlbnQiLCJ1cmxQYXJzaW5nTm9kZSIsImNyZWF0ZUVsZW1lbnQiLCJvcmlnaW5VUkwiLCJyZXNvbHZlVVJMIiwic2V0QXR0cmlidXRlIiwiaGFzaCIsImNoYXJBdCIsInJlcXVlc3RVUkwiLCJub25TdGFuZGFyZEJyb3dzZXJFbnYiLCJjb29raWVzIiwid3JpdGUiLCJleHBpcmVzIiwiZG9tYWluIiwic2VjdXJlIiwiY29va2llIiwidG9HTVRTdHJpbmciLCJyZWFkIiwiUmVnRXhwIiwicmVtb3ZlIiwiaGVhZGVyc1RvT2JqZWN0IiwibWVyZ2VDb25maWciLCJjb25maWcxIiwiY29uZmlnMiIsImdldE1lcmdlZFZhbHVlIiwibWVyZ2VEZWVwUHJvcGVydGllcyIsInZhbHVlRnJvbUNvbmZpZzIiLCJkZWZhdWx0VG9Db25maWcyIiwibWVyZ2VEaXJlY3RLZXlzIiwibWVyZ2VNYXAiLCJ0aW1lb3V0TWVzc2FnZSIsIndpdGhDcmVkZW50aWFscyIsIndpdGhYU1JGVG9rZW4iLCJjb21wdXRlQ29uZmlnVmFsdWUiLCJjb25maWdWYWx1ZSIsInJlc29sdmVDb25maWciLCJuZXdDb25maWciLCJidG9hIiwidW5lc2NhcGUiLCJCb29sZWFuIiwieHNyZlZhbHVlIiwiaXNYSFJBZGFwdGVyU3VwcG9ydGVkIiwiWE1MSHR0cFJlcXVlc3QiLCJ4aHJBZGFwdGVyIiwiZGlzcGF0Y2hYaHJSZXF1ZXN0IiwiX2NvbmZpZyIsInJlcXVlc3REYXRhIiwicmVxdWVzdEhlYWRlcnMiLCJvbkNhbmNlbGVkIiwidXBsb2FkVGhyb3R0bGVkIiwiZG93bmxvYWRUaHJvdHRsZWQiLCJmbHVzaFVwbG9hZCIsImZsdXNoRG93bmxvYWQiLCJvcGVuIiwib25sb2FkZW5kIiwicmVzcG9uc2VIZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwicmVzcG9uc2VUZXh0Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwiaGFuZGxlTG9hZCIsInJlYWR5U3RhdGUiLCJyZXNwb25zZVVSTCIsIm9uYWJvcnQiLCJoYW5kbGVBYm9ydCIsIm9uZXJyb3IiLCJoYW5kbGVFcnJvciIsIkVSUl9ORVRXT1JLIiwib250aW1lb3V0IiwiaGFuZGxlVGltZW91dCIsInNldFJlcXVlc3RIZWFkZXIiLCJ1cGxvYWQiLCJjYW5jZWwiLCJzZW5kIiwiY29tcG9zZVNpZ25hbHMiLCJzaWduYWxzIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImNvbXBvc2VTaWduYWxzJDEiLCJzdHJlYW1DaHVuayIsInBvcyIsInJlYWRCeXRlcyIsIml0ZXJhYmxlIiwidHJhY2tTdHJlYW0iLCJvblByb2dyZXNzIiwib25GaW5pc2giLCJfb25GaW5pc2giLCJSZWFkYWJsZVN0cmVhbSIsInB1bGwiLCJjbG9zZSIsImxvYWRlZEJ5dGVzIiwiZW5xdWV1ZSIsInJldHVybiIsImhpZ2hXYXRlck1hcmsiLCJpc0ZldGNoU3VwcG9ydGVkIiwiZmV0Y2giLCJSZXF1ZXN0IiwiUmVzcG9uc2UiLCJpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkIiwiZW5jb2RlVGV4dCIsInN1cHBvcnRzUmVxdWVzdFN0cmVhbSIsImR1cGxleEFjY2Vzc2VkIiwiaGFzQ29udGVudFR5cGUiLCJkdXBsZXgiLCJERUZBVUxUX0NIVU5LX1NJWkUiLCJzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtIiwicmVzb2x2ZXJzIiwiXyIsImdldEJvZHlMZW5ndGgiLCJyZXNvbHZlQm9keUxlbmd0aCIsImZldGNoQWRhcHRlciIsImZldGNoT3B0aW9ucyIsImNvbXBvc2VkU2lnbmFsIiwic3RvcFRpbWVvdXQiLCJyZXF1ZXN0Q29udGVudExlbmd0aCIsIl9yZXF1ZXN0IiwiY29udGVudFR5cGVIZWFkZXIiLCJpc0NyZWRlbnRpYWxzU3VwcG9ydGVkIiwiY3JlZGVudGlhbHMiLCJpc1N0cmVhbVJlc3BvbnNlIiwicmVzcG9uc2VDb250ZW50TGVuZ3RoIiwia25vd25BZGFwdGVycyIsInhociIsInJlbmRlclJlYXNvbiIsImlzUmVzb2x2ZWRIYW5kbGUiLCJhZGFwdGVycyIsImdldEFkYXB0ZXIiLCJuYW1lT3JBZGFwdGVyIiwicmVqZWN0ZWRSZWFzb25zIiwicmVhc29ucyIsInN0YXRlIiwicyIsInRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQiLCJ0aHJvd0lmUmVxdWVzdGVkIiwiZGlzcGF0Y2hSZXF1ZXN0Iiwib25BZGFwdGVyUmVzb2x1dGlvbiIsIm9uQWRhcHRlclJlamVjdGlvbiIsInZhbGlkYXRvcnMkMSIsInZhbGlkYXRvciIsImRlcHJlY2F0ZWRXYXJuaW5ncyIsInZlcnNpb24iLCJmb3JtYXRNZXNzYWdlIiwiZGVzYyIsIm9wdHMiLCJFUlJfREVQUkVDQVRFRCIsImNvbnNvbGUiLCJ3YXJuIiwiYXNzZXJ0T3B0aW9ucyIsInNjaGVtYSIsImFsbG93VW5rbm93biIsIkVSUl9CQURfT1BUSU9OIiwidmFsaWRhdG9ycyIsIkF4aW9zIiwiaW5zdGFuY2VDb25maWciLCJpbnRlcmNlcHRvcnMiLCJjb25maWdPclVybCIsImR1bW15IiwiYm9vbGVhbiIsImZ1bmN0aW9uIiwiY29udGV4dEhlYWRlcnMiLCJyZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiIsInN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyIsInVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3IiLCJ1bnNoaWZ0IiwicmVzcG9uc2VJbnRlcmNlcHRvckNoYWluIiwicHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzIiwicHJvbWlzZSIsImNoYWluIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiZ2V0VXJpIiwiZm9yRWFjaE1ldGhvZE5vRGF0YSIsImZvckVhY2hNZXRob2RXaXRoRGF0YSIsImdlbmVyYXRlSFRUUE1ldGhvZCIsImlzRm9ybSIsImh0dHBNZXRob2QiLCJBeGlvcyQxIiwiQ2FuY2VsVG9rZW4iLCJleGVjdXRvciIsInJlc29sdmVQcm9taXNlIiwicHJvbWlzZUV4ZWN1dG9yIiwiX2xpc3RlbmVycyIsIm9uZnVsZmlsbGVkIiwic3BsaWNlIiwiYyIsIkNhbmNlbFRva2VuJDEiLCJzcHJlYWQiLCJpc0F4aW9zRXJyb3IiLCJwYXlsb2FkIiwiSHR0cFN0YXR1c0NvZGUiLCJDb250aW51ZSIsIlN3aXRjaGluZ1Byb3RvY29scyIsIlByb2Nlc3NpbmciLCJFYXJseUhpbnRzIiwiT2siLCJDcmVhdGVkIiwiQWNjZXB0ZWQiLCJOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24iLCJOb0NvbnRlbnQiLCJSZXNldENvbnRlbnQiLCJQYXJ0aWFsQ29udGVudCIsIk11bHRpU3RhdHVzIiwiQWxyZWFkeVJlcG9ydGVkIiwiSW1Vc2VkIiwiTXVsdGlwbGVDaG9pY2VzIiwiTW92ZWRQZXJtYW5lbnRseSIsIkZvdW5kIiwiU2VlT3RoZXIiLCJOb3RNb2RpZmllZCIsIlVzZVByb3h5IiwiVW51c2VkIiwiVGVtcG9yYXJ5UmVkaXJlY3QiLCJQZXJtYW5lbnRSZWRpcmVjdCIsIkJhZFJlcXVlc3QiLCJVbmF1dGhvcml6ZWQiLCJQYXltZW50UmVxdWlyZWQiLCJGb3JiaWRkZW4iLCJOb3RGb3VuZCIsIk1ldGhvZE5vdEFsbG93ZWQiLCJOb3RBY2NlcHRhYmxlIiwiUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkIiwiUmVxdWVzdFRpbWVvdXQiLCJDb25mbGljdCIsIkdvbmUiLCJMZW5ndGhSZXF1aXJlZCIsIlByZWNvbmRpdGlvbkZhaWxlZCIsIlBheWxvYWRUb29MYXJnZSIsIlVyaVRvb0xvbmciLCJVbnN1cHBvcnRlZE1lZGlhVHlwZSIsIlJhbmdlTm90U2F0aXNmaWFibGUiLCJFeHBlY3RhdGlvbkZhaWxlZCIsIkltQVRlYXBvdCIsIk1pc2RpcmVjdGVkUmVxdWVzdCIsIlVucHJvY2Vzc2FibGVFbnRpdHkiLCJMb2NrZWQiLCJGYWlsZWREZXBlbmRlbmN5IiwiVG9vRWFybHkiLCJVcGdyYWRlUmVxdWlyZWQiLCJQcmVjb25kaXRpb25SZXF1aXJlZCIsIlRvb01hbnlSZXF1ZXN0cyIsIlJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZSIsIlVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvciIsIk5vdEltcGxlbWVudGVkIiwiQmFkR2F0ZXdheSIsIlNlcnZpY2VVbmF2YWlsYWJsZSIsIkdhdGV3YXlUaW1lb3V0IiwiSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQiLCJWYXJpYW50QWxzb05lZ290aWF0ZXMiLCJJbnN1ZmZpY2llbnRTdG9yYWdlIiwiTG9vcERldGVjdGVkIiwiTm90RXh0ZW5kZWQiLCJOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZCIsIkh0dHBTdGF0dXNDb2RlJDEiLCJjcmVhdGVJbnN0YW5jZSIsImRlZmF1bHRDb25maWciLCJpbnN0YW5jZSIsImF4aW9zIiwiQ2FuY2VsIiwicHJvbWlzZXMiLCJmb3JtVG9KU09OIiwiZGVmYXVsdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/axios/dist/node/axios.cjs\n");
/***/ })
};
;