NeahNew/.next/server/vendor-chunks/quill-better-table.js
2025-05-03 14:17:46 +02:00

24 lines
318 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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/quill-better-table";
exports.ids = ["vendor-chunks/quill-better-table"];
exports.modules = {
/***/ "(ssr)/./node_modules/quill-better-table/dist/quill-better-table.js":
/*!********************************************************************!*\
!*** ./node_modules/quill-better-table/dist/quill-better-table.js ***!
\********************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory(__webpack_require__(/*! quill */ \"(ssr)/./node_modules/quill/quill.js\"));\n\telse {}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \tfunction hotDisposeChunk(chunkId) {\n/******/ \t\tdelete installedChunks[chunkId];\n/******/ \t}\n/******/ \tvar parentHotUpdateCallback = window[\"webpackHotUpdatequillBetterTable\"];\n/******/ \twindow[\"webpackHotUpdatequillBetterTable\"] = // eslint-disable-next-line no-unused-vars\n/******/ \tfunction webpackHotUpdateCallback(chunkId, moreModules) {\n/******/ \t\thotAddUpdateChunk(chunkId, moreModules);\n/******/ \t\tif (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);\n/******/ \t} ;\n/******/\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tfunction hotDownloadUpdateChunk(chunkId) {\n/******/ \t\tvar script = document.createElement(\"script\");\n/******/ \t\tscript.charset = \"utf-8\";\n/******/ \t\tscript.src = __nested_webpack_require_25974__.p + \"\" + chunkId + \".\" + hotCurrentHash + \".hot-update.js\";\n/******/ \t\tif (false) {}\n/******/ \t\tdocument.head.appendChild(script);\n/******/ \t}\n/******/\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tfunction hotDownloadManifest(requestTimeout) {\n/******/ \t\trequestTimeout = requestTimeout || 10000;\n/******/ \t\treturn new Promise(function(resolve, reject) {\n/******/ \t\t\tif (typeof XMLHttpRequest === \"undefined\") {\n/******/ \t\t\t\treturn reject(new Error(\"No browser support\"));\n/******/ \t\t\t}\n/******/ \t\t\ttry {\n/******/ \t\t\t\tvar request = new XMLHttpRequest();\n/******/ \t\t\t\tvar requestPath = __nested_webpack_require_25974__.p + \"\" + hotCurrentHash + \".hot-update.json\";\n/******/ \t\t\t\trequest.open(\"GET\", requestPath, true);\n/******/ \t\t\t\trequest.timeout = requestTimeout;\n/******/ \t\t\t\trequest.send(null);\n/******/ \t\t\t} catch (err) {\n/******/ \t\t\t\treturn reject(err);\n/******/ \t\t\t}\n/******/ \t\t\trequest.onreadystatechange = function() {\n/******/ \t\t\t\tif (request.readyState !== 4) return;\n/******/ \t\t\t\tif (request.status === 0) {\n/******/ \t\t\t\t\t// timeout\n/******/ \t\t\t\t\treject(\n/******/ \t\t\t\t\t\tnew Error(\"Manifest request to \" + requestPath + \" timed out.\")\n/******/ \t\t\t\t\t);\n/******/ \t\t\t\t} else if (request.status === 404) {\n/******/ \t\t\t\t\t// no update available\n/******/ \t\t\t\t\tresolve();\n/******/ \t\t\t\t} else if (request.status !== 200 && request.status !== 304) {\n/******/ \t\t\t\t\t// other failure\n/******/ \t\t\t\t\treject(new Error(\"Manifest request to \" + requestPath + \" failed.\"));\n/******/ \t\t\t\t} else {\n/******/ \t\t\t\t\t// success\n/******/ \t\t\t\t\ttry {\n/******/ \t\t\t\t\t\tvar update = JSON.parse(request.responseText);\n/******/ \t\t\t\t\t} catch (e) {\n/******/ \t\t\t\t\t\treject(e);\n/******/ \t\t\t\t\t\treturn;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t\tresolve(update);\n/******/ \t\t\t\t}\n/******/ \t\t\t};\n/******/ \t\t});\n/******/ \t}\n/******/\n/******/ \tvar hotApplyOnUpdate = true;\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tvar hotCurrentHash = \"ced44c7892a78034ffe4\";\n/******/ \tvar hotRequestTimeout = 10000;\n/******/ \tvar hotCurrentModuleData = {};\n/******/ \tvar hotCurrentChildModule;\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tvar hotCurrentParents = [];\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tvar hotCurrentParentsTemp = [];\n/******/\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tfunction hotCreateRequire(moduleId) {\n/******/ \t\tvar me = installedModules[moduleId];\n/******/ \t\tif (!me) return __nested_webpack_require_25974__;\n/******/ \t\tvar fn = function(request) {\n/******/ \t\t\tif (me.hot.active) {\n/******/ \t\t\t\tif (installedModules[request]) {\n/******/ \t\t\t\t\tif (installedModules[request].parents.indexOf(moduleId) === -1) {\n/******/ \t\t\t\t\t\tinstalledModules[request].parents.push(moduleId);\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t} else {\n/******/ \t\t\t\t\thotCurrentParents = [moduleId];\n/******/ \t\t\t\t\thotCurrentChildModule = request;\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif (me.children.indexOf(request) === -1) {\n/******/ \t\t\t\t\tme.children.push(request);\n/******/ \t\t\t\t}\n/******/ \t\t\t} else {\n/******/ \t\t\t\tconsole.warn(\n/******/ \t\t\t\t\t\"[HMR] unexpected require(\" +\n/******/ \t\t\t\t\t\trequest +\n/******/ \t\t\t\t\t\t\") from disposed module \" +\n/******/ \t\t\t\t\t\tmoduleId\n/******/ \t\t\t\t);\n/******/ \t\t\t\thotCurrentParents = [];\n/******/ \t\t\t}\n/******/ \t\t\treturn __nested_webpack_require_25974__(request);\n/******/ \t\t};\n/******/ \t\tvar ObjectFactory = function ObjectFactory(name) {\n/******/ \t\t\treturn {\n/******/ \t\t\t\tconfigurable: true,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: function() {\n/******/ \t\t\t\t\treturn __nested_webpack_require_25974__[name];\n/******/ \t\t\t\t},\n/******/ \t\t\t\tset: function(value) {\n/******/ \t\t\t\t\t__nested_webpack_require_25974__[name] = value;\n/******/ \t\t\t\t}\n/******/ \t\t\t};\n/******/ \t\t};\n/******/ \t\tfor (var name in __nested_webpack_require_25974__) {\n/******/ \t\t\tif (\n/******/ \t\t\t\tObject.prototype.hasOwnProperty.call(__nested_webpack_require_25974__, name) &&\n/******/ \t\t\t\tname !== \"e\" &&\n/******/ \t\t\t\tname !== \"t\"\n/******/ \t\t\t) {\n/******/ \t\t\t\tObject.defineProperty(fn, name, ObjectFactory(name));\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tfn.e = function(chunkId) {\n/******/ \t\t\tif (hotStatus === \"ready\") hotSetStatus(\"prepare\");\n/******/ \t\t\thotChunksLoading++;\n/******/ \t\t\treturn __nested_webpack_require_25974__.e(chunkId).then(finishChunkLoading, function(err) {\n/******/ \t\t\t\tfinishChunkLoading();\n/******/ \t\t\t\tthrow err;\n/******/ \t\t\t});\n/******/\n/******/ \t\t\tfunction finishChunkLoading() {\n/******/ \t\t\t\thotChunksLoading--;\n/******/ \t\t\t\tif (hotStatus === \"prepare\") {\n/******/ \t\t\t\t\tif (!hotWaitingFilesMap[chunkId]) {\n/******/ \t\t\t\t\t\thotEnsureUpdateChunk(chunkId);\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t\tif (hotChunksLoading === 0 && hotWaitingFiles === 0) {\n/******/ \t\t\t\t\t\thotUpdateDownloaded();\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t\tfn.t = function(value, mode) {\n/******/ \t\t\tif (mode & 1) value = fn(value);\n/******/ \t\t\treturn __nested_webpack_require_25974__.t(value, mode & ~1);\n/******/ \t\t};\n/******/ \t\treturn fn;\n/******/ \t}\n/******/\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tfunction hotCreateModule(moduleId) {\n/******/ \t\tvar hot = {\n/******/ \t\t\t// private stuff\n/******/ \t\t\t_acceptedDependencies: {},\n/******/ \t\t\t_declinedDependencies: {},\n/******/ \t\t\t_selfAccepted: false,\n/******/ \t\t\t_selfDeclined: false,\n/******/ \t\t\t_disposeHandlers: [],\n/******/ \t\t\t_main: hotCurrentChildModule !== moduleId,\n/******/\n/******/ \t\t\t// Module API\n/******/ \t\t\tactive: true,\n/******/ \t\t\taccept: function(dep, callback) {\n/******/ \t\t\t\tif (dep === undefined) hot._selfAccepted = true;\n/******/ \t\t\t\telse if (typeof dep === \"function\") hot._selfAccepted = dep;\n/******/ \t\t\t\telse if (typeof dep === \"object\")\n/******/ \t\t\t\t\tfor (var i = 0; i < dep.length; i++)\n/******/ \t\t\t\t\t\thot._acceptedDependencies[dep[i]] = callback || function() {};\n/******/ \t\t\t\telse hot._acceptedDependencies[dep] = callback || function() {};\n/******/ \t\t\t},\n/******/ \t\t\tdecline: function(dep) {\n/******/ \t\t\t\tif (dep === undefined) hot._selfDeclined = true;\n/******/ \t\t\t\telse if (typeof dep === \"object\")\n/******/ \t\t\t\t\tfor (var i = 0; i < dep.length; i++)\n/******/ \t\t\t\t\t\thot._declinedDependencies[dep[i]] = true;\n/******/ \t\t\t\telse hot._declinedDependencies[dep] = true;\n/******/ \t\t\t},\n/******/ \t\t\tdispose: function(callback) {\n/******/ \t\t\t\thot._disposeHandlers.push(callback);\n/******/ \t\t\t},\n/******/ \t\t\taddDisposeHandler: function(callback) {\n/******/ \t\t\t\thot._disposeHandlers.push(callback);\n/******/ \t\t\t},\n/******/ \t\t\tremoveDisposeHandler: function(callback) {\n/******/ \t\t\t\tvar idx = hot._disposeHandlers.indexOf(callback);\n/******/ \t\t\t\tif (idx >= 0) hot._disposeHandlers.splice(idx, 1);\n/******/ \t\t\t},\n/******/\n/******/ \t\t\t// Management API\n/******/ \t\t\tcheck: hotCheck,\n/******/ \t\t\tapply: hotApply,\n/******/ \t\t\tstatus: function(l) {\n/******/ \t\t\t\tif (!l) return hotStatus;\n/******/ \t\t\t\thotStatusHandlers.push(l);\n/******/ \t\t\t},\n/******/ \t\t\taddStatusHandler: function(l) {\n/******/ \t\t\t\thotStatusHandlers.push(l);\n/******/ \t\t\t},\n/******/ \t\t\tremoveStatusHandler: function(l) {\n/******/ \t\t\t\tvar idx = hotStatusHandlers.indexOf(l);\n/******/ \t\t\t\tif (idx >= 0) hotStatusHandlers.splice(idx, 1);\n/******/ \t\t\t},\n/******/\n/******/ \t\t\t//inherit from previous dispose call\n/******/ \t\t\tdata: hotCurrentModuleData[moduleId]\n/******/ \t\t};\n/******/ \t\thotCurrentChildModule = undefined;\n/******/ \t\treturn hot;\n/******/ \t}\n/******/\n/******/ \tvar hotStatusHandlers = [];\n/******/ \tvar hotStatus = \"idle\";\n/******/\n/******/ \tfunction hotSetStatus(newStatus) {\n/******/ \t\thotStatus = newStatus;\n/******/ \t\tfor (var i = 0; i < hotStatusHandlers.length; i++)\n/******/ \t\t\thotStatusHandlers[i].call(null, newStatus);\n/******/ \t}\n/******/\n/******/ \t// while downloading\n/******/ \tvar hotWaitingFiles = 0;\n/******/ \tvar hotChunksLoading = 0;\n/******/ \tvar hotWaitingFilesMap = {};\n/******/ \tvar hotRequestedFilesMap = {};\n/******/ \tvar hotAvailableFilesMap = {};\n/******/ \tvar hotDeferred;\n/******/\n/******/ \t// The update info\n/******/ \tvar hotUpdate, hotUpdateNewHash;\n/******/\n/******/ \tfunction toModuleId(id) {\n/******/ \t\tvar isNumber = +id + \"\" === id;\n/******/ \t\treturn isNumber ? +id : id;\n/******/ \t}\n/******/\n/******/ \tfunction hotCheck(apply) {\n/******/ \t\tif (hotStatus !== \"idle\") {\n/******/ \t\t\tthrow new Error(\"check() is only allowed in idle status\");\n/******/ \t\t}\n/******/ \t\thotApplyOnUpdate = apply;\n/******/ \t\thotSetStatus(\"check\");\n/******/ \t\treturn hotDownloadManifest(hotRequestTimeout).then(function(update) {\n/******/ \t\t\tif (!update) {\n/******/ \t\t\t\thotSetStatus(\"idle\");\n/******/ \t\t\t\treturn null;\n/******/ \t\t\t}\n/******/ \t\t\thotRequestedFilesMap = {};\n/******/ \t\t\thotWaitingFilesMap = {};\n/******/ \t\t\thotAvailableFilesMap = update.c;\n/******/ \t\t\thotUpdateNewHash = update.h;\n/******/\n/******/ \t\t\thotSetStatus(\"prepare\");\n/******/ \t\t\tvar promise = new Promise(function(resolve, reject) {\n/******/ \t\t\t\thotDeferred = {\n/******/ \t\t\t\t\tresolve: resolve,\n/******/ \t\t\t\t\treject: reject\n/******/ \t\t\t\t};\n/******/ \t\t\t});\n/******/ \t\t\thotUpdate = {};\n/******/ \t\t\tvar chunkId = 2;\n/******/ \t\t\t// eslint-disable-next-line no-lone-blocks\n/******/ \t\t\t{\n/******/ \t\t\t\t/*globals chunkId */\n/******/ \t\t\t\thotEnsureUpdateChunk(chunkId);\n/******/ \t\t\t}\n/******/ \t\t\tif (\n/******/ \t\t\t\thotStatus === \"prepare\" &&\n/******/ \t\t\t\thotChunksLoading === 0 &&\n/******/ \t\t\t\thotWaitingFiles === 0\n/******/ \t\t\t) {\n/******/ \t\t\t\thotUpdateDownloaded();\n/******/ \t\t\t}\n/******/ \t\t\treturn promise;\n/******/ \t\t});\n/******/ \t}\n/******/\n/******/ \t// eslint-disable-next-line no-unused-vars\n/******/ \tfunction hotAddUpdateChunk(chunkId, moreModules) {\n/******/ \t\tif (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])\n/******/ \t\t\treturn;\n/******/ \t\thotRequestedFilesMap[chunkId] = false;\n/******/ \t\tfor (var moduleId in moreModules) {\n/******/ \t\t\tif (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\thotUpdate[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif (--hotWaitingFiles === 0 && hotChunksLoading === 0) {\n/******/ \t\t\thotUpdateDownloaded();\n/******/ \t\t}\n/******/ \t}\n/******/\n/******/ \tfunction hotEnsureUpdateChunk(chunkId) {\n/******/ \t\tif (!hotAvailableFilesMap[chunkId]) {\n/******/ \t\t\thotWaitingFilesMap[chunkId] = true;\n/******/ \t\t} else {\n/******/ \t\t\thotRequestedFilesMap[chunkId] = true;\n/******/ \t\t\thotWaitingFiles++;\n/******/ \t\t\thotDownloadUpdateChunk(chunkId);\n/******/ \t\t}\n/******/ \t}\n/******/\n/******/ \tfunction hotUpdateDownloaded() {\n/******/ \t\thotSetStatus(\"ready\");\n/******/ \t\tvar deferred = hotDeferred;\n/******/ \t\thotDeferred = null;\n/******/ \t\tif (!deferred) return;\n/******/ \t\tif (hotApplyOnUpdate) {\n/******/ \t\t\t// Wrap deferred object in Promise to mark it as a well-handled Promise to\n/******/ \t\t\t// avoid triggering uncaught exception warning in Chrome.\n/******/ \t\t\t// See https://bugs.chromium.org/p/chromium/issues/detail?id=465666\n/******/ \t\t\tPromise.resolve()\n/******/ \t\t\t\t.then(function() {\n/******/ \t\t\t\t\treturn hotApply(hotApplyOnUpdate);\n/******/ \t\t\t\t})\n/******/ \t\t\t\t.then(\n/******/ \t\t\t\t\tfunction(result) {\n/******/ \t\t\t\t\t\tdeferred.resolve(result);\n/******/ \t\t\t\t\t},\n/******/ \t\t\t\t\tfunction(err) {\n/******/ \t\t\t\t\t\tdeferred.reject(err);\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t);\n/******/ \t\t} else {\n/******/ \t\t\tvar outdatedModules = [];\n/******/ \t\t\tfor (var id in hotUpdate) {\n/******/ \t\t\t\tif (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {\n/******/ \t\t\t\t\toutdatedModules.push(toModuleId(id));\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t\tdeferred.resolve(outdatedModules);\n/******/ \t\t}\n/******/ \t}\n/******/\n/******/ \tfunction hotApply(options) {\n/******/ \t\tif (hotStatus !== \"ready\")\n/******/ \t\t\tthrow new Error(\"apply() is only allowed in ready status\");\n/******/ \t\toptions = options || {};\n/******/\n/******/ \t\tvar cb;\n/******/ \t\tvar i;\n/******/ \t\tvar j;\n/******/ \t\tvar module;\n/******/ \t\tvar moduleId;\n/******/\n/******/ \t\tfunction getAffectedStuff(updateModuleId) {\n/******/ \t\t\tvar outdatedModules = [updateModuleId];\n/******/ \t\t\tvar outdatedDependencies = {};\n/******/\n/******/ \t\t\tvar queue = outdatedModules.map(function(id) {\n/******/ \t\t\t\treturn {\n/******/ \t\t\t\t\tchain: [id],\n/******/ \t\t\t\t\tid: id\n/******/ \t\t\t\t};\n/******/ \t\t\t});\n/******/ \t\t\twhile (queue.length > 0) {\n/******/ \t\t\t\tvar queueItem = queue.pop();\n/******/ \t\t\t\tvar moduleId = queueItem.id;\n/******/ \t\t\t\tvar chain = queueItem.chain;\n/******/ \t\t\t\tmodule = installedModules[moduleId];\n/******/ \t\t\t\tif (!module || module.hot._selfAccepted) continue;\n/******/ \t\t\t\tif (module.hot._selfDeclined) {\n/******/ \t\t\t\t\treturn {\n/******/ \t\t\t\t\t\ttype: \"self-declined\",\n/******/ \t\t\t\t\t\tchain: chain,\n/******/ \t\t\t\t\t\tmoduleId: moduleId\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif (module.hot._main) {\n/******/ \t\t\t\t\treturn {\n/******/ \t\t\t\t\t\ttype: \"unaccepted\",\n/******/ \t\t\t\t\t\tchain: chain,\n/******/ \t\t\t\t\t\tmoduleId: moduleId\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}\n/******/ \t\t\t\tfor (var i = 0; i < module.parents.length; i++) {\n/******/ \t\t\t\t\tvar parentId = module.parents[i];\n/******/ \t\t\t\t\tvar parent = installedModules[parentId];\n/******/ \t\t\t\t\tif (!parent) continue;\n/******/ \t\t\t\t\tif (parent.hot._declinedDependencies[moduleId]) {\n/******/ \t\t\t\t\t\treturn {\n/******/ \t\t\t\t\t\t\ttype: \"declined\",\n/******/ \t\t\t\t\t\t\tchain: chain.concat([parentId]),\n/******/ \t\t\t\t\t\t\tmoduleId: moduleId,\n/******/ \t\t\t\t\t\t\tparentId: parentId\n/******/ \t\t\t\t\t\t};\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t\tif (outdatedModules.indexOf(parentId) !== -1) continue;\n/******/ \t\t\t\t\tif (parent.hot._acceptedDependencies[moduleId]) {\n/******/ \t\t\t\t\t\tif (!outdatedDependencies[parentId])\n/******/ \t\t\t\t\t\t\toutdatedDependencies[parentId] = [];\n/******/ \t\t\t\t\t\taddAllToSet(outdatedDependencies[parentId], [moduleId]);\n/******/ \t\t\t\t\t\tcontinue;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t\tdelete outdatedDependencies[parentId];\n/******/ \t\t\t\t\toutdatedModules.push(parentId);\n/******/ \t\t\t\t\tqueue.push({\n/******/ \t\t\t\t\t\tchain: chain.concat([parentId]),\n/******/ \t\t\t\t\t\tid: parentId\n/******/ \t\t\t\t\t});\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/\n/******/ \t\t\treturn {\n/******/ \t\t\t\ttype: \"accepted\",\n/******/ \t\t\t\tmoduleId: updateModuleId,\n/******/ \t\t\t\toutdatedModules: outdatedModules,\n/******/ \t\t\t\toutdatedDependencies: outdatedDependencies\n/******/ \t\t\t};\n/******/ \t\t}\n/******/\n/******/ \t\tfunction addAllToSet(a, b) {\n/******/ \t\t\tfor (var i = 0; i < b.length; i++) {\n/******/ \t\t\t\tvar item = b[i];\n/******/ \t\t\t\tif (a.indexOf(item) === -1) a.push(item);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// at begin all updates modules are outdated\n/******/ \t\t// the \"outdated\" status can propagate to parents if they don't accept the children\n/******/ \t\tvar outdatedDependencies = {};\n/******/ \t\tvar outdatedModules = [];\n/******/ \t\tvar appliedUpdate = {};\n/******/\n/******/ \t\tvar warnUnexpectedRequire = function warnUnexpectedRequire() {\n/******/ \t\t\tconsole.warn(\n/******/ \t\t\t\t\"[HMR] unexpected require(\" + result.moduleId + \") to disposed module\"\n/******/ \t\t\t);\n/******/ \t\t};\n/******/\n/******/ \t\tfor (var id in hotUpdate) {\n/******/ \t\t\tif (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {\n/******/ \t\t\t\tmoduleId = toModuleId(id);\n/******/ \t\t\t\t/** @type {TODO} */\n/******/ \t\t\t\tvar result;\n/******/ \t\t\t\tif (hotUpdate[id]) {\n/******/ \t\t\t\t\tresult = getAffectedStuff(moduleId);\n/******/ \t\t\t\t} else {\n/******/ \t\t\t\t\tresult = {\n/******/ \t\t\t\t\t\ttype: \"disposed\",\n/******/ \t\t\t\t\t\tmoduleId: id\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}\n/******/ \t\t\t\t/** @type {Error|false} */\n/******/ \t\t\t\tvar abortError = false;\n/******/ \t\t\t\tvar doApply = false;\n/******/ \t\t\t\tvar doDispose = false;\n/******/ \t\t\t\tvar chainInfo = \"\";\n/******/ \t\t\t\tif (result.chain) {\n/******/ \t\t\t\t\tchainInfo = \"\\nUpdate propagation: \" + result.chain.join(\" -> \");\n/******/ \t\t\t\t}\n/******/ \t\t\t\tswitch (result.type) {\n/******/ \t\t\t\t\tcase \"self-declined\":\n/******/ \t\t\t\t\t\tif (options.onDeclined) options.onDeclined(result);\n/******/ \t\t\t\t\t\tif (!options.ignoreDeclined)\n/******/ \t\t\t\t\t\t\tabortError = new Error(\n/******/ \t\t\t\t\t\t\t\t\"Aborted because of self decline: \" +\n/******/ \t\t\t\t\t\t\t\t\tresult.moduleId +\n/******/ \t\t\t\t\t\t\t\t\tchainInfo\n/******/ \t\t\t\t\t\t\t);\n/******/ \t\t\t\t\t\tbreak;\n/******/ \t\t\t\t\tcase \"declined\":\n/******/ \t\t\t\t\t\tif (options.onDeclined) options.onDeclined(result);\n/******/ \t\t\t\t\t\tif (!options.ignoreDeclined)\n/******/ \t\t\t\t\t\t\tabortError = new Error(\n/******/ \t\t\t\t\t\t\t\t\"Aborted because of declined dependency: \" +\n/******/ \t\t\t\t\t\t\t\t\tresult.moduleId +\n/******/ \t\t\t\t\t\t\t\t\t\" in \" +\n/******/ \t\t\t\t\t\t\t\t\tresult.parentId +\n/******/ \t\t\t\t\t\t\t\t\tchainInfo\n/******/ \t\t\t\t\t\t\t);\n/******/ \t\t\t\t\t\tbreak;\n/******/ \t\t\t\t\tcase \"unaccepted\":\n/******/ \t\t\t\t\t\tif (options.onUnaccepted) options.onUnaccepted(result);\n/******/ \t\t\t\t\t\tif (!options.ignoreUnaccepted)\n/******/ \t\t\t\t\t\t\tabortError = new Error(\n/******/ \t\t\t\t\t\t\t\t\"Aborted because \" + moduleId + \" is not accepted\" + chainInfo\n/******/ \t\t\t\t\t\t\t);\n/******/ \t\t\t\t\t\tbreak;\n/******/ \t\t\t\t\tcase \"accepted\":\n/******/ \t\t\t\t\t\tif (options.onAccepted) options.onAccepted(result);\n/******/ \t\t\t\t\t\tdoApply = true;\n/******/ \t\t\t\t\t\tbreak;\n/******/ \t\t\t\t\tcase \"disposed\":\n/******/ \t\t\t\t\t\tif (options.onDisposed) options.onDisposed(result);\n/******/ \t\t\t\t\t\tdoDispose = true;\n/******/ \t\t\t\t\t\tbreak;\n/******/ \t\t\t\t\tdefault:\n/******/ \t\t\t\t\t\tthrow new Error(\"Unexception type \" + result.type);\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif (abortError) {\n/******/ \t\t\t\t\thotSetStatus(\"abort\");\n/******/ \t\t\t\t\treturn Promise.reject(abortError);\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif (doApply) {\n/******/ \t\t\t\t\tappliedUpdate[moduleId] = hotUpdate[moduleId];\n/******/ \t\t\t\t\taddAllToSet(outdatedModules, result.outdatedModules);\n/******/ \t\t\t\t\tfor (moduleId in result.outdatedDependencies) {\n/******/ \t\t\t\t\t\tif (\n/******/ \t\t\t\t\t\t\tObject.prototype.hasOwnProperty.call(\n/******/ \t\t\t\t\t\t\t\tresult.outdatedDependencies,\n/******/ \t\t\t\t\t\t\t\tmoduleId\n/******/ \t\t\t\t\t\t\t)\n/******/ \t\t\t\t\t\t) {\n/******/ \t\t\t\t\t\t\tif (!outdatedDependencies[moduleId])\n/******/ \t\t\t\t\t\t\t\toutdatedDependencies[moduleId] = [];\n/******/ \t\t\t\t\t\t\taddAllToSet(\n/******/ \t\t\t\t\t\t\t\toutdatedDependencies[moduleId],\n/******/ \t\t\t\t\t\t\t\tresult.outdatedDependencies[moduleId]\n/******/ \t\t\t\t\t\t\t);\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t\tif (doDispose) {\n/******/ \t\t\t\t\taddAllToSet(outdatedModules, [result.moduleId]);\n/******/ \t\t\t\t\tappliedUpdate[moduleId] = warnUnexpectedRequire;\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// Store self accepted outdated modules to require them later by the module system\n/******/ \t\tvar outdatedSelfAcceptedModules = [];\n/******/ \t\tfor (i = 0; i < outdatedModules.length; i++) {\n/******/ \t\t\tmoduleId = outdatedModules[i];\n/******/ \t\t\tif (\n/******/ \t\t\t\tinstalledModules[moduleId] &&\n/******/ \t\t\t\tinstalledModules[moduleId].hot._selfAccepted &&\n/******/ \t\t\t\t// removed self-accepted modules should not be required\n/******/ \t\t\t\tappliedUpdate[moduleId] !== warnUnexpectedRequire\n/******/ \t\t\t) {\n/******/ \t\t\t\toutdatedSelfAcceptedModules.push({\n/******/ \t\t\t\t\tmodule: moduleId,\n/******/ \t\t\t\t\terrorHandler: installedModules[moduleId].hot._selfAccepted\n/******/ \t\t\t\t});\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// Now in \"dispose\" phase\n/******/ \t\thotSetStatus(\"dispose\");\n/******/ \t\tObject.keys(hotAvailableFilesMap).forEach(function(chunkId) {\n/******/ \t\t\tif (hotAvailableFilesMap[chunkId] === false) {\n/******/ \t\t\t\thotDisposeChunk(chunkId);\n/******/ \t\t\t}\n/******/ \t\t});\n/******/\n/******/ \t\tvar idx;\n/******/ \t\tvar queue = outdatedModules.slice();\n/******/ \t\twhile (queue.length > 0) {\n/******/ \t\t\tmoduleId = queue.pop();\n/******/ \t\t\tmodule = installedModules[moduleId];\n/******/ \t\t\tif (!module) continue;\n/******/\n/******/ \t\t\tvar data = {};\n/******/\n/******/ \t\t\t// Call dispose handlers\n/******/ \t\t\tvar disposeHandlers = module.hot._disposeHandlers;\n/******/ \t\t\tfor (j = 0; j < disposeHandlers.length; j++) {\n/******/ \t\t\t\tcb = disposeHandlers[j];\n/******/ \t\t\t\tcb(data);\n/******/ \t\t\t}\n/******/ \t\t\thotCurrentModuleData[moduleId] = data;\n/******/\n/******/ \t\t\t// disable module (this disables requires from this module)\n/******/ \t\t\tmodule.hot.active = false;\n/******/\n/******/ \t\t\t// remove module from cache\n/******/ \t\t\tdelete installedModules[moduleId];\n/******/\n/******/ \t\t\t// when disposing there is no need to call dispose handler\n/******/ \t\t\tdelete outdatedDependencies[moduleId];\n/******/\n/******/ \t\t\t// remove \"parents\" references from all children\n/******/ \t\t\tfor (j = 0; j < module.children.length; j++) {\n/******/ \t\t\t\tvar child = installedModules[module.children[j]];\n/******/ \t\t\t\tif (!child) continue;\n/******/ \t\t\t\tidx = child.parents.indexOf(moduleId);\n/******/ \t\t\t\tif (idx >= 0) {\n/******/ \t\t\t\t\tchild.parents.splice(idx, 1);\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// remove outdated dependency from module children\n/******/ \t\tvar dependency;\n/******/ \t\tvar moduleOutdatedDependencies;\n/******/ \t\tfor (moduleId in outdatedDependencies) {\n/******/ \t\t\tif (\n/******/ \t\t\t\tObject.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)\n/******/ \t\t\t) {\n/******/ \t\t\t\tmodule = installedModules[moduleId];\n/******/ \t\t\t\tif (module) {\n/******/ \t\t\t\t\tmoduleOutdatedDependencies = outdatedDependencies[moduleId];\n/******/ \t\t\t\t\tfor (j = 0; j < moduleOutdatedDependencies.length; j++) {\n/******/ \t\t\t\t\t\tdependency = moduleOutdatedDependencies[j];\n/******/ \t\t\t\t\t\tidx = module.children.indexOf(dependency);\n/******/ \t\t\t\t\t\tif (idx >= 0) module.children.splice(idx, 1);\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// Now in \"apply\" phase\n/******/ \t\thotSetStatus(\"apply\");\n/******/\n/******/ \t\thotCurrentHash = hotUpdateNewHash;\n/******/\n/******/ \t\t// insert new code\n/******/ \t\tfor (moduleId in appliedUpdate) {\n/******/ \t\t\tif (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = appliedUpdate[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// call accept handlers\n/******/ \t\tvar error = null;\n/******/ \t\tfor (moduleId in outdatedDependencies) {\n/******/ \t\t\tif (\n/******/ \t\t\t\tObject.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)\n/******/ \t\t\t) {\n/******/ \t\t\t\tmodule = installedModules[moduleId];\n/******/ \t\t\t\tif (module) {\n/******/ \t\t\t\t\tmoduleOutdatedDependencies = outdatedDependencies[moduleId];\n/******/ \t\t\t\t\tvar callbacks = [];\n/******/ \t\t\t\t\tfor (i = 0; i < moduleOutdatedDependencies.length; i++) {\n/******/ \t\t\t\t\t\tdependency = moduleOutdatedDependencies[i];\n/******/ \t\t\t\t\t\tcb = module.hot._acceptedDependencies[dependency];\n/******/ \t\t\t\t\t\tif (cb) {\n/******/ \t\t\t\t\t\t\tif (callbacks.indexOf(cb) !== -1) continue;\n/******/ \t\t\t\t\t\t\tcallbacks.push(cb);\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t\tfor (i = 0; i < callbacks.length; i++) {\n/******/ \t\t\t\t\t\tcb = callbacks[i];\n/******/ \t\t\t\t\t\ttry {\n/******/ \t\t\t\t\t\t\tcb(moduleOutdatedDependencies);\n/******/ \t\t\t\t\t\t} catch (err) {\n/******/ \t\t\t\t\t\t\tif (options.onErrored) {\n/******/ \t\t\t\t\t\t\t\toptions.onErrored({\n/******/ \t\t\t\t\t\t\t\t\ttype: \"accept-errored\",\n/******/ \t\t\t\t\t\t\t\t\tmoduleId: moduleId,\n/******/ \t\t\t\t\t\t\t\t\tdependencyId: moduleOutdatedDependencies[i],\n/******/ \t\t\t\t\t\t\t\t\terror: err\n/******/ \t\t\t\t\t\t\t\t});\n/******/ \t\t\t\t\t\t\t}\n/******/ \t\t\t\t\t\t\tif (!options.ignoreErrored) {\n/******/ \t\t\t\t\t\t\t\tif (!error) error = err;\n/******/ \t\t\t\t\t\t\t}\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// Load self accepted modules\n/******/ \t\tfor (i = 0; i < outdatedSelfAcceptedModules.length; i++) {\n/******/ \t\t\tvar item = outdatedSelfAcceptedModules[i];\n/******/ \t\t\tmoduleId = item.module;\n/******/ \t\t\thotCurrentParents = [moduleId];\n/******/ \t\t\ttry {\n/******/ \t\t\t\t__nested_webpack_require_25974__(moduleId);\n/******/ \t\t\t} catch (err) {\n/******/ \t\t\t\tif (typeof item.errorHandler === \"function\") {\n/******/ \t\t\t\t\ttry {\n/******/ \t\t\t\t\t\titem.errorHandler(err);\n/******/ \t\t\t\t\t} catch (err2) {\n/******/ \t\t\t\t\t\tif (options.onErrored) {\n/******/ \t\t\t\t\t\t\toptions.onErrored({\n/******/ \t\t\t\t\t\t\t\ttype: \"self-accept-error-handler-errored\",\n/******/ \t\t\t\t\t\t\t\tmoduleId: moduleId,\n/******/ \t\t\t\t\t\t\t\terror: err2,\n/******/ \t\t\t\t\t\t\t\toriginalError: err\n/******/ \t\t\t\t\t\t\t});\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t\tif (!options.ignoreErrored) {\n/******/ \t\t\t\t\t\t\tif (!error) error = err2;\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t\tif (!error) error = err;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t} else {\n/******/ \t\t\t\t\tif (options.onErrored) {\n/******/ \t\t\t\t\t\toptions.onErrored({\n/******/ \t\t\t\t\t\t\ttype: \"self-accept-errored\",\n/******/ \t\t\t\t\t\t\tmoduleId: moduleId,\n/******/ \t\t\t\t\t\t\terror: err\n/******/ \t\t\t\t\t\t});\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t\tif (!options.ignoreErrored) {\n/******/ \t\t\t\t\t\tif (!error) error = err;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\t// handle errors in accept handlers and self accepted module load\n/******/ \t\tif (error) {\n/******/ \t\t\thotSetStatus(\"fail\");\n/******/ \t\t\treturn Promise.reject(error);\n/******/ \t\t}\n/******/\n/******/ \t\thotSetStatus(\"idle\");\n/******/ \t\treturn new Promise(function(resolve) {\n/******/ \t\t\tresolve(outdatedModules);\n/******/ \t\t});\n/******/ \t}\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __nested_webpack_require_25974__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {},\n/******/ \t\t\thot: hotCreateModule(moduleId),\n/******/ \t\t\tparents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),\n/******/ \t\t\tchildren: []\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__nested_webpack_require_25974__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__nested_webpack_require_25974__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__nested_webpack_require_25974__.d = function(exports, name, getter) {\n/******/ \t\tif(!__nested_webpack_require_25974__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__nested_webpack_require_25974__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__nested_webpack_require_25974__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __nested_webpack_require_25974__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__nested_webpack_require_25974__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_25974__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__nested_webpack_require_25974__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__nested_webpack_require_25974__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__nested_webpack_require_25974__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__nested_webpack_require_25974__.p = \"\";\n/******/\n/******/ \t// __webpack_hash__\n/******/ \t__nested_webpack_require_25974__.h = function() { return hotCurrentHash; };\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn hotCreateRequire(12)(__nested_webpack_require_25974__.s = 12);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M73.142857 336.64h526.628572v43.885714H73.142857zM73.142857 643.657143h526.628572v43.885714H73.142857zM336.457143 117.028571h43.885714v789.942858h-43.885714zM204.8 73.142857h614.4a131.657143 131.657143 0 0 1 131.657143 131.657143v614.4a131.657143 131.657143 0 0 1-131.657143 131.657143H204.8A131.657143 131.657143 0 0 1 73.142857 819.2V204.8A131.84 131.84 0 0 1 204.8 73.142857z m0 43.885714a87.771429 87.771429 0 0 0-87.771429 87.771429v614.4a87.771429 87.771429 0 0 0 87.771429 87.771429h614.4a87.771429 87.771429 0 0 0 87.771429-87.771429V204.8a87.771429 87.771429 0 0 0-87.771429-87.771429zM819.2 73.142857h-219.428571v877.714286h219.428571a131.657143 131.657143 0 0 0 131.657143-131.657143V204.8A131.84 131.84 0 0 0 819.2 73.142857z m44.068571 460.982857h-65.828571v65.828572H753.371429v-65.828572h-65.828572V490.057143h65.828572v-65.828572h44.068571v65.828572h65.828571z\\\"/></svg>\";\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M380.342857 336.457143h526.811429v43.885714H380.342857z m0 307.2h526.811429v43.885714H380.342857zM643.657143 117.028571h43.885714v789.942858h-43.885714zM204.8 73.142857h614.582857A131.474286 131.474286 0 0 1 950.857143 204.8v614.4a131.657143 131.657143 0 0 1-131.657143 131.657143H204.8A131.657143 131.657143 0 0 1 73.142857 819.2V204.8A131.657143 131.657143 0 0 1 204.8 73.142857z m0 43.885714a87.588571 87.588571 0 0 0-87.588571 87.771429v614.4a87.588571 87.588571 0 0 0 87.588571 87.771429h614.582857a87.771429 87.771429 0 0 0 87.771429-87.771429V204.8a87.771429 87.771429 0 0 0-87.771429-87.771429zM204.8 73.142857A131.657143 131.657143 0 0 0 73.142857 204.8v614.4a131.657143 131.657143 0 0 0 131.657143 131.657143h219.428571V73.142857z m131.84 460.8h-65.828571v65.828572h-43.885715v-65.828572h-65.828571v-43.885714h65.828571v-65.828572h43.885715v65.828572h65.828571z\\\"/></svg>\";\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M73.142857 599.771429h877.714286v43.885714H73.142857zM336.457143 380.342857h43.885714v526.628572h-43.885714z m307.2 0h43.885714v526.628572h-43.885714zM204.8 73.142857h614.4a131.657143 131.657143 0 0 1 131.657143 131.657143v614.4a131.657143 131.657143 0 0 1-131.657143 131.657143H204.8A131.657143 131.657143 0 0 1 73.142857 819.2V204.8A131.657143 131.657143 0 0 1 204.8 73.142857z m0 43.885714a87.771429 87.771429 0 0 0-87.771429 87.771429v614.4a87.588571 87.588571 0 0 0 87.771429 87.771429h614.4a87.588571 87.588571 0 0 0 87.771429-87.771429V204.8a87.771429 87.771429 0 0 0-87.771429-87.771429zM819.2 73.142857H204.8A131.657143 131.657143 0 0 0 73.142857 204.8v219.428571h877.714286v-219.428571A131.657143 131.657143 0 0 0 819.2 73.142857z m-219.428571 197.485714h-65.828572v65.828572h-43.885714v-65.828572h-65.828572v-43.885714h65.828572V160.914286h43.885714v65.828571h65.828572z\\\"/></svg>\";\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M204.8 73.142857h614.4a131.657143 131.657143 0 0 1 131.657143 131.657143v614.4a131.657143 131.657143 0 0 1-131.657143 131.657143H204.8A131.657143 131.657143 0 0 1 73.142857 819.2V204.8A131.84 131.84 0 0 1 204.8 73.142857z m0 43.885714a87.771429 87.771429 0 0 0-87.771429 87.771429v614.4a87.771429 87.771429 0 0 0 87.771429 87.771429h614.4a87.771429 87.771429 0 0 0 87.771429-87.771429V204.8a87.771429 87.771429 0 0 0-87.771429-87.771429zM73.142857 336.457143h877.714286v44.068571H73.142857zM336.64 117.028571h43.885714v526.628572h-43.885714z m307.017143 0h44.068571v526.628572H643.657143zM73.142857 599.771429v219.428571a131.657143 131.657143 0 0 0 131.657143 131.657143h614.4a131.657143 131.657143 0 0 0 131.657143-131.657143v-219.428571z m526.628572 197.485714h-65.645715v65.828571H490.057143v-65.828571h-65.828572v-43.885714h65.828572v-65.828572h44.068571v65.828572h65.645715z\\\"/></svg>\";\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M925.99596 99.038384c-25.470707-25.6-60.121212-39.822222-96.323233-39.822222H194.19798c-36.072727 0-70.723232 14.351515-96.323233 39.822222-25.6 25.6-39.822222 60.121212-39.822222 96.323232v635.474748c0 36.072727 14.351515 70.723232 39.822222 96.323232C123.474747 952.759596 158.125253 967.111111 194.19798 967.111111h635.474747c36.072727 0 70.723232-14.351515 96.323233-39.951515 25.6-25.6 39.951515-60.121212 39.951515-96.323232V195.361616c0-36.072727-14.351515-70.723232-39.951515-96.323232z m-277.850505 5.559596v226.909091H375.725253V104.59798h272.420202zM103.434343 195.361616c0-24.048485 9.567677-47.191919 26.634344-64.129293 17.066667-17.066667 40.080808-26.634343 64.129293-26.634343h136.145454v226.909091H103.434343V195.361616z m90.763637 726.367677c-24.048485 0-47.191919-9.567677-64.129293-26.634344-17.066667-17.066667-26.634343-40.080808-26.634344-64.129292V649.309091h226.909091v272.420202H194.19798z m181.527273 0V649.309091h272.290909v272.420202H375.725253z m544.711111-90.892929c0 24.048485-9.567677 47.191919-26.634344 64.129293-17.066667 17.066667-40.080808 26.634343-64.129293 26.634343H693.527273V649.309091h226.909091v181.527273zM693.527273 331.507071V104.59798h136.145454c24.048485 0 47.191919 9.567677 64.129293 26.634343 17.066667 17.066667 26.634343 40.080808 26.634344 64.129293v136.145455H693.527273z\\\"/></svg>\";\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M336.457143 73.142857h43.885714v877.714286h-43.885714z m307.382857 0h43.702857v877.714286h-43.702857z m-438.857143 0h614.4A131.657143 131.657143 0 0 1 950.857143 204.8v614.4a131.474286 131.474286 0 0 1-131.474286 131.657143h-614.4A131.657143 131.657143 0 0 1 73.142857 819.2V204.8A131.84 131.84 0 0 1 204.982857 73.142857z m0 43.885714a87.588571 87.588571 0 0 0-87.771428 87.771429v614.4a87.588571 87.588571 0 0 0 87.771428 87.771429h614.4a87.771429 87.771429 0 0 0 87.771429-87.771429V204.8a87.771429 87.771429 0 0 0-87.771429-87.771429zM73.142857 336.457143h877.714286v307.2H73.142857z m292.571429 43.885714v219.428572h292.571428v-219.428572z\\\"/></svg>\";\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M925.996 99.038c-25.47-25.6-60.121-39.822-96.323-39.822H194.198c-75.12 0.13-136.016 61.026-136.145 136.146v635.345c0 36.073 14.351 70.723 39.822 96.323 25.6 25.73 60.25 40.081 96.323 40.081h635.475c36.072 0 70.723-14.351 96.323-39.951 25.6-25.6 39.951-60.122 39.951-96.324V195.362c0-36.073-14.351-70.724-39.951-96.324z m-365.77 494.287L512 545.228l-48.226 48.097-32.194-31.935 48.355-48.226-48.226-48.097 32.194-32.194L512 480.97l48.097-48.097 32.194 32.194-48.097 48.097 48.226 48.226-32.194 31.935zM103.434 195.362c0-24.049 9.568-47.192 26.635-64.13 17.066-17.066 40.08-26.634 64.129-26.634h136.145v226.91H103.434V195.361z m0 181.656h226.91V649.31h-226.91V377.02z m90.764 544.84c-24.049 0-47.192-9.567-64.13-26.634-17.066-17.066-26.634-40.08-26.634-64.258V694.69h226.91v227.168H194.197z m726.238-90.763c0 24.048-9.438 47.192-26.505 64.259-17.066 17.066-40.21 26.634-64.258 26.505H693.527V694.69h226.91v136.404z m0-181.786H693.527V377.02h226.91v272.29zM693.527 331.507V104.598h136.146c24.048 0 47.192 9.438 64.258 26.505 17.067 17.067 26.635 40.21 26.505 64.259v136.145H693.527z\\\"/></svg>\";\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M925.99596 99.038384c-25.470707-25.6-60.121212-39.822222-96.323233-39.822222H194.19798c-36.072727 0-70.723232 14.351515-96.323233 39.822222-25.6 25.6-39.822222 60.121212-39.822222 96.323232v635.474748c0 36.072727 14.351515 70.723232 39.822222 96.323232C123.474747 952.759596 158.125253 967.111111 194.19798 967.111111h635.474747c36.072727 0 70.723232-14.351515 96.323233-39.951515 25.6-25.6 39.951515-60.121212 39.951515-96.323232V195.361616c0-36.072727-14.351515-70.723232-39.951515-96.323232z m-550.270707 5.559596h272.290909v227.167677H375.725253V104.59798z m56.242424 360.468687l31.935353-32.19394 48.09697 48.226263 48.09697-48.226263 32.193939 32.19394-48.09697 48.096969 48.226263 48.226263-32.193939 31.935354-48.226263-48.09697-48.226263 48.09697-31.935353-31.935354 48.226262-48.226263-48.096969-48.096969zM103.434343 195.361616c0-24.048485 9.567677-47.191919 26.634344-64.129293 17.066667-17.066667 40.080808-26.634343 64.129293-26.634343h136.145454v227.167677H103.434343V195.361616z m817.002021 635.733333c0 24.048485-9.567677 47.191919-26.634344 64.258586-17.066667 17.066667-40.080808 26.634343-64.129293 26.634344H194.19798c-24.048485 0-47.191919-9.567677-64.258586-26.634344C112.872727 878.157576 103.434343 855.014141 103.434343 830.836364V694.690909h226.909091v226.909091h45.381819V694.690909h272.290909v226.909091h45.381818V694.690909h226.909091v136.40404z m0-499.329292H693.527273V104.59798h136.145454c24.048485 0 47.191919 9.567677 64.129293 26.634343 17.066667 17.066667 26.634343 40.080808 26.634344 64.129293v136.404041z\\\"/></svg>\";\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?><!doctype html><svg class=icon width=20px height=20.00px viewBox=\\\"0 0 1024 1024\\\" version=1.1 xmlns=http://www.w3.org/2000/svg><path fill=#595959 d=\\\"M764.42168889 830.5152c0 30.23530667-24.61013333 54.84430222-54.84316444 54.84430222H314.42147555c-30.23416889 0-54.84316445-24.61013333-54.84316444-54.84430222V248.32796445h504.84337778v582.18723555zM369.26577778 149.89084445c0-6.32832 4.92202667-11.25034667 11.25034667-11.25034667H644.18702222c6.32832 0 11.25034667 4.92202667 11.25034667 11.25034667v33.04675555H369.26577778V149.89084445z m559.68768 33.04675555H720.82773333V149.89084445c0-42.1888-34.45191111-76.64071111-76.64071111-76.64071112H380.51612445c-42.1888 0-76.64071111 34.45191111-76.64071112 76.64071112v33.04675555h-208.82773333c-18.28181333 0-33.04789333 14.76608-33.04789333 33.04675555s14.76608 33.04675555 33.04675555 33.04675556h98.43825778v581.48408889c0 66.79779555 54.14001778 120.93781333 120.93667555 120.93781333h395.1570489c66.79665778 0 120.93667555-54.14001778 120.93667555-120.93781333V248.32796445h98.43825778c18.28067555 0 33.04675555-14.76494222 33.04675555-33.04675556s-14.76608-32.34360889-33.04675555-32.34360889zM512 786.21923555c18.28181333 0 33.04675555-14.76608 33.04675555-33.04789333v-351.56195555c0-18.28181333-14.76494222-33.04675555-33.04675555-33.04675556s-33.04675555 14.76494222-33.04675555 33.04675556v351.56195555c0 18.28181333 14.76494222 33.04789333 33.04675555 33.04789333m-153.98456889 0c18.28181333 0 33.04675555-14.76608 33.04675556-33.04789333v-351.56195555c0-18.28181333-14.76494222-33.04675555-33.04675556-33.04675556s-33.04675555 14.76494222-33.04675556 33.04675556v351.56195555c0.70314667 18.28181333 15.46922667 33.04789333 33.04675556 33.04789333m307.96913778 0c18.28067555 0 33.04675555-14.76608 33.04675556-33.04789333v-351.56195555c0-18.28181333-14.76608-33.04675555-33.04675556-33.04675556s-33.04675555 14.76494222-33.04675556 33.04675556v351.56195555c0 18.28181333 14.76494222 33.04789333 33.04675556 33.04789333\\\"/></svg>\";\n\n/***/ }),\n/* 10 */\n/***/ (function(module, __nested_webpack_exports__, __nested_webpack_require_42296__) {\n\n\"use strict\";\n__nested_webpack_require_42296__.r(__nested_webpack_exports__);\n\n// EXTERNAL MODULE: external {\"commonjs\":\"quill\",\"commonjs2\":\"quill\",\"amd\":\"quill\",\"root\":\"Quill\"}\nvar external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_ = __nested_webpack_require_42296__(0);\nvar external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default = /*#__PURE__*/__nested_webpack_require_42296__.n(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_);\n\n// CONCATENATED MODULE: ./src/utils/index.js\nfunction css(domNode, rules) {\n if (typeof rules === 'object') {\n for (let prop in rules) {\n domNode.style[prop] = rules[prop];\n }\n }\n}\n/**\n * getRelativeRect\n * @param {Object} targetRect rect data for target element\n * @param {Element} container container element\n * @return {Object} an object with rect data\n */\n\nfunction getRelativeRect(targetRect, container) {\n let containerRect = container.getBoundingClientRect();\n return {\n x: targetRect.x - containerRect.x - container.scrollLeft,\n y: targetRect.y - containerRect.y - container.scrollTop,\n x1: targetRect.x - containerRect.x - container.scrollLeft + targetRect.width,\n y1: targetRect.y - containerRect.y - container.scrollTop + targetRect.height,\n width: targetRect.width,\n height: targetRect.height\n };\n}\n/**\n * _omit\n * @param {Object} obj target Object\n * @param {Array} uselessKeys keys of removed properties\n * @return {Object} new Object without useless properties\n */\n\nfunction _omit(obj, uselessKeys) {\n return obj && Object.keys(obj).reduce((acc, key) => {\n return uselessKeys.includes(key) ? acc : Object.assign({}, acc, {\n [key]: obj[key]\n });\n }, {});\n}\n/**\n * getEventComposedPath\n * compatibility fixed for Event.path/Event.composedPath\n * Event.path is only for chrome/opera\n * Event.composedPath is for Safari, FF\n * Neither for Micro Edge\n * @param {Event} evt\n * @return {Array} an array of event.path\n */\n\nfunction getEventComposedPath(evt) {\n let path; // chrome, opera, safari, firefox\n\n path = evt.path || evt.composedPath && evt.composedPath(); // other: edge\n\n if (path == undefined && evt.target) {\n path = [];\n let target = evt.target;\n path.push(target);\n\n while (target && target.parentNode) {\n target = target.parentNode;\n path.push(target);\n }\n }\n\n return path;\n}\nfunction convertToHex(rgb) {\n var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; // if rgb\n\n if (/^(rgb|RGB)/.test(rgb)) {\n var color = rgb.toString().match(/\\d+/g);\n var hex = \"#\";\n\n for (var i = 0; i < 3; i++) {\n hex += (\"0\" + Number(color[i]).toString(16)).slice(-2);\n }\n\n return hex;\n } else if (reg.test(rgb)) {\n var aNum = rgb.replace(/#/, \"\").split(\"\");\n\n if (aNum.length === 6) {\n return rgb;\n } else if (aNum.length === 3) {\n var numHex = \"#\";\n\n for (var i = 0; i < aNum.length; i += 1) {\n numHex += aNum[i] + aNum[i];\n }\n\n return numHex;\n }\n }\n\n return rgb;\n}\n// CONCATENATED MODULE: ./src/modules/table-column-tool.js\n\n\nconst COL_TOOL_HEIGHT = 12;\nconst COL_TOOL_CELL_HEIGHT = 12;\nconst ROW_TOOL_WIDTH = 12;\nconst CELL_MIN_WIDTH = 50;\nconst PRIMARY_COLOR = '#35A7ED';\nclass table_column_tool_TableColumnTool {\n constructor(table, quill, options) {\n if (!table) return null;\n this.table = table;\n this.quill = quill;\n this.options = options;\n this.domNode = null;\n this.initColTool();\n }\n\n initColTool() {\n const parent = this.quill.root.parentNode;\n const tableRect = this.table.getBoundingClientRect();\n const containerRect = parent.getBoundingClientRect();\n const tableViewRect = this.table.parentNode.getBoundingClientRect();\n this.domNode = document.createElement('div');\n this.domNode.classList.add('qlbt-col-tool');\n this.updateToolCells();\n parent.appendChild(this.domNode);\n css(this.domNode, {\n width: \"\".concat(tableViewRect.width, \"px\"),\n height: \"\".concat(COL_TOOL_HEIGHT, \"px\"),\n left: \"\".concat(tableViewRect.left - containerRect.left + parent.scrollLeft, \"px\"),\n top: \"\".concat(tableViewRect.top - containerRect.top + parent.scrollTop - COL_TOOL_HEIGHT - 5, \"px\")\n });\n }\n\n createToolCell() {\n const toolCell = document.createElement('div');\n toolCell.classList.add('qlbt-col-tool-cell');\n const resizeHolder = document.createElement('div');\n resizeHolder.classList.add('qlbt-col-tool-cell-holder');\n css(toolCell, {\n 'height': \"\".concat(COL_TOOL_CELL_HEIGHT, \"px\")\n });\n toolCell.appendChild(resizeHolder);\n return toolCell;\n }\n\n updateToolCells() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n const CellsInFirstRow = tableContainer.children.tail.children.head.children;\n const tableCols = tableContainer.colGroup().children;\n const cellsNumber = computeCellsNumber(CellsInFirstRow);\n let existCells = Array.from(this.domNode.querySelectorAll('.qlbt-col-tool-cell'));\n\n for (let index = 0; index < Math.max(cellsNumber, existCells.length); index++) {\n let col = tableCols.at(index);\n let colWidth = col && parseInt(col.formats()[col.statics.blotName].width, 10); // if cell already exist\n\n let toolCell = null;\n\n if (!existCells[index]) {\n toolCell = this.createToolCell();\n this.domNode.appendChild(toolCell);\n this.addColCellHolderHandler(toolCell); // set tool cell min-width\n\n css(toolCell, {\n 'min-width': \"\".concat(colWidth, \"px\")\n });\n } else if (existCells[index] && index >= cellsNumber) {\n existCells[index].remove();\n } else {\n toolCell = existCells[index]; // set tool cell min-width\n\n css(toolCell, {\n 'min-width': \"\".concat(colWidth, \"px\")\n });\n }\n }\n }\n\n destroy() {\n this.domNode.remove();\n return null;\n }\n\n addColCellHolderHandler(cell) {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n const $holder = cell.querySelector(\".qlbt-col-tool-cell-holder\");\n let dragging = false;\n let x0 = 0;\n let x = 0;\n let delta = 0;\n let width0 = 0; // helpLine relation varrible\n\n let tableRect = {};\n let cellRect = {};\n let $helpLine = null;\n\n const handleDrag = e => {\n e.preventDefault();\n\n if (dragging) {\n x = e.clientX;\n\n if (width0 + x - x0 >= CELL_MIN_WIDTH) {\n delta = x - x0;\n } else {\n delta = CELL_MIN_WIDTH - width0;\n }\n\n css($helpLine, {\n 'left': \"\".concat(cellRect.left + cellRect.width - 1 + delta, \"px\")\n });\n }\n };\n\n const handleMouseup = e => {\n e.preventDefault();\n const existCells = Array.from(this.domNode.querySelectorAll('.qlbt-col-tool-cell'));\n const colIndex = existCells.indexOf(cell);\n const colBlot = tableContainer.colGroup().children.at(colIndex);\n\n if (dragging) {\n colBlot.format('width', width0 + delta);\n css(cell, {\n 'min-width': \"\".concat(width0 + delta, \"px\")\n });\n x0 = 0;\n x = 0;\n delta = 0;\n width0 = 0;\n dragging = false;\n $holder.classList.remove('dragging');\n }\n\n document.removeEventListener('mousemove', handleDrag, false);\n document.removeEventListener('mouseup', handleMouseup, false);\n tableRect = {};\n cellRect = {};\n $helpLine.remove();\n $helpLine = null;\n tableContainer.updateTableWidth();\n const tableSelection = this.quill.getModule('better-table').tableSelection;\n tableSelection && tableSelection.clearSelection();\n };\n\n const handleMousedown = e => {\n document.addEventListener('mousemove', handleDrag, false);\n document.addEventListener('mouseup', handleMouseup, false);\n tableRect = this.table.getBoundingClientRect();\n cellRect = cell.getBoundingClientRect();\n $helpLine = document.createElement('div');\n css($helpLine, {\n position: 'fixed',\n top: \"\".concat(cellRect.top, \"px\"),\n left: \"\".concat(cellRect.left + cellRect.width - 1, \"px\"),\n zIndex: '100',\n height: \"\".concat(tableRect.height + COL_TOOL_HEIGHT + 4, \"px\"),\n width: '1px',\n backgroundColor: PRIMARY_COLOR\n });\n document.body.appendChild($helpLine);\n dragging = true;\n x0 = e.clientX;\n width0 = cellRect.width;\n $holder.classList.add('dragging');\n };\n\n $holder.addEventListener('mousedown', handleMousedown, false);\n }\n\n colToolCells() {\n return Array.from(this.domNode.querySelectorAll('.qlbt-col-tool-cell'));\n }\n\n}\n\nfunction computeCellsNumber(CellsInFirstRow) {\n return CellsInFirstRow.reduce((sum, cell) => {\n const cellColspan = cell.formats().colspan;\n sum = sum + parseInt(cellColspan, 10);\n return sum;\n }, 0);\n}\n// CONCATENATED MODULE: ./src/formats/header.js\n\n\nconst Block = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import(\"blots/block\");\n\nclass header_Header extends Block {\n static create(value) {\n if (typeof value === 'string') {\n value = {\n value\n };\n }\n\n const node = super.create(value.value);\n CELL_IDENTITY_KEYS.forEach(key => {\n if (value[key]) node.setAttribute(\"data-\".concat(key), value[key]);\n });\n CELL_ATTRIBUTES.forEach(key => {\n if (value[key]) node.setAttribute(\"data-\".concat(key), value[key]);\n });\n return node;\n }\n\n static formats(domNode) {\n const formats = {};\n formats.value = this.tagName.indexOf(domNode.tagName) + 1;\n return CELL_ATTRIBUTES.concat(CELL_IDENTITY_KEYS).reduce((formats, attribute) => {\n if (domNode.hasAttribute(\"data-\".concat(attribute))) {\n formats[attribute] = domNode.getAttribute(\"data-\".concat(attribute)) || undefined;\n }\n\n return formats;\n }, formats);\n }\n\n format(name, value) {\n const {\n row,\n cell,\n rowspan,\n colspan\n } = header_Header.formats(this.domNode);\n\n if (name === header_Header.blotName) {\n if (value) {\n super.format(name, {\n value,\n row,\n cell,\n rowspan,\n colspan\n });\n } else {\n if (row) {\n this.replaceWith(TableCellLine.blotName, {\n row,\n cell,\n rowspan,\n colspan\n });\n } else {\n super.format(name, value);\n }\n }\n } else {\n super.format(name, value);\n }\n }\n\n optimize(context) {\n const {\n row,\n rowspan,\n colspan\n } = header_Header.formats(this.domNode);\n\n if (row && !(this.parent instanceof TableCell)) {\n this.wrap(TableCell.blotName, {\n row,\n colspan,\n rowspan\n });\n } // ShadowBlot optimize\n\n\n this.enforceAllowedChildren();\n\n if (this.uiNode != null && this.uiNode !== this.domNode.firstChild) {\n this.domNode.insertBefore(this.uiNode, this.domNode.firstChild);\n }\n\n if (this.children.length === 0) {\n if (this.statics.defaultChild != null) {\n const child = this.scroll.create(this.statics.defaultChild.blotName);\n this.appendChild(child); // TODO double check if necessary\n // child.optimize(context);\n } else {\n this.remove();\n }\n } // Block optimize\n\n\n this.cache = {};\n }\n\n}\n\nheader_Header.blotName = 'header';\nheader_Header.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n/* harmony default export */ var header = (header_Header);\n// CONCATENATED MODULE: ./src/formats/table.js\n\n\n\nconst Break = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import(\"blots/break\");\nconst table_Block = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import(\"blots/block\");\nconst Container = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import(\"blots/container\");\nconst COL_ATTRIBUTES = [\"width\"];\nconst COL_DEFAULT = {\n width: 100\n};\nconst CELL_IDENTITY_KEYS = [\"row\", \"cell\"];\nconst CELL_ATTRIBUTES = [\"rowspan\", \"colspan\"];\nconst CELL_DEFAULT = {\n rowspan: 1,\n colspan: 1\n};\nconst ERROR_LIMIT = 5;\n\nclass TableCellLine extends table_Block {\n static create(value) {\n const node = super.create(value);\n CELL_IDENTITY_KEYS.forEach(key => {\n let identityMaker = key === 'row' ? table_rowId : table_cellId;\n node.setAttribute(\"data-\".concat(key), value[key] || identityMaker());\n });\n CELL_ATTRIBUTES.forEach(attrName => {\n node.setAttribute(\"data-\".concat(attrName), value[attrName] || CELL_DEFAULT[attrName]);\n });\n\n if (value['cell-bg']) {\n node.setAttribute('data-cell-bg', value['cell-bg']);\n }\n\n return node;\n }\n\n static formats(domNode) {\n const formats = {};\n return CELL_ATTRIBUTES.concat(CELL_IDENTITY_KEYS).concat(['cell-bg']).reduce((formats, attribute) => {\n if (domNode.hasAttribute(\"data-\".concat(attribute))) {\n formats[attribute] = domNode.getAttribute(\"data-\".concat(attribute)) || undefined;\n }\n\n return formats;\n }, formats);\n }\n\n format(name, value) {\n if (CELL_ATTRIBUTES.concat(CELL_IDENTITY_KEYS).indexOf(name) > -1) {\n if (value) {\n this.domNode.setAttribute(\"data-\".concat(name), value);\n } else {\n this.domNode.removeAttribute(\"data-\".concat(name));\n }\n } else if (name === 'cell-bg') {\n if (value) {\n this.domNode.setAttribute('data-cell-bg', value);\n } else {\n this.domNode.removeAttribute('data-cell-bg');\n }\n } else if (name === 'header') {\n if (!value) return;\n const {\n row,\n cell,\n rowspan,\n colspan\n } = TableCellLine.formats(this.domNode);\n super.format(name, {\n value,\n row,\n cell,\n rowspan,\n colspan\n });\n } else {\n super.format(name, value);\n }\n }\n\n optimize(context) {\n // cover shadowBlot's wrap call, pass params parentBlot initialize\n // needed\n const rowId = this.domNode.getAttribute('data-row');\n const rowspan = this.domNode.getAttribute('data-rowspan');\n const colspan = this.domNode.getAttribute('data-colspan');\n const cellBg = this.domNode.getAttribute('data-cell-bg');\n\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\n this.wrap(this.statics.requiredContainer.blotName, {\n row: rowId,\n colspan,\n rowspan,\n 'cell-bg': cellBg\n });\n }\n\n super.optimize(context);\n }\n\n tableCell() {\n return this.parent;\n }\n\n}\n\nTableCellLine.blotName = \"table-cell-line\";\nTableCellLine.className = \"qlbt-cell-line\";\nTableCellLine.tagName = \"P\";\n\nclass TableCell extends Container {\n checkMerge() {\n if (super.checkMerge() && this.next.children.head != null) {\n const thisHead = this.children.head.formats()[this.children.head.statics.blotName];\n const thisTail = this.children.tail.formats()[this.children.tail.statics.blotName];\n const nextHead = this.next.children.head.formats()[this.next.children.head.statics.blotName];\n const nextTail = this.next.children.tail.formats()[this.next.children.tail.statics.blotName];\n return thisHead.cell === thisTail.cell && thisHead.cell === nextHead.cell && thisHead.cell === nextTail.cell;\n }\n\n return false;\n }\n\n static create(value) {\n const node = super.create(value);\n node.setAttribute(\"data-row\", value.row);\n CELL_ATTRIBUTES.forEach(attrName => {\n if (value[attrName]) {\n node.setAttribute(attrName, value[attrName]);\n }\n });\n\n if (value['cell-bg']) {\n node.setAttribute('data-cell-bg', value['cell-bg']);\n node.style.backgroundColor = value['cell-bg'];\n }\n\n return node;\n }\n\n static formats(domNode) {\n const formats = {};\n\n if (domNode.hasAttribute(\"data-row\")) {\n formats[\"row\"] = domNode.getAttribute(\"data-row\");\n }\n\n if (domNode.hasAttribute(\"data-cell-bg\")) {\n formats[\"cell-bg\"] = domNode.getAttribute(\"data-cell-bg\");\n }\n\n return CELL_ATTRIBUTES.reduce((formats, attribute) => {\n if (domNode.hasAttribute(attribute)) {\n formats[attribute] = domNode.getAttribute(attribute);\n }\n\n return formats;\n }, formats);\n }\n\n cellOffset() {\n if (this.parent) {\n return this.parent.children.indexOf(this);\n }\n\n return -1;\n }\n\n formats() {\n const formats = {};\n\n if (this.domNode.hasAttribute(\"data-row\")) {\n formats[\"row\"] = this.domNode.getAttribute(\"data-row\");\n }\n\n if (this.domNode.hasAttribute(\"data-cell-bg\")) {\n formats[\"cell-bg\"] = this.domNode.getAttribute(\"data-cell-bg\");\n }\n\n return CELL_ATTRIBUTES.reduce((formats, attribute) => {\n if (this.domNode.hasAttribute(attribute)) {\n formats[attribute] = this.domNode.getAttribute(attribute);\n }\n\n return formats;\n }, formats);\n }\n\n toggleAttribute(name, value) {\n if (value) {\n this.domNode.setAttribute(name, value);\n } else {\n this.domNode.removeAttribute(name);\n }\n }\n\n formatChildren(name, value) {\n this.children.forEach(child => {\n child.format(name, value);\n });\n }\n\n format(name, value) {\n if (CELL_ATTRIBUTES.indexOf(name) > -1) {\n this.toggleAttribute(name, value);\n this.formatChildren(name, value);\n } else if (['row'].indexOf(name) > -1) {\n this.toggleAttribute(\"data-\".concat(name), value);\n this.formatChildren(name, value);\n } else if (name === 'cell-bg') {\n this.toggleAttribute('data-cell-bg', value);\n this.formatChildren(name, value);\n\n if (value) {\n this.domNode.style.backgroundColor = value;\n } else {\n this.domNode.style.backgroundColor = 'initial';\n }\n } else {\n super.format(name, value);\n }\n }\n\n optimize(context) {\n const rowId = this.domNode.getAttribute(\"data-row\");\n\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\n this.wrap(this.statics.requiredContainer.blotName, {\n row: rowId\n });\n }\n\n super.optimize(context);\n }\n\n row() {\n return this.parent;\n }\n\n rowOffset() {\n if (this.row()) {\n return this.row().rowOffset();\n }\n\n return -1;\n }\n\n table() {\n return this.row() && this.row().table();\n }\n\n}\n\nTableCell.blotName = \"table\";\nTableCell.tagName = \"TD\";\n\nclass TableRow extends Container {\n checkMerge() {\n if (super.checkMerge() && this.next.children.head != null) {\n const thisHead = this.children.head.formats();\n const thisTail = this.children.tail.formats();\n const nextHead = this.next.children.head.formats();\n const nextTail = this.next.children.tail.formats();\n return thisHead.row === thisTail.row && thisHead.row === nextHead.row && thisHead.row === nextTail.row;\n }\n\n return false;\n }\n\n static create(value) {\n const node = super.create(value);\n node.setAttribute(\"data-row\", value.row);\n return node;\n }\n\n formats() {\n return [\"row\"].reduce((formats, attrName) => {\n if (this.domNode.hasAttribute(\"data-\".concat(attrName))) {\n formats[attrName] = this.domNode.getAttribute(\"data-\".concat(attrName));\n }\n\n return formats;\n }, {});\n }\n\n optimize(context) {\n // optimize function of ShadowBlot\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\n this.wrap(this.statics.requiredContainer.blotName);\n } // optimize function of ParentBlot\n // note: modified this optimize function because\n // TableRow should not be removed when the length of its children was 0\n\n\n this.enforceAllowedChildren();\n\n if (this.uiNode != null && this.uiNode !== this.domNode.firstChild) {\n this.domNode.insertBefore(this.uiNode, this.domNode.firstChild);\n } // optimize function of ContainerBlot\n\n\n if (this.children.length > 0 && this.next != null && this.checkMerge()) {\n this.next.moveChildren(this);\n this.next.remove();\n }\n }\n\n rowOffset() {\n if (this.parent) {\n return this.parent.children.indexOf(this);\n }\n\n return -1;\n }\n\n table() {\n return this.parent && this.parent.parent;\n }\n\n}\n\nTableRow.blotName = \"table-row\";\nTableRow.tagName = \"TR\";\n\nclass TableBody extends Container {}\n\nTableBody.blotName = \"table-body\";\nTableBody.tagName = \"TBODY\";\n\nclass TableCol extends table_Block {\n static create(value) {\n let node = super.create(value);\n COL_ATTRIBUTES.forEach(attrName => {\n node.setAttribute(\"\".concat(attrName), value[attrName] || COL_DEFAULT[attrName]);\n });\n return node;\n }\n\n static formats(domNode) {\n return COL_ATTRIBUTES.reduce((formats, attribute) => {\n if (domNode.hasAttribute(\"\".concat(attribute))) {\n formats[attribute] = domNode.getAttribute(\"\".concat(attribute)) || undefined;\n }\n\n return formats;\n }, {});\n }\n\n format(name, value) {\n if (COL_ATTRIBUTES.indexOf(name) > -1) {\n this.domNode.setAttribute(\"\".concat(name), value || COL_DEFAULT[name]);\n } else {\n super.format(name, value);\n }\n }\n\n html() {\n return this.domNode.outerHTML;\n }\n\n}\n\nTableCol.blotName = \"table-col\";\nTableCol.tagName = \"col\";\n\nclass TableColGroup extends Container {}\n\nTableColGroup.blotName = \"table-col-group\";\nTableColGroup.tagName = \"colgroup\";\n\nclass table_TableContainer extends Container {\n static create() {\n let node = super.create();\n return node;\n }\n\n constructor(scroll, domNode) {\n super(scroll, domNode);\n this.updateTableWidth();\n }\n\n updateTableWidth() {\n setTimeout(() => {\n const colGroup = this.colGroup();\n if (!colGroup) return;\n const tableWidth = colGroup.children.reduce((sumWidth, col) => {\n sumWidth = sumWidth + parseInt(col.formats()[TableCol.blotName].width, 10);\n return sumWidth;\n }, 0);\n this.domNode.style.width = \"\".concat(tableWidth, \"px\");\n }, 0);\n }\n\n cells(column) {\n return this.rows().map(row => row.children.at(column));\n }\n\n colGroup() {\n return this.children.head;\n }\n\n deleteColumns(compareRect) {\n let delIndexes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n let editorWrapper = arguments.length > 2 ? arguments[2] : undefined;\n const [body] = this.descendants(TableBody);\n if (body == null || body.children.head == null) return;\n const tableCells = this.descendants(TableCell);\n const removedCells = [];\n const modifiedCells = [];\n tableCells.forEach(cell => {\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper);\n\n if (cellRect.x + ERROR_LIMIT > compareRect.x && cellRect.x1 - ERROR_LIMIT < compareRect.x1) {\n removedCells.push(cell);\n } else if (cellRect.x < compareRect.x + ERROR_LIMIT && cellRect.x1 > compareRect.x1 - ERROR_LIMIT) {\n modifiedCells.push(cell);\n }\n });\n\n if (removedCells.length === tableCells.length) {\n this.tableDestroy();\n return true;\n } // remove the matches column tool cell\n\n\n delIndexes.forEach(delIndex => {\n this.colGroup().children.at(delIndexes[0]).remove();\n });\n removedCells.forEach(cell => {\n cell.remove();\n });\n modifiedCells.forEach(cell => {\n const cellColspan = parseInt(cell.formats().colspan, 10);\n const cellWidth = parseInt(cell.formats().width, 10);\n cell.format('colspan', cellColspan - delIndexes.length);\n });\n this.updateTableWidth();\n }\n\n deleteRow(compareRect, editorWrapper) {\n const [body] = this.descendants(TableBody);\n if (body == null || body.children.head == null) return;\n const tableCells = this.descendants(TableCell);\n const tableRows = this.descendants(TableRow);\n const removedCells = []; // cells to be removed\n\n const modifiedCells = []; // cells to be modified\n\n const fallCells = []; // cells to fall into next row\n // compute rows to remove\n // bugfix: #21 There will be a empty tr left if delete the last row of a table\n\n const removedRows = tableRows.filter(row => {\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper);\n return rowRect.y > compareRect.y - ERROR_LIMIT && rowRect.y1 < compareRect.y1 + ERROR_LIMIT;\n });\n tableCells.forEach(cell => {\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper);\n\n if (cellRect.y > compareRect.y - ERROR_LIMIT && cellRect.y1 < compareRect.y1 + ERROR_LIMIT) {\n removedCells.push(cell);\n } else if (cellRect.y < compareRect.y + ERROR_LIMIT && cellRect.y1 > compareRect.y1 - ERROR_LIMIT) {\n modifiedCells.push(cell);\n\n if (Math.abs(cellRect.y - compareRect.y) < ERROR_LIMIT) {\n fallCells.push(cell);\n }\n }\n });\n\n if (removedCells.length === tableCells.length) {\n this.tableDestroy();\n return;\n } // compute length of removed rows\n\n\n const removedRowsLength = this.rows().reduce((sum, row) => {\n let rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper);\n\n if (rowRect.y > compareRect.y - ERROR_LIMIT && rowRect.y1 < compareRect.y1 + ERROR_LIMIT) {\n sum += 1;\n }\n\n return sum;\n }, 0); // it must excute before the table layout changed with other operation\n\n fallCells.forEach(cell => {\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper);\n const nextRow = cell.parent.next;\n const cellsInNextRow = nextRow.children;\n const refCell = cellsInNextRow.reduce((ref, compareCell) => {\n const compareRect = getRelativeRect(compareCell.domNode.getBoundingClientRect(), editorWrapper);\n\n if (Math.abs(cellRect.x1 - compareRect.x) < ERROR_LIMIT) {\n ref = compareCell;\n }\n\n return ref;\n }, null);\n nextRow.insertBefore(cell, refCell);\n cell.format('row', nextRow.formats().row);\n });\n removedCells.forEach(cell => {\n cell.remove();\n });\n modifiedCells.forEach(cell => {\n const cellRowspan = parseInt(cell.formats().rowspan, 10);\n cell.format(\"rowspan\", cellRowspan - removedRowsLength);\n }); // remove selected rows\n\n removedRows.forEach(row => row.remove());\n }\n\n tableDestroy() {\n const quill = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.scroll.domNode.parentNode);\n const tableModule = quill.getModule(\"better-table\");\n this.remove();\n tableModule.hideTableTools();\n quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n }\n\n insertCell(tableRow, ref) {\n const id = table_cellId();\n const rId = tableRow.formats().row;\n const tableCell = this.scroll.create(TableCell.blotName, Object.assign({}, CELL_DEFAULT, {\n row: rId\n }));\n const cellLine = this.scroll.create(TableCellLine.blotName, {\n row: rId,\n cell: id\n });\n tableCell.appendChild(cellLine);\n\n if (ref) {\n tableRow.insertBefore(tableCell, ref);\n } else {\n tableRow.appendChild(tableCell);\n }\n }\n\n insertColumn(compareRect, colIndex) {\n let isRight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n let editorWrapper = arguments.length > 3 ? arguments[3] : undefined;\n const [body] = this.descendants(TableBody);\n const [tableColGroup] = this.descendants(TableColGroup);\n const tableCols = this.descendants(TableCol);\n let addAsideCells = [];\n let modifiedCells = [];\n let affectedCells = [];\n if (body == null || body.children.head == null) return;\n const tableCells = this.descendants(TableCell);\n tableCells.forEach(cell => {\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper);\n\n if (isRight) {\n if (Math.abs(cellRect.x1 - compareRect.x1) < ERROR_LIMIT) {\n // the right of selected boundary equal to the right of table cell,\n // add a new table cell right aside this table cell\n addAsideCells.push(cell);\n } else if (compareRect.x1 - cellRect.x > ERROR_LIMIT && compareRect.x1 - cellRect.x1 < -ERROR_LIMIT) {\n // the right of selected boundary is inside this table cell\n // colspan of this table cell will increase 1\n modifiedCells.push(cell);\n }\n } else {\n if (Math.abs(cellRect.x - compareRect.x) < ERROR_LIMIT) {\n // left of selected boundary equal to left of table cell,\n // add a new table cell left aside this table cell\n addAsideCells.push(cell);\n } else if (compareRect.x - cellRect.x > ERROR_LIMIT && compareRect.x - cellRect.x1 < -ERROR_LIMIT) {\n // the left of selected boundary is inside this table cell\n // colspan of this table cell will increase 1\n modifiedCells.push(cell);\n }\n }\n });\n addAsideCells.forEach(cell => {\n const ref = isRight ? cell.next : cell;\n const id = table_cellId();\n const tableRow = cell.parent;\n const rId = tableRow.formats().row;\n const cellFormats = cell.formats();\n const tableCell = this.scroll.create(TableCell.blotName, Object.assign({}, CELL_DEFAULT, {\n row: rId,\n rowspan: cellFormats.rowspan\n }));\n const cellLine = this.scroll.create(TableCellLine.blotName, {\n row: rId,\n cell: id,\n rowspan: cellFormats.rowspan\n });\n tableCell.appendChild(cellLine);\n\n if (ref) {\n tableRow.insertBefore(tableCell, ref);\n } else {\n tableRow.appendChild(tableCell);\n }\n\n affectedCells.push(tableCell);\n }); // insert new tableCol\n\n const tableCol = this.scroll.create(TableCol.blotName, true);\n let colRef = isRight ? tableCols[colIndex].next : tableCols[colIndex];\n\n if (colRef) {\n tableColGroup.insertBefore(tableCol, colRef);\n } else {\n tableColGroup.appendChild(tableCol);\n }\n\n modifiedCells.forEach(cell => {\n const cellColspan = cell.formats().colspan;\n cell.format('colspan', parseInt(cellColspan, 10) + 1);\n affectedCells.push(cell);\n });\n affectedCells.sort((cellA, cellB) => {\n let y1 = cellA.domNode.getBoundingClientRect().y;\n let y2 = cellB.domNode.getBoundingClientRect().y;\n return y1 - y2;\n });\n this.updateTableWidth();\n return affectedCells;\n }\n\n insertRow(compareRect, isDown, editorWrapper) {\n const [body] = this.descendants(TableBody);\n if (body == null || body.children.head == null) return;\n const tableCells = this.descendants(TableCell);\n const rId = table_rowId();\n const newRow = this.scroll.create(TableRow.blotName, {\n row: rId\n });\n let addBelowCells = [];\n let modifiedCells = [];\n let affectedCells = [];\n tableCells.forEach(cell => {\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper);\n\n if (isDown) {\n if (Math.abs(cellRect.y1 - compareRect.y1) < ERROR_LIMIT) {\n addBelowCells.push(cell);\n } else if (compareRect.y1 - cellRect.y > ERROR_LIMIT && compareRect.y1 - cellRect.y1 < -ERROR_LIMIT) {\n modifiedCells.push(cell);\n }\n } else {\n if (Math.abs(cellRect.y - compareRect.y) < ERROR_LIMIT) {\n addBelowCells.push(cell);\n } else if (compareRect.y - cellRect.y > ERROR_LIMIT && compareRect.y - cellRect.y1 < -ERROR_LIMIT) {\n modifiedCells.push(cell);\n }\n }\n }); // ordered table cells with rect.x, fix error for inserting\n // new table cell in complicated table with wrong order.\n\n const sortFunc = (cellA, cellB) => {\n let x1 = cellA.domNode.getBoundingClientRect().x;\n let x2 = cellB.domNode.getBoundingClientRect().x;\n return x1 - x2;\n };\n\n addBelowCells.sort(sortFunc);\n addBelowCells.forEach(cell => {\n const cId = table_cellId();\n const cellFormats = cell.formats();\n const tableCell = this.scroll.create(TableCell.blotName, Object.assign({}, CELL_DEFAULT, {\n row: rId,\n colspan: cellFormats.colspan\n }));\n const cellLine = this.scroll.create(TableCellLine.blotName, {\n row: rId,\n cell: cId,\n colspan: cellFormats.colspan\n });\n const empty = this.scroll.create(Break.blotName);\n cellLine.appendChild(empty);\n tableCell.appendChild(cellLine);\n newRow.appendChild(tableCell);\n affectedCells.push(tableCell);\n });\n modifiedCells.forEach(cell => {\n const cellRowspan = parseInt(cell.formats().rowspan, 10);\n cell.format(\"rowspan\", cellRowspan + 1);\n affectedCells.push(cell);\n });\n const refRow = this.rows().find(row => {\n let rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper);\n\n if (isDown) {\n return Math.abs(rowRect.y - compareRect.y - compareRect.height) < ERROR_LIMIT;\n } else {\n return Math.abs(rowRect.y - compareRect.y) < ERROR_LIMIT;\n }\n });\n body.insertBefore(newRow, refRow); // reordering affectedCells\n\n affectedCells.sort(sortFunc);\n return affectedCells;\n }\n\n mergeCells(compareRect, mergingCells, rowspan, colspan, editorWrapper) {\n const mergedCell = mergingCells.reduce((result, tableCell, index) => {\n if (index !== 0) {\n result && tableCell.moveChildren(result);\n tableCell.remove();\n } else {\n tableCell.format('colspan', colspan);\n tableCell.format('rowspan', rowspan);\n result = tableCell;\n }\n\n return result;\n }, null);\n let rowId = mergedCell.domNode.getAttribute('data-row');\n let cellId = mergedCell.children.head.domNode.getAttribute('data-cell');\n mergedCell.children.forEach(cellLine => {\n cellLine.format('cell', cellId);\n cellLine.format('row', rowId);\n cellLine.format('colspan', colspan);\n cellLine.format('rowspan', rowspan);\n });\n return mergedCell;\n }\n\n unmergeCells(unmergingCells, editorWrapper) {\n let cellFormats = {};\n let cellRowspan = 1;\n let cellColspan = 1;\n unmergingCells.forEach(tableCell => {\n cellFormats = tableCell.formats();\n cellRowspan = cellFormats.rowspan;\n cellColspan = cellFormats.colspan;\n\n if (cellColspan > 1) {\n let ref = tableCell.next;\n let row = tableCell.row();\n tableCell.format('colspan', 1);\n\n for (let i = cellColspan; i > 1; i--) {\n this.insertCell(row, ref);\n }\n }\n\n if (cellRowspan > 1) {\n let i = cellRowspan;\n let nextRow = tableCell.row().next;\n\n while (i > 1) {\n let refInNextRow = nextRow.children.reduce((result, cell) => {\n let compareRect = getRelativeRect(tableCell.domNode.getBoundingClientRect(), editorWrapper);\n let cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper);\n\n if (Math.abs(compareRect.x1 - cellRect.x) < ERROR_LIMIT) {\n result = cell;\n }\n\n return result;\n }, null);\n\n for (let i = cellColspan; i > 0; i--) {\n this.insertCell(nextRow, refInNextRow);\n }\n\n i -= 1;\n nextRow = nextRow.next;\n }\n\n tableCell.format('rowspan', 1);\n }\n });\n }\n\n rows() {\n const body = this.children.tail;\n if (body == null) return [];\n return body.children.map(row => row);\n }\n\n}\n\ntable_TableContainer.blotName = \"table-container\";\ntable_TableContainer.className = \"quill-better-table\";\ntable_TableContainer.tagName = \"TABLE\";\n\nclass table_TableViewWrapper extends Container {\n constructor(scroll, domNode) {\n super(scroll, domNode);\n const quill = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(scroll.domNode.parentNode);\n domNode.addEventListener('scroll', e => {\n const tableModule = quill.getModule('better-table');\n\n if (tableModule.columnTool) {\n tableModule.columnTool.domNode.scrollLeft = e.target.scrollLeft;\n }\n\n if (tableModule.tableSelection && tableModule.tableSelection.selectedTds.length > 0) {\n tableModule.tableSelection.repositionHelpLines();\n }\n }, false);\n }\n\n table() {\n return this.children.head;\n }\n\n}\n\ntable_TableViewWrapper.blotName = \"table-view\";\ntable_TableViewWrapper.className = \"quill-better-table-wrapper\";\ntable_TableViewWrapper.tagName = \"DIV\";\ntable_TableViewWrapper.allowedChildren = [table_TableContainer];\ntable_TableContainer.requiredContainer = table_TableViewWrapper;\ntable_TableContainer.allowedChildren = [TableBody, TableColGroup];\nTableBody.requiredContainer = table_TableContainer;\nTableBody.allowedChildren = [TableRow];\nTableRow.requiredContainer = TableBody;\nTableRow.allowedChildren = [TableCell];\nTableCell.requiredContainer = TableRow;\nTableCell.allowedChildren = [TableCellLine, header];\nTableCellLine.requiredContainer = TableCell;\nTableColGroup.allowedChildren = [TableCol];\nTableColGroup.requiredContainer = table_TableContainer;\nTableCol.requiredContainer = TableColGroup;\n\nfunction table_rowId() {\n const id = Math.random().toString(36).slice(2, 6);\n return \"row-\".concat(id);\n}\n\nfunction table_cellId() {\n const id = Math.random().toString(36).slice(2, 6);\n return \"cell-\".concat(id);\n}\n\n\n// CONCATENATED MODULE: ./src/modules/table-selection.js\n\n\n\nconst table_selection_PRIMARY_COLOR = '#0589f3';\nconst LINE_POSITIONS = ['left', 'right', 'top', 'bottom'];\nconst table_selection_ERROR_LIMIT = 2;\nclass table_selection_TableSelection {\n constructor(table, quill, options) {\n if (!table) return null;\n this.table = table;\n this.quill = quill;\n this.options = options;\n this.boundary = {}; // params for selected square\n\n this.selectedTds = []; // array for selected table-cells\n\n this.dragging = false;\n this.selectingHandler = this.mouseDownHandler.bind(this);\n this.clearSelectionHandler = this.clearSelection.bind(this);\n this.helpLinesInitial();\n this.quill.root.addEventListener('mousedown', this.selectingHandler, false);\n this.quill.on('text-change', this.clearSelectionHandler);\n }\n\n helpLinesInitial() {\n let parent = this.quill.root.parentNode;\n LINE_POSITIONS.forEach(direction => {\n this[direction] = document.createElement('div');\n this[direction].classList.add('qlbt-selection-line');\n this[direction].classList.add('qlbt-selection-line-' + direction);\n css(this[direction], {\n position: 'absolute',\n display: 'none',\n 'background-color': table_selection_PRIMARY_COLOR\n });\n parent.appendChild(this[direction]);\n });\n }\n\n mouseDownHandler(e) {\n if (e.button !== 0 || !e.target.closest(\".quill-better-table\")) return;\n this.quill.root.addEventListener('mousemove', mouseMoveHandler, false);\n this.quill.root.addEventListener('mouseup', mouseUpHandler, false);\n const self = this;\n const startTd = e.target.closest('td[data-row]');\n const startTdRect = getRelativeRect(startTd.getBoundingClientRect(), this.quill.root.parentNode);\n this.dragging = true;\n this.boundary = computeBoundaryFromRects(startTdRect, startTdRect);\n this.correctBoundary();\n this.selectedTds = this.computeSelectedTds();\n this.repositionHelpLines();\n\n function mouseMoveHandler(e) {\n if (e.button !== 0 || !e.target.closest(\".quill-better-table\")) return;\n const endTd = e.target.closest('td[data-row]');\n const endTdRect = getRelativeRect(endTd.getBoundingClientRect(), self.quill.root.parentNode);\n self.boundary = computeBoundaryFromRects(startTdRect, endTdRect);\n self.correctBoundary();\n self.selectedTds = self.computeSelectedTds();\n self.repositionHelpLines(); // avoid select text in multiple table-cell\n\n if (startTd !== endTd) {\n self.quill.blur();\n }\n }\n\n function mouseUpHandler(e) {\n self.quill.root.removeEventListener('mousemove', mouseMoveHandler, false);\n self.quill.root.removeEventListener('mouseup', mouseUpHandler, false);\n self.dragging = false;\n }\n }\n\n correctBoundary() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n const tableCells = tableContainer.descendants(TableCell);\n tableCells.forEach(tableCell => {\n let {\n x,\n y,\n width,\n height\n } = getRelativeRect(tableCell.domNode.getBoundingClientRect(), this.quill.root.parentNode);\n let isCellIntersected = (x + table_selection_ERROR_LIMIT >= this.boundary.x && x + table_selection_ERROR_LIMIT <= this.boundary.x1 || x - table_selection_ERROR_LIMIT + width >= this.boundary.x && x - table_selection_ERROR_LIMIT + width <= this.boundary.x1) && (y + table_selection_ERROR_LIMIT >= this.boundary.y && y + table_selection_ERROR_LIMIT <= this.boundary.y1 || y - table_selection_ERROR_LIMIT + height >= this.boundary.y && y - table_selection_ERROR_LIMIT + height <= this.boundary.y1);\n\n if (isCellIntersected) {\n this.boundary = computeBoundaryFromRects(this.boundary, {\n x,\n y,\n width,\n height\n });\n }\n });\n }\n\n computeSelectedTds() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n const tableCells = tableContainer.descendants(TableCell);\n return tableCells.reduce((selectedCells, tableCell) => {\n let {\n x,\n y,\n width,\n height\n } = getRelativeRect(tableCell.domNode.getBoundingClientRect(), this.quill.root.parentNode);\n let isCellIncluded = x + table_selection_ERROR_LIMIT >= this.boundary.x && x - table_selection_ERROR_LIMIT + width <= this.boundary.x1 && y + table_selection_ERROR_LIMIT >= this.boundary.y && y - table_selection_ERROR_LIMIT + height <= this.boundary.y1;\n\n if (isCellIncluded) {\n selectedCells.push(tableCell);\n }\n\n return selectedCells;\n }, []);\n }\n\n repositionHelpLines() {\n const tableViewScrollLeft = this.table.parentNode.scrollLeft;\n css(this.left, {\n display: 'block',\n left: \"\".concat(this.boundary.x - tableViewScrollLeft - 1, \"px\"),\n top: \"\".concat(this.boundary.y, \"px\"),\n height: \"\".concat(this.boundary.height + 1, \"px\"),\n width: '1px'\n });\n css(this.right, {\n display: 'block',\n left: \"\".concat(this.boundary.x1 - tableViewScrollLeft, \"px\"),\n top: \"\".concat(this.boundary.y, \"px\"),\n height: \"\".concat(this.boundary.height + 1, \"px\"),\n width: '1px'\n });\n css(this.top, {\n display: 'block',\n left: \"\".concat(this.boundary.x - 1 - tableViewScrollLeft, \"px\"),\n top: \"\".concat(this.boundary.y, \"px\"),\n width: \"\".concat(this.boundary.width + 1, \"px\"),\n height: '1px'\n });\n css(this.bottom, {\n display: 'block',\n left: \"\".concat(this.boundary.x - 1 - tableViewScrollLeft, \"px\"),\n top: \"\".concat(this.boundary.y1 + 1, \"px\"),\n width: \"\".concat(this.boundary.width + 1, \"px\"),\n height: '1px'\n });\n } // based on selectedTds compute positions of help lines\n // It is useful when selectedTds are not changed\n\n\n refreshHelpLinesPosition() {\n const startRect = getRelativeRect(this.selectedTds[0].domNode.getBoundingClientRect(), this.quill.root.parentNode);\n const endRect = getRelativeRect(this.selectedTds[this.selectedTds.length - 1].domNode.getBoundingClientRect(), this.quill.root.parentNode);\n this.boundary = computeBoundaryFromRects(startRect, endRect);\n this.repositionHelpLines();\n }\n\n destroy() {\n LINE_POSITIONS.forEach(direction => {\n this[direction].remove();\n this[direction] = null;\n });\n this.quill.root.removeEventListener('mousedown', this.selectingHandler, false);\n this.quill.off('text-change', this.clearSelectionHandler);\n return null;\n }\n\n setSelection(startRect, endRect) {\n this.boundary = computeBoundaryFromRects(getRelativeRect(startRect, this.quill.root.parentNode), getRelativeRect(endRect, this.quill.root.parentNode));\n this.correctBoundary();\n this.selectedTds = this.computeSelectedTds();\n this.repositionHelpLines();\n }\n\n clearSelection() {\n this.boundary = {};\n this.selectedTds = [];\n LINE_POSITIONS.forEach(direction => {\n this[direction] && css(this[direction], {\n display: 'none'\n });\n });\n }\n\n}\n\nfunction computeBoundaryFromRects(startRect, endRect) {\n let x = Math.min(startRect.x, endRect.x, startRect.x + startRect.width - 1, endRect.x + endRect.width - 1);\n let x1 = Math.max(startRect.x, endRect.x, startRect.x + startRect.width - 1, endRect.x + endRect.width - 1);\n let y = Math.min(startRect.y, endRect.y, startRect.y + startRect.height - 1, endRect.y + endRect.height - 1);\n let y1 = Math.max(startRect.y, endRect.y, startRect.y + startRect.height - 1, endRect.y + endRect.height - 1);\n let width = x1 - x;\n let height = y1 - y;\n return {\n x,\n x1,\n y,\n y1,\n width,\n height\n };\n}\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_1.svg\nvar icon_operation_1 = __nested_webpack_require_42296__(1);\nvar icon_operation_1_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_1);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_2.svg\nvar icon_operation_2 = __nested_webpack_require_42296__(2);\nvar icon_operation_2_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_2);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_3.svg\nvar icon_operation_3 = __nested_webpack_require_42296__(3);\nvar icon_operation_3_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_3);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_4.svg\nvar icon_operation_4 = __nested_webpack_require_42296__(4);\nvar icon_operation_4_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_4);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_5.svg\nvar icon_operation_5 = __nested_webpack_require_42296__(5);\nvar icon_operation_5_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_5);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_6.svg\nvar icon_operation_6 = __nested_webpack_require_42296__(6);\nvar icon_operation_6_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_6);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_7.svg\nvar icon_operation_7 = __nested_webpack_require_42296__(7);\nvar icon_operation_7_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_7);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_8.svg\nvar icon_operation_8 = __nested_webpack_require_42296__(8);\nvar icon_operation_8_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_8);\n\n// EXTERNAL MODULE: ./src/assets/icons/icon_operation_9.svg\nvar icon_operation_9 = __nested_webpack_require_42296__(9);\nvar icon_operation_9_default = /*#__PURE__*/__nested_webpack_require_42296__.n(icon_operation_9);\n\n// CONCATENATED MODULE: ./src/modules/table-operation-menu.js\n\n // svg icons\n\n\n\n\n\n\n\n\n\n\nconst MENU_MIN_HEIHGT = 150;\nconst MENU_WIDTH = 200;\nconst table_operation_menu_ERROR_LIMIT = 5;\nconst DEFAULT_CELL_COLORS = ['white', 'red', 'yellow', 'blue'];\nconst DEFAULT_COLOR_SUBTITLE = 'Background Colors';\nconst MENU_ITEMS_DEFAULT = {\n insertColumnRight: {\n text: 'Insert column right',\n iconSrc: icon_operation_1_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n let colIndex = getColToolCellIndexByBoundary(this.columnToolCells, this.boundary, (cellRect, boundary) => {\n return Math.abs(cellRect.x + cellRect.width - boundary.x1) <= table_operation_menu_ERROR_LIMIT;\n }, this.quill.root.parentNode);\n const newColumn = tableContainer.insertColumn(this.boundary, colIndex, true, this.quill.root.parentNode);\n this.tableColumnTool.updateToolCells();\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.quill.setSelection(this.quill.getIndex(newColumn[0]), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.SILENT);\n this.tableSelection.setSelection(newColumn[0].domNode.getBoundingClientRect(), newColumn[0].domNode.getBoundingClientRect());\n }\n\n },\n insertColumnLeft: {\n text: 'Insert column left',\n iconSrc: icon_operation_2_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n let colIndex = getColToolCellIndexByBoundary(this.columnToolCells, this.boundary, (cellRect, boundary) => {\n return Math.abs(cellRect.x - boundary.x) <= table_operation_menu_ERROR_LIMIT;\n }, this.quill.root.parentNode);\n const newColumn = tableContainer.insertColumn(this.boundary, colIndex, false, this.quill.root.parentNode);\n this.tableColumnTool.updateToolCells();\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.quill.setSelection(this.quill.getIndex(newColumn[0]), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.SILENT);\n this.tableSelection.setSelection(newColumn[0].domNode.getBoundingClientRect(), newColumn[0].domNode.getBoundingClientRect());\n }\n\n },\n insertRowUp: {\n text: 'Insert row up',\n iconSrc: icon_operation_3_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n const affectedCells = tableContainer.insertRow(this.boundary, false, this.quill.root.parentNode);\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.quill.setSelection(this.quill.getIndex(affectedCells[0]), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.SILENT);\n this.tableSelection.setSelection(affectedCells[0].domNode.getBoundingClientRect(), affectedCells[0].domNode.getBoundingClientRect());\n }\n\n },\n insertRowDown: {\n text: 'Insert row down',\n iconSrc: icon_operation_4_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n const affectedCells = tableContainer.insertRow(this.boundary, true, this.quill.root.parentNode);\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.quill.setSelection(this.quill.getIndex(affectedCells[0]), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.SILENT);\n this.tableSelection.setSelection(affectedCells[0].domNode.getBoundingClientRect(), affectedCells[0].domNode.getBoundingClientRect());\n }\n\n },\n mergeCells: {\n text: 'Merge selected cells',\n iconSrc: icon_operation_5_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table); // compute merged Cell rowspan, equal to length of selected rows\n\n const rowspan = tableContainer.rows().reduce((sum, row) => {\n let rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), this.quill.root.parentNode);\n\n if (rowRect.y > this.boundary.y - table_operation_menu_ERROR_LIMIT && rowRect.y + rowRect.height < this.boundary.y + this.boundary.height + table_operation_menu_ERROR_LIMIT) {\n sum += 1;\n }\n\n return sum;\n }, 0); // compute merged cell colspan, equal to length of selected cols\n\n const colspan = this.columnToolCells.reduce((sum, cell) => {\n let cellRect = getRelativeRect(cell.getBoundingClientRect(), this.quill.root.parentNode);\n\n if (cellRect.x > this.boundary.x - table_operation_menu_ERROR_LIMIT && cellRect.x + cellRect.width < this.boundary.x + this.boundary.width + table_operation_menu_ERROR_LIMIT) {\n sum += 1;\n }\n\n return sum;\n }, 0);\n const mergedCell = tableContainer.mergeCells(this.boundary, this.selectedTds, rowspan, colspan, this.quill.root.parentNode);\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.tableSelection.setSelection(mergedCell.domNode.getBoundingClientRect(), mergedCell.domNode.getBoundingClientRect());\n }\n\n },\n unmergeCells: {\n text: 'Unmerge cells',\n iconSrc: icon_operation_6_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n tableContainer.unmergeCells(this.selectedTds, this.quill.root.parentNode);\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.tableSelection.clearSelection();\n }\n\n },\n deleteColumn: {\n text: 'Delete selected columns',\n iconSrc: icon_operation_7_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n let colIndexes = getColToolCellIndexesByBoundary(this.columnToolCells, this.boundary, (cellRect, boundary) => {\n return cellRect.x + table_operation_menu_ERROR_LIMIT > boundary.x && cellRect.x + cellRect.width - table_operation_menu_ERROR_LIMIT < boundary.x1;\n }, this.quill.root.parentNode);\n let isDeleteTable = tableContainer.deleteColumns(this.boundary, colIndexes, this.quill.root.parentNode);\n\n if (!isDeleteTable) {\n this.tableColumnTool.updateToolCells();\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.tableSelection.clearSelection();\n }\n }\n\n },\n deleteRow: {\n text: 'Delete selected rows',\n iconSrc: icon_operation_8_default.a,\n\n handler() {\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n tableContainer.deleteRow(this.boundary, this.quill.root.parentNode);\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.tableSelection.clearSelection();\n }\n\n },\n deleteTable: {\n text: 'Delete table',\n iconSrc: icon_operation_9_default.a,\n\n handler() {\n const betterTableModule = this.quill.getModule('better-table');\n const tableContainer = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.find(this.table);\n betterTableModule.hideTableTools();\n tableContainer.remove();\n this.quill.update(external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n }\n\n }\n};\nclass table_operation_menu_TableOperationMenu {\n constructor(params, quill, options) {\n const betterTableModule = quill.getModule('better-table');\n this.tableSelection = betterTableModule.tableSelection;\n this.table = params.table;\n this.quill = quill;\n this.options = options;\n this.menuItems = Object.assign({}, MENU_ITEMS_DEFAULT, options.items);\n this.tableColumnTool = betterTableModule.columnTool;\n this.boundary = this.tableSelection.boundary;\n this.selectedTds = this.tableSelection.selectedTds;\n this.destroyHandler = this.destroy.bind(this);\n this.columnToolCells = this.tableColumnTool.colToolCells();\n this.colorSubTitle = options.color && options.color.text ? options.color.text : DEFAULT_COLOR_SUBTITLE;\n this.cellColors = options.color && options.color.colors ? options.color.colors : DEFAULT_CELL_COLORS;\n this.menuInitial(params);\n this.mount();\n document.addEventListener(\"click\", this.destroyHandler, false);\n }\n\n mount() {\n document.body.appendChild(this.domNode);\n }\n\n destroy() {\n this.domNode.remove();\n document.removeEventListener(\"click\", this.destroyHandler, false);\n return null;\n }\n\n menuInitial(_ref) {\n let {\n table,\n left,\n top\n } = _ref;\n this.domNode = document.createElement('div');\n this.domNode.classList.add('qlbt-operation-menu');\n css(this.domNode, {\n position: 'absolute',\n left: \"\".concat(left, \"px\"),\n top: \"\".concat(top, \"px\"),\n 'min-height': \"\".concat(MENU_MIN_HEIHGT, \"px\"),\n width: \"\".concat(MENU_WIDTH, \"px\")\n });\n\n for (let name in this.menuItems) {\n if (this.menuItems[name]) {\n this.domNode.appendChild(this.menuItemCreator(Object.assign({}, MENU_ITEMS_DEFAULT[name], this.menuItems[name])));\n\n if (['insertRowDown', 'unmergeCells'].indexOf(name) > -1) {\n this.domNode.appendChild(dividingCreator());\n }\n }\n } // if colors option is false, disabled bg color\n\n\n if (this.options.color && this.options.color !== false) {\n this.domNode.appendChild(dividingCreator());\n this.domNode.appendChild(subTitleCreator(this.colorSubTitle));\n this.domNode.appendChild(this.colorsItemCreator(this.cellColors));\n } // create dividing line\n\n\n function dividingCreator() {\n const dividing = document.createElement('div');\n dividing.classList.add('qlbt-operation-menu-dividing');\n return dividing;\n } // create subtitle for menu\n\n\n function subTitleCreator(title) {\n const subTitle = document.createElement('div');\n subTitle.classList.add('qlbt-operation-menu-subtitle');\n subTitle.innerText = title;\n return subTitle;\n }\n }\n\n colorsItemCreator(colors) {\n const self = this;\n const node = document.createElement('div');\n node.classList.add('qlbt-operation-color-picker');\n colors.forEach(color => {\n let colorBox = colorBoxCreator(color);\n node.appendChild(colorBox);\n });\n\n function colorBoxCreator(color) {\n const box = document.createElement('div');\n box.classList.add('qlbt-operation-color-picker-item');\n box.setAttribute('data-color', color);\n box.style.backgroundColor = color;\n box.addEventListener('click', function () {\n const selectedTds = self.tableSelection.selectedTds;\n\n if (selectedTds && selectedTds.length > 0) {\n selectedTds.forEach(tableCell => {\n tableCell.format('cell-bg', color);\n });\n }\n }, false);\n return box;\n }\n\n return node;\n }\n\n menuItemCreator(_ref2) {\n let {\n text,\n iconSrc,\n handler\n } = _ref2;\n const node = document.createElement('div');\n node.classList.add('qlbt-operation-menu-item');\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('qlbt-operation-menu-icon');\n iconSpan.innerHTML = iconSrc;\n const textSpan = document.createElement('span');\n textSpan.classList.add('qlbt-operation-menu-text');\n textSpan.innerText = text;\n node.appendChild(iconSpan);\n node.appendChild(textSpan);\n node.addEventListener('click', handler.bind(this), false);\n return node;\n }\n\n}\n\nfunction getColToolCellIndexByBoundary(cells, boundary, conditionFn, container) {\n return cells.reduce((findIndex, cell) => {\n let cellRect = getRelativeRect(cell.getBoundingClientRect(), container);\n\n if (conditionFn(cellRect, boundary)) {\n findIndex = cells.indexOf(cell);\n }\n\n return findIndex;\n }, false);\n}\n\nfunction getColToolCellIndexesByBoundary(cells, boundary, conditionFn, container) {\n return cells.reduce((findIndexes, cell) => {\n let cellRect = getRelativeRect(cell.getBoundingClientRect(), container);\n\n if (conditionFn(cellRect, boundary)) {\n findIndexes.push(cells.indexOf(cell));\n }\n\n return findIndexes;\n }, []);\n}\n// CONCATENATED MODULE: ./src/utils/node-matchers.js\n\n\nconst Delta = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import('delta'); // rebuild delta\n\nfunction matchTableCell(node, delta, scroll) {\n const row = node.parentNode;\n const table = row.parentNode.tagName === 'TABLE' ? row.parentNode : row.parentNode.parentNode;\n const rows = Array.from(table.querySelectorAll('tr'));\n const cells = Array.from(row.querySelectorAll('td'));\n const rowId = rows.indexOf(row) + 1;\n const cellId = cells.indexOf(node) + 1;\n const colspan = node.getAttribute('colspan') || false;\n const rowspan = node.getAttribute('rowspan') || false;\n const cellBg = node.getAttribute('data-cell-bg') || node.style.backgroundColor; // The td from external table has no 'data-cell-bg' \n // bugfix: empty table cells copied from other place will be removed unexpectedly\n\n if (delta.length() === 0) {\n delta = new Delta().insert('\\n', {\n 'table-cell-line': {\n row: rowId,\n cell: cellId,\n rowspan,\n colspan\n }\n });\n return delta;\n }\n\n delta = delta.reduce((newDelta, op) => {\n if (op.insert && typeof op.insert === 'string') {\n const lines = [];\n let insertStr = op.insert;\n let start = 0;\n\n for (let i = 0; i < op.insert.length; i++) {\n if (insertStr.charAt(i) === '\\n') {\n if (i === 0) {\n lines.push('\\n');\n } else {\n lines.push(insertStr.substring(start, i));\n lines.push('\\n');\n }\n\n start = i + 1;\n }\n }\n\n const tailStr = insertStr.substring(start);\n if (tailStr) lines.push(tailStr);\n lines.forEach(text => {\n text === '\\n' ? newDelta.insert('\\n', op.attributes) : newDelta.insert(text, _omit(op.attributes, ['table', 'table-cell-line']));\n });\n } else {\n newDelta.insert(op.insert, op.attributes);\n }\n\n return newDelta;\n }, new Delta());\n return delta.reduce((newDelta, op) => {\n if (op.insert && typeof op.insert === 'string' && op.insert.startsWith('\\n')) {\n newDelta.insert(op.insert, Object.assign({}, Object.assign({}, {\n row: rowId\n }, op.attributes.table), {\n 'table-cell-line': {\n row: rowId,\n cell: cellId,\n rowspan,\n colspan,\n 'cell-bg': cellBg\n }\n }, _omit(op.attributes, ['table'])));\n } else {\n // bugfix: remove background attr from the delta of table cell\n // to prevent unexcepted background attr append.\n if (op.attributes && op.attributes.background && op.attributes.background === convertToHex(cellBg)) {\n newDelta.insert(op.insert, Object.assign({}, _omit(op.attributes, ['table', 'table-cell-line', 'background'])));\n } else {\n newDelta.insert(op.insert, Object.assign({}, _omit(op.attributes, ['table', 'table-cell-line'])));\n }\n }\n\n return newDelta;\n }, new Delta());\n} // replace th tag with td tag\n\nfunction matchTableHeader(node, delta, scroll) {\n const row = node.parentNode;\n const table = row.parentNode.tagName === 'TABLE' ? row.parentNode : row.parentNode.parentNode;\n const rows = Array.from(table.querySelectorAll('tr'));\n const cells = Array.from(row.querySelectorAll('th'));\n const rowId = rows.indexOf(row) + 1;\n const cellId = cells.indexOf(node) + 1;\n const colspan = node.getAttribute('colspan') || false;\n const rowspan = node.getAttribute('rowspan') || false; // bugfix: empty table cells copied from other place will be removed unexpectedly\n\n if (delta.length() === 0) {\n delta = new Delta().insert('\\n', {\n 'table-cell-line': {\n row: rowId,\n cell: cellId,\n rowspan,\n colspan\n }\n });\n return delta;\n }\n\n delta = delta.reduce((newDelta, op) => {\n if (op.insert && typeof op.insert === 'string') {\n const lines = [];\n let insertStr = op.insert;\n let start = 0;\n\n for (let i = 0; i < op.insert.length; i++) {\n if (insertStr.charAt(i) === '\\n') {\n if (i === 0) {\n lines.push('\\n');\n } else {\n lines.push(insertStr.substring(start, i));\n lines.push('\\n');\n }\n\n start = i + 1;\n }\n }\n\n const tailStr = insertStr.substring(start);\n if (tailStr) lines.push(tailStr); // bugfix: no '\\n' in op.insert, push a '\\n' to lines\n\n if (lines.indexOf('\\n') < 0) {\n lines.push('\\n');\n }\n\n lines.forEach(text => {\n text === '\\n' ? newDelta.insert('\\n', {\n 'table-cell-line': {\n row: rowId,\n cell: cellId,\n rowspan,\n colspan\n }\n }) : newDelta.insert(text, op.attributes);\n });\n } else {\n newDelta.insert(op.insert, op.attributes);\n }\n\n return newDelta;\n }, new Delta());\n return delta.reduce((newDelta, op) => {\n if (op.insert && typeof op.insert === 'string' && op.insert.startsWith('\\n')) {\n newDelta.insert(op.insert, Object.assign({}, {\n 'table-cell-line': {\n row: rowId,\n cell: cellId,\n rowspan,\n colspan\n }\n }));\n } else {\n newDelta.insert(op.insert, Object.assign({}, _omit(op.attributes, ['table', 'table-cell-line'])));\n }\n\n return newDelta;\n }, new Delta());\n} // supplement colgroup and col\n\nfunction matchTable(node, delta, scroll) {\n let newColDelta = new Delta();\n const topRow = node.querySelector('tr'); // bugfix: empty table will return empty delta\n\n if (topRow === null) return newColDelta;\n const cellsInTopRow = Array.from(topRow.querySelectorAll('td')).concat(Array.from(topRow.querySelectorAll('th')));\n const maxCellsNumber = cellsInTopRow.reduce((sum, cell) => {\n const cellColspan = cell.getAttribute('colspan') || 1;\n sum = sum + parseInt(cellColspan, 10);\n return sum;\n }, 0);\n const colsNumber = node.querySelectorAll('col').length; // issue #2\n // bugfix: the table copied from Excel had some default col tags missing\n // add missing col tags\n\n if (colsNumber === maxCellsNumber) {\n return delta;\n } else {\n for (let i = 0; i < maxCellsNumber - colsNumber; i++) {\n newColDelta.insert('\\n', {\n 'table-col': true\n });\n }\n\n if (colsNumber === 0) return newColDelta.concat(delta);\n let lastNumber = 0;\n return delta.reduce((finalDelta, op) => {\n finalDelta.insert(op.insert, op.attributes);\n\n if (op.attributes && op.attributes['table-col']) {\n lastNumber += op.insert.length;\n\n if (lastNumber === colsNumber) {\n finalDelta = finalDelta.concat(newColDelta);\n }\n }\n\n return finalDelta;\n }, new Delta());\n }\n}\n// CONCATENATED MODULE: ./src/quill-better-table.js\n\n\n\n // import table node matchers\n\n\n\nconst Module = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import('core/module');\nconst quill_better_table_Delta = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.import('delta');\n\n\nclass quill_better_table_BetterTable extends Module {\n static register() {\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(TableCol, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(TableColGroup, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(TableCellLine, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(TableCell, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(TableRow, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(TableBody, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(table_TableContainer, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(table_TableViewWrapper, true);\n external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.register(table_TableViewWrapper, true); // register customized Headeroverwriting quill built-in Header\n // Quill.register('formats/header', Header, true);\n }\n\n constructor(quill, options) {\n super(quill, options); // handle click on quill-better-table\n\n this.quill.root.addEventListener('click', evt => {\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\n const path = getEventComposedPath(evt);\n if (!path || path.length <= 0) return;\n const tableNode = path.filter(node => {\n return node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table');\n })[0];\n\n if (tableNode) {\n // current table clicked\n if (this.table === tableNode) return; // other table clicked\n\n if (this.table) this.hideTableTools();\n this.showTableTools(tableNode, quill, options);\n } else if (this.table) {\n // other clicked\n this.hideTableTools();\n }\n }, false); // handle right click on quill-better-table\n\n this.quill.root.addEventListener('contextmenu', evt => {\n if (!this.table) return true;\n evt.preventDefault(); // bugfix: evt.path is undefined in Safari, FF, Micro Edge\n\n const path = getEventComposedPath(evt);\n if (!path || path.length <= 0) return;\n const tableNode = path.filter(node => {\n return node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table');\n })[0];\n const rowNode = path.filter(node => {\n return node.tagName && node.tagName.toUpperCase() === 'TR' && node.getAttribute('data-row');\n })[0];\n const cellNode = path.filter(node => {\n return node.tagName && node.tagName.toUpperCase() === 'TD' && node.getAttribute('data-row');\n })[0];\n let isTargetCellSelected = this.tableSelection.selectedTds.map(tableCell => tableCell.domNode).includes(cellNode);\n\n if (this.tableSelection.selectedTds.length <= 0 || !isTargetCellSelected) {\n this.tableSelection.setSelection(cellNode.getBoundingClientRect(), cellNode.getBoundingClientRect());\n }\n\n if (this.tableOperationMenu) this.tableOperationMenu = this.tableOperationMenu.destroy();\n\n if (tableNode) {\n this.tableOperationMenu = new table_operation_menu_TableOperationMenu({\n table: tableNode,\n row: rowNode,\n cell: cellNode,\n left: evt.pageX,\n top: evt.pageY\n }, quill, options.operationMenu);\n }\n }, false); // add keyboard bindingBackspace\n // prevent user hits backspace to delete table cell\n\n const KeyBoard = quill.getModule('keyboard');\n quill.keyboard.addBinding({\n key: 'Backspace'\n }, {}, function (range, context) {\n if (range.index === 0 || this.quill.getLength() <= 1) return true;\n const [line] = this.quill.getLine(range.index);\n\n if (context.offset === 0) {\n const [prev] = this.quill.getLine(range.index - 1);\n\n if (prev != null) {\n if (prev.statics.blotName === 'table-cell-line' && line.statics.blotName !== 'table-cell-line') return false;\n }\n }\n\n return true;\n }); // since only one matched bindings callback will excute.\n // expected my binding callback excute first\n // I changed the order of binding callbacks\n\n let thisBinding = quill.keyboard.bindings['Backspace'].pop();\n quill.keyboard.bindings['Backspace'].splice(0, 1, thisBinding); // add Matchers to match and render quill-better-table for initialization\n // or pasting\n\n quill.clipboard.addMatcher('td', matchTableCell);\n quill.clipboard.addMatcher('th', matchTableHeader);\n quill.clipboard.addMatcher('table', matchTable); // quill.clipboard.addMatcher('h1, h2, h3, h4, h5, h6', matchHeader)\n // remove matcher for tr tag\n\n quill.clipboard.matchers = quill.clipboard.matchers.filter(matcher => {\n return matcher[0] !== 'tr';\n });\n }\n\n getTable() {\n let range = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.quill.getSelection();\n if (range == null) return [null, null, null, -1];\n const [cellLine, offset] = this.quill.getLine(range.index);\n\n if (cellLine == null || cellLine.statics.blotName !== TableCellLine.blotName) {\n return [null, null, null, -1];\n }\n\n const cell = cellLine.tableCell();\n const row = cell.row();\n const table = row.table();\n return [table, row, cell, offset];\n }\n\n insertTable(rows, columns) {\n const range = this.quill.getSelection(true);\n if (range == null) return;\n let currentBlot = this.quill.getLeaf(range.index)[0];\n let delta = new quill_better_table_Delta().retain(range.index);\n\n if (isInTableCell(currentBlot)) {\n console.warn(\"Can not insert table into a table cell.\");\n return;\n }\n\n delta.insert('\\n'); // insert table column\n\n delta = new Array(columns).fill('\\n').reduce((memo, text) => {\n memo.insert(text, {\n 'table-col': true\n });\n return memo;\n }, delta); // insert table cell line with empty line\n\n delta = new Array(rows).fill(0).reduce(memo => {\n let tableRowId = table_rowId();\n return new Array(columns).fill('\\n').reduce((memo, text) => {\n memo.insert(text, {\n 'table-cell-line': {\n row: tableRowId,\n cell: table_cellId()\n }\n });\n return memo;\n }, memo);\n }, delta);\n this.quill.updateContents(delta, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n this.quill.setSelection(range.index + columns + 1, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.API);\n }\n\n showTableTools(table, quill, options) {\n this.table = table;\n this.columnTool = new table_column_tool_TableColumnTool(table, quill, options);\n this.tableSelection = new table_selection_TableSelection(table, quill, options);\n }\n\n hideTableTools() {\n this.columnTool && this.columnTool.destroy();\n this.tableSelection && this.tableSelection.destroy();\n this.tableOperationMenu && this.tableOperationMenu.destroy();\n this.columnTool = null;\n this.tableSelection = null;\n this.tableOperationMenu = null;\n this.table = null;\n }\n\n}\n\nquill_better_table_BetterTable.keyboardBindings = {\n 'table-cell-line backspace': {\n key: 'Backspace',\n format: ['table-cell-line'],\n collapsed: true,\n offset: 0,\n\n handler(range, context) {\n const [line, offset] = this.quill.getLine(range.index);\n\n if (!line.prev || line.prev.statics.blotName !== 'table-cell-line') {\n return false;\n }\n\n return true;\n }\n\n },\n 'table-cell-line delete': {\n key: 'Delete',\n format: ['table-cell-line'],\n collapsed: true,\n suffix: /^$/,\n\n handler() {}\n\n },\n 'table-cell-line enter': {\n key: 'Enter',\n shiftKey: null,\n format: ['table-cell-line'],\n\n handler(range, context) {\n // bugfix: a unexpected new line inserted when user compositionend with hitting Enter\n if (this.quill.selection && this.quill.selection.composing) return;\n const Scope = external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.imports.parchment.Scope;\n\n if (range.length > 0) {\n this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change\n }\n\n const lineFormats = Object.keys(context.format).reduce((formats, format) => {\n if (this.quill.scroll.query(format, Scope.BLOCK) && !Array.isArray(context.format[format])) {\n formats[format] = context.format[format];\n }\n\n return formats;\n }, {}); // insert new cellLine with lineFormats\n\n this.quill.insertText(range.index, '\\n', lineFormats['table-cell-line'], external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER); // Earlier scroll.deleteAt might have messed up our selection,\n // so insertText's built in selection preservation is not reliable\n\n this.quill.setSelection(range.index + 1, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.SILENT);\n this.quill.focus();\n Object.keys(context.format).forEach(name => {\n if (lineFormats[name] != null) return;\n if (Array.isArray(context.format[name])) return;\n if (name === 'link') return;\n this.quill.format(name, context.format[name], external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n });\n }\n\n },\n 'table-cell-line up': makeTableArrowHandler(true),\n 'table-cell-line down': makeTableArrowHandler(false),\n 'down-to-table': {\n key: 'ArrowDown',\n collapsed: true,\n\n handler(range, context) {\n const target = context.line.next;\n\n if (target && target.statics.blotName === 'table-view') {\n const targetCell = target.table().rows()[0].children.head;\n const targetLine = targetCell.children.head;\n this.quill.setSelection(targetLine.offset(this.quill.scroll), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n return false;\n }\n\n return true;\n }\n\n },\n 'up-to-table': {\n key: 'ArrowUp',\n collapsed: true,\n\n handler(range, context) {\n const target = context.line.prev;\n\n if (target && target.statics.blotName === 'table-view') {\n const rows = target.table().rows();\n const targetCell = rows[rows.length - 1].children.head;\n const targetLine = targetCell.children.head;\n this.quill.setSelection(targetLine.offset(this.quill.scroll), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n return false;\n }\n\n return true;\n }\n\n }\n};\n\nfunction makeTableArrowHandler(up) {\n return {\n key: up ? 'ArrowUp' : 'ArrowDown',\n collapsed: true,\n format: ['table-cell-line'],\n\n handler(range, context) {\n // TODO move to table module\n const key = up ? 'prev' : 'next';\n const targetLine = context.line[key];\n if (targetLine != null) return true;\n const cell = context.line.parent;\n const targetRow = cell.parent[key];\n\n if (targetRow != null && targetRow.statics.blotName === 'table-row') {\n let targetCell = targetRow.children.head;\n let totalColspanOfTargetCell = parseInt(targetCell.formats()['colspan'], 10);\n let cur = cell;\n let totalColspanOfCur = parseInt(cur.formats()['colspan'], 10); // get targetCell above current cell depends on colspan\n\n while (cur.prev != null) {\n cur = cur.prev;\n totalColspanOfCur += parseInt(cur.formats()['colspan'], 10);\n }\n\n while (targetCell.next != null && totalColspanOfTargetCell < totalColspanOfCur) {\n targetCell = targetCell.next;\n totalColspanOfTargetCell += parseInt(targetCell.formats()['colspan'], 10);\n }\n\n const index = targetCell.offset(this.quill.scroll);\n this.quill.setSelection(index, 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n } else {\n const targetLine = cell.table().parent[key];\n\n if (targetLine != null) {\n if (up) {\n this.quill.setSelection(targetLine.offset(this.quill.scroll) + targetLine.length() - 1, 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n } else {\n this.quill.setSelection(targetLine.offset(this.quill.scroll), 0, external_commonjs_quill_commonjs2_quill_amd_quill_root_Quill_default.a.sources.USER);\n }\n }\n }\n\n return false;\n }\n\n };\n}\n\nfunction isTableCell(blot) {\n return blot.statics.blotName === TableCell.blotName;\n}\n\nfunction isInTableCell(current) {\n return current && current.parent ? isTableCell(current.parent) ? true : isInTableCell(current.parent) : false;\n}\n\n/* harmony default export */ var quill_better_table = __nested_webpack_exports__[\"default\"] = (quill_better_table_BetterTable);\n\n/***/ }),\n/* 11 */,\n/* 12 */\n/***/ (function(module, exports, __nested_webpack_require_121783__) {\n\nmodule.exports = __nested_webpack_require_121783__(10);\n\n\n/***/ })\n/******/ ])[\"default\"];\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvcXVpbGwtYmV0dGVyLXRhYmxlL2Rpc3QvcXVpbGwtYmV0dGVyLXRhYmxlLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsSUFBSSxJQUF5RDtBQUM3RCwyQkFBMkIsbUJBQU8sQ0FBQyxrREFBTztBQUMxQyxNQUFNLEVBSzhDO0FBQ3BELENBQUM7QUFDRCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQ0FBbUI7QUFDM0MsZUFBZSxLQUFJLEVBQUUsRUFBMEI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGdDQUFtQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGdDQUFtQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0NBQW1CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnQ0FBbUI7QUFDeEMsY0FBYztBQUNkO0FBQ0EsY0FBYyxnQ0FBbUI7QUFDakM7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGdDQUFtQjtBQUMvQztBQUNBLGtEQUFrRCxnQ0FBbUI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdDQUFtQjtBQUN0QztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQ0FBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixnQkFBZ0I7QUFDOUM7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsZ0JBQWdCO0FBQzlDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw4QkFBOEI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDJCQUEyQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixjQUFjO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsTUFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw0QkFBNEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1Q0FBdUM7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVDQUF1QztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixzQkFBc0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdDQUF3QztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsZ0NBQW1CO0FBQ2hDLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdDQUFtQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0NBQW1CO0FBQzdCO0FBQ0E7QUFDQSxVQUFVLGdDQUFtQjtBQUM3QjtBQUNBO0FBQ0EsVUFBVSxnQ0FBbUI7QUFDN0IsZUFBZSxnQ0FBbUI7QUFDbEMsbURBQW1ELCtCQUErQjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0NBQW1CO0FBQzdCO0FBQ0EsaUVBQWlFLGlCQUFpQjtBQUNsRjtBQUNBLDBEQUEwRCxhQUFhO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxnQ0FBbUI7QUFDN0IsZ0NBQWdDLGdDQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdDQUFtQjtBQUM5QixrREFBa0QsZ0NBQWdDO0FBQ2xGLDBFQUEwRSxnQ0FBbUIsNEJBQTRCLG9CQUFvQjtBQUM3STtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0NBQW1CO0FBQzdCO0FBQ0Esb0NBQW9DLDRCQUE0QjtBQUNoRSwwQ0FBMEM7QUFDMUMsV0FBVyxnQ0FBbUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdDQUFtQixrQ0FBa0M7QUFDL0Q7QUFDQTtBQUNBLFVBQVUsZ0NBQW1CO0FBQzdCO0FBQ0E7QUFDQSxVQUFVLGdDQUFtQixrQkFBa0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGdDQUFtQjtBQUN6RCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsT0FBTztBQUNQO0FBQ0Esd0JBQXdCLDBCQUFtQixFQUFFLGdDQUFtQjs7QUFFaEU7QUFDQSxnQ0FBbUIsR0FBRywwQkFBbUI7O0FBRXpDLDhCQUE4QjtBQUM5QixvRUFBb0UsZ0NBQW1CO0FBQ3ZGLHdGQUF3RixnQ0FBbUI7O0FBRTNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksU0FBUztBQUNyQixZQUFZLG9CQUFvQjtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLE9BQU87QUFDbkIsWUFBWSxvQkFBb0I7QUFDaEM7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBLEtBQUs7QUFDTCxHQUFHLElBQUk7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQSxZQUFZOztBQUVaLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsRUFBRSxhQUFhLEVBQUUsS0FBSzs7QUFFbEQ7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLGtEQUFrRDtBQUMxRTtBQUNBLHFGQUFxRjs7QUFFckY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUixzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUssSUFBSTtBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUssSUFBSTtBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3Qiw4QkFBOEI7O0FBRTlCLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSyxNQUFNOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBLEtBQUssR0FBRzs7QUFFUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRztBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxPQUFPO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVzs7QUFFWCxvQ0FBb0MsT0FBTztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixnQ0FBbUI7QUFDMUMsNENBQTRDLGdDQUFtQjs7QUFFL0Q7QUFDQSx1QkFBdUIsZ0NBQW1CO0FBQzFDLDRDQUE0QyxnQ0FBbUI7O0FBRS9EO0FBQ0EsdUJBQXVCLGdDQUFtQjtBQUMxQyw0Q0FBNEMsZ0NBQW1COztBQUUvRDtBQUNBLHVCQUF1QixnQ0FBbUI7QUFDMUMsNENBQTRDLGdDQUFtQjs7QUFFL0Q7QUFDQSx1QkFBdUIsZ0NBQW1CO0FBQzFDLDRDQUE0QyxnQ0FBbUI7O0FBRS9EO0FBQ0EsdUJBQXVCLGdDQUFtQjtBQUMxQyw0Q0FBNEMsZ0NBQW1COztBQUUvRDtBQUNBLHVCQUF1QixnQ0FBbUI7QUFDMUMsNENBQTRDLGdDQUFtQjs7QUFFL0Q7QUFDQSx1QkFBdUIsZ0NBQW1CO0FBQzFDLDRDQUE0QyxnQ0FBbUI7O0FBRS9EO0FBQ0EsdUJBQXVCLGdDQUFtQjtBQUMxQyw0Q0FBNEMsZ0NBQW1COztBQUUvRDs7QUFFQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0hBQXNIOztBQUV0SDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU8sTUFBTTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLHNFQUFzRTs7QUFFdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0Esc0dBQXNHOztBQUV0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRkFBa0Y7QUFDbEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLHNCQUFzQjtBQUM1QztBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsaURBQWlELGtCQUFrQjtBQUNuRTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25ELFFBQVE7QUFDUixtREFBbUQ7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ04saURBQWlEO0FBQ2pEOztBQUVBO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILDBEQUEwRDtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CLGlDQUFpQztBQUNyRDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7O0FBSUE7Ozs7QUFJQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1IQUFtSDtBQUNuSDtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSyxVQUFVOztBQUVmO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLLFVBQVU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLElBQUk7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLLEdBQUc7QUFDUjtBQUNBOztBQUVBO0FBQ0Esb0VBQW9FO0FBQ3BFOztBQUVBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSyxVQUFVOztBQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPLElBQUksR0FBRzs7QUFFZCxxS0FBcUs7QUFDcks7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7O0FBRXhFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNEQUFzRCwwQkFBbUI7O0FBRXpFLE9BQU87QUFDUDtBQUNBO0FBQ0EsaUNBQWlDLGlDQUFtQjs7QUFFcEQsaUJBQWlCLGlDQUFtQjs7O0FBR3BDLE9BQU87QUFDUDtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL3F1aWxsLWJldHRlci10YWJsZS9kaXN0L3F1aWxsLWJldHRlci10YWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJxdWlsbFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJxdWlsbFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJxdWlsbEJldHRlclRhYmxlXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicXVpbGxcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInF1aWxsQmV0dGVyVGFibGVcIl0gPSBmYWN0b3J5KHJvb3RbXCJRdWlsbFwiXSk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzBfXykge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0ZnVuY3Rpb24gaG90RGlzcG9zZUNodW5rKGNodW5rSWQpIHtcbi8qKioqKiovIFx0XHRkZWxldGUgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdHZhciBwYXJlbnRIb3RVcGRhdGVDYWxsYmFjayA9IHdpbmRvd1tcIndlYnBhY2tIb3RVcGRhdGVxdWlsbEJldHRlclRhYmxlXCJdO1xuLyoqKioqKi8gXHR3aW5kb3dbXCJ3ZWJwYWNrSG90VXBkYXRlcXVpbGxCZXR0ZXJUYWJsZVwiXSA9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuLyoqKioqKi8gXHRmdW5jdGlvbiB3ZWJwYWNrSG90VXBkYXRlQ2FsbGJhY2soY2h1bmtJZCwgbW9yZU1vZHVsZXMpIHtcbi8qKioqKiovIFx0XHRob3RBZGRVcGRhdGVDaHVuayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4vKioqKioqLyBcdFx0aWYgKHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrKSBwYXJlbnRIb3RVcGRhdGVDYWxsYmFjayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4vKioqKioqLyBcdH0gO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4vKioqKioqLyBcdGZ1bmN0aW9uIGhvdERvd25sb2FkVXBkYXRlQ2h1bmsoY2h1bmtJZCkge1xuLyoqKioqKi8gXHRcdHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuLyoqKioqKi8gXHRcdHNjcmlwdC5jaGFyc2V0ID0gXCJ1dGYtOFwiO1xuLyoqKioqKi8gXHRcdHNjcmlwdC5zcmMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBcIlwiICsgY2h1bmtJZCArIFwiLlwiICsgaG90Q3VycmVudEhhc2ggKyBcIi5ob3QtdXBkYXRlLmpzXCI7XG4vKioqKioqLyBcdFx0aWYgKG51bGwpIHNjcmlwdC5jcm9zc09yaWdpbiA9IG51bGw7XG4vKioqKioqLyBcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbi8qKioqKiovIFx0ZnVuY3Rpb24gaG90RG93bmxvYWRNYW5pZmVzdChyZXF1ZXN0VGltZW91dCkge1xuLyoqKioqKi8gXHRcdHJlcXVlc3RUaW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQgfHwgMTAwMDA7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuLyoqKioqKi8gXHRcdFx0aWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuLyoqKioqKi8gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcIk5vIGJyb3dzZXIgc3VwcG9ydFwiKSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuLyoqKioqKi8gXHRcdFx0XHR2YXIgcmVxdWVzdFBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBcIlwiICsgaG90Q3VycmVudEhhc2ggKyBcIi5ob3QtdXBkYXRlLmpzb25cIjtcbi8qKioqKiovIFx0XHRcdFx0cmVxdWVzdC5vcGVuKFwiR0VUXCIsIHJlcXVlc3RQYXRoLCB0cnVlKTtcbi8qKioqKiovIFx0XHRcdFx0cmVxdWVzdC50aW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQ7XG4vKioqKioqLyBcdFx0XHRcdHJlcXVlc3Quc2VuZChudWxsKTtcbi8qKioqKiovIFx0XHRcdH0gY2F0Y2ggKGVycikge1xuLyoqKioqKi8gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KGVycik7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdFx0XHRpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47XG4vKioqKioqLyBcdFx0XHRcdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCkge1xuLyoqKioqKi8gXHRcdFx0XHRcdC8vIHRpbWVvdXRcbi8qKioqKiovIFx0XHRcdFx0XHRyZWplY3QoXG4vKioqKioqLyBcdFx0XHRcdFx0XHRuZXcgRXJyb3IoXCJNYW5pZmVzdCByZXF1ZXN0IHRvIFwiICsgcmVxdWVzdFBhdGggKyBcIiB0aW1lZCBvdXQuXCIpXG4vKioqKioqLyBcdFx0XHRcdFx0KTtcbi8qKioqKiovIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gNDA0KSB7XG4vKioqKioqLyBcdFx0XHRcdFx0Ly8gbm8gdXBkYXRlIGF2YWlsYWJsZVxuLyoqKioqKi8gXHRcdFx0XHRcdHJlc29sdmUoKTtcbi8qKioqKiovIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwICYmIHJlcXVlc3Quc3RhdHVzICE9PSAzMDQpIHtcbi8qKioqKiovIFx0XHRcdFx0XHQvLyBvdGhlciBmYWlsdXJlXG4vKioqKioqLyBcdFx0XHRcdFx0cmVqZWN0KG5ldyBFcnJvcihcIk1hbmlmZXN0IHJlcXVlc3QgdG8gXCIgKyByZXF1ZXN0UGF0aCArIFwiIGZhaWxlZC5cIikpO1xuLyoqKioqKi8gXHRcdFx0XHR9IGVsc2Uge1xuLyoqKioqKi8gXHRcdFx0XHRcdC8vIHN1Y2Nlc3Ncbi8qKioqKiovIFx0XHRcdFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0dmFyIHVwZGF0ZSA9IEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuLyoqKioqKi8gXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdHJlamVjdChlKTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdHJldHVybjtcbi8qKioqKiovIFx0XHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRcdFx0cmVzb2x2ZSh1cGRhdGUpO1xuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR9O1xuLyoqKioqKi8gXHRcdH0pO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHR2YXIgaG90QXBwbHlPblVwZGF0ZSA9IHRydWU7XG4vKioqKioqLyBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuLyoqKioqKi8gXHR2YXIgaG90Q3VycmVudEhhc2ggPSBcImNlZDQ0Yzc4OTJhNzgwMzRmZmU0XCI7XG4vKioqKioqLyBcdHZhciBob3RSZXF1ZXN0VGltZW91dCA9IDEwMDAwO1xuLyoqKioqKi8gXHR2YXIgaG90Q3VycmVudE1vZHVsZURhdGEgPSB7fTtcbi8qKioqKiovIFx0dmFyIGhvdEN1cnJlbnRDaGlsZE1vZHVsZTtcbi8qKioqKiovIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4vKioqKioqLyBcdHZhciBob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuLyoqKioqKi8gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbi8qKioqKiovIFx0dmFyIGhvdEN1cnJlbnRQYXJlbnRzVGVtcCA9IFtdO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4vKioqKioqLyBcdGZ1bmN0aW9uIGhvdENyZWF0ZVJlcXVpcmUobW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHR2YXIgbWUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRpZiAoIW1lKSByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXztcbi8qKioqKiovIFx0XHR2YXIgZm4gPSBmdW5jdGlvbihyZXF1ZXN0KSB7XG4vKioqKioqLyBcdFx0XHRpZiAobWUuaG90LmFjdGl2ZSkge1xuLyoqKioqKi8gXHRcdFx0XHRpZiAoaW5zdGFsbGVkTW9kdWxlc1tyZXF1ZXN0XSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdGlmIChpbnN0YWxsZWRNb2R1bGVzW3JlcXVlc3RdLnBhcmVudHMuaW5kZXhPZihtb2R1bGVJZCkgPT09IC0xKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW3JlcXVlc3RdLnBhcmVudHMucHVzaChtb2R1bGVJZCk7XG4vKioqKioqLyBcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHR9IGVsc2Uge1xuLyoqKioqKi8gXHRcdFx0XHRcdGhvdEN1cnJlbnRQYXJlbnRzID0gW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRcdFx0XHRob3RDdXJyZW50Q2hpbGRNb2R1bGUgPSByZXF1ZXN0O1xuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRcdGlmIChtZS5jaGlsZHJlbi5pbmRleE9mKHJlcXVlc3QpID09PSAtMSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdG1lLmNoaWxkcmVuLnB1c2gocmVxdWVzdCk7XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH0gZWxzZSB7XG4vKioqKioqLyBcdFx0XHRcdGNvbnNvbGUud2Fybihcbi8qKioqKiovIFx0XHRcdFx0XHRcIltITVJdIHVuZXhwZWN0ZWQgcmVxdWlyZShcIiArXG4vKioqKioqLyBcdFx0XHRcdFx0XHRyZXF1ZXN0ICtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFwiKSBmcm9tIGRpc3Bvc2VkIG1vZHVsZSBcIiArXG4vKioqKioqLyBcdFx0XHRcdFx0XHRtb2R1bGVJZFxuLyoqKioqKi8gXHRcdFx0XHQpO1xuLyoqKioqKi8gXHRcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18ocmVxdWVzdCk7XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XHR2YXIgT2JqZWN0RmFjdG9yeSA9IGZ1bmN0aW9uIE9iamVjdEZhY3RvcnkobmFtZSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuLyoqKioqKi8gXHRcdFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fW25hbWVdO1xuLyoqKioqKi8gXHRcdFx0XHR9LFxuLyoqKioqKi8gXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXSA9IHZhbHVlO1xuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR9O1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFx0Zm9yICh2YXIgbmFtZSBpbiBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG4vKioqKioqLyBcdFx0XHRpZiAoXG4vKioqKioqLyBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfX3dlYnBhY2tfcmVxdWlyZV9fLCBuYW1lKSAmJlxuLyoqKioqKi8gXHRcdFx0XHRuYW1lICE9PSBcImVcIiAmJlxuLyoqKioqKi8gXHRcdFx0XHRuYW1lICE9PSBcInRcIlxuLyoqKioqKi8gXHRcdFx0KSB7XG4vKioqKioqLyBcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgbmFtZSwgT2JqZWN0RmFjdG9yeShuYW1lKSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdGZuLmUgPSBmdW5jdGlvbihjaHVua0lkKSB7XG4vKioqKioqLyBcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInJlYWR5XCIpIGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XG4vKioqKioqLyBcdFx0XHRob3RDaHVua3NMb2FkaW5nKys7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5lKGNodW5rSWQpLnRoZW4oZmluaXNoQ2h1bmtMb2FkaW5nLCBmdW5jdGlvbihlcnIpIHtcbi8qKioqKiovIFx0XHRcdFx0ZmluaXNoQ2h1bmtMb2FkaW5nKCk7XG4vKioqKioqLyBcdFx0XHRcdHRocm93IGVycjtcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGZpbmlzaENodW5rTG9hZGluZygpIHtcbi8qKioqKiovIFx0XHRcdFx0aG90Q2h1bmtzTG9hZGluZy0tO1xuLyoqKioqKi8gXHRcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInByZXBhcmVcIikge1xuLyoqKioqKi8gXHRcdFx0XHRcdGlmICghaG90V2FpdGluZ0ZpbGVzTWFwW2NodW5rSWRdKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRob3RFbnN1cmVVcGRhdGVDaHVuayhjaHVua0lkKTtcbi8qKioqKiovIFx0XHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRcdFx0aWYgKGhvdENodW5rc0xvYWRpbmcgPT09IDAgJiYgaG90V2FpdGluZ0ZpbGVzID09PSAwKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRob3RVcGRhdGVEb3dubG9hZGVkKCk7XG4vKioqKioqLyBcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XHRmbi50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRcdGlmIChtb2RlICYgMSkgdmFsdWUgPSBmbih2YWx1ZSk7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy50KHZhbHVlLCBtb2RlICYgfjEpO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFx0cmV0dXJuIGZuO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbi8qKioqKiovIFx0ZnVuY3Rpb24gaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0dmFyIGhvdCA9IHtcbi8qKioqKiovIFx0XHRcdC8vIHByaXZhdGUgc3R1ZmZcbi8qKioqKiovIFx0XHRcdF9hY2NlcHRlZERlcGVuZGVuY2llczoge30sXG4vKioqKioqLyBcdFx0XHRfZGVjbGluZWREZXBlbmRlbmNpZXM6IHt9LFxuLyoqKioqKi8gXHRcdFx0X3NlbGZBY2NlcHRlZDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRfc2VsZkRlY2xpbmVkOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdF9kaXNwb3NlSGFuZGxlcnM6IFtdLFxuLyoqKioqKi8gXHRcdFx0X21haW46IGhvdEN1cnJlbnRDaGlsZE1vZHVsZSAhPT0gbW9kdWxlSWQsXG4vKioqKioqL1xuLyoqKioqKi8gXHRcdFx0Ly8gTW9kdWxlIEFQSVxuLyoqKioqKi8gXHRcdFx0YWN0aXZlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0YWNjZXB0OiBmdW5jdGlvbihkZXAsIGNhbGxiYWNrKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmIChkZXAgPT09IHVuZGVmaW5lZCkgaG90Ll9zZWxmQWNjZXB0ZWQgPSB0cnVlO1xuLyoqKioqKi8gXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgZGVwID09PSBcImZ1bmN0aW9uXCIpIGhvdC5fc2VsZkFjY2VwdGVkID0gZGVwO1xuLyoqKioqKi8gXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgZGVwID09PSBcIm9iamVjdFwiKVxuLyoqKioqKi8gXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0aG90Ll9hY2NlcHRlZERlcGVuZGVuY2llc1tkZXBbaV1dID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcbi8qKioqKiovIFx0XHRcdFx0ZWxzZSBob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcF0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuLyoqKioqKi8gXHRcdFx0fSxcbi8qKioqKiovIFx0XHRcdGRlY2xpbmU6IGZ1bmN0aW9uKGRlcCkge1xuLyoqKioqKi8gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkRlY2xpbmVkID0gdHJ1ZTtcbi8qKioqKiovIFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIGRlcCA9PT0gXCJvYmplY3RcIilcbi8qKioqKiovIFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKylcbi8qKioqKiovIFx0XHRcdFx0XHRcdGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IHRydWU7XG4vKioqKioqLyBcdFx0XHRcdGVsc2UgaG90Ll9kZWNsaW5lZERlcGVuZGVuY2llc1tkZXBdID0gdHJ1ZTtcbi8qKioqKiovIFx0XHRcdH0sXG4vKioqKioqLyBcdFx0XHRkaXNwb3NlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuLyoqKioqKi8gXHRcdFx0XHRob3QuX2Rpc3Bvc2VIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTtcbi8qKioqKiovIFx0XHRcdH0sXG4vKioqKioqLyBcdFx0XHRhZGREaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbi8qKioqKiovIFx0XHRcdFx0aG90Ll9kaXNwb3NlSGFuZGxlcnMucHVzaChjYWxsYmFjayk7XG4vKioqKioqLyBcdFx0XHR9LFxuLyoqKioqKi8gXHRcdFx0cmVtb3ZlRGlzcG9zZUhhbmRsZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4vKioqKioqLyBcdFx0XHRcdHZhciBpZHggPSBob3QuX2Rpc3Bvc2VIYW5kbGVycy5pbmRleE9mKGNhbGxiYWNrKTtcbi8qKioqKiovIFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBob3QuX2Rpc3Bvc2VIYW5kbGVycy5zcGxpY2UoaWR4LCAxKTtcbi8qKioqKiovIFx0XHRcdH0sXG4vKioqKioqL1xuLyoqKioqKi8gXHRcdFx0Ly8gTWFuYWdlbWVudCBBUElcbi8qKioqKiovIFx0XHRcdGNoZWNrOiBob3RDaGVjayxcbi8qKioqKiovIFx0XHRcdGFwcGx5OiBob3RBcHBseSxcbi8qKioqKiovIFx0XHRcdHN0YXR1czogZnVuY3Rpb24obCkge1xuLyoqKioqKi8gXHRcdFx0XHRpZiAoIWwpIHJldHVybiBob3RTdGF0dXM7XG4vKioqKioqLyBcdFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzLnB1c2gobCk7XG4vKioqKioqLyBcdFx0XHR9LFxuLyoqKioqKi8gXHRcdFx0YWRkU3RhdHVzSGFuZGxlcjogZnVuY3Rpb24obCkge1xuLyoqKioqKi8gXHRcdFx0XHRob3RTdGF0dXNIYW5kbGVycy5wdXNoKGwpO1xuLyoqKioqKi8gXHRcdFx0fSxcbi8qKioqKiovIFx0XHRcdHJlbW92ZVN0YXR1c0hhbmRsZXI6IGZ1bmN0aW9uKGwpIHtcbi8qKioqKiovIFx0XHRcdFx0dmFyIGlkeCA9IGhvdFN0YXR1c0hhbmRsZXJzLmluZGV4T2YobCk7XG4vKioqKioqLyBcdFx0XHRcdGlmIChpZHggPj0gMCkgaG90U3RhdHVzSGFuZGxlcnMuc3BsaWNlKGlkeCwgMSk7XG4vKioqKioqLyBcdFx0XHR9LFxuLyoqKioqKi9cbi8qKioqKiovIFx0XHRcdC8vaW5oZXJpdCBmcm9tIHByZXZpb3VzIGRpc3Bvc2UgY2FsbFxuLyoqKioqKi8gXHRcdFx0ZGF0YTogaG90Q3VycmVudE1vZHVsZURhdGFbbW9kdWxlSWRdXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XHRob3RDdXJyZW50Q2hpbGRNb2R1bGUgPSB1bmRlZmluZWQ7XG4vKioqKioqLyBcdFx0cmV0dXJuIGhvdDtcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0dmFyIGhvdFN0YXR1c0hhbmRsZXJzID0gW107XG4vKioqKioqLyBcdHZhciBob3RTdGF0dXMgPSBcImlkbGVcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdGZ1bmN0aW9uIGhvdFNldFN0YXR1cyhuZXdTdGF0dXMpIHtcbi8qKioqKiovIFx0XHRob3RTdGF0dXMgPSBuZXdTdGF0dXM7XG4vKioqKioqLyBcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBob3RTdGF0dXNIYW5kbGVycy5sZW5ndGg7IGkrKylcbi8qKioqKiovIFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzW2ldLmNhbGwobnVsbCwgbmV3U3RhdHVzKTtcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gd2hpbGUgZG93bmxvYWRpbmdcbi8qKioqKiovIFx0dmFyIGhvdFdhaXRpbmdGaWxlcyA9IDA7XG4vKioqKioqLyBcdHZhciBob3RDaHVua3NMb2FkaW5nID0gMDtcbi8qKioqKiovIFx0dmFyIGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuLyoqKioqKi8gXHR2YXIgaG90UmVxdWVzdGVkRmlsZXNNYXAgPSB7fTtcbi8qKioqKiovIFx0dmFyIGhvdEF2YWlsYWJsZUZpbGVzTWFwID0ge307XG4vKioqKioqLyBcdHZhciBob3REZWZlcnJlZDtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSB1cGRhdGUgaW5mb1xuLyoqKioqKi8gXHR2YXIgaG90VXBkYXRlLCBob3RVcGRhdGVOZXdIYXNoO1xuLyoqKioqKi9cbi8qKioqKiovIFx0ZnVuY3Rpb24gdG9Nb2R1bGVJZChpZCkge1xuLyoqKioqKi8gXHRcdHZhciBpc051bWJlciA9ICtpZCArIFwiXCIgPT09IGlkO1xuLyoqKioqKi8gXHRcdHJldHVybiBpc051bWJlciA/ICtpZCA6IGlkO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHRmdW5jdGlvbiBob3RDaGVjayhhcHBseSkge1xuLyoqKioqKi8gXHRcdGlmIChob3RTdGF0dXMgIT09IFwiaWRsZVwiKSB7XG4vKioqKioqLyBcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjaGVjaygpIGlzIG9ubHkgYWxsb3dlZCBpbiBpZGxlIHN0YXR1c1wiKTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0aG90QXBwbHlPblVwZGF0ZSA9IGFwcGx5O1xuLyoqKioqKi8gXHRcdGhvdFNldFN0YXR1cyhcImNoZWNrXCIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBob3REb3dubG9hZE1hbmlmZXN0KGhvdFJlcXVlc3RUaW1lb3V0KS50aGVuKGZ1bmN0aW9uKHVwZGF0ZSkge1xuLyoqKioqKi8gXHRcdFx0aWYgKCF1cGRhdGUpIHtcbi8qKioqKiovIFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcbi8qKioqKiovIFx0XHRcdFx0cmV0dXJuIG51bGw7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcCA9IHt9O1xuLyoqKioqKi8gXHRcdFx0aG90V2FpdGluZ0ZpbGVzTWFwID0ge307XG4vKioqKioqLyBcdFx0XHRob3RBdmFpbGFibGVGaWxlc01hcCA9IHVwZGF0ZS5jO1xuLyoqKioqKi8gXHRcdFx0aG90VXBkYXRlTmV3SGFzaCA9IHVwZGF0ZS5oO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHRcdGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XG4vKioqKioqLyBcdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuLyoqKioqKi8gXHRcdFx0XHRob3REZWZlcnJlZCA9IHtcbi8qKioqKiovIFx0XHRcdFx0XHRyZXNvbHZlOiByZXNvbHZlLFxuLyoqKioqKi8gXHRcdFx0XHRcdHJlamVjdDogcmVqZWN0XG4vKioqKioqLyBcdFx0XHRcdH07XG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHRcdGhvdFVwZGF0ZSA9IHt9O1xuLyoqKioqKi8gXHRcdFx0dmFyIGNodW5rSWQgPSAyO1xuLyoqKioqKi8gXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmUtYmxvY2tzXG4vKioqKioqLyBcdFx0XHR7XG4vKioqKioqLyBcdFx0XHRcdC8qZ2xvYmFscyBjaHVua0lkICovXG4vKioqKioqLyBcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0aWYgKFxuLyoqKioqKi8gXHRcdFx0XHRob3RTdGF0dXMgPT09IFwicHJlcGFyZVwiICYmXG4vKioqKioqLyBcdFx0XHRcdGhvdENodW5rc0xvYWRpbmcgPT09IDAgJiZcbi8qKioqKiovIFx0XHRcdFx0aG90V2FpdGluZ0ZpbGVzID09PSAwXG4vKioqKioqLyBcdFx0XHQpIHtcbi8qKioqKiovIFx0XHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIHByb21pc2U7XG4vKioqKioqLyBcdFx0fSk7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuLyoqKioqKi8gXHRmdW5jdGlvbiBob3RBZGRVcGRhdGVDaHVuayhjaHVua0lkLCBtb3JlTW9kdWxlcykge1xuLyoqKioqKi8gXHRcdGlmICghaG90QXZhaWxhYmxlRmlsZXNNYXBbY2h1bmtJZF0gfHwgIWhvdFJlcXVlc3RlZEZpbGVzTWFwW2NodW5rSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuO1xuLyoqKioqKi8gXHRcdGhvdFJlcXVlc3RlZEZpbGVzTWFwW2NodW5rSWRdID0gZmFsc2U7XG4vKioqKioqLyBcdFx0Zm9yICh2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbi8qKioqKiovIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuLyoqKioqKi8gXHRcdFx0XHRob3RVcGRhdGVbbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRpZiAoLS1ob3RXYWl0aW5nRmlsZXMgPT09IDAgJiYgaG90Q2h1bmtzTG9hZGluZyA9PT0gMCkge1xuLyoqKioqKi8gXHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0ZnVuY3Rpb24gaG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCkge1xuLyoqKioqKi8gXHRcdGlmICghaG90QXZhaWxhYmxlRmlsZXNNYXBbY2h1bmtJZF0pIHtcbi8qKioqKiovIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XG4vKioqKioqLyBcdFx0fSBlbHNlIHtcbi8qKioqKiovIFx0XHRcdGhvdFJlcXVlc3RlZEZpbGVzTWFwW2NodW5rSWRdID0gdHJ1ZTtcbi8qKioqKiovIFx0XHRcdGhvdFdhaXRpbmdGaWxlcysrO1xuLyoqKioqKi8gXHRcdFx0aG90RG93bmxvYWRVcGRhdGVDaHVuayhjaHVua0lkKTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqLyBcdGZ1bmN0aW9uIGhvdFVwZGF0ZURvd25sb2FkZWQoKSB7XG4vKioqKioqLyBcdFx0aG90U2V0U3RhdHVzKFwicmVhZHlcIik7XG4vKioqKioqLyBcdFx0dmFyIGRlZmVycmVkID0gaG90RGVmZXJyZWQ7XG4vKioqKioqLyBcdFx0aG90RGVmZXJyZWQgPSBudWxsO1xuLyoqKioqKi8gXHRcdGlmICghZGVmZXJyZWQpIHJldHVybjtcbi8qKioqKiovIFx0XHRpZiAoaG90QXBwbHlPblVwZGF0ZSkge1xuLyoqKioqKi8gXHRcdFx0Ly8gV3JhcCBkZWZlcnJlZCBvYmplY3QgaW4gUHJvbWlzZSB0byBtYXJrIGl0IGFzIGEgd2VsbC1oYW5kbGVkIFByb21pc2UgdG9cbi8qKioqKiovIFx0XHRcdC8vIGF2b2lkIHRyaWdnZXJpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIHdhcm5pbmcgaW4gQ2hyb21lLlxuLyoqKioqKi8gXHRcdFx0Ly8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ2NTY2NlxuLyoqKioqKi8gXHRcdFx0UHJvbWlzZS5yZXNvbHZlKClcbi8qKioqKiovIFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0cmV0dXJuIGhvdEFwcGx5KGhvdEFwcGx5T25VcGRhdGUpO1xuLyoqKioqKi8gXHRcdFx0XHR9KVxuLyoqKioqKi8gXHRcdFx0XHQudGhlbihcbi8qKioqKiovIFx0XHRcdFx0XHRmdW5jdGlvbihyZXN1bHQpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcbi8qKioqKiovIFx0XHRcdFx0XHR9LFxuLyoqKioqKi8gXHRcdFx0XHRcdGZ1bmN0aW9uKGVycikge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0KGVycik7XG4vKioqKioqLyBcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHQpO1xuLyoqKioqKi8gXHRcdH0gZWxzZSB7XG4vKioqKioqLyBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4vKioqKioqLyBcdFx0XHRmb3IgKHZhciBpZCBpbiBob3RVcGRhdGUpIHtcbi8qKioqKiovIFx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChob3RVcGRhdGUsIGlkKSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdG91dGRhdGVkTW9kdWxlcy5wdXNoKHRvTW9kdWxlSWQoaWQpKTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0ZnVuY3Rpb24gaG90QXBwbHkob3B0aW9ucykge1xuLyoqKioqKi8gXHRcdGlmIChob3RTdGF0dXMgIT09IFwicmVhZHlcIilcbi8qKioqKiovIFx0XHRcdHRocm93IG5ldyBFcnJvcihcImFwcGx5KCkgaXMgb25seSBhbGxvd2VkIGluIHJlYWR5IHN0YXR1c1wiKTtcbi8qKioqKiovIFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0dmFyIGNiO1xuLyoqKioqKi8gXHRcdHZhciBpO1xuLyoqKioqKi8gXHRcdHZhciBqO1xuLyoqKioqKi8gXHRcdHZhciBtb2R1bGU7XG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZUlkO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHRmdW5jdGlvbiBnZXRBZmZlY3RlZFN0dWZmKHVwZGF0ZU1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW3VwZGF0ZU1vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5tYXAoZnVuY3Rpb24oaWQpIHtcbi8qKioqKiovIFx0XHRcdFx0cmV0dXJuIHtcbi8qKioqKiovIFx0XHRcdFx0XHRjaGFpbjogW2lkXSxcbi8qKioqKiovIFx0XHRcdFx0XHRpZDogaWRcbi8qKioqKiovIFx0XHRcdFx0fTtcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdFx0d2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbi8qKioqKiovIFx0XHRcdFx0dmFyIHF1ZXVlSXRlbSA9IHF1ZXVlLnBvcCgpO1xuLyoqKioqKi8gXHRcdFx0XHR2YXIgbW9kdWxlSWQgPSBxdWV1ZUl0ZW0uaWQ7XG4vKioqKioqLyBcdFx0XHRcdHZhciBjaGFpbiA9IHF1ZXVlSXRlbS5jaGFpbjtcbi8qKioqKiovIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0XHRcdGlmICghbW9kdWxlIHx8IG1vZHVsZS5ob3QuX3NlbGZBY2NlcHRlZCkgY29udGludWU7XG4vKioqKioqLyBcdFx0XHRcdGlmIChtb2R1bGUuaG90Ll9zZWxmRGVjbGluZWQpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRyZXR1cm4ge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWRlY2xpbmVkXCIsXG4vKioqKioqLyBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXG4vKioqKioqLyBcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWRcbi8qKioqKiovIFx0XHRcdFx0XHR9O1xuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRcdGlmIChtb2R1bGUuaG90Ll9tYWluKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0cmV0dXJuIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdHR5cGU6IFwidW5hY2NlcHRlZFwiLFxuLyoqKioqKi8gXHRcdFx0XHRcdFx0Y2hhaW46IGNoYWluLFxuLyoqKioqKi8gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkXG4vKioqKioqLyBcdFx0XHRcdFx0fTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG1vZHVsZS5wYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0dmFyIHBhcmVudElkID0gbW9kdWxlLnBhcmVudHNbaV07XG4vKioqKioqLyBcdFx0XHRcdFx0dmFyIHBhcmVudCA9IGluc3RhbGxlZE1vZHVsZXNbcGFyZW50SWRdO1xuLyoqKioqKi8gXHRcdFx0XHRcdGlmICghcGFyZW50KSBjb250aW51ZTtcbi8qKioqKiovIFx0XHRcdFx0XHRpZiAocGFyZW50LmhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRyZXR1cm4ge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRlY2xpbmVkXCIsXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0cGFyZW50SWQ6IHBhcmVudElkXG4vKioqKioqLyBcdFx0XHRcdFx0XHR9O1xuLyoqKioqKi8gXHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0XHRpZiAob3V0ZGF0ZWRNb2R1bGVzLmluZGV4T2YocGFyZW50SWQpICE9PSAtMSkgY29udGludWU7XG4vKioqKioqLyBcdFx0XHRcdFx0aWYgKHBhcmVudC5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0aWYgKCFvdXRkYXRlZERlcGVuZGVuY2llc1twYXJlbnRJZF0pXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSA9IFtdO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdLCBbbW9kdWxlSWRdKTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuLyoqKioqKi8gXHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0XHRkZWxldGUgb3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdO1xuLyoqKioqKi8gXHRcdFx0XHRcdG91dGRhdGVkTW9kdWxlcy5wdXNoKHBhcmVudElkKTtcbi8qKioqKiovIFx0XHRcdFx0XHRxdWV1ZS5wdXNoKHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZDogcGFyZW50SWRcbi8qKioqKiovIFx0XHRcdFx0XHR9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0XHRcdHJldHVybiB7XG4vKioqKioqLyBcdFx0XHRcdHR5cGU6IFwiYWNjZXB0ZWRcIixcbi8qKioqKiovIFx0XHRcdFx0bW9kdWxlSWQ6IHVwZGF0ZU1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0XHRvdXRkYXRlZE1vZHVsZXM6IG91dGRhdGVkTW9kdWxlcyxcbi8qKioqKiovIFx0XHRcdFx0b3V0ZGF0ZWREZXBlbmRlbmNpZXM6IG91dGRhdGVkRGVwZW5kZW5jaWVzXG4vKioqKioqLyBcdFx0XHR9O1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovXG4vKioqKioqLyBcdFx0ZnVuY3Rpb24gYWRkQWxsVG9TZXQoYSwgYikge1xuLyoqKioqKi8gXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4vKioqKioqLyBcdFx0XHRcdHZhciBpdGVtID0gYltpXTtcbi8qKioqKiovIFx0XHRcdFx0aWYgKGEuaW5kZXhPZihpdGVtKSA9PT0gLTEpIGEucHVzaChpdGVtKTtcbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIGF0IGJlZ2luIGFsbCB1cGRhdGVzIG1vZHVsZXMgYXJlIG91dGRhdGVkXG4vKioqKioqLyBcdFx0Ly8gdGhlIFwib3V0ZGF0ZWRcIiBzdGF0dXMgY2FuIHByb3BhZ2F0ZSB0byBwYXJlbnRzIGlmIHRoZXkgZG9uJ3QgYWNjZXB0IHRoZSBjaGlsZHJlblxuLyoqKioqKi8gXHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xuLyoqKioqKi8gXHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbXTtcbi8qKioqKiovIFx0XHR2YXIgYXBwbGllZFVwZGF0ZSA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHR2YXIgd2FyblVuZXhwZWN0ZWRSZXF1aXJlID0gZnVuY3Rpb24gd2FyblVuZXhwZWN0ZWRSZXF1aXJlKCkge1xuLyoqKioqKi8gXHRcdFx0Y29uc29sZS53YXJuKFxuLyoqKioqKi8gXHRcdFx0XHRcIltITVJdIHVuZXhwZWN0ZWQgcmVxdWlyZShcIiArIHJlc3VsdC5tb2R1bGVJZCArIFwiKSB0byBkaXNwb3NlZCBtb2R1bGVcIlxuLyoqKioqKi8gXHRcdFx0KTtcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHRmb3IgKHZhciBpZCBpbiBob3RVcGRhdGUpIHtcbi8qKioqKiovIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaG90VXBkYXRlLCBpZCkpIHtcbi8qKioqKiovIFx0XHRcdFx0bW9kdWxlSWQgPSB0b01vZHVsZUlkKGlkKTtcbi8qKioqKiovIFx0XHRcdFx0LyoqIEB0eXBlIHtUT0RPfSAqL1xuLyoqKioqKi8gXHRcdFx0XHR2YXIgcmVzdWx0O1xuLyoqKioqKi8gXHRcdFx0XHRpZiAoaG90VXBkYXRlW2lkXSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdHJlc3VsdCA9IGdldEFmZmVjdGVkU3R1ZmYobW9kdWxlSWQpO1xuLyoqKioqKi8gXHRcdFx0XHR9IGVsc2Uge1xuLyoqKioqKi8gXHRcdFx0XHRcdHJlc3VsdCA9IHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdHR5cGU6IFwiZGlzcG9zZWRcIixcbi8qKioqKiovIFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBpZFxuLyoqKioqKi8gXHRcdFx0XHRcdH07XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0LyoqIEB0eXBlIHtFcnJvcnxmYWxzZX0gKi9cbi8qKioqKiovIFx0XHRcdFx0dmFyIGFib3J0RXJyb3IgPSBmYWxzZTtcbi8qKioqKiovIFx0XHRcdFx0dmFyIGRvQXBwbHkgPSBmYWxzZTtcbi8qKioqKiovIFx0XHRcdFx0dmFyIGRvRGlzcG9zZSA9IGZhbHNlO1xuLyoqKioqKi8gXHRcdFx0XHR2YXIgY2hhaW5JbmZvID0gXCJcIjtcbi8qKioqKiovIFx0XHRcdFx0aWYgKHJlc3VsdC5jaGFpbikge1xuLyoqKioqKi8gXHRcdFx0XHRcdGNoYWluSW5mbyA9IFwiXFxuVXBkYXRlIHByb3BhZ2F0aW9uOiBcIiArIHJlc3VsdC5jaGFpbi5qb2luKFwiIC0+IFwiKTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRzd2l0Y2ggKHJlc3VsdC50eXBlKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0Y2FzZSBcInNlbGYtZGVjbGluZWRcIjpcbi8qKioqKiovIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRGVjbGluZWQpIG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZURlY2xpbmVkKVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIG9mIHNlbGYgZGVjbGluZTogXCIgK1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm1vZHVsZUlkICtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRcdGNoYWluSW5mb1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHQpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0YnJlYWs7XG4vKioqKioqLyBcdFx0XHRcdFx0Y2FzZSBcImRlY2xpbmVkXCI6XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRlY2xpbmVkKSBvcHRpb25zLm9uRGVjbGluZWQocmVzdWx0KTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVEZWNsaW5lZClcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0YWJvcnRFcnJvciA9IG5ldyBFcnJvcihcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRcIkFib3J0ZWQgYmVjYXVzZSBvZiBkZWNsaW5lZCBkZXBlbmRlbmN5OiBcIiArXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQubW9kdWxlSWQgK1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdFx0XCIgaW4gXCIgK1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0LnBhcmVudElkICtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRcdGNoYWluSW5mb1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHQpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0YnJlYWs7XG4vKioqKioqLyBcdFx0XHRcdFx0Y2FzZSBcInVuYWNjZXB0ZWRcIjpcbi8qKioqKiovIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uVW5hY2NlcHRlZCkgb3B0aW9ucy5vblVuYWNjZXB0ZWQocmVzdWx0KTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVVbmFjY2VwdGVkKVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIFwiICsgbW9kdWxlSWQgKyBcIiBpcyBub3QgYWNjZXB0ZWRcIiArIGNoYWluSW5mb1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHQpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0YnJlYWs7XG4vKioqKioqLyBcdFx0XHRcdFx0Y2FzZSBcImFjY2VwdGVkXCI6XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkFjY2VwdGVkKSBvcHRpb25zLm9uQWNjZXB0ZWQocmVzdWx0KTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGRvQXBwbHkgPSB0cnVlO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0YnJlYWs7XG4vKioqKioqLyBcdFx0XHRcdFx0Y2FzZSBcImRpc3Bvc2VkXCI6XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRpc3Bvc2VkKSBvcHRpb25zLm9uRGlzcG9zZWQocmVzdWx0KTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGRvRGlzcG9zZSA9IHRydWU7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRicmVhaztcbi8qKioqKiovIFx0XHRcdFx0XHRkZWZhdWx0OlxuLyoqKioqKi8gXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5leGNlcHRpb24gdHlwZSBcIiArIHJlc3VsdC50eXBlKTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRpZiAoYWJvcnRFcnJvcikge1xuLyoqKioqKi8gXHRcdFx0XHRcdGhvdFNldFN0YXR1cyhcImFib3J0XCIpO1xuLyoqKioqKi8gXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRpZiAoZG9BcHBseSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdID0gaG90VXBkYXRlW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRcdFx0XHRhZGRBbGxUb1NldChvdXRkYXRlZE1vZHVsZXMsIHJlc3VsdC5vdXRkYXRlZE1vZHVsZXMpO1xuLyoqKioqKi8gXHRcdFx0XHRcdGZvciAobW9kdWxlSWQgaW4gcmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAoXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQub3V0ZGF0ZWREZXBlbmRlbmNpZXMsXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWRcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0KVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0KSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdGlmICghb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSA9IFtdO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRhZGRBbGxUb1NldChcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0sXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHQpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRpZiAoZG9EaXNwb3NlKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCBbcmVzdWx0Lm1vZHVsZUlkXSk7XG4vKioqKioqLyBcdFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gPSB3YXJuVW5leHBlY3RlZFJlcXVpcmU7XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFN0b3JlIHNlbGYgYWNjZXB0ZWQgb3V0ZGF0ZWQgbW9kdWxlcyB0byByZXF1aXJlIHRoZW0gbGF0ZXIgYnkgdGhlIG1vZHVsZSBzeXN0ZW1cbi8qKioqKiovIFx0XHR2YXIgb3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzID0gW107XG4vKioqKioqLyBcdFx0Zm9yIChpID0gMDsgaSA8IG91dGRhdGVkTW9kdWxlcy5sZW5ndGg7IGkrKykge1xuLyoqKioqKi8gXHRcdFx0bW9kdWxlSWQgPSBvdXRkYXRlZE1vZHVsZXNbaV07XG4vKioqKioqLyBcdFx0XHRpZiAoXG4vKioqKioqLyBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdICYmXG4vKioqKioqLyBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkICYmXG4vKioqKioqLyBcdFx0XHRcdC8vIHJlbW92ZWQgc2VsZi1hY2NlcHRlZCBtb2R1bGVzIHNob3VsZCBub3QgYmUgcmVxdWlyZWRcbi8qKioqKiovIFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gIT09IHdhcm5VbmV4cGVjdGVkUmVxdWlyZVxuLyoqKioqKi8gXHRcdFx0KSB7XG4vKioqKioqLyBcdFx0XHRcdG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlcy5wdXNoKHtcbi8qKioqKiovIFx0XHRcdFx0XHRtb2R1bGU6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0XHRcdGVycm9ySGFuZGxlcjogaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uaG90Ll9zZWxmQWNjZXB0ZWRcbi8qKioqKiovIFx0XHRcdFx0fSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBOb3cgaW4gXCJkaXNwb3NlXCIgcGhhc2Vcbi8qKioqKiovIFx0XHRob3RTZXRTdGF0dXMoXCJkaXNwb3NlXCIpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5rZXlzKGhvdEF2YWlsYWJsZUZpbGVzTWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGNodW5rSWQpIHtcbi8qKioqKiovIFx0XHRcdGlmIChob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSA9PT0gZmFsc2UpIHtcbi8qKioqKiovIFx0XHRcdFx0aG90RGlzcG9zZUNodW5rKGNodW5rSWQpO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH0pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHR2YXIgaWR4O1xuLyoqKioqKi8gXHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5zbGljZSgpO1xuLyoqKioqKi8gXHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4vKioqKioqLyBcdFx0XHRtb2R1bGVJZCA9IHF1ZXVlLnBvcCgpO1xuLyoqKioqKi8gXHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0XHRpZiAoIW1vZHVsZSkgY29udGludWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdFx0dmFyIGRhdGEgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0XHQvLyBDYWxsIGRpc3Bvc2UgaGFuZGxlcnNcbi8qKioqKiovIFx0XHRcdHZhciBkaXNwb3NlSGFuZGxlcnMgPSBtb2R1bGUuaG90Ll9kaXNwb3NlSGFuZGxlcnM7XG4vKioqKioqLyBcdFx0XHRmb3IgKGogPSAwOyBqIDwgZGlzcG9zZUhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XG4vKioqKioqLyBcdFx0XHRcdGNiID0gZGlzcG9zZUhhbmRsZXJzW2pdO1xuLyoqKioqKi8gXHRcdFx0XHRjYihkYXRhKTtcbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdGhvdEN1cnJlbnRNb2R1bGVEYXRhW21vZHVsZUlkXSA9IGRhdGE7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdFx0Ly8gZGlzYWJsZSBtb2R1bGUgKHRoaXMgZGlzYWJsZXMgcmVxdWlyZXMgZnJvbSB0aGlzIG1vZHVsZSlcbi8qKioqKiovIFx0XHRcdG1vZHVsZS5ob3QuYWN0aXZlID0gZmFsc2U7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdFx0Ly8gcmVtb3ZlIG1vZHVsZSBmcm9tIGNhY2hlXG4vKioqKioqLyBcdFx0XHRkZWxldGUgaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdFx0Ly8gd2hlbiBkaXNwb3NpbmcgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGRpc3Bvc2UgaGFuZGxlclxuLyoqKioqKi8gXHRcdFx0ZGVsZXRlIG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0XHQvLyByZW1vdmUgXCJwYXJlbnRzXCIgcmVmZXJlbmNlcyBmcm9tIGFsbCBjaGlsZHJlblxuLyoqKioqKi8gXHRcdFx0Zm9yIChqID0gMDsgaiA8IG1vZHVsZS5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuLyoqKioqKi8gXHRcdFx0XHR2YXIgY2hpbGQgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZS5jaGlsZHJlbltqXV07XG4vKioqKioqLyBcdFx0XHRcdGlmICghY2hpbGQpIGNvbnRpbnVlO1xuLyoqKioqKi8gXHRcdFx0XHRpZHggPSBjaGlsZC5wYXJlbnRzLmluZGV4T2YobW9kdWxlSWQpO1xuLyoqKioqKi8gXHRcdFx0XHRpZiAoaWR4ID49IDApIHtcbi8qKioqKiovIFx0XHRcdFx0XHRjaGlsZC5wYXJlbnRzLnNwbGljZShpZHgsIDEpO1xuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyByZW1vdmUgb3V0ZGF0ZWQgZGVwZW5kZW5jeSBmcm9tIG1vZHVsZSBjaGlsZHJlblxuLyoqKioqKi8gXHRcdHZhciBkZXBlbmRlbmN5O1xuLyoqKioqKi8gXHRcdHZhciBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcztcbi8qKioqKiovIFx0XHRmb3IgKG1vZHVsZUlkIGluIG91dGRhdGVkRGVwZW5kZW5jaWVzKSB7XG4vKioqKioqLyBcdFx0XHRpZiAoXG4vKioqKioqLyBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXRkYXRlZERlcGVuZGVuY2llcywgbW9kdWxlSWQpXG4vKioqKioqLyBcdFx0XHQpIHtcbi8qKioqKiovIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0XHRcdGlmIChtb2R1bGUpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcyA9IG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMubGVuZ3RoOyBqKyspIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kgPSBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llc1tqXTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGlkeCA9IG1vZHVsZS5jaGlsZHJlbi5pbmRleE9mKGRlcGVuZGVuY3kpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBtb2R1bGUuY2hpbGRyZW4uc3BsaWNlKGlkeCwgMSk7XG4vKioqKioqLyBcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBOb3cgaW4gXCJhcHBseVwiIHBoYXNlXG4vKioqKioqLyBcdFx0aG90U2V0U3RhdHVzKFwiYXBwbHlcIik7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdGhvdEN1cnJlbnRIYXNoID0gaG90VXBkYXRlTmV3SGFzaDtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gaW5zZXJ0IG5ldyBjb2RlXG4vKioqKioqLyBcdFx0Zm9yIChtb2R1bGVJZCBpbiBhcHBsaWVkVXBkYXRlKSB7XG4vKioqKioqLyBcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFwcGxpZWRVcGRhdGUsIG1vZHVsZUlkKSkge1xuLyoqKioqKi8gXHRcdFx0XHRtb2R1bGVzW21vZHVsZUlkXSA9IGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gY2FsbCBhY2NlcHQgaGFuZGxlcnNcbi8qKioqKiovIFx0XHR2YXIgZXJyb3IgPSBudWxsO1xuLyoqKioqKi8gXHRcdGZvciAobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbi8qKioqKiovIFx0XHRcdGlmIChcbi8qKioqKiovIFx0XHRcdFx0T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG91dGRhdGVkRGVwZW5kZW5jaWVzLCBtb2R1bGVJZClcbi8qKioqKiovIFx0XHRcdCkge1xuLyoqKioqKi8gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHRcdFx0aWYgKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzID0gb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdFx0XHRcdHZhciBjYWxsYmFja3MgPSBbXTtcbi8qKioqKiovIFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kgPSBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llc1tpXTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGNiID0gbW9kdWxlLmhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAoY2IpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcy5pbmRleE9mKGNiKSAhPT0gLTEpIGNvbnRpbnVlO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRjYWxsYmFja3MucHVzaChjYik7XG4vKioqKioqLyBcdFx0XHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdGNiID0gY2FsbGJhY2tzW2ldO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0Y2IobW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMpO1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0LWVycm9yZWRcIixcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRcdGRlcGVuZGVuY3lJZDogbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbaV0sXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdFx0fSk7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZUVycm9yZWQpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gTG9hZCBzZWxmIGFjY2VwdGVkIG1vZHVsZXNcbi8qKioqKiovIFx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4vKioqKioqLyBcdFx0XHR2YXIgaXRlbSA9IG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlc1tpXTtcbi8qKioqKiovIFx0XHRcdG1vZHVsZUlkID0gaXRlbS5tb2R1bGU7XG4vKioqKioqLyBcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKTtcbi8qKioqKiovIFx0XHRcdH0gY2F0Y2ggKGVycikge1xuLyoqKioqKi8gXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0uZXJyb3JIYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbi8qKioqKiovIFx0XHRcdFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0aXRlbS5lcnJvckhhbmRsZXIoZXJyKTtcbi8qKioqKiovIFx0XHRcdFx0XHR9IGNhdGNoIChlcnIyKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkVycm9yZWQpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwic2VsZi1hY2NlcHQtZXJyb3ItaGFuZGxlci1lcnJvcmVkXCIsXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnIyLFxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHRcdG9yaWdpbmFsRXJyb3I6IGVyclxuLyoqKioqKi8gXHRcdFx0XHRcdFx0XHR9KTtcbi8qKioqKiovIFx0XHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyMjtcbi8qKioqKiovIFx0XHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuLyoqKioqKi8gXHRcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdFx0fSBlbHNlIHtcbi8qKioqKiovIFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkVycm9yZWQpIHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWFjY2VwdC1lcnJvcmVkXCIsXG4vKioqKioqLyBcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGVyclxuLyoqKioqKi8gXHRcdFx0XHRcdFx0fSk7XG4vKioqKioqLyBcdFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbi8qKioqKiovIFx0XHRcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIGhhbmRsZSBlcnJvcnMgaW4gYWNjZXB0IGhhbmRsZXJzIGFuZCBzZWxmIGFjY2VwdGVkIG1vZHVsZSBsb2FkXG4vKioqKioqLyBcdFx0aWYgKGVycm9yKSB7XG4vKioqKioqLyBcdFx0XHRob3RTZXRTdGF0dXMoXCJmYWlsXCIpO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdGhvdFNldFN0YXR1cyhcImlkbGVcIik7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbi8qKioqKiovIFx0XHRcdHJlc29sdmUob3V0ZGF0ZWRNb2R1bGVzKTtcbi8qKioqKiovIFx0XHR9KTtcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aG90OiBob3RDcmVhdGVNb2R1bGUobW9kdWxlSWQpLFxuLyoqKioqKi8gXHRcdFx0cGFyZW50czogKGhvdEN1cnJlbnRQYXJlbnRzVGVtcCA9IGhvdEN1cnJlbnRQYXJlbnRzLCBob3RDdXJyZW50UGFyZW50cyA9IFtdLCBob3RDdXJyZW50UGFyZW50c1RlbXApLFxuLyoqKioqKi8gXHRcdFx0Y2hpbGRyZW46IFtdXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgaG90Q3JlYXRlUmVxdWlyZShtb2R1bGVJZCkpO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfaGFzaF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gaG90Q3VycmVudEhhc2g7IH07XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBob3RDcmVhdGVSZXF1aXJlKDEyKShfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMik7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMF9fO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBcIjw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgc3RhbmRhbG9uZT1cXFwibm9cXFwiPz48IWRvY3R5cGUgaHRtbD48c3ZnIGNsYXNzPWljb24gd2lkdGg9MjBweCBoZWlnaHQ9MjBweCB2aWV3Qm94PVxcXCIwIDAgMTAyNCAxMDI0XFxcIiB2ZXJzaW9uPTEuMSB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zz48cGF0aCBmaWxsPSM1OTU5NTkgZD1cXFwiTTczLjE0Mjg1NyAzMzYuNjRoNTI2LjYyODU3MnY0My44ODU3MTRINzMuMTQyODU3ek03My4xNDI4NTcgNjQzLjY1NzE0M2g1MjYuNjI4NTcydjQzLjg4NTcxNEg3My4xNDI4NTd6TTMzNi40NTcxNDMgMTE3LjAyODU3MWg0My44ODU3MTR2Nzg5Ljk0Mjg1OGgtNDMuODg1NzE0ek0yMDQuOCA3My4xNDI4NTdoNjE0LjRhMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAxIDEzMS42NTcxNDMgMTMxLjY1NzE0M3Y2MTQuNGExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDEtMTMxLjY1NzE0MyAxMzEuNjU3MTQzSDIwNC44QTEzMS42NTcxNDMgMTMxLjY1NzE0MyAwIDAgMSA3My4xNDI4NTcgODE5LjJWMjA0LjhBMTMxLjg0IDEzMS44NCAwIDAgMSAyMDQuOCA3My4xNDI4NTd6IG0wIDQzLjg4NTcxNGE4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwLTg3Ljc3MTQyOSA4Ny43NzE0Mjl2NjE0LjRhODcuNzcxNDI5IDg3Ljc3MTQyOSAwIDAgMCA4Ny43NzE0MjkgODcuNzcxNDI5aDYxNC40YTg3Ljc3MTQyOSA4Ny43NzE0MjkgMCAwIDAgODcuNzcxNDI5LTg3Ljc3MTQyOVYyMDQuOGE4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwLTg3Ljc3MTQyOS04Ny43NzE0Mjl6TTgxOS4yIDczLjE0Mjg1N2gtMjE5LjQyODU3MXY4NzcuNzE0Mjg2aDIxOS40Mjg1NzFhMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAwIDEzMS42NTcxNDMtMTMxLjY1NzE0M1YyMDQuOEExMzEuODQgMTMxLjg0IDAgMCAwIDgxOS4yIDczLjE0Mjg1N3ogbTQ0LjA2ODU3MSA0NjAuOTgyODU3aC02NS44Mjg1NzF2NjUuODI4NTcySDc1My4zNzE0Mjl2LTY1LjgyODU3MmgtNjUuODI4NTcyVjQ5MC4wNTcxNDNoNjUuODI4NTcydi02NS44Mjg1NzJoNDQuMDY4NTcxdjY1LjgyODU3Mmg2NS44Mjg1NzF6XFxcIi8+PC9zdmc+XCI7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBzdGFuZGFsb25lPVxcXCJub1xcXCI/PjwhZG9jdHlwZSBodG1sPjxzdmcgY2xhc3M9aWNvbiB3aWR0aD0yMHB4IGhlaWdodD0yMC4wMHB4IHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249MS4xIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxwYXRoIGZpbGw9IzU5NTk1OSBkPVxcXCJNMzgwLjM0Mjg1NyAzMzYuNDU3MTQzaDUyNi44MTE0Mjl2NDMuODg1NzE0SDM4MC4zNDI4NTd6IG0wIDMwNy4yaDUyNi44MTE0Mjl2NDMuODg1NzE0SDM4MC4zNDI4NTd6TTY0My42NTcxNDMgMTE3LjAyODU3MWg0My44ODU3MTR2Nzg5Ljk0Mjg1OGgtNDMuODg1NzE0ek0yMDQuOCA3My4xNDI4NTdoNjE0LjU4Mjg1N0ExMzEuNDc0Mjg2IDEzMS40NzQyODYgMCAwIDEgOTUwLjg1NzE0MyAyMDQuOHY2MTQuNGExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDEtMTMxLjY1NzE0MyAxMzEuNjU3MTQzSDIwNC44QTEzMS42NTcxNDMgMTMxLjY1NzE0MyAwIDAgMSA3My4xNDI4NTcgODE5LjJWMjA0LjhBMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAxIDIwNC44IDczLjE0Mjg1N3ogbTAgNDMuODg1NzE0YTg3LjU4ODU3MSA4Ny41ODg1NzEgMCAwIDAtODcuNTg4NTcxIDg3Ljc3MTQyOXY2MTQuNGE4Ny41ODg1NzEgODcuNTg4NTcxIDAgMCAwIDg3LjU4ODU3MSA4Ny43NzE0MjloNjE0LjU4Mjg1N2E4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwIDg3Ljc3MTQyOS04Ny43NzE0MjlWMjA0LjhhODcuNzcxNDI5IDg3Ljc3MTQyOSAwIDAgMC04Ny43NzE0MjktODcuNzcxNDI5ek0yMDQuOCA3My4xNDI4NTdBMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAwIDczLjE0Mjg1NyAyMDQuOHY2MTQuNGExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDAgMTMxLjY1NzE0MyAxMzEuNjU3MTQzaDIxOS40Mjg1NzFWNzMuMTQyODU3eiBtMTMxLjg0IDQ2MC44aC02NS44Mjg1NzF2NjUuODI4NTcyaC00My44ODU3MTV2LTY1LjgyODU3MmgtNjUuODI4NTcxdi00My44ODU3MTRoNjUuODI4NTcxdi02NS44Mjg1NzJoNDMuODg1NzE1djY1LjgyODU3Mmg2NS44Mjg1NzF6XFxcIi8+PC9zdmc+XCI7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBzdGFuZGFsb25lPVxcXCJub1xcXCI/PjwhZG9jdHlwZSBodG1sPjxzdmcgY2xhc3M9aWNvbiB3aWR0aD0yMHB4IGhlaWdodD0yMC4wMHB4IHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249MS4xIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxwYXRoIGZpbGw9IzU5NTk1OSBkPVxcXCJNNzMuMTQyODU3IDU5OS43NzE0MjloODc3LjcxNDI4NnY0My44ODU3MTRINzMuMTQyODU3ek0zMzYuNDU3MTQzIDM4MC4zNDI4NTdoNDMuODg1NzE0djUyNi42Mjg1NzJoLTQzLjg4NTcxNHogbTMwNy4yIDBoNDMuODg1NzE0djUyNi42Mjg1NzJoLTQzLjg4NTcxNHpNMjA0LjggNzMuMTQyODU3aDYxNC40YTEzMS42NTcxNDMgMTMxLjY1NzE0MyAwIDAgMSAxMzEuNjU3MTQzIDEzMS42NTcxNDN2NjE0LjRhMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAxLTEzMS42NTcxNDMgMTMxLjY1NzE0M0gyMDQuOEExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDEgNzMuMTQyODU3IDgxOS4yVjIwNC44QTEzMS42NTcxNDMgMTMxLjY1NzE0MyAwIDAgMSAyMDQuOCA3My4xNDI4NTd6IG0wIDQzLjg4NTcxNGE4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwLTg3Ljc3MTQyOSA4Ny43NzE0Mjl2NjE0LjRhODcuNTg4NTcxIDg3LjU4ODU3MSAwIDAgMCA4Ny43NzE0MjkgODcuNzcxNDI5aDYxNC40YTg3LjU4ODU3MSA4Ny41ODg1NzEgMCAwIDAgODcuNzcxNDI5LTg3Ljc3MTQyOVYyMDQuOGE4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwLTg3Ljc3MTQyOS04Ny43NzE0Mjl6TTgxOS4yIDczLjE0Mjg1N0gyMDQuOEExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDAgNzMuMTQyODU3IDIwNC44djIxOS40Mjg1NzFoODc3LjcxNDI4NnYtMjE5LjQyODU3MUExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDAgODE5LjIgNzMuMTQyODU3eiBtLTIxOS40Mjg1NzEgMTk3LjQ4NTcxNGgtNjUuODI4NTcydjY1LjgyODU3MmgtNDMuODg1NzE0di02NS44Mjg1NzJoLTY1LjgyODU3MnYtNDMuODg1NzE0aDY1LjgyODU3MlYxNjAuOTE0Mjg2aDQzLjg4NTcxNHY2NS44Mjg1NzFoNjUuODI4NTcyelxcXCIvPjwvc3ZnPlwiO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBcIjw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgc3RhbmRhbG9uZT1cXFwibm9cXFwiPz48IWRvY3R5cGUgaHRtbD48c3ZnIGNsYXNzPWljb24gd2lkdGg9MjBweCBoZWlnaHQ9MjAuMDBweCB2aWV3Qm94PVxcXCIwIDAgMTAyNCAxMDI0XFxcIiB2ZXJzaW9uPTEuMSB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zz48cGF0aCBmaWxsPSM1OTU5NTkgZD1cXFwiTTIwNC44IDczLjE0Mjg1N2g2MTQuNGExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDEgMTMxLjY1NzE0MyAxMzEuNjU3MTQzdjYxNC40YTEzMS42NTcxNDMgMTMxLjY1NzE0MyAwIDAgMS0xMzEuNjU3MTQzIDEzMS42NTcxNDNIMjA0LjhBMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAxIDczLjE0Mjg1NyA4MTkuMlYyMDQuOEExMzEuODQgMTMxLjg0IDAgMCAxIDIwNC44IDczLjE0Mjg1N3ogbTAgNDMuODg1NzE0YTg3Ljc3MTQyOSA4Ny43NzE0MjkgMCAwIDAtODcuNzcxNDI5IDg3Ljc3MTQyOXY2MTQuNGE4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwIDg3Ljc3MTQyOSA4Ny43NzE0MjloNjE0LjRhODcuNzcxNDI5IDg3Ljc3MTQyOSAwIDAgMCA4Ny43NzE0MjktODcuNzcxNDI5VjIwNC44YTg3Ljc3MTQyOSA4Ny43NzE0MjkgMCAwIDAtODcuNzcxNDI5LTg3Ljc3MTQyOXpNNzMuMTQyODU3IDMzNi40NTcxNDNoODc3LjcxNDI4NnY0NC4wNjg1NzFINzMuMTQyODU3ek0zMzYuNjQgMTE3LjAyODU3MWg0My44ODU3MTR2NTI2LjYyODU3MmgtNDMuODg1NzE0eiBtMzA3LjAxNzE0MyAwaDQ0LjA2ODU3MXY1MjYuNjI4NTcySDY0My42NTcxNDN6TTczLjE0Mjg1NyA1OTkuNzcxNDI5djIxOS40Mjg1NzFhMTMxLjY1NzE0MyAxMzEuNjU3MTQzIDAgMCAwIDEzMS42NTcxNDMgMTMxLjY1NzE0M2g2MTQuNGExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDAgMTMxLjY1NzE0My0xMzEuNjU3MTQzdi0yMTkuNDI4NTcxeiBtNTI2LjYyODU3MiAxOTcuNDg1NzE0aC02NS42NDU3MTV2NjUuODI4NTcxSDQ5MC4wNTcxNDN2LTY1LjgyODU3MWgtNjUuODI4NTcydi00My44ODU3MTRoNjUuODI4NTcydi02NS44Mjg1NzJoNDQuMDY4NTcxdjY1LjgyODU3Mmg2NS42NDU3MTV6XFxcIi8+PC9zdmc+XCI7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBzdGFuZGFsb25lPVxcXCJub1xcXCI/PjwhZG9jdHlwZSBodG1sPjxzdmcgY2xhc3M9aWNvbiB3aWR0aD0yMHB4IGhlaWdodD0yMC4wMHB4IHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249MS4xIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxwYXRoIGZpbGw9IzU5NTk1OSBkPVxcXCJNOTI1Ljk5NTk2IDk5LjAzODM4NGMtMjUuNDcwNzA3LTI1LjYtNjAuMTIxMjEyLTM5LjgyMjIyMi05Ni4zMjMyMzMtMzkuODIyMjIySDE5NC4xOTc5OGMtMzYuMDcyNzI3IDAtNzAuNzIzMjMyIDE0LjM1MTUxNS05Ni4zMjMyMzMgMzkuODIyMjIyLTI1LjYgMjUuNi0zOS44MjIyMjIgNjAuMTIxMjEyLTM5LjgyMjIyMiA5Ni4zMjMyMzJ2NjM1LjQ3NDc0OGMwIDM2LjA3MjcyNyAxNC4zNTE1MTUgNzAuNzIzMjMyIDM5LjgyMjIyMiA5Ni4zMjMyMzJDMTIzLjQ3NDc0NyA5NTIuNzU5NTk2IDE1OC4xMjUyNTMgOTY3LjExMTExMSAxOTQuMTk3OTggOTY3LjExMTExMWg2MzUuNDc0NzQ3YzM2LjA3MjcyNyAwIDcwLjcyMzIzMi0xNC4zNTE1MTUgOTYuMzIzMjMzLTM5Ljk1MTUxNSAyNS42LTI1LjYgMzkuOTUxNTE1LTYwLjEyMTIxMiAzOS45NTE1MTUtOTYuMzIzMjMyVjE5NS4zNjE2MTZjMC0zNi4wNzI3MjctMTQuMzUxNTE1LTcwLjcyMzIzMi0zOS45NTE1MTUtOTYuMzIzMjMyeiBtLTI3Ny44NTA1MDUgNS41NTk1OTZ2MjI2LjkwOTA5MUgzNzUuNzI1MjUzVjEwNC41OTc5OGgyNzIuNDIwMjAyek0xMDMuNDM0MzQzIDE5NS4zNjE2MTZjMC0yNC4wNDg0ODUgOS41Njc2NzctNDcuMTkxOTE5IDI2LjYzNDM0NC02NC4xMjkyOTMgMTcuMDY2NjY3LTE3LjA2NjY2NyA0MC4wODA4MDgtMjYuNjM0MzQzIDY0LjEyOTI5My0yNi42MzQzNDNoMTM2LjE0NTQ1NHYyMjYuOTA5MDkxSDEwMy40MzQzNDNWMTk1LjM2MTYxNnogbTkwLjc2MzYzNyA3MjYuMzY3Njc3Yy0yNC4wNDg0ODUgMC00Ny4xOTE5MTktOS41Njc2NzctNjQuMTI5MjkzLTI2LjYzNDM0NC0xNy4wNjY2NjctMTcuMDY2NjY3LTI2LjYzNDM0My00MC4wODA4MDgtMjYuNjM0MzQ0LTY0LjEyOTI5MlY2NDkuMzA5MDkxaDIyNi45MDkwOTF2MjcyLjQyMDIwMkgxOTQuMTk3OTh6IG0xODEuNTI3MjczIDBWNjQ5LjMwOTA5MWgyNzIuMjkwOTA5djI3Mi40MjAyMDJIMzc1LjcyNTI1M3ogbTU0NC43MTExMTEtOTAuODkyOTI5YzAgMjQuMDQ4NDg1LTkuNTY3Njc3IDQ3LjE5MTkxOS0yNi42MzQzNDQgNjQuMTI5MjkzLTE3LjA2NjY2NyAxNy4wNjY2NjctNDAuMDgwODA4IDI2LjYzNDM0My02NC4xMjkyOTMgMjYuNjM0MzQzSDY5My41MjcyNzNWNjQ5LjMwOTA5MWgyMjYuOTA5MDkxdjE4MS41MjcyNzN6TTY5My41MjcyNzMgMzMxLjUwNzA3MVYxMDQuNTk3OThoMTM2LjE0NTQ1NGMyNC4wNDg0ODUgMCA0Ny4xOTE5MTkgOS41Njc2NzcgNjQuMTI5MjkzIDI2LjYzNDM0MyAxNy4wNjY2NjcgMTcuMDY2NjY3IDI2LjYzNDM0MyA0MC4wODA4MDggMjYuNjM0MzQ0IDY0LjEyOTI5M3YxMzYuMTQ1NDU1SDY5My41MjcyNzN6XFxcIi8+PC9zdmc+XCI7XG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBzdGFuZGFsb25lPVxcXCJub1xcXCI/PjwhZG9jdHlwZSBodG1sPjxzdmcgY2xhc3M9aWNvbiB3aWR0aD0yMHB4IGhlaWdodD0yMC4wMHB4IHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249MS4xIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxwYXRoIGZpbGw9IzU5NTk1OSBkPVxcXCJNMzM2LjQ1NzE0MyA3My4xNDI4NTdoNDMuODg1NzE0djg3Ny43MTQyODZoLTQzLjg4NTcxNHogbTMwNy4zODI4NTcgMGg0My43MDI4NTd2ODc3LjcxNDI4NmgtNDMuNzAyODU3eiBtLTQzOC44NTcxNDMgMGg2MTQuNEExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDEgOTUwLjg1NzE0MyAyMDQuOHY2MTQuNGExMzEuNDc0Mjg2IDEzMS40NzQyODYgMCAwIDEtMTMxLjQ3NDI4NiAxMzEuNjU3MTQzaC02MTQuNEExMzEuNjU3MTQzIDEzMS42NTcxNDMgMCAwIDEgNzMuMTQyODU3IDgxOS4yVjIwNC44QTEzMS44NCAxMzEuODQgMCAwIDEgMjA0Ljk4Mjg1NyA3My4xNDI4NTd6IG0wIDQzLjg4NTcxNGE4Ny41ODg1NzEgODcuNTg4NTcxIDAgMCAwLTg3Ljc3MTQyOCA4Ny43NzE0Mjl2NjE0LjRhODcuNTg4NTcxIDg3LjU4ODU3MSAwIDAgMCA4Ny43NzE0MjggODcuNzcxNDI5aDYxNC40YTg3Ljc3MTQyOSA4Ny43NzE0MjkgMCAwIDAgODcuNzcxNDI5LTg3Ljc3MTQyOVYyMDQuOGE4Ny43NzE0MjkgODcuNzcxNDI5IDAgMCAwLTg3Ljc3MTQyOS04Ny43NzE0Mjl6TTczLjE0Mjg1NyAzMzYuNDU3MTQzaDg3Ny43MTQyODZ2MzA3LjJINzMuMTQyODU3eiBtMjkyLjU3MTQyOSA0My44ODU3MTR2MjE5LjQyODU3MmgyOTIuNTcxNDI4di0yMTkuNDI4NTcyelxcXCIvPjwvc3ZnPlwiO1xuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBcIjw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgc3RhbmRhbG9uZT1cXFwibm9cXFwiPz48IWRvY3R5cGUgaHRtbD48c3ZnIGNsYXNzPWljb24gd2lkdGg9MjBweCBoZWlnaHQ9MjAuMDBweCB2aWV3Qm94PVxcXCIwIDAgMTAyNCAxMDI0XFxcIiB2ZXJzaW9uPTEuMSB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zz48cGF0aCBmaWxsPSM1OTU5NTkgZD1cXFwiTTkyNS45OTYgOTkuMDM4Yy0yNS40Ny0yNS42LTYwLjEyMS0zOS44MjItOTYuMzIzLTM5LjgyMkgxOTQuMTk4Yy03NS4xMiAwLjEzLTEzNi4wMTYgNjEuMDI2LTEzNi4xNDUgMTM2LjE0NnY2MzUuMzQ1YzAgMzYuMDczIDE0LjM1MSA3MC43MjMgMzkuODIyIDk2LjMyMyAyNS42IDI1LjczIDYwLjI1IDQwLjA4MSA5Ni4zMjMgNDAuMDgxaDYzNS40NzVjMzYuMDcyIDAgNzAuNzIzLTE0LjM1MSA5Ni4zMjMtMzkuOTUxIDI1LjYtMjUuNiAzOS45NTEtNjAuMTIyIDM5Ljk1MS05Ni4zMjRWMTk1LjM2MmMwLTM2LjA3My0xNC4zNTEtNzAuNzI0LTM5Ljk1MS05Ni4zMjR6IG0tMzY1Ljc3IDQ5NC4yODdMNTEyIDU0NS4yMjhsLTQ4LjIyNiA0OC4wOTctMzIuMTk0LTMxLjkzNSA0OC4zNTUtNDguMjI2LTQ4LjIyNi00OC4wOTcgMzIuMTk0LTMyLjE5NEw1MTIgNDgwLjk3bDQ4LjA5Ny00OC4wOTcgMzIuMTk0IDMyLjE5NC00OC4wOTcgNDguMDk3IDQ4LjIyNiA0OC4yMjYtMzIuMTk0IDMxLjkzNXpNMTAzLjQzNCAxOTUuMzYyYzAtMjQuMDQ5IDkuNTY4LTQ3LjE5MiAyNi42MzUtNjQuMTMgMTcuMDY2LTE3LjA2NiA0MC4wOC0yNi42MzQgNjQuMTI5LTI2LjYzNGgxMzYuMTQ1djIyNi45MUgxMDMuNDM0VjE5NS4zNjF6IG0wIDE4MS42NTZoMjI2LjkxVjY0OS4zMWgtMjI2LjkxVjM3Ny4wMnogbTkwLjc2NCA1NDQuODRjLTI0LjA0OSAwLTQ3LjE5Mi05LjU2Ny02NC4xMy0yNi42MzQtMTcuMDY2LTE3LjA2Ni0yNi42MzQtNDAuMDgtMjYuNjM0LTY0LjI1OFY2OTQuNjloMjI2LjkxdjIyNy4xNjhIMTk0LjE5N3ogbTcyNi4yMzgtOTAuNzYzYzAgMjQuMDQ4LTkuNDM4IDQ3LjE5Mi0yNi41MDUgNjQuMjU5LTE3LjA2NiAxNy4wNjYtNDAuMjEgMjYuNjM0LTY0LjI1OCAyNi41MDVINjkzLjUyN1Y2OTQuNjloMjI2LjkxdjEzNi40MDR6IG0wLTE4MS43ODZINjkzLjUyN1YzNzcuMDJoMjI2LjkxdjI3Mi4yOXpNNjkzLjUyNyAzMzEuNTA3VjEwNC41OThoMTM2LjE0NmMyNC4wNDggMCA0Ny4xOTIgOS40MzggNjQuMjU4IDI2LjUwNSAxNy4wNjcgMTcuMDY3IDI2LjYzNSA0MC4yMSAyNi41MDUgNjQuMjU5djEzNi4xNDVINjkzLjUyN3pcXFwiLz48L3N2Zz5cIjtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gXCI8P3htbCB2ZXJzaW9uPVxcXCIxLjBcXFwiIHN0YW5kYWxvbmU9XFxcIm5vXFxcIj8+PCFkb2N0eXBlIGh0bWw+PHN2ZyBjbGFzcz1pY29uIHdpZHRoPTIwcHggaGVpZ2h0PTIwLjAwcHggdmlld0JveD1cXFwiMCAwIDEwMjQgMTAyNFxcXCIgdmVyc2lvbj0xLjEgeG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmc+PHBhdGggZmlsbD0jNTk1OTU5IGQ9XFxcIk05MjUuOTk1OTYgOTkuMDM4Mzg0Yy0yNS40NzA3MDctMjUuNi02MC4xMjEyMTItMzkuODIyMjIyLTk2LjMyMzIzMy0zOS44MjIyMjJIMTk0LjE5Nzk4Yy0zNi4wNzI3MjcgMC03MC43MjMyMzIgMTQuMzUxNTE1LTk2LjMyMzIzMyAzOS44MjIyMjItMjUuNiAyNS42LTM5LjgyMjIyMiA2MC4xMjEyMTItMzkuODIyMjIyIDk2LjMyMzIzMnY2MzUuNDc0NzQ4YzAgMzYuMDcyNzI3IDE0LjM1MTUxNSA3MC43MjMyMzIgMzkuODIyMjIyIDk2LjMyMzIzMkMxMjMuNDc0NzQ3IDk1Mi43NTk1OTYgMTU4LjEyNTI1MyA5NjcuMTExMTExIDE5NC4xOTc5OCA5NjcuMTExMTExaDYzNS40NzQ3NDdjMzYuMDcyNzI3IDAgNzAuNzIzMjMyLTE0LjM1MTUxNSA5Ni4zMjMyMzMtMzkuOTUxNTE1IDI1LjYtMjUuNiAzOS45NTE1MTUtNjAuMTIxMjEyIDM5Ljk1MTUxNS05Ni4zMjMyMzJWMTk1LjM2MTYxNmMwLTM2LjA3MjcyNy0xNC4zNTE1MTUtNzAuNzIzMjMyLTM5Ljk1MTUxNS05Ni4zMjMyMzJ6IG0tNTUwLjI3MDcwNyA1LjU1OTU5NmgyNzIuMjkwOTA5djIyNy4xNjc2NzdIMzc1LjcyNTI1M1YxMDQuNTk3OTh6IG01Ni4yNDI0MjQgMzYwLjQ2ODY4N2wzMS45MzUzNTMtMzIuMTkzOTQgNDguMDk2OTcgNDguMjI2MjYzIDQ4LjA5Njk3LTQ4LjIyNjI2MyAzMi4xOTM5MzkgMzIuMTkzOTQtNDguMDk2OTcgNDguMDk2OTY5IDQ4LjIyNjI2MyA0OC4yMjYyNjMtMzIuMTkzOTM5IDMxLjkzNTM1NC00OC4yMjYyNjMtNDguMDk2OTctNDguMjI2MjYzIDQ4LjA5Njk3LTMxLjkzNTM1My0zMS45MzUzNTQgNDguMjI2MjYyLTQ4LjIyNjI2My00OC4wOTY5NjktNDguMDk2OTY5ek0xMDMuNDM0MzQzIDE5NS4zNjE2MTZjMC0yNC4wNDg0ODUgOS41Njc2NzctNDcuMTkxOTE5IDI2LjYzNDM0NC02NC4xMjkyOTMgMTcuMDY2NjY3LTE3LjA2NjY2NyA0MC4wODA4MDgtMjYuNjM0MzQzIDY0LjEyOTI5My0yNi42MzQzNDNoMTM2LjE0NTQ1NHYyMjcuMTY3Njc3SDEwMy40MzQzNDNWMTk1LjM2MTYxNnogbTgxNy4wMDIwMjEgNjM1LjczMzMzM2MwIDI0LjA0ODQ4NS05LjU2NzY3NyA0Ny4xOTE5MTktMjYuNjM0MzQ0IDY0LjI1ODU4Ni0xNy4wNjY2NjcgMTcuMDY2NjY3LTQwLjA4MDgwOCAyNi42MzQzNDMtNjQuMTI5MjkzIDI2LjYzNDM0NEgxOTQuMTk3OThjLTI0LjA0ODQ4NSAwLTQ3LjE5MTkxOS05LjU2NzY3Ny02NC4yNTg1ODYtMjYuNjM0MzQ0QzExMi44NzI3MjcgODc4LjE1NzU3NiAxMDMuNDM0MzQzIDg1NS4wMTQxNDEgMTAzLjQzNDM0MyA4MzAuODM2MzY0VjY5NC42OTA5MDloMjI2LjkwOTA5MXYyMjYuOTA5MDkxaDQ1LjM4MTgxOVY2OTQuNjkwOTA5aDI3Mi4yOTA5MDl2MjI2LjkwOTA5MWg0NS4zODE4MThWNjk0LjY5MDkwOWgyMjYuOTA5MDkxdjEzNi40MDQwNHogbTAtNDk5LjMyOTI5Mkg2OTMuNTI3MjczVjEwNC41OTc5OGgxMzYuMTQ1NDU0YzI0LjA0ODQ4NSAwIDQ3LjE5MTkxOSA5LjU2NzY3NyA2NC4xMjkyOTMgMjYuNjM0MzQzIDE3LjA2NjY2NyAxNy4wNjY2NjcgMjYuNjM0MzQzIDQwLjA4MDgwOCAyNi42MzQzNDQgNjQuMTI5MjkzdjEzNi40MDQwNDF6XFxcIi8+PC9zdmc+XCI7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBzdGFuZGFsb25lPVxcXCJub1xcXCI/PjwhZG9jdHlwZSBodG1sPjxzdmcgY2xhc3M9aWNvbiB3aWR0aD0yMHB4IGhlaWdodD0yMC4wMHB4IHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249MS4xIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxwYXRoIGZpbGw9IzU5NTk1OSBkPVxcXCJNNzY0LjQyMTY4ODg5IDgzMC41MTUyYzAgMzAuMjM1MzA2NjctMjQuNjEwMTMzMzMgNTQuODQ0MzAyMjItNTQuODQzMTY0NDQgNTQuODQ0MzAyMjJIMzE0LjQyMTQ3NTU1Yy0zMC4yMzQxNjg4OSAwLTU0Ljg0MzE2NDQ1LTI0LjYxMDEzMzMzLTU0Ljg0MzE2NDQ0LTU0Ljg0NDMwMjIyVjI0OC4zMjc5NjQ0NWg1MDQuODQzMzc3Nzh2NTgyLjE4NzIzNTU1ek0zNjkuMjY1Nzc3NzggMTQ5Ljg5MDg0NDQ1YzAtNi4zMjgzMiA0LjkyMjAyNjY3LTExLjI1MDM0NjY3IDExLjI1MDM0NjY3LTExLjI1MDM0NjY3SDY0NC4xODcwMjIyMmM2LjMyODMyIDAgMTEuMjUwMzQ2NjcgNC45MjIwMjY2NyAxMS4yNTAzNDY2NyAxMS4yNTAzNDY2N3YzMy4wNDY3NTU1NUgzNjkuMjY1Nzc3NzhWMTQ5Ljg5MDg0NDQ1eiBtNTU5LjY4NzY4IDMzLjA0Njc1NTU1SDcyMC44Mjc3MzMzM1YxNDkuODkwODQ0NDVjMC00Mi4xODg4LTM0LjQ1MTkxMTExLTc2LjY0MDcxMTExLTc2LjY0MDcxMTExLTc2LjY0MDcxMTEySDM4MC41MTYxMjQ0NWMtNDIuMTg4OCAwLTc2LjY0MDcxMTExIDM0LjQ1MTkxMTExLTc2LjY0MDcxMTEyIDc2LjY0MDcxMTEydjMzLjA0Njc1NTU1aC0yMDguODI3NzMzMzNjLTE4LjI4MTgxMzMzIDAtMzMuMDQ3ODkzMzMgMTQuNzY2MDgtMzMuMDQ3ODkzMzMgMzMuMDQ2NzU1NTVzMTQuNzY2MDggMzMuMDQ2NzU1NTUgMzMuMDQ2NzU1NTUgMzMuMDQ2NzU1NTZoOTguNDM4MjU3Nzh2NTgxLjQ4NDA4ODg5YzAgNjYuNzk3Nzk1NTUgNTQuMTQwMDE3NzggMTIwLjkzNzgxMzMzIDEyMC45MzY2NzU1NSAxMjAuOTM3ODEzMzNoMzk1LjE1NzA0ODljNjYuNzk2NjU3NzggMCAxMjAuOTM2Njc1NTUtNTQuMTQwMDE3NzggMTIwLjkzNjY3NTU1LTEyMC45Mzc4MTMzM1YyNDguMzI3OTY0NDVoOTguNDM4MjU3NzhjMTguMjgwNjc1NTUgMCAzMy4wNDY3NTU1NS0xNC43NjQ5NDIyMiAzMy4wNDY3NTU1NS0zMy4wNDY3NTU1NnMtMTQuNzY2MDgtMzIuMzQzNjA4ODktMzMuMDQ2NzU1NTUtMzIuMzQzNjA4ODl6TTUxMiA3ODYuMjE5MjM1NTVjMTguMjgxODEzMzMgMCAzMy4wNDY3NTU1NS0xNC43NjYwOCAzMy4wNDY3NTU1NS0zMy4wNDc4OTMzM3YtMzUxLjU2MTk1NTU1YzAtMTguMjgxODEzMzMtMTQuNzY0OTQyMjItMzMuMDQ2NzU1NTUtMzMuMDQ2NzU1NTUtMzMuMDQ2NzU1NTZzLTMzLjA0Njc1NTU1IDE0Ljc2NDk0MjIyLTMzLjA0Njc1NTU1IDMzLjA0Njc1NTU2djM1MS41NjE5NTU1NWMwIDE4LjI4MTgxMzMzIDE0Ljc2NDk0MjIyIDMzLjA0Nzg5MzMzIDMzLjA0Njc1NTU1IDMzLjA0Nzg5MzMzbS0xNTMuOTg0NTY4ODkgMGMxOC4yODE4MTMzMyAwIDMzLjA0Njc1NTU1LTE0Ljc2NjA4IDMzLjA0Njc1NTU2LTMzLjA0Nzg5MzMzdi0zNTEuNTYxOTU1NTVjMC0xOC4yODE4MTMzMy0xNC43NjQ5NDIyMi0zMy4wNDY3NTU1NS0zMy4wNDY3NTU1Ni0zMy4wNDY3NTU1NnMtMzMuMDQ2NzU1NTUgMTQuNzY0OTQyMjItMzMuMDQ2NzU1NTYgMzMuMDQ2NzU1NTZ2MzUxLjU2MTk1NTU1YzAuNzAzMTQ2NjcgMTguMjgxODEzMzMgMTUuNDY5MjI2NjcgMzMuMDQ3ODkzMzMgMzMuMDQ2NzU1NTYgMzMuMDQ3ODkzMzNtMzA3Ljk2OTEzNzc4IDBjMTguMjgwNjc1NTUgMCAzMy4wNDY3NTU1NS0xNC43NjYwOCAzMy4wNDY3NTU1Ni0zMy4wNDc4OTMzM3YtMzUxLjU2MTk1NTU1YzAtMTguMjgxODEzMzMtMTQuNzY2MDgtMzMuMDQ2NzU1NTUtMzMuMDQ2NzU1NTYtMzMuMDQ2NzU1NTZzLTMzLjA0Njc1NTU1IDE0Ljc2NDk0MjIyLTMzLjA0Njc1NTU2IDMzLjA0Njc1NTU2djM1MS41NjE5NTU1NWMwIDE4LjI4MTgxMzMzIDE0Ljc2NDk0MjIyIDMzLjA0Nzg5MzMzIDMzLjA0Njc1NTU2IDMzLjA0Nzg5MzMzXFxcIi8+PC9zdmc+XCI7XG5cbi8qKiovIH0pLFxuLyogMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInF1aWxsXCIsXCJjb21tb25qczJcIjpcInF1aWxsXCIsXCJhbWRcIjpcInF1aWxsXCIsXCJyb290XCI6XCJRdWlsbFwifVxudmFyIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvdXRpbHMvaW5kZXguanNcbmZ1bmN0aW9uIGNzcyhkb21Ob2RlLCBydWxlcykge1xuICBpZiAodHlwZW9mIHJ1bGVzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAobGV0IHByb3AgaW4gcnVsZXMpIHtcbiAgICAgIGRvbU5vZGUuc3R5bGVbcHJvcF0gPSBydWxlc1twcm9wXTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogZ2V0UmVsYXRpdmVSZWN0XG4gKiBAcGFyYW0gIHtPYmplY3R9IHRhcmdldFJlY3QgIHJlY3QgZGF0YSBmb3IgdGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGNvbnRhaW5lciAgY29udGFpbmVyIGVsZW1lbnRcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgYW4gb2JqZWN0IHdpdGggcmVjdCBkYXRhXG4gKi9cblxuZnVuY3Rpb24gZ2V0UmVsYXRpdmVSZWN0KHRhcmdldFJlY3QsIGNvbnRhaW5lcikge1xuICBsZXQgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICB4OiB0YXJnZXRSZWN0LnggLSBjb250YWluZXJSZWN0LnggLSBjb250YWluZXIuc2Nyb2xsTGVmdCxcbiAgICB5OiB0YXJnZXRSZWN0LnkgLSBjb250YWluZXJSZWN0LnkgLSBjb250YWluZXIuc2Nyb2xsVG9wLFxuICAgIHgxOiB0YXJnZXRSZWN0LnggLSBjb250YWluZXJSZWN0LnggLSBjb250YWluZXIuc2Nyb2xsTGVmdCArIHRhcmdldFJlY3Qud2lkdGgsXG4gICAgeTE6IHRhcmdldFJlY3QueSAtIGNvbnRhaW5lclJlY3QueSAtIGNvbnRhaW5lci5zY3JvbGxUb3AgKyB0YXJnZXRSZWN0LmhlaWdodCxcbiAgICB3aWR0aDogdGFyZ2V0UmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHRhcmdldFJlY3QuaGVpZ2h0XG4gIH07XG59XG4vKipcbiAqIF9vbWl0XG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgICAgICAgIHRhcmdldCBPYmplY3RcbiAqIEBwYXJhbSAge0FycmF5fSB1c2VsZXNzS2V5cyAga2V5cyBvZiByZW1vdmVkIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgbmV3IE9iamVjdCB3aXRob3V0IHVzZWxlc3MgcHJvcGVydGllc1xuICovXG5cbmZ1bmN0aW9uIF9vbWl0KG9iaiwgdXNlbGVzc0tleXMpIHtcbiAgcmV0dXJuIG9iaiAmJiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICByZXR1cm4gdXNlbGVzc0tleXMuaW5jbHVkZXMoa2V5KSA/IGFjYyA6IE9iamVjdC5hc3NpZ24oe30sIGFjYywge1xuICAgICAgW2tleV06IG9ialtrZXldXG4gICAgfSk7XG4gIH0sIHt9KTtcbn1cbi8qKlxuICogZ2V0RXZlbnRDb21wb3NlZFBhdGhcbiAqICBjb21wYXRpYmlsaXR5IGZpeGVkIGZvciBFdmVudC5wYXRoL0V2ZW50LmNvbXBvc2VkUGF0aFxuICogIEV2ZW50LnBhdGggaXMgb25seSBmb3IgY2hyb21lL29wZXJhXG4gKiAgRXZlbnQuY29tcG9zZWRQYXRoIGlzIGZvciBTYWZhcmksIEZGXG4gKiAgTmVpdGhlciBmb3IgTWljcm8gRWRnZVxuICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gKiBAcmV0dXJuIHtBcnJheX0gYW4gYXJyYXkgb2YgZXZlbnQucGF0aFxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50Q29tcG9zZWRQYXRoKGV2dCkge1xuICBsZXQgcGF0aDsgLy8gY2hyb21lLCBvcGVyYSwgc2FmYXJpLCBmaXJlZm94XG5cbiAgcGF0aCA9IGV2dC5wYXRoIHx8IGV2dC5jb21wb3NlZFBhdGggJiYgZXZ0LmNvbXBvc2VkUGF0aCgpOyAvLyBvdGhlcjogZWRnZVxuXG4gIGlmIChwYXRoID09IHVuZGVmaW5lZCAmJiBldnQudGFyZ2V0KSB7XG4gICAgcGF0aCA9IFtdO1xuICAgIGxldCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgIHBhdGgucHVzaCh0YXJnZXQpO1xuXG4gICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICBwYXRoLnB1c2godGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGF0aDtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb0hleChyZ2IpIHtcbiAgdmFyIHJlZyA9IC9eIyhbMC05YS1mQS1mXXszfXxbMC05YS1mQS1mXXs2fSkkLzsgLy8gaWYgcmdiXG5cbiAgaWYgKC9eKHJnYnxSR0IpLy50ZXN0KHJnYikpIHtcbiAgICB2YXIgY29sb3IgPSByZ2IudG9TdHJpbmcoKS5tYXRjaCgvXFxkKy9nKTtcbiAgICB2YXIgaGV4ID0gXCIjXCI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgaGV4ICs9IChcIjBcIiArIE51bWJlcihjb2xvcltpXSkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhleDtcbiAgfSBlbHNlIGlmIChyZWcudGVzdChyZ2IpKSB7XG4gICAgdmFyIGFOdW0gPSByZ2IucmVwbGFjZSgvIy8sIFwiXCIpLnNwbGl0KFwiXCIpO1xuXG4gICAgaWYgKGFOdW0ubGVuZ3RoID09PSA2KSB7XG4gICAgICByZXR1cm4gcmdiO1xuICAgIH0gZWxzZSBpZiAoYU51bS5sZW5ndGggPT09IDMpIHtcbiAgICAgIHZhciBudW1IZXggPSBcIiNcIjtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhTnVtLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIG51bUhleCArPSBhTnVtW2ldICsgYU51bVtpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bUhleDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmdiO1xufVxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvbW9kdWxlcy90YWJsZS1jb2x1bW4tdG9vbC5qc1xuXG5cbmNvbnN0IENPTF9UT09MX0hFSUdIVCA9IDEyO1xuY29uc3QgQ09MX1RPT0xfQ0VMTF9IRUlHSFQgPSAxMjtcbmNvbnN0IFJPV19UT09MX1dJRFRIID0gMTI7XG5jb25zdCBDRUxMX01JTl9XSURUSCA9IDUwO1xuY29uc3QgUFJJTUFSWV9DT0xPUiA9ICcjMzVBN0VEJztcbmNsYXNzIHRhYmxlX2NvbHVtbl90b29sX1RhYmxlQ29sdW1uVG9vbCB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBxdWlsbCwgb3B0aW9ucykge1xuICAgIGlmICghdGFibGUpIHJldHVybiBudWxsO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnF1aWxsID0gcXVpbGw7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmRvbU5vZGUgPSBudWxsO1xuICAgIHRoaXMuaW5pdENvbFRvb2woKTtcbiAgfVxuXG4gIGluaXRDb2xUb29sKCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlO1xuICAgIGNvbnN0IHRhYmxlUmVjdCA9IHRoaXMudGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0YWJsZVZpZXdSZWN0ID0gdGhpcy50YWJsZS5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuZG9tTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tTm9kZS5jbGFzc0xpc3QuYWRkKCdxbGJ0LWNvbC10b29sJyk7XG4gICAgdGhpcy51cGRhdGVUb29sQ2VsbHMoKTtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTtcbiAgICBjc3ModGhpcy5kb21Ob2RlLCB7XG4gICAgICB3aWR0aDogXCJcIi5jb25jYXQodGFibGVWaWV3UmVjdC53aWR0aCwgXCJweFwiKSxcbiAgICAgIGhlaWdodDogXCJcIi5jb25jYXQoQ09MX1RPT0xfSEVJR0hULCBcInB4XCIpLFxuICAgICAgbGVmdDogXCJcIi5jb25jYXQodGFibGVWaWV3UmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0ICsgcGFyZW50LnNjcm9sbExlZnQsIFwicHhcIiksXG4gICAgICB0b3A6IFwiXCIuY29uY2F0KHRhYmxlVmlld1JlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3AgKyBwYXJlbnQuc2Nyb2xsVG9wIC0gQ09MX1RPT0xfSEVJR0hUIC0gNSwgXCJweFwiKVxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlVG9vbENlbGwoKSB7XG4gICAgY29uc3QgdG9vbENlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0b29sQ2VsbC5jbGFzc0xpc3QuYWRkKCdxbGJ0LWNvbC10b29sLWNlbGwnKTtcbiAgICBjb25zdCByZXNpemVIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZXNpemVIb2xkZXIuY2xhc3NMaXN0LmFkZCgncWxidC1jb2wtdG9vbC1jZWxsLWhvbGRlcicpO1xuICAgIGNzcyh0b29sQ2VsbCwge1xuICAgICAgJ2hlaWdodCc6IFwiXCIuY29uY2F0KENPTF9UT09MX0NFTExfSEVJR0hULCBcInB4XCIpXG4gICAgfSk7XG4gICAgdG9vbENlbGwuYXBwZW5kQ2hpbGQocmVzaXplSG9sZGVyKTtcbiAgICByZXR1cm4gdG9vbENlbGw7XG4gIH1cblxuICB1cGRhdGVUb29sQ2VsbHMoKSB7XG4gICAgY29uc3QgdGFibGVDb250YWluZXIgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmZpbmQodGhpcy50YWJsZSk7XG4gICAgY29uc3QgQ2VsbHNJbkZpcnN0Um93ID0gdGFibGVDb250YWluZXIuY2hpbGRyZW4udGFpbC5jaGlsZHJlbi5oZWFkLmNoaWxkcmVuO1xuICAgIGNvbnN0IHRhYmxlQ29scyA9IHRhYmxlQ29udGFpbmVyLmNvbEdyb3VwKCkuY2hpbGRyZW47XG4gICAgY29uc3QgY2VsbHNOdW1iZXIgPSBjb21wdXRlQ2VsbHNOdW1iZXIoQ2VsbHNJbkZpcnN0Um93KTtcbiAgICBsZXQgZXhpc3RDZWxscyA9IEFycmF5LmZyb20odGhpcy5kb21Ob2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xbGJ0LWNvbC10b29sLWNlbGwnKSk7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTWF0aC5tYXgoY2VsbHNOdW1iZXIsIGV4aXN0Q2VsbHMubGVuZ3RoKTsgaW5kZXgrKykge1xuICAgICAgbGV0IGNvbCA9IHRhYmxlQ29scy5hdChpbmRleCk7XG4gICAgICBsZXQgY29sV2lkdGggPSBjb2wgJiYgcGFyc2VJbnQoY29sLmZvcm1hdHMoKVtjb2wuc3RhdGljcy5ibG90TmFtZV0ud2lkdGgsIDEwKTsgLy8gaWYgY2VsbCBhbHJlYWR5IGV4aXN0XG5cbiAgICAgIGxldCB0b29sQ2VsbCA9IG51bGw7XG5cbiAgICAgIGlmICghZXhpc3RDZWxsc1tpbmRleF0pIHtcbiAgICAgICAgdG9vbENlbGwgPSB0aGlzLmNyZWF0ZVRvb2xDZWxsKCk7XG4gICAgICAgIHRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZCh0b29sQ2VsbCk7XG4gICAgICAgIHRoaXMuYWRkQ29sQ2VsbEhvbGRlckhhbmRsZXIodG9vbENlbGwpOyAvLyBzZXQgdG9vbCBjZWxsIG1pbi13aWR0aFxuXG4gICAgICAgIGNzcyh0b29sQ2VsbCwge1xuICAgICAgICAgICdtaW4td2lkdGgnOiBcIlwiLmNvbmNhdChjb2xXaWR0aCwgXCJweFwiKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZXhpc3RDZWxsc1tpbmRleF0gJiYgaW5kZXggPj0gY2VsbHNOdW1iZXIpIHtcbiAgICAgICAgZXhpc3RDZWxsc1tpbmRleF0ucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b29sQ2VsbCA9IGV4aXN0Q2VsbHNbaW5kZXhdOyAvLyBzZXQgdG9vbCBjZWxsIG1pbi13aWR0aFxuXG4gICAgICAgIGNzcyh0b29sQ2VsbCwge1xuICAgICAgICAgICdtaW4td2lkdGgnOiBcIlwiLmNvbmNhdChjb2xXaWR0aCwgXCJweFwiKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZG9tTm9kZS5yZW1vdmUoKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFkZENvbENlbGxIb2xkZXJIYW5kbGVyKGNlbGwpIHtcbiAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuZmluZCh0aGlzLnRhYmxlKTtcbiAgICBjb25zdCAkaG9sZGVyID0gY2VsbC5xdWVyeVNlbGVjdG9yKFwiLnFsYnQtY29sLXRvb2wtY2VsbC1ob2xkZXJcIik7XG4gICAgbGV0IGRyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IHgwID0gMDtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IGRlbHRhID0gMDtcbiAgICBsZXQgd2lkdGgwID0gMDsgLy8gaGVscExpbmUgcmVsYXRpb24gdmFycmlibGVcblxuICAgIGxldCB0YWJsZVJlY3QgPSB7fTtcbiAgICBsZXQgY2VsbFJlY3QgPSB7fTtcbiAgICBsZXQgJGhlbHBMaW5lID0gbnVsbDtcblxuICAgIGNvbnN0IGhhbmRsZURyYWcgPSBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICAgIHggPSBlLmNsaWVudFg7XG5cbiAgICAgICAgaWYgKHdpZHRoMCArIHggLSB4MCA+PSBDRUxMX01JTl9XSURUSCkge1xuICAgICAgICAgIGRlbHRhID0geCAtIHgwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbHRhID0gQ0VMTF9NSU5fV0lEVEggLSB3aWR0aDA7XG4gICAgICAgIH1cblxuICAgICAgICBjc3MoJGhlbHBMaW5lLCB7XG4gICAgICAgICAgJ2xlZnQnOiBcIlwiLmNvbmNhdChjZWxsUmVjdC5sZWZ0ICsgY2VsbFJlY3Qud2lkdGggLSAxICsgZGVsdGEsIFwicHhcIilcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNldXAgPSBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGV4aXN0Q2VsbHMgPSBBcnJheS5mcm9tKHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcucWxidC1jb2wtdG9vbC1jZWxsJykpO1xuICAgICAgY29uc3QgY29sSW5kZXggPSBleGlzdENlbGxzLmluZGV4T2YoY2VsbCk7XG4gICAgICBjb25zdCBjb2xCbG90ID0gdGFibGVDb250YWluZXIuY29sR3JvdXAoKS5jaGlsZHJlbi5hdChjb2xJbmRleCk7XG5cbiAgICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgICBjb2xCbG90LmZvcm1hdCgnd2lkdGgnLCB3aWR0aDAgKyBkZWx0YSk7XG4gICAgICAgIGNzcyhjZWxsLCB7XG4gICAgICAgICAgJ21pbi13aWR0aCc6IFwiXCIuY29uY2F0KHdpZHRoMCArIGRlbHRhLCBcInB4XCIpXG4gICAgICAgIH0pO1xuICAgICAgICB4MCA9IDA7XG4gICAgICAgIHggPSAwO1xuICAgICAgICBkZWx0YSA9IDA7XG4gICAgICAgIHdpZHRoMCA9IDA7XG4gICAgICAgIGRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgICRob2xkZXIuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZywgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNldXAsIGZhbHNlKTtcbiAgICAgIHRhYmxlUmVjdCA9IHt9O1xuICAgICAgY2VsbFJlY3QgPSB7fTtcbiAgICAgICRoZWxwTGluZS5yZW1vdmUoKTtcbiAgICAgICRoZWxwTGluZSA9IG51bGw7XG4gICAgICB0YWJsZUNvbnRhaW5lci51cGRhdGVUYWJsZVdpZHRoKCk7XG4gICAgICBjb25zdCB0YWJsZVNlbGVjdGlvbiA9IHRoaXMucXVpbGwuZ2V0TW9kdWxlKCdiZXR0ZXItdGFibGUnKS50YWJsZVNlbGVjdGlvbjtcbiAgICAgIHRhYmxlU2VsZWN0aW9uICYmIHRhYmxlU2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlZG93biA9IGUgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZywgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNldXAsIGZhbHNlKTtcbiAgICAgIHRhYmxlUmVjdCA9IHRoaXMudGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjZWxsUmVjdCA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAkaGVscExpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNzcygkaGVscExpbmUsIHtcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIHRvcDogXCJcIi5jb25jYXQoY2VsbFJlY3QudG9wLCBcInB4XCIpLFxuICAgICAgICBsZWZ0OiBcIlwiLmNvbmNhdChjZWxsUmVjdC5sZWZ0ICsgY2VsbFJlY3Qud2lkdGggLSAxLCBcInB4XCIpLFxuICAgICAgICB6SW5kZXg6ICcxMDAnLFxuICAgICAgICBoZWlnaHQ6IFwiXCIuY29uY2F0KHRhYmxlUmVjdC5oZWlnaHQgKyBDT0xfVE9PTF9IRUlHSFQgKyA0LCBcInB4XCIpLFxuICAgICAgICB3aWR0aDogJzFweCcsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogUFJJTUFSWV9DT0xPUlxuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCRoZWxwTGluZSk7XG4gICAgICBkcmFnZ2luZyA9IHRydWU7XG4gICAgICB4MCA9IGUuY2xpZW50WDtcbiAgICAgIHdpZHRoMCA9IGNlbGxSZWN0LndpZHRoO1xuICAgICAgJGhvbGRlci5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO1xuICAgIH07XG5cbiAgICAkaG9sZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZU1vdXNlZG93biwgZmFsc2UpO1xuICB9XG5cbiAgY29sVG9vbENlbGxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcucWxidC1jb2wtdG9vbC1jZWxsJykpO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUNlbGxzTnVtYmVyKENlbGxzSW5GaXJzdFJvdykge1xuICByZXR1cm4gQ2VsbHNJbkZpcnN0Um93LnJlZHVjZSgoc3VtLCBjZWxsKSA9PiB7XG4gICAgY29uc3QgY2VsbENvbHNwYW4gPSBjZWxsLmZvcm1hdHMoKS5jb2xzcGFuO1xuICAgIHN1bSA9IHN1bSArIHBhcnNlSW50KGNlbGxDb2xzcGFuLCAxMCk7XG4gICAgcmV0dXJuIHN1bTtcbiAgfSwgMCk7XG59XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mb3JtYXRzL2hlYWRlci5qc1xuXG5cbmNvbnN0IEJsb2NrID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5pbXBvcnQoXCJibG90cy9ibG9ja1wiKTtcblxuY2xhc3MgaGVhZGVyX0hlYWRlciBleHRlbmRzIEJsb2NrIHtcbiAgc3RhdGljIGNyZWF0ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHtcbiAgICAgICAgdmFsdWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZSA9IHN1cGVyLmNyZWF0ZSh2YWx1ZS52YWx1ZSk7XG4gICAgQ0VMTF9JREVOVElUWV9LRVlTLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICh2YWx1ZVtrZXldKSBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtXCIuY29uY2F0KGtleSksIHZhbHVlW2tleV0pO1xuICAgIH0pO1xuICAgIENFTExfQVRUUklCVVRFUy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAodmFsdWVba2V5XSkgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLVwiLmNvbmNhdChrZXkpLCB2YWx1ZVtrZXldKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRzKGRvbU5vZGUpIHtcbiAgICBjb25zdCBmb3JtYXRzID0ge307XG4gICAgZm9ybWF0cy52YWx1ZSA9IHRoaXMudGFnTmFtZS5pbmRleE9mKGRvbU5vZGUudGFnTmFtZSkgKyAxO1xuICAgIHJldHVybiBDRUxMX0FUVFJJQlVURVMuY29uY2F0KENFTExfSURFTlRJVFlfS0VZUykucmVkdWNlKChmb3JtYXRzLCBhdHRyaWJ1dGUpID0+IHtcbiAgICAgIGlmIChkb21Ob2RlLmhhc0F0dHJpYnV0ZShcImRhdGEtXCIuY29uY2F0KGF0dHJpYnV0ZSkpKSB7XG4gICAgICAgIGZvcm1hdHNbYXR0cmlidXRlXSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQoYXR0cmlidXRlKSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0cztcbiAgICB9LCBmb3JtYXRzKTtcbiAgfVxuXG4gIGZvcm1hdChuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdyxcbiAgICAgIGNlbGwsXG4gICAgICByb3dzcGFuLFxuICAgICAgY29sc3BhblxuICAgIH0gPSBoZWFkZXJfSGVhZGVyLmZvcm1hdHModGhpcy5kb21Ob2RlKTtcblxuICAgIGlmIChuYW1lID09PSBoZWFkZXJfSGVhZGVyLmJsb3ROYW1lKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3VwZXIuZm9ybWF0KG5hbWUsIHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgY2VsbCxcbiAgICAgICAgICByb3dzcGFuLFxuICAgICAgICAgIGNvbHNwYW5cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgdGhpcy5yZXBsYWNlV2l0aChUYWJsZUNlbGxMaW5lLmJsb3ROYW1lLCB7XG4gICAgICAgICAgICByb3csXG4gICAgICAgICAgICBjZWxsLFxuICAgICAgICAgICAgcm93c3BhbixcbiAgICAgICAgICAgIGNvbHNwYW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXBlci5mb3JtYXQobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmZvcm1hdChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb3B0aW1pemUoY29udGV4dCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdyxcbiAgICAgIHJvd3NwYW4sXG4gICAgICBjb2xzcGFuXG4gICAgfSA9IGhlYWRlcl9IZWFkZXIuZm9ybWF0cyh0aGlzLmRvbU5vZGUpO1xuXG4gICAgaWYgKHJvdyAmJiAhKHRoaXMucGFyZW50IGluc3RhbmNlb2YgVGFibGVDZWxsKSkge1xuICAgICAgdGhpcy53cmFwKFRhYmxlQ2VsbC5ibG90TmFtZSwge1xuICAgICAgICByb3csXG4gICAgICAgIGNvbHNwYW4sXG4gICAgICAgIHJvd3NwYW5cbiAgICAgIH0pO1xuICAgIH0gLy8gU2hhZG93QmxvdCBvcHRpbWl6ZVxuXG5cbiAgICB0aGlzLmVuZm9yY2VBbGxvd2VkQ2hpbGRyZW4oKTtcblxuICAgIGlmICh0aGlzLnVpTm9kZSAhPSBudWxsICYmIHRoaXMudWlOb2RlICE9PSB0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5kb21Ob2RlLmluc2VydEJlZm9yZSh0aGlzLnVpTm9kZSwgdGhpcy5kb21Ob2RlLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGljcy5kZWZhdWx0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuc2Nyb2xsLmNyZWF0ZSh0aGlzLnN0YXRpY3MuZGVmYXVsdENoaWxkLmJsb3ROYW1lKTtcbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjaGlsZCk7IC8vIFRPRE8gZG91YmxlIGNoZWNrIGlmIG5lY2Vzc2FyeVxuICAgICAgICAvLyBjaGlsZC5vcHRpbWl6ZShjb250ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSAvLyBCbG9jayBvcHRpbWl6ZVxuXG5cbiAgICB0aGlzLmNhY2hlID0ge307XG4gIH1cblxufVxuXG5oZWFkZXJfSGVhZGVyLmJsb3ROYW1lID0gJ2hlYWRlcic7XG5oZWFkZXJfSGVhZGVyLnRhZ05hbWUgPSBbJ0gxJywgJ0gyJywgJ0gzJywgJ0g0JywgJ0g1JywgJ0g2J107XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIHZhciBoZWFkZXIgPSAoaGVhZGVyX0hlYWRlcik7XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9mb3JtYXRzL3RhYmxlLmpzXG5cblxuXG5jb25zdCBCcmVhayA9IGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuaW1wb3J0KFwiYmxvdHMvYnJlYWtcIik7XG5jb25zdCB0YWJsZV9CbG9jayA9IGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuaW1wb3J0KFwiYmxvdHMvYmxvY2tcIik7XG5jb25zdCBDb250YWluZXIgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmltcG9ydChcImJsb3RzL2NvbnRhaW5lclwiKTtcbmNvbnN0IENPTF9BVFRSSUJVVEVTID0gW1wid2lkdGhcIl07XG5jb25zdCBDT0xfREVGQVVMVCA9IHtcbiAgd2lkdGg6IDEwMFxufTtcbmNvbnN0IENFTExfSURFTlRJVFlfS0VZUyA9IFtcInJvd1wiLCBcImNlbGxcIl07XG5jb25zdCBDRUxMX0FUVFJJQlVURVMgPSBbXCJyb3dzcGFuXCIsIFwiY29sc3BhblwiXTtcbmNvbnN0IENFTExfREVGQVVMVCA9IHtcbiAgcm93c3BhbjogMSxcbiAgY29sc3BhbjogMVxufTtcbmNvbnN0IEVSUk9SX0xJTUlUID0gNTtcblxuY2xhc3MgVGFibGVDZWxsTGluZSBleHRlbmRzIHRhYmxlX0Jsb2NrIHtcbiAgc3RhdGljIGNyZWF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IG5vZGUgPSBzdXBlci5jcmVhdGUodmFsdWUpO1xuICAgIENFTExfSURFTlRJVFlfS0VZUy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBsZXQgaWRlbnRpdHlNYWtlciA9IGtleSA9PT0gJ3JvdycgPyB0YWJsZV9yb3dJZCA6IHRhYmxlX2NlbGxJZDtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQoa2V5KSwgdmFsdWVba2V5XSB8fCBpZGVudGl0eU1ha2VyKCkpO1xuICAgIH0pO1xuICAgIENFTExfQVRUUklCVVRFUy5mb3JFYWNoKGF0dHJOYW1lID0+IHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQoYXR0ck5hbWUpLCB2YWx1ZVthdHRyTmFtZV0gfHwgQ0VMTF9ERUZBVUxUW2F0dHJOYW1lXSk7XG4gICAgfSk7XG5cbiAgICBpZiAodmFsdWVbJ2NlbGwtYmcnXSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2VsbC1iZycsIHZhbHVlWydjZWxsLWJnJ10pO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgc3RhdGljIGZvcm1hdHMoZG9tTm9kZSkge1xuICAgIGNvbnN0IGZvcm1hdHMgPSB7fTtcbiAgICByZXR1cm4gQ0VMTF9BVFRSSUJVVEVTLmNvbmNhdChDRUxMX0lERU5USVRZX0tFWVMpLmNvbmNhdChbJ2NlbGwtYmcnXSkucmVkdWNlKChmb3JtYXRzLCBhdHRyaWJ1dGUpID0+IHtcbiAgICAgIGlmIChkb21Ob2RlLmhhc0F0dHJpYnV0ZShcImRhdGEtXCIuY29uY2F0KGF0dHJpYnV0ZSkpKSB7XG4gICAgICAgIGZvcm1hdHNbYXR0cmlidXRlXSA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQoYXR0cmlidXRlKSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0cztcbiAgICB9LCBmb3JtYXRzKTtcbiAgfVxuXG4gIGZvcm1hdChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChDRUxMX0FUVFJJQlVURVMuY29uY2F0KENFTExfSURFTlRJVFlfS0VZUykuaW5kZXhPZihuYW1lKSA+IC0xKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5kb21Ob2RlLnNldEF0dHJpYnV0ZShcImRhdGEtXCIuY29uY2F0KG5hbWUpLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvbU5vZGUucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2NlbGwtYmcnKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5kb21Ob2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1jZWxsLWJnJywgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jZWxsLWJnJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnaGVhZGVyJykge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgICAgY29uc3Qge1xuICAgICAgICByb3csXG4gICAgICAgIGNlbGwsXG4gICAgICAgIHJvd3NwYW4sXG4gICAgICAgIGNvbHNwYW5cbiAgICAgIH0gPSBUYWJsZUNlbGxMaW5lLmZvcm1hdHModGhpcy5kb21Ob2RlKTtcbiAgICAgIHN1cGVyLmZvcm1hdChuYW1lLCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICByb3csXG4gICAgICAgIGNlbGwsXG4gICAgICAgIHJvd3NwYW4sXG4gICAgICAgIGNvbHNwYW5cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5mb3JtYXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGltaXplKGNvbnRleHQpIHtcbiAgICAvLyBjb3ZlciBzaGFkb3dCbG90J3Mgd3JhcCBjYWxsLCBwYXNzIHBhcmFtcyBwYXJlbnRCbG90IGluaXRpYWxpemVcbiAgICAvLyBuZWVkZWRcbiAgICBjb25zdCByb3dJZCA9IHRoaXMuZG9tTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm93Jyk7XG4gICAgY29uc3Qgcm93c3BhbiA9IHRoaXMuZG9tTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm93c3BhbicpO1xuICAgIGNvbnN0IGNvbHNwYW4gPSB0aGlzLmRvbU5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbHNwYW4nKTtcbiAgICBjb25zdCBjZWxsQmcgPSB0aGlzLmRvbU5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWNlbGwtYmcnKTtcblxuICAgIGlmICh0aGlzLnN0YXRpY3MucmVxdWlyZWRDb250YWluZXIgJiYgISh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHRoaXMuc3RhdGljcy5yZXF1aXJlZENvbnRhaW5lcikpIHtcbiAgICAgIHRoaXMud3JhcCh0aGlzLnN0YXRpY3MucmVxdWlyZWRDb250YWluZXIuYmxvdE5hbWUsIHtcbiAgICAgICAgcm93OiByb3dJZCxcbiAgICAgICAgY29sc3BhbixcbiAgICAgICAgcm93c3BhbixcbiAgICAgICAgJ2NlbGwtYmcnOiBjZWxsQmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1cGVyLm9wdGltaXplKGNvbnRleHQpO1xuICB9XG5cbiAgdGFibGVDZWxsKCkge1xuICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgfVxuXG59XG5cblRhYmxlQ2VsbExpbmUuYmxvdE5hbWUgPSBcInRhYmxlLWNlbGwtbGluZVwiO1xuVGFibGVDZWxsTGluZS5jbGFzc05hbWUgPSBcInFsYnQtY2VsbC1saW5lXCI7XG5UYWJsZUNlbGxMaW5lLnRhZ05hbWUgPSBcIlBcIjtcblxuY2xhc3MgVGFibGVDZWxsIGV4dGVuZHMgQ29udGFpbmVyIHtcbiAgY2hlY2tNZXJnZSgpIHtcbiAgICBpZiAoc3VwZXIuY2hlY2tNZXJnZSgpICYmIHRoaXMubmV4dC5jaGlsZHJlbi5oZWFkICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRoaXNIZWFkID0gdGhpcy5jaGlsZHJlbi5oZWFkLmZvcm1hdHMoKVt0aGlzLmNoaWxkcmVuLmhlYWQuc3RhdGljcy5ibG90TmFtZV07XG4gICAgICBjb25zdCB0aGlzVGFpbCA9IHRoaXMuY2hpbGRyZW4udGFpbC5mb3JtYXRzKClbdGhpcy5jaGlsZHJlbi50YWlsLnN0YXRpY3MuYmxvdE5hbWVdO1xuICAgICAgY29uc3QgbmV4dEhlYWQgPSB0aGlzLm5leHQuY2hpbGRyZW4uaGVhZC5mb3JtYXRzKClbdGhpcy5uZXh0LmNoaWxkcmVuLmhlYWQuc3RhdGljcy5ibG90TmFtZV07XG4gICAgICBjb25zdCBuZXh0VGFpbCA9IHRoaXMubmV4dC5jaGlsZHJlbi50YWlsLmZvcm1hdHMoKVt0aGlzLm5leHQuY2hpbGRyZW4udGFpbC5zdGF0aWNzLmJsb3ROYW1lXTtcbiAgICAgIHJldHVybiB0aGlzSGVhZC5jZWxsID09PSB0aGlzVGFpbC5jZWxsICYmIHRoaXNIZWFkLmNlbGwgPT09IG5leHRIZWFkLmNlbGwgJiYgdGhpc0hlYWQuY2VsbCA9PT0gbmV4dFRhaWwuY2VsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKHZhbHVlKSB7XG4gICAgY29uc3Qgbm9kZSA9IHN1cGVyLmNyZWF0ZSh2YWx1ZSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJvd1wiLCB2YWx1ZS5yb3cpO1xuICAgIENFTExfQVRUUklCVVRFUy5mb3JFYWNoKGF0dHJOYW1lID0+IHtcbiAgICAgIGlmICh2YWx1ZVthdHRyTmFtZV0pIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbHVlW2F0dHJOYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodmFsdWVbJ2NlbGwtYmcnXSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2VsbC1iZycsIHZhbHVlWydjZWxsLWJnJ10pO1xuICAgICAgbm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZVsnY2VsbC1iZyddO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgc3RhdGljIGZvcm1hdHMoZG9tTm9kZSkge1xuICAgIGNvbnN0IGZvcm1hdHMgPSB7fTtcblxuICAgIGlmIChkb21Ob2RlLmhhc0F0dHJpYnV0ZShcImRhdGEtcm93XCIpKSB7XG4gICAgICBmb3JtYXRzW1wicm93XCJdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJvd1wiKTtcbiAgICB9XG5cbiAgICBpZiAoZG9tTm9kZS5oYXNBdHRyaWJ1dGUoXCJkYXRhLWNlbGwtYmdcIikpIHtcbiAgICAgIGZvcm1hdHNbXCJjZWxsLWJnXCJdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNlbGwtYmdcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIENFTExfQVRUUklCVVRFUy5yZWR1Y2UoKGZvcm1hdHMsIGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgaWYgKGRvbU5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgZm9ybWF0c1thdHRyaWJ1dGVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHM7XG4gICAgfSwgZm9ybWF0cyk7XG4gIH1cblxuICBjZWxsT2Zmc2V0KCkge1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZm9ybWF0cygpIHtcbiAgICBjb25zdCBmb3JtYXRzID0ge307XG5cbiAgICBpZiAodGhpcy5kb21Ob2RlLmhhc0F0dHJpYnV0ZShcImRhdGEtcm93XCIpKSB7XG4gICAgICBmb3JtYXRzW1wicm93XCJdID0gdGhpcy5kb21Ob2RlLmdldEF0dHJpYnV0ZShcImRhdGEtcm93XCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRvbU5vZGUuaGFzQXR0cmlidXRlKFwiZGF0YS1jZWxsLWJnXCIpKSB7XG4gICAgICBmb3JtYXRzW1wiY2VsbC1iZ1wiXSA9IHRoaXMuZG9tTm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNlbGwtYmdcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIENFTExfQVRUUklCVVRFUy5yZWR1Y2UoKGZvcm1hdHMsIGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZG9tTm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgICBmb3JtYXRzW2F0dHJpYnV0ZV0gPSB0aGlzLmRvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtYXRzO1xuICAgIH0sIGZvcm1hdHMpO1xuICB9XG5cbiAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmRvbU5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRDaGlsZHJlbihuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBjaGlsZC5mb3JtYXQobmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9ybWF0KG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKENFTExfQVRUUklCVVRFUy5pbmRleE9mKG5hbWUpID4gLTEpIHtcbiAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuZm9ybWF0Q2hpbGRyZW4obmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoWydyb3cnXS5pbmRleE9mKG5hbWUpID4gLTEpIHtcbiAgICAgIHRoaXMudG9nZ2xlQXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQobmFtZSksIHZhbHVlKTtcbiAgICAgIHRoaXMuZm9ybWF0Q2hpbGRyZW4obmFtZSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2NlbGwtYmcnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgnZGF0YS1jZWxsLWJnJywgdmFsdWUpO1xuICAgICAgdGhpcy5mb3JtYXRDaGlsZHJlbihuYW1lLCB2YWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRvbU5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvbU5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ2luaXRpYWwnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5mb3JtYXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGltaXplKGNvbnRleHQpIHtcbiAgICBjb25zdCByb3dJZCA9IHRoaXMuZG9tTm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJvd1wiKTtcblxuICAgIGlmICh0aGlzLnN0YXRpY3MucmVxdWlyZWRDb250YWluZXIgJiYgISh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHRoaXMuc3RhdGljcy5yZXF1aXJlZENvbnRhaW5lcikpIHtcbiAgICAgIHRoaXMud3JhcCh0aGlzLnN0YXRpY3MucmVxdWlyZWRDb250YWluZXIuYmxvdE5hbWUsIHtcbiAgICAgICAgcm93OiByb3dJZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3VwZXIub3B0aW1pemUoY29udGV4dCk7XG4gIH1cblxuICByb3coKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICB9XG5cbiAgcm93T2Zmc2V0KCkge1xuICAgIGlmICh0aGlzLnJvdygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3coKS5yb3dPZmZzZXQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3coKSAmJiB0aGlzLnJvdygpLnRhYmxlKCk7XG4gIH1cblxufVxuXG5UYWJsZUNlbGwuYmxvdE5hbWUgPSBcInRhYmxlXCI7XG5UYWJsZUNlbGwudGFnTmFtZSA9IFwiVERcIjtcblxuY2xhc3MgVGFibGVSb3cgZXh0ZW5kcyBDb250YWluZXIge1xuICBjaGVja01lcmdlKCkge1xuICAgIGlmIChzdXBlci5jaGVja01lcmdlKCkgJiYgdGhpcy5uZXh0LmNoaWxkcmVuLmhlYWQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdGhpc0hlYWQgPSB0aGlzLmNoaWxkcmVuLmhlYWQuZm9ybWF0cygpO1xuICAgICAgY29uc3QgdGhpc1RhaWwgPSB0aGlzLmNoaWxkcmVuLnRhaWwuZm9ybWF0cygpO1xuICAgICAgY29uc3QgbmV4dEhlYWQgPSB0aGlzLm5leHQuY2hpbGRyZW4uaGVhZC5mb3JtYXRzKCk7XG4gICAgICBjb25zdCBuZXh0VGFpbCA9IHRoaXMubmV4dC5jaGlsZHJlbi50YWlsLmZvcm1hdHMoKTtcbiAgICAgIHJldHVybiB0aGlzSGVhZC5yb3cgPT09IHRoaXNUYWlsLnJvdyAmJiB0aGlzSGVhZC5yb3cgPT09IG5leHRIZWFkLnJvdyAmJiB0aGlzSGVhZC5yb3cgPT09IG5leHRUYWlsLnJvdztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlKHZhbHVlKSB7XG4gICAgY29uc3Qgbm9kZSA9IHN1cGVyLmNyZWF0ZSh2YWx1ZSk7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJvd1wiLCB2YWx1ZS5yb3cpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZm9ybWF0cygpIHtcbiAgICByZXR1cm4gW1wicm93XCJdLnJlZHVjZSgoZm9ybWF0cywgYXR0ck5hbWUpID0+IHtcbiAgICAgIGlmICh0aGlzLmRvbU5vZGUuaGFzQXR0cmlidXRlKFwiZGF0YS1cIi5jb25jYXQoYXR0ck5hbWUpKSkge1xuICAgICAgICBmb3JtYXRzW2F0dHJOYW1lXSA9IHRoaXMuZG9tTm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLVwiLmNvbmNhdChhdHRyTmFtZSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0cztcbiAgICB9LCB7fSk7XG4gIH1cblxuICBvcHRpbWl6ZShjb250ZXh0KSB7XG4gICAgLy8gb3B0aW1pemUgZnVuY3Rpb24gb2YgU2hhZG93QmxvdFxuICAgIGlmICh0aGlzLnN0YXRpY3MucmVxdWlyZWRDb250YWluZXIgJiYgISh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHRoaXMuc3RhdGljcy5yZXF1aXJlZENvbnRhaW5lcikpIHtcbiAgICAgIHRoaXMud3JhcCh0aGlzLnN0YXRpY3MucmVxdWlyZWRDb250YWluZXIuYmxvdE5hbWUpO1xuICAgIH0gLy8gb3B0aW1pemUgZnVuY3Rpb24gb2YgUGFyZW50QmxvdFxuICAgIC8vIG5vdGU6IG1vZGlmaWVkIHRoaXMgb3B0aW1pemUgZnVuY3Rpb24gYmVjYXVzZVxuICAgIC8vIFRhYmxlUm93IHNob3VsZCBub3QgYmUgcmVtb3ZlZCB3aGVuIHRoZSBsZW5ndGggb2YgaXRzIGNoaWxkcmVuIHdhcyAwXG5cblxuICAgIHRoaXMuZW5mb3JjZUFsbG93ZWRDaGlsZHJlbigpO1xuXG4gICAgaWYgKHRoaXMudWlOb2RlICE9IG51bGwgJiYgdGhpcy51aU5vZGUgIT09IHRoaXMuZG9tTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLmRvbU5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMudWlOb2RlLCB0aGlzLmRvbU5vZGUuZmlyc3RDaGlsZCk7XG4gICAgfSAvLyBvcHRpbWl6ZSBmdW5jdGlvbiBvZiBDb250YWluZXJCbG90XG5cblxuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgdGhpcy5uZXh0ICE9IG51bGwgJiYgdGhpcy5jaGVja01lcmdlKCkpIHtcbiAgICAgIHRoaXMubmV4dC5tb3ZlQ2hpbGRyZW4odGhpcyk7XG4gICAgICB0aGlzLm5leHQucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgcm93T2Zmc2V0KCkge1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnBhcmVudDtcbiAgfVxuXG59XG5cblRhYmxlUm93LmJsb3ROYW1lID0gXCJ0YWJsZS1yb3dcIjtcblRhYmxlUm93LnRhZ05hbWUgPSBcIlRSXCI7XG5cbmNsYXNzIFRhYmxlQm9keSBleHRlbmRzIENvbnRhaW5lciB7fVxuXG5UYWJsZUJvZHkuYmxvdE5hbWUgPSBcInRhYmxlLWJvZHlcIjtcblRhYmxlQm9keS50YWdOYW1lID0gXCJUQk9EWVwiO1xuXG5jbGFzcyBUYWJsZUNvbCBleHRlbmRzIHRhYmxlX0Jsb2NrIHtcbiAgc3RhdGljIGNyZWF0ZSh2YWx1ZSkge1xuICAgIGxldCBub2RlID0gc3VwZXIuY3JlYXRlKHZhbHVlKTtcbiAgICBDT0xfQVRUUklCVVRFUy5mb3JFYWNoKGF0dHJOYW1lID0+IHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiXCIuY29uY2F0KGF0dHJOYW1lKSwgdmFsdWVbYXR0ck5hbWVdIHx8IENPTF9ERUZBVUxUW2F0dHJOYW1lXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBzdGF0aWMgZm9ybWF0cyhkb21Ob2RlKSB7XG4gICAgcmV0dXJuIENPTF9BVFRSSUJVVEVTLnJlZHVjZSgoZm9ybWF0cywgYXR0cmlidXRlKSA9PiB7XG4gICAgICBpZiAoZG9tTm9kZS5oYXNBdHRyaWJ1dGUoXCJcIi5jb25jYXQoYXR0cmlidXRlKSkpIHtcbiAgICAgICAgZm9ybWF0c1thdHRyaWJ1dGVdID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGUoXCJcIi5jb25jYXQoYXR0cmlidXRlKSkgfHwgdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0cztcbiAgICB9LCB7fSk7XG4gIH1cblxuICBmb3JtYXQobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoQ09MX0FUVFJJQlVURVMuaW5kZXhPZihuYW1lKSA+IC0xKSB7XG4gICAgICB0aGlzLmRvbU5vZGUuc2V0QXR0cmlidXRlKFwiXCIuY29uY2F0KG5hbWUpLCB2YWx1ZSB8fCBDT0xfREVGQVVMVFtuYW1lXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmZvcm1hdChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgaHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21Ob2RlLm91dGVySFRNTDtcbiAgfVxuXG59XG5cblRhYmxlQ29sLmJsb3ROYW1lID0gXCJ0YWJsZS1jb2xcIjtcblRhYmxlQ29sLnRhZ05hbWUgPSBcImNvbFwiO1xuXG5jbGFzcyBUYWJsZUNvbEdyb3VwIGV4dGVuZHMgQ29udGFpbmVyIHt9XG5cblRhYmxlQ29sR3JvdXAuYmxvdE5hbWUgPSBcInRhYmxlLWNvbC1ncm91cFwiO1xuVGFibGVDb2xHcm91cC50YWdOYW1lID0gXCJjb2xncm91cFwiO1xuXG5jbGFzcyB0YWJsZV9UYWJsZUNvbnRhaW5lciBleHRlbmRzIENvbnRhaW5lciB7XG4gIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgbGV0IG5vZGUgPSBzdXBlci5jcmVhdGUoKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjcm9sbCwgZG9tTm9kZSkge1xuICAgIHN1cGVyKHNjcm9sbCwgZG9tTm9kZSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZVdpZHRoKCk7XG4gIH1cblxuICB1cGRhdGVUYWJsZVdpZHRoKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgY29sR3JvdXAgPSB0aGlzLmNvbEdyb3VwKCk7XG4gICAgICBpZiAoIWNvbEdyb3VwKSByZXR1cm47XG4gICAgICBjb25zdCB0YWJsZVdpZHRoID0gY29sR3JvdXAuY2hpbGRyZW4ucmVkdWNlKChzdW1XaWR0aCwgY29sKSA9PiB7XG4gICAgICAgIHN1bVdpZHRoID0gc3VtV2lkdGggKyBwYXJzZUludChjb2wuZm9ybWF0cygpW1RhYmxlQ29sLmJsb3ROYW1lXS53aWR0aCwgMTApO1xuICAgICAgICByZXR1cm4gc3VtV2lkdGg7XG4gICAgICB9LCAwKTtcbiAgICAgIHRoaXMuZG9tTm9kZS5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KHRhYmxlV2lkdGgsIFwicHhcIik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBjZWxscyhjb2x1bW4pIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzKCkubWFwKHJvdyA9PiByb3cuY2hpbGRyZW4uYXQoY29sdW1uKSk7XG4gIH1cblxuICBjb2xHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oZWFkO1xuICB9XG5cbiAgZGVsZXRlQ29sdW1ucyhjb21wYXJlUmVjdCkge1xuICAgIGxldCBkZWxJbmRleGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTtcbiAgICBsZXQgZWRpdG9yV3JhcHBlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IFtib2R5XSA9IHRoaXMuZGVzY2VuZGFudHMoVGFibGVCb2R5KTtcbiAgICBpZiAoYm9keSA9PSBudWxsIHx8IGJvZHkuY2hpbGRyZW4uaGVhZCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgdGFibGVDZWxscyA9IHRoaXMuZGVzY2VuZGFudHMoVGFibGVDZWxsKTtcbiAgICBjb25zdCByZW1vdmVkQ2VsbHMgPSBbXTtcbiAgICBjb25zdCBtb2RpZmllZENlbGxzID0gW107XG4gICAgdGFibGVDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgY29uc3QgY2VsbFJlY3QgPSBnZXRSZWxhdGl2ZVJlY3QoY2VsbC5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBlZGl0b3JXcmFwcGVyKTtcblxuICAgICAgaWYgKGNlbGxSZWN0LnggKyBFUlJPUl9MSU1JVCA+IGNvbXBhcmVSZWN0LnggJiYgY2VsbFJlY3QueDEgLSBFUlJPUl9MSU1JVCA8IGNvbXBhcmVSZWN0LngxKSB7XG4gICAgICAgIHJlbW92ZWRDZWxscy5wdXNoKGNlbGwpO1xuICAgICAgfSBlbHNlIGlmIChjZWxsUmVjdC54IDwgY29tcGFyZVJlY3QueCArIEVSUk9SX0xJTUlUICYmIGNlbGxSZWN0LngxID4gY29tcGFyZVJlY3QueDEgLSBFUlJPUl9MSU1JVCkge1xuICAgICAgICBtb2RpZmllZENlbGxzLnB1c2goY2VsbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmVtb3ZlZENlbGxzLmxlbmd0aCA9PT0gdGFibGVDZWxscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudGFibGVEZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIHJlbW92ZSB0aGUgbWF0Y2hlcyBjb2x1bW4gdG9vbCBjZWxsXG5cblxuICAgIGRlbEluZGV4ZXMuZm9yRWFjaChkZWxJbmRleCA9PiB7XG4gICAgICB0aGlzLmNvbEdyb3VwKCkuY2hpbGRyZW4uYXQoZGVsSW5kZXhlc1swXSkucmVtb3ZlKCk7XG4gICAgfSk7XG4gICAgcmVtb3ZlZENlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICBjZWxsLnJlbW92ZSgpO1xuICAgIH0pO1xuICAgIG1vZGlmaWVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgIGNvbnN0IGNlbGxDb2xzcGFuID0gcGFyc2VJbnQoY2VsbC5mb3JtYXRzKCkuY29sc3BhbiwgMTApO1xuICAgICAgY29uc3QgY2VsbFdpZHRoID0gcGFyc2VJbnQoY2VsbC5mb3JtYXRzKCkud2lkdGgsIDEwKTtcbiAgICAgIGNlbGwuZm9ybWF0KCdjb2xzcGFuJywgY2VsbENvbHNwYW4gLSBkZWxJbmRleGVzLmxlbmd0aCk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZVdpZHRoKCk7XG4gIH1cblxuICBkZWxldGVSb3coY29tcGFyZVJlY3QsIGVkaXRvcldyYXBwZXIpIHtcbiAgICBjb25zdCBbYm9keV0gPSB0aGlzLmRlc2NlbmRhbnRzKFRhYmxlQm9keSk7XG4gICAgaWYgKGJvZHkgPT0gbnVsbCB8fCBib2R5LmNoaWxkcmVuLmhlYWQgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHRhYmxlQ2VsbHMgPSB0aGlzLmRlc2NlbmRhbnRzKFRhYmxlQ2VsbCk7XG4gICAgY29uc3QgdGFibGVSb3dzID0gdGhpcy5kZXNjZW5kYW50cyhUYWJsZVJvdyk7XG4gICAgY29uc3QgcmVtb3ZlZENlbGxzID0gW107IC8vIGNlbGxzIHRvIGJlIHJlbW92ZWRcblxuICAgIGNvbnN0IG1vZGlmaWVkQ2VsbHMgPSBbXTsgLy8gY2VsbHMgdG8gYmUgbW9kaWZpZWRcblxuICAgIGNvbnN0IGZhbGxDZWxscyA9IFtdOyAvLyBjZWxscyB0byBmYWxsIGludG8gbmV4dCByb3dcbiAgICAvLyBjb21wdXRlIHJvd3MgdG8gcmVtb3ZlXG4gICAgLy8gYnVnZml4OiAjMjEgVGhlcmUgd2lsbCBiZSBhIGVtcHR5IHRyIGxlZnQgaWYgZGVsZXRlIHRoZSBsYXN0IHJvdyBvZiBhIHRhYmxlXG5cbiAgICBjb25zdCByZW1vdmVkUm93cyA9IHRhYmxlUm93cy5maWx0ZXIocm93ID0+IHtcbiAgICAgIGNvbnN0IHJvd1JlY3QgPSBnZXRSZWxhdGl2ZVJlY3Qocm93LmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGVkaXRvcldyYXBwZXIpO1xuICAgICAgcmV0dXJuIHJvd1JlY3QueSA+IGNvbXBhcmVSZWN0LnkgLSBFUlJPUl9MSU1JVCAmJiByb3dSZWN0LnkxIDwgY29tcGFyZVJlY3QueTEgKyBFUlJPUl9MSU1JVDtcbiAgICB9KTtcbiAgICB0YWJsZUNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICBjb25zdCBjZWxsUmVjdCA9IGdldFJlbGF0aXZlUmVjdChjZWxsLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGVkaXRvcldyYXBwZXIpO1xuXG4gICAgICBpZiAoY2VsbFJlY3QueSA+IGNvbXBhcmVSZWN0LnkgLSBFUlJPUl9MSU1JVCAmJiBjZWxsUmVjdC55MSA8IGNvbXBhcmVSZWN0LnkxICsgRVJST1JfTElNSVQpIHtcbiAgICAgICAgcmVtb3ZlZENlbGxzLnB1c2goY2VsbCk7XG4gICAgICB9IGVsc2UgaWYgKGNlbGxSZWN0LnkgPCBjb21wYXJlUmVjdC55ICsgRVJST1JfTElNSVQgJiYgY2VsbFJlY3QueTEgPiBjb21wYXJlUmVjdC55MSAtIEVSUk9SX0xJTUlUKSB7XG4gICAgICAgIG1vZGlmaWVkQ2VsbHMucHVzaChjZWxsKTtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoY2VsbFJlY3QueSAtIGNvbXBhcmVSZWN0LnkpIDwgRVJST1JfTElNSVQpIHtcbiAgICAgICAgICBmYWxsQ2VsbHMucHVzaChjZWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlbW92ZWRDZWxscy5sZW5ndGggPT09IHRhYmxlQ2VsbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRhYmxlRGVzdHJveSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gY29tcHV0ZSBsZW5ndGggb2YgcmVtb3ZlZCByb3dzXG5cblxuICAgIGNvbnN0IHJlbW92ZWRSb3dzTGVuZ3RoID0gdGhpcy5yb3dzKCkucmVkdWNlKChzdW0sIHJvdykgPT4ge1xuICAgICAgbGV0IHJvd1JlY3QgPSBnZXRSZWxhdGl2ZVJlY3Qocm93LmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGVkaXRvcldyYXBwZXIpO1xuXG4gICAgICBpZiAocm93UmVjdC55ID4gY29tcGFyZVJlY3QueSAtIEVSUk9SX0xJTUlUICYmIHJvd1JlY3QueTEgPCBjb21wYXJlUmVjdC55MSArIEVSUk9SX0xJTUlUKSB7XG4gICAgICAgIHN1bSArPSAxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3VtO1xuICAgIH0sIDApOyAvLyBpdCBtdXN0IGV4Y3V0ZSBiZWZvcmUgdGhlIHRhYmxlIGxheW91dCBjaGFuZ2VkIHdpdGggb3RoZXIgb3BlcmF0aW9uXG5cbiAgICBmYWxsQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgIGNvbnN0IGNlbGxSZWN0ID0gZ2V0UmVsYXRpdmVSZWN0KGNlbGwuZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZWRpdG9yV3JhcHBlcik7XG4gICAgICBjb25zdCBuZXh0Um93ID0gY2VsbC5wYXJlbnQubmV4dDtcbiAgICAgIGNvbnN0IGNlbGxzSW5OZXh0Um93ID0gbmV4dFJvdy5jaGlsZHJlbjtcbiAgICAgIGNvbnN0IHJlZkNlbGwgPSBjZWxsc0luTmV4dFJvdy5yZWR1Y2UoKHJlZiwgY29tcGFyZUNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgY29tcGFyZVJlY3QgPSBnZXRSZWxhdGl2ZVJlY3QoY29tcGFyZUNlbGwuZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgZWRpdG9yV3JhcHBlcik7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGNlbGxSZWN0LngxIC0gY29tcGFyZVJlY3QueCkgPCBFUlJPUl9MSU1JVCkge1xuICAgICAgICAgIHJlZiA9IGNvbXBhcmVDZWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgIH0sIG51bGwpO1xuICAgICAgbmV4dFJvdy5pbnNlcnRCZWZvcmUoY2VsbCwgcmVmQ2VsbCk7XG4gICAgICBjZWxsLmZvcm1hdCgncm93JywgbmV4dFJvdy5mb3JtYXRzKCkucm93KTtcbiAgICB9KTtcbiAgICByZW1vdmVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgIGNlbGwucmVtb3ZlKCk7XG4gICAgfSk7XG4gICAgbW9kaWZpZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgY29uc3QgY2VsbFJvd3NwYW4gPSBwYXJzZUludChjZWxsLmZvcm1hdHMoKS5yb3dzcGFuLCAxMCk7XG4gICAgICBjZWxsLmZvcm1hdChcInJvd3NwYW5cIiwgY2VsbFJvd3NwYW4gLSByZW1vdmVkUm93c0xlbmd0aCk7XG4gICAgfSk7IC8vIHJlbW92ZSBzZWxlY3RlZCByb3dzXG5cbiAgICByZW1vdmVkUm93cy5mb3JFYWNoKHJvdyA9PiByb3cucmVtb3ZlKCkpO1xuICB9XG5cbiAgdGFibGVEZXN0cm95KCkge1xuICAgIGNvbnN0IHF1aWxsID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMuc2Nyb2xsLmRvbU5vZGUucGFyZW50Tm9kZSk7XG4gICAgY29uc3QgdGFibGVNb2R1bGUgPSBxdWlsbC5nZXRNb2R1bGUoXCJiZXR0ZXItdGFibGVcIik7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgICB0YWJsZU1vZHVsZS5oaWRlVGFibGVUb29scygpO1xuICAgIHF1aWxsLnVwZGF0ZShleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gIH1cblxuICBpbnNlcnRDZWxsKHRhYmxlUm93LCByZWYpIHtcbiAgICBjb25zdCBpZCA9IHRhYmxlX2NlbGxJZCgpO1xuICAgIGNvbnN0IHJJZCA9IHRhYmxlUm93LmZvcm1hdHMoKS5yb3c7XG4gICAgY29uc3QgdGFibGVDZWxsID0gdGhpcy5zY3JvbGwuY3JlYXRlKFRhYmxlQ2VsbC5ibG90TmFtZSwgT2JqZWN0LmFzc2lnbih7fSwgQ0VMTF9ERUZBVUxULCB7XG4gICAgICByb3c6IHJJZFxuICAgIH0pKTtcbiAgICBjb25zdCBjZWxsTGluZSA9IHRoaXMuc2Nyb2xsLmNyZWF0ZShUYWJsZUNlbGxMaW5lLmJsb3ROYW1lLCB7XG4gICAgICByb3c6IHJJZCxcbiAgICAgIGNlbGw6IGlkXG4gICAgfSk7XG4gICAgdGFibGVDZWxsLmFwcGVuZENoaWxkKGNlbGxMaW5lKTtcblxuICAgIGlmIChyZWYpIHtcbiAgICAgIHRhYmxlUm93Lmluc2VydEJlZm9yZSh0YWJsZUNlbGwsIHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlUm93LmFwcGVuZENoaWxkKHRhYmxlQ2VsbCk7XG4gICAgfVxuICB9XG5cbiAgaW5zZXJ0Q29sdW1uKGNvbXBhcmVSZWN0LCBjb2xJbmRleCkge1xuICAgIGxldCBpc1JpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAgIGxldCBlZGl0b3JXcmFwcGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgW2JvZHldID0gdGhpcy5kZXNjZW5kYW50cyhUYWJsZUJvZHkpO1xuICAgIGNvbnN0IFt0YWJsZUNvbEdyb3VwXSA9IHRoaXMuZGVzY2VuZGFudHMoVGFibGVDb2xHcm91cCk7XG4gICAgY29uc3QgdGFibGVDb2xzID0gdGhpcy5kZXNjZW5kYW50cyhUYWJsZUNvbCk7XG4gICAgbGV0IGFkZEFzaWRlQ2VsbHMgPSBbXTtcbiAgICBsZXQgbW9kaWZpZWRDZWxscyA9IFtdO1xuICAgIGxldCBhZmZlY3RlZENlbGxzID0gW107XG4gICAgaWYgKGJvZHkgPT0gbnVsbCB8fCBib2R5LmNoaWxkcmVuLmhlYWQgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHRhYmxlQ2VsbHMgPSB0aGlzLmRlc2NlbmRhbnRzKFRhYmxlQ2VsbCk7XG4gICAgdGFibGVDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgY29uc3QgY2VsbFJlY3QgPSBnZXRSZWxhdGl2ZVJlY3QoY2VsbC5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBlZGl0b3JXcmFwcGVyKTtcblxuICAgICAgaWYgKGlzUmlnaHQpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGNlbGxSZWN0LngxIC0gY29tcGFyZVJlY3QueDEpIDwgRVJST1JfTElNSVQpIHtcbiAgICAgICAgICAvLyB0aGUgcmlnaHQgb2Ygc2VsZWN0ZWQgYm91bmRhcnkgZXF1YWwgdG8gdGhlIHJpZ2h0IG9mIHRhYmxlIGNlbGwsXG4gICAgICAgICAgLy8gYWRkIGEgbmV3IHRhYmxlIGNlbGwgcmlnaHQgYXNpZGUgdGhpcyB0YWJsZSBjZWxsXG4gICAgICAgICAgYWRkQXNpZGVDZWxscy5wdXNoKGNlbGwpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVSZWN0LngxIC0gY2VsbFJlY3QueCA+IEVSUk9SX0xJTUlUICYmIGNvbXBhcmVSZWN0LngxIC0gY2VsbFJlY3QueDEgPCAtRVJST1JfTElNSVQpIHtcbiAgICAgICAgICAvLyB0aGUgcmlnaHQgb2Ygc2VsZWN0ZWQgYm91bmRhcnkgaXMgaW5zaWRlIHRoaXMgdGFibGUgY2VsbFxuICAgICAgICAgIC8vIGNvbHNwYW4gb2YgdGhpcyB0YWJsZSBjZWxsIHdpbGwgaW5jcmVhc2UgMVxuICAgICAgICAgIG1vZGlmaWVkQ2VsbHMucHVzaChjZWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGNlbGxSZWN0LnggLSBjb21wYXJlUmVjdC54KSA8IEVSUk9SX0xJTUlUKSB7XG4gICAgICAgICAgLy8gbGVmdCBvZiBzZWxlY3RlZCBib3VuZGFyeSBlcXVhbCB0byBsZWZ0IG9mIHRhYmxlIGNlbGwsXG4gICAgICAgICAgLy8gYWRkIGEgbmV3IHRhYmxlIGNlbGwgbGVmdCBhc2lkZSB0aGlzIHRhYmxlIGNlbGxcbiAgICAgICAgICBhZGRBc2lkZUNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZVJlY3QueCAtIGNlbGxSZWN0LnggPiBFUlJPUl9MSU1JVCAmJiBjb21wYXJlUmVjdC54IC0gY2VsbFJlY3QueDEgPCAtRVJST1JfTElNSVQpIHtcbiAgICAgICAgICAvLyB0aGUgbGVmdCBvZiBzZWxlY3RlZCBib3VuZGFyeSBpcyBpbnNpZGUgdGhpcyB0YWJsZSBjZWxsXG4gICAgICAgICAgLy8gY29sc3BhbiBvZiB0aGlzIHRhYmxlIGNlbGwgd2lsbCBpbmNyZWFzZSAxXG4gICAgICAgICAgbW9kaWZpZWRDZWxscy5wdXNoKGNlbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYWRkQXNpZGVDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgY29uc3QgcmVmID0gaXNSaWdodCA/IGNlbGwubmV4dCA6IGNlbGw7XG4gICAgICBjb25zdCBpZCA9IHRhYmxlX2NlbGxJZCgpO1xuICAgICAgY29uc3QgdGFibGVSb3cgPSBjZWxsLnBhcmVudDtcbiAgICAgIGNvbnN0IHJJZCA9IHRhYmxlUm93LmZvcm1hdHMoKS5yb3c7XG4gICAgICBjb25zdCBjZWxsRm9ybWF0cyA9IGNlbGwuZm9ybWF0cygpO1xuICAgICAgY29uc3QgdGFibGVDZWxsID0gdGhpcy5zY3JvbGwuY3JlYXRlKFRhYmxlQ2VsbC5ibG90TmFtZSwgT2JqZWN0LmFzc2lnbih7fSwgQ0VMTF9ERUZBVUxULCB7XG4gICAgICAgIHJvdzogcklkLFxuICAgICAgICByb3dzcGFuOiBjZWxsRm9ybWF0cy5yb3dzcGFuXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBjZWxsTGluZSA9IHRoaXMuc2Nyb2xsLmNyZWF0ZShUYWJsZUNlbGxMaW5lLmJsb3ROYW1lLCB7XG4gICAgICAgIHJvdzogcklkLFxuICAgICAgICBjZWxsOiBpZCxcbiAgICAgICAgcm93c3BhbjogY2VsbEZvcm1hdHMucm93c3BhblxuICAgICAgfSk7XG4gICAgICB0YWJsZUNlbGwuYXBwZW5kQ2hpbGQoY2VsbExpbmUpO1xuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIHRhYmxlUm93Lmluc2VydEJlZm9yZSh0YWJsZUNlbGwsIHJlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWJsZVJvdy5hcHBlbmRDaGlsZCh0YWJsZUNlbGwpO1xuICAgICAgfVxuXG4gICAgICBhZmZlY3RlZENlbGxzLnB1c2godGFibGVDZWxsKTtcbiAgICB9KTsgLy8gaW5zZXJ0IG5ldyB0YWJsZUNvbFxuXG4gICAgY29uc3QgdGFibGVDb2wgPSB0aGlzLnNjcm9sbC5jcmVhdGUoVGFibGVDb2wuYmxvdE5hbWUsIHRydWUpO1xuICAgIGxldCBjb2xSZWYgPSBpc1JpZ2h0ID8gdGFibGVDb2xzW2NvbEluZGV4XS5uZXh0IDogdGFibGVDb2xzW2NvbEluZGV4XTtcblxuICAgIGlmIChjb2xSZWYpIHtcbiAgICAgIHRhYmxlQ29sR3JvdXAuaW5zZXJ0QmVmb3JlKHRhYmxlQ29sLCBjb2xSZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZUNvbEdyb3VwLmFwcGVuZENoaWxkKHRhYmxlQ29sKTtcbiAgICB9XG5cbiAgICBtb2RpZmllZENlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICBjb25zdCBjZWxsQ29sc3BhbiA9IGNlbGwuZm9ybWF0cygpLmNvbHNwYW47XG4gICAgICBjZWxsLmZvcm1hdCgnY29sc3BhbicsIHBhcnNlSW50KGNlbGxDb2xzcGFuLCAxMCkgKyAxKTtcbiAgICAgIGFmZmVjdGVkQ2VsbHMucHVzaChjZWxsKTtcbiAgICB9KTtcbiAgICBhZmZlY3RlZENlbGxzLnNvcnQoKGNlbGxBLCBjZWxsQikgPT4ge1xuICAgICAgbGV0IHkxID0gY2VsbEEuZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55O1xuICAgICAgbGV0IHkyID0gY2VsbEIuZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55O1xuICAgICAgcmV0dXJuIHkxIC0geTI7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVUYWJsZVdpZHRoKCk7XG4gICAgcmV0dXJuIGFmZmVjdGVkQ2VsbHM7XG4gIH1cblxuICBpbnNlcnRSb3coY29tcGFyZVJlY3QsIGlzRG93biwgZWRpdG9yV3JhcHBlcikge1xuICAgIGNvbnN0IFtib2R5XSA9IHRoaXMuZGVzY2VuZGFudHMoVGFibGVCb2R5KTtcbiAgICBpZiAoYm9keSA9PSBudWxsIHx8IGJvZHkuY2hpbGRyZW4uaGVhZCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgdGFibGVDZWxscyA9IHRoaXMuZGVzY2VuZGFudHMoVGFibGVDZWxsKTtcbiAgICBjb25zdCBySWQgPSB0YWJsZV9yb3dJZCgpO1xuICAgIGNvbnN0IG5ld1JvdyA9IHRoaXMuc2Nyb2xsLmNyZWF0ZShUYWJsZVJvdy5ibG90TmFtZSwge1xuICAgICAgcm93OiBySWRcbiAgICB9KTtcbiAgICBsZXQgYWRkQmVsb3dDZWxscyA9IFtdO1xuICAgIGxldCBtb2RpZmllZENlbGxzID0gW107XG4gICAgbGV0IGFmZmVjdGVkQ2VsbHMgPSBbXTtcbiAgICB0YWJsZUNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICBjb25zdCBjZWxsUmVjdCA9IGdldFJlbGF0aXZlUmVjdChjZWxsLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGVkaXRvcldyYXBwZXIpO1xuXG4gICAgICBpZiAoaXNEb3duKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhjZWxsUmVjdC55MSAtIGNvbXBhcmVSZWN0LnkxKSA8IEVSUk9SX0xJTUlUKSB7XG4gICAgICAgICAgYWRkQmVsb3dDZWxscy5wdXNoKGNlbGwpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVSZWN0LnkxIC0gY2VsbFJlY3QueSA+IEVSUk9SX0xJTUlUICYmIGNvbXBhcmVSZWN0LnkxIC0gY2VsbFJlY3QueTEgPCAtRVJST1JfTElNSVQpIHtcbiAgICAgICAgICBtb2RpZmllZENlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhjZWxsUmVjdC55IC0gY29tcGFyZVJlY3QueSkgPCBFUlJPUl9MSU1JVCkge1xuICAgICAgICAgIGFkZEJlbG93Q2VsbHMucHVzaChjZWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlUmVjdC55IC0gY2VsbFJlY3QueSA+IEVSUk9SX0xJTUlUICYmIGNvbXBhcmVSZWN0LnkgLSBjZWxsUmVjdC55MSA8IC1FUlJPUl9MSU1JVCkge1xuICAgICAgICAgIG1vZGlmaWVkQ2VsbHMucHVzaChjZWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyBvcmRlcmVkIHRhYmxlIGNlbGxzIHdpdGggcmVjdC54LCBmaXggZXJyb3IgZm9yIGluc2VydGluZ1xuICAgIC8vIG5ldyB0YWJsZSBjZWxsIGluIGNvbXBsaWNhdGVkIHRhYmxlIHdpdGggd3Jvbmcgb3JkZXIuXG5cbiAgICBjb25zdCBzb3J0RnVuYyA9IChjZWxsQSwgY2VsbEIpID0+IHtcbiAgICAgIGxldCB4MSA9IGNlbGxBLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueDtcbiAgICAgIGxldCB4MiA9IGNlbGxCLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueDtcbiAgICAgIHJldHVybiB4MSAtIHgyO1xuICAgIH07XG5cbiAgICBhZGRCZWxvd0NlbGxzLnNvcnQoc29ydEZ1bmMpO1xuICAgIGFkZEJlbG93Q2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgIGNvbnN0IGNJZCA9IHRhYmxlX2NlbGxJZCgpO1xuICAgICAgY29uc3QgY2VsbEZvcm1hdHMgPSBjZWxsLmZvcm1hdHMoKTtcbiAgICAgIGNvbnN0IHRhYmxlQ2VsbCA9IHRoaXMuc2Nyb2xsLmNyZWF0ZShUYWJsZUNlbGwuYmxvdE5hbWUsIE9iamVjdC5hc3NpZ24oe30sIENFTExfREVGQVVMVCwge1xuICAgICAgICByb3c6IHJJZCxcbiAgICAgICAgY29sc3BhbjogY2VsbEZvcm1hdHMuY29sc3BhblxuICAgICAgfSkpO1xuICAgICAgY29uc3QgY2VsbExpbmUgPSB0aGlzLnNjcm9sbC5jcmVhdGUoVGFibGVDZWxsTGluZS5ibG90TmFtZSwge1xuICAgICAgICByb3c6IHJJZCxcbiAgICAgICAgY2VsbDogY0lkLFxuICAgICAgICBjb2xzcGFuOiBjZWxsRm9ybWF0cy5jb2xzcGFuXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVtcHR5ID0gdGhpcy5zY3JvbGwuY3JlYXRlKEJyZWFrLmJsb3ROYW1lKTtcbiAgICAgIGNlbGxMaW5lLmFwcGVuZENoaWxkKGVtcHR5KTtcbiAgICAgIHRhYmxlQ2VsbC5hcHBlbmRDaGlsZChjZWxsTGluZSk7XG4gICAgICBuZXdSb3cuYXBwZW5kQ2hpbGQodGFibGVDZWxsKTtcbiAgICAgIGFmZmVjdGVkQ2VsbHMucHVzaCh0YWJsZUNlbGwpO1xuICAgIH0pO1xuICAgIG1vZGlmaWVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgIGNvbnN0IGNlbGxSb3dzcGFuID0gcGFyc2VJbnQoY2VsbC5mb3JtYXRzKCkucm93c3BhbiwgMTApO1xuICAgICAgY2VsbC5mb3JtYXQoXCJyb3dzcGFuXCIsIGNlbGxSb3dzcGFuICsgMSk7XG4gICAgICBhZmZlY3RlZENlbGxzLnB1c2goY2VsbCk7XG4gICAgfSk7XG4gICAgY29uc3QgcmVmUm93ID0gdGhpcy5yb3dzKCkuZmluZChyb3cgPT4ge1xuICAgICAgbGV0IHJvd1JlY3QgPSBnZXRSZWxhdGl2ZVJlY3Qocm93LmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGVkaXRvcldyYXBwZXIpO1xuXG4gICAgICBpZiAoaXNEb3duKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhyb3dSZWN0LnkgLSBjb21wYXJlUmVjdC55IC0gY29tcGFyZVJlY3QuaGVpZ2h0KSA8IEVSUk9SX0xJTUlUO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHJvd1JlY3QueSAtIGNvbXBhcmVSZWN0LnkpIDwgRVJST1JfTElNSVQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYm9keS5pbnNlcnRCZWZvcmUobmV3Um93LCByZWZSb3cpOyAvLyByZW9yZGVyaW5nIGFmZmVjdGVkQ2VsbHNcblxuICAgIGFmZmVjdGVkQ2VsbHMuc29ydChzb3J0RnVuYyk7XG4gICAgcmV0dXJuIGFmZmVjdGVkQ2VsbHM7XG4gIH1cblxuICBtZXJnZUNlbGxzKGNvbXBhcmVSZWN0LCBtZXJnaW5nQ2VsbHMsIHJvd3NwYW4sIGNvbHNwYW4sIGVkaXRvcldyYXBwZXIpIHtcbiAgICBjb25zdCBtZXJnZWRDZWxsID0gbWVyZ2luZ0NlbGxzLnJlZHVjZSgocmVzdWx0LCB0YWJsZUNlbGwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgcmVzdWx0ICYmIHRhYmxlQ2VsbC5tb3ZlQ2hpbGRyZW4ocmVzdWx0KTtcbiAgICAgICAgdGFibGVDZWxsLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVDZWxsLmZvcm1hdCgnY29sc3BhbicsIGNvbHNwYW4pO1xuICAgICAgICB0YWJsZUNlbGwuZm9ybWF0KCdyb3dzcGFuJywgcm93c3Bhbik7XG4gICAgICAgIHJlc3VsdCA9IHRhYmxlQ2VsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBudWxsKTtcbiAgICBsZXQgcm93SWQgPSBtZXJnZWRDZWxsLmRvbU5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdycpO1xuICAgIGxldCBjZWxsSWQgPSBtZXJnZWRDZWxsLmNoaWxkcmVuLmhlYWQuZG9tTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2VsbCcpO1xuICAgIG1lcmdlZENlbGwuY2hpbGRyZW4uZm9yRWFjaChjZWxsTGluZSA9PiB7XG4gICAgICBjZWxsTGluZS5mb3JtYXQoJ2NlbGwnLCBjZWxsSWQpO1xuICAgICAgY2VsbExpbmUuZm9ybWF0KCdyb3cnLCByb3dJZCk7XG4gICAgICBjZWxsTGluZS5mb3JtYXQoJ2NvbHNwYW4nLCBjb2xzcGFuKTtcbiAgICAgIGNlbGxMaW5lLmZvcm1hdCgncm93c3BhbicsIHJvd3NwYW4pO1xuICAgIH0pO1xuICAgIHJldHVybiBtZXJnZWRDZWxsO1xuICB9XG5cbiAgdW5tZXJnZUNlbGxzKHVubWVyZ2luZ0NlbGxzLCBlZGl0b3JXcmFwcGVyKSB7XG4gICAgbGV0IGNlbGxGb3JtYXRzID0ge307XG4gICAgbGV0IGNlbGxSb3dzcGFuID0gMTtcbiAgICBsZXQgY2VsbENvbHNwYW4gPSAxO1xuICAgIHVubWVyZ2luZ0NlbGxzLmZvckVhY2godGFibGVDZWxsID0+IHtcbiAgICAgIGNlbGxGb3JtYXRzID0gdGFibGVDZWxsLmZvcm1hdHMoKTtcbiAgICAgIGNlbGxSb3dzcGFuID0gY2VsbEZvcm1hdHMucm93c3BhbjtcbiAgICAgIGNlbGxDb2xzcGFuID0gY2VsbEZvcm1hdHMuY29sc3BhbjtcblxuICAgICAgaWYgKGNlbGxDb2xzcGFuID4gMSkge1xuICAgICAgICBsZXQgcmVmID0gdGFibGVDZWxsLm5leHQ7XG4gICAgICAgIGxldCByb3cgPSB0YWJsZUNlbGwucm93KCk7XG4gICAgICAgIHRhYmxlQ2VsbC5mb3JtYXQoJ2NvbHNwYW4nLCAxKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gY2VsbENvbHNwYW47IGkgPiAxOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLmluc2VydENlbGwocm93LCByZWYpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsUm93c3BhbiA+IDEpIHtcbiAgICAgICAgbGV0IGkgPSBjZWxsUm93c3BhbjtcbiAgICAgICAgbGV0IG5leHRSb3cgPSB0YWJsZUNlbGwucm93KCkubmV4dDtcblxuICAgICAgICB3aGlsZSAoaSA+IDEpIHtcbiAgICAgICAgICBsZXQgcmVmSW5OZXh0Um93ID0gbmV4dFJvdy5jaGlsZHJlbi5yZWR1Y2UoKHJlc3VsdCwgY2VsbCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbXBhcmVSZWN0ID0gZ2V0UmVsYXRpdmVSZWN0KHRhYmxlQ2VsbC5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBlZGl0b3JXcmFwcGVyKTtcbiAgICAgICAgICAgIGxldCBjZWxsUmVjdCA9IGdldFJlbGF0aXZlUmVjdChjZWxsLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGVkaXRvcldyYXBwZXIpO1xuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoY29tcGFyZVJlY3QueDEgLSBjZWxsUmVjdC54KSA8IEVSUk9SX0xJTUlUKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGNlbGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSwgbnVsbCk7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gY2VsbENvbHNwYW47IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0Q2VsbChuZXh0Um93LCByZWZJbk5leHRSb3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICBuZXh0Um93ID0gbmV4dFJvdy5uZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGFibGVDZWxsLmZvcm1hdCgncm93c3BhbicsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcm93cygpIHtcbiAgICBjb25zdCBib2R5ID0gdGhpcy5jaGlsZHJlbi50YWlsO1xuICAgIGlmIChib2R5ID09IG51bGwpIHJldHVybiBbXTtcbiAgICByZXR1cm4gYm9keS5jaGlsZHJlbi5tYXAocm93ID0+IHJvdyk7XG4gIH1cblxufVxuXG50YWJsZV9UYWJsZUNvbnRhaW5lci5ibG90TmFtZSA9IFwidGFibGUtY29udGFpbmVyXCI7XG50YWJsZV9UYWJsZUNvbnRhaW5lci5jbGFzc05hbWUgPSBcInF1aWxsLWJldHRlci10YWJsZVwiO1xudGFibGVfVGFibGVDb250YWluZXIudGFnTmFtZSA9IFwiVEFCTEVcIjtcblxuY2xhc3MgdGFibGVfVGFibGVWaWV3V3JhcHBlciBleHRlbmRzIENvbnRhaW5lciB7XG4gIGNvbnN0cnVjdG9yKHNjcm9sbCwgZG9tTm9kZSkge1xuICAgIHN1cGVyKHNjcm9sbCwgZG9tTm9kZSk7XG4gICAgY29uc3QgcXVpbGwgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmZpbmQoc2Nyb2xsLmRvbU5vZGUucGFyZW50Tm9kZSk7XG4gICAgZG9tTm9kZS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBlID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlTW9kdWxlID0gcXVpbGwuZ2V0TW9kdWxlKCdiZXR0ZXItdGFibGUnKTtcblxuICAgICAgaWYgKHRhYmxlTW9kdWxlLmNvbHVtblRvb2wpIHtcbiAgICAgICAgdGFibGVNb2R1bGUuY29sdW1uVG9vbC5kb21Ob2RlLnNjcm9sbExlZnQgPSBlLnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgICAgfVxuXG4gICAgICBpZiAodGFibGVNb2R1bGUudGFibGVTZWxlY3Rpb24gJiYgdGFibGVNb2R1bGUudGFibGVTZWxlY3Rpb24uc2VsZWN0ZWRUZHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0YWJsZU1vZHVsZS50YWJsZVNlbGVjdGlvbi5yZXBvc2l0aW9uSGVscExpbmVzKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGVhZDtcbiAgfVxuXG59XG5cbnRhYmxlX1RhYmxlVmlld1dyYXBwZXIuYmxvdE5hbWUgPSBcInRhYmxlLXZpZXdcIjtcbnRhYmxlX1RhYmxlVmlld1dyYXBwZXIuY2xhc3NOYW1lID0gXCJxdWlsbC1iZXR0ZXItdGFibGUtd3JhcHBlclwiO1xudGFibGVfVGFibGVWaWV3V3JhcHBlci50YWdOYW1lID0gXCJESVZcIjtcbnRhYmxlX1RhYmxlVmlld1dyYXBwZXIuYWxsb3dlZENoaWxkcmVuID0gW3RhYmxlX1RhYmxlQ29udGFpbmVyXTtcbnRhYmxlX1RhYmxlQ29udGFpbmVyLnJlcXVpcmVkQ29udGFpbmVyID0gdGFibGVfVGFibGVWaWV3V3JhcHBlcjtcbnRhYmxlX1RhYmxlQ29udGFpbmVyLmFsbG93ZWRDaGlsZHJlbiA9IFtUYWJsZUJvZHksIFRhYmxlQ29sR3JvdXBdO1xuVGFibGVCb2R5LnJlcXVpcmVkQ29udGFpbmVyID0gdGFibGVfVGFibGVDb250YWluZXI7XG5UYWJsZUJvZHkuYWxsb3dlZENoaWxkcmVuID0gW1RhYmxlUm93XTtcblRhYmxlUm93LnJlcXVpcmVkQ29udGFpbmVyID0gVGFibGVCb2R5O1xuVGFibGVSb3cuYWxsb3dlZENoaWxkcmVuID0gW1RhYmxlQ2VsbF07XG5UYWJsZUNlbGwucmVxdWlyZWRDb250YWluZXIgPSBUYWJsZVJvdztcblRhYmxlQ2VsbC5hbGxvd2VkQ2hpbGRyZW4gPSBbVGFibGVDZWxsTGluZSwgaGVhZGVyXTtcblRhYmxlQ2VsbExpbmUucmVxdWlyZWRDb250YWluZXIgPSBUYWJsZUNlbGw7XG5UYWJsZUNvbEdyb3VwLmFsbG93ZWRDaGlsZHJlbiA9IFtUYWJsZUNvbF07XG5UYWJsZUNvbEdyb3VwLnJlcXVpcmVkQ29udGFpbmVyID0gdGFibGVfVGFibGVDb250YWluZXI7XG5UYWJsZUNvbC5yZXF1aXJlZENvbnRhaW5lciA9IFRhYmxlQ29sR3JvdXA7XG5cbmZ1bmN0aW9uIHRhYmxlX3Jvd0lkKCkge1xuICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDYpO1xuICByZXR1cm4gXCJyb3ctXCIuY29uY2F0KGlkKTtcbn1cblxuZnVuY3Rpb24gdGFibGVfY2VsbElkKCkge1xuICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDYpO1xuICByZXR1cm4gXCJjZWxsLVwiLmNvbmNhdChpZCk7XG59XG5cblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvbW9kdWxlcy90YWJsZS1zZWxlY3Rpb24uanNcblxuXG5cbmNvbnN0IHRhYmxlX3NlbGVjdGlvbl9QUklNQVJZX0NPTE9SID0gJyMwNTg5ZjMnO1xuY29uc3QgTElORV9QT1NJVElPTlMgPSBbJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddO1xuY29uc3QgdGFibGVfc2VsZWN0aW9uX0VSUk9SX0xJTUlUID0gMjtcbmNsYXNzIHRhYmxlX3NlbGVjdGlvbl9UYWJsZVNlbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBxdWlsbCwgb3B0aW9ucykge1xuICAgIGlmICghdGFibGUpIHJldHVybiBudWxsO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnF1aWxsID0gcXVpbGw7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmJvdW5kYXJ5ID0ge307IC8vIHBhcmFtcyBmb3Igc2VsZWN0ZWQgc3F1YXJlXG5cbiAgICB0aGlzLnNlbGVjdGVkVGRzID0gW107IC8vIGFycmF5IGZvciBzZWxlY3RlZCB0YWJsZS1jZWxsc1xuXG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0aW5nSGFuZGxlciA9IHRoaXMubW91c2VEb3duSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25IYW5kbGVyID0gdGhpcy5jbGVhclNlbGVjdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGVscExpbmVzSW5pdGlhbCgpO1xuICAgIHRoaXMucXVpbGwucm9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLnNlbGVjdGluZ0hhbmRsZXIsIGZhbHNlKTtcbiAgICB0aGlzLnF1aWxsLm9uKCd0ZXh0LWNoYW5nZScsIHRoaXMuY2xlYXJTZWxlY3Rpb25IYW5kbGVyKTtcbiAgfVxuXG4gIGhlbHBMaW5lc0luaXRpYWwoKSB7XG4gICAgbGV0IHBhcmVudCA9IHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlO1xuICAgIExJTkVfUE9TSVRJT05TLmZvckVhY2goZGlyZWN0aW9uID0+IHtcbiAgICAgIHRoaXNbZGlyZWN0aW9uXSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpc1tkaXJlY3Rpb25dLmNsYXNzTGlzdC5hZGQoJ3FsYnQtc2VsZWN0aW9uLWxpbmUnKTtcbiAgICAgIHRoaXNbZGlyZWN0aW9uXS5jbGFzc0xpc3QuYWRkKCdxbGJ0LXNlbGVjdGlvbi1saW5lLScgKyBkaXJlY3Rpb24pO1xuICAgICAgY3NzKHRoaXNbZGlyZWN0aW9uXSwge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHRhYmxlX3NlbGVjdGlvbl9QUklNQVJZX0NPTE9SXG4gICAgICB9KTtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzW2RpcmVjdGlvbl0pO1xuICAgIH0pO1xuICB9XG5cbiAgbW91c2VEb3duSGFuZGxlcihlKSB7XG4gICAgaWYgKGUuYnV0dG9uICE9PSAwIHx8ICFlLnRhcmdldC5jbG9zZXN0KFwiLnF1aWxsLWJldHRlci10YWJsZVwiKSkgcmV0dXJuO1xuICAgIHRoaXMucXVpbGwucm9vdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBtb3VzZU1vdmVIYW5kbGVyLCBmYWxzZSk7XG4gICAgdGhpcy5xdWlsbC5yb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwSGFuZGxlciwgZmFsc2UpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHN0YXJ0VGQgPSBlLnRhcmdldC5jbG9zZXN0KCd0ZFtkYXRhLXJvd10nKTtcbiAgICBjb25zdCBzdGFydFRkUmVjdCA9IGdldFJlbGF0aXZlUmVjdChzdGFydFRkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB0aGlzLnF1aWxsLnJvb3QucGFyZW50Tm9kZSk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5ib3VuZGFyeSA9IGNvbXB1dGVCb3VuZGFyeUZyb21SZWN0cyhzdGFydFRkUmVjdCwgc3RhcnRUZFJlY3QpO1xuICAgIHRoaXMuY29ycmVjdEJvdW5kYXJ5KCk7XG4gICAgdGhpcy5zZWxlY3RlZFRkcyA9IHRoaXMuY29tcHV0ZVNlbGVjdGVkVGRzKCk7XG4gICAgdGhpcy5yZXBvc2l0aW9uSGVscExpbmVzKCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKGUpIHtcbiAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCB8fCAhZS50YXJnZXQuY2xvc2VzdChcIi5xdWlsbC1iZXR0ZXItdGFibGVcIikpIHJldHVybjtcbiAgICAgIGNvbnN0IGVuZFRkID0gZS50YXJnZXQuY2xvc2VzdCgndGRbZGF0YS1yb3ddJyk7XG4gICAgICBjb25zdCBlbmRUZFJlY3QgPSBnZXRSZWxhdGl2ZVJlY3QoZW5kVGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHNlbGYucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICAgIHNlbGYuYm91bmRhcnkgPSBjb21wdXRlQm91bmRhcnlGcm9tUmVjdHMoc3RhcnRUZFJlY3QsIGVuZFRkUmVjdCk7XG4gICAgICBzZWxmLmNvcnJlY3RCb3VuZGFyeSgpO1xuICAgICAgc2VsZi5zZWxlY3RlZFRkcyA9IHNlbGYuY29tcHV0ZVNlbGVjdGVkVGRzKCk7XG4gICAgICBzZWxmLnJlcG9zaXRpb25IZWxwTGluZXMoKTsgLy8gYXZvaWQgc2VsZWN0IHRleHQgaW4gbXVsdGlwbGUgdGFibGUtY2VsbFxuXG4gICAgICBpZiAoc3RhcnRUZCAhPT0gZW5kVGQpIHtcbiAgICAgICAgc2VsZi5xdWlsbC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW91c2VVcEhhbmRsZXIoZSkge1xuICAgICAgc2VsZi5xdWlsbC5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdXNlTW92ZUhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIHNlbGYucXVpbGwucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgbW91c2VVcEhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIHNlbGYuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb3JyZWN0Qm91bmRhcnkoKSB7XG4gICAgY29uc3QgdGFibGVDb250YWluZXIgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmZpbmQodGhpcy50YWJsZSk7XG4gICAgY29uc3QgdGFibGVDZWxscyA9IHRhYmxlQ29udGFpbmVyLmRlc2NlbmRhbnRzKFRhYmxlQ2VsbCk7XG4gICAgdGFibGVDZWxscy5mb3JFYWNoKHRhYmxlQ2VsbCA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gZ2V0UmVsYXRpdmVSZWN0KHRhYmxlQ2VsbC5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB0aGlzLnF1aWxsLnJvb3QucGFyZW50Tm9kZSk7XG4gICAgICBsZXQgaXNDZWxsSW50ZXJzZWN0ZWQgPSAoeCArIHRhYmxlX3NlbGVjdGlvbl9FUlJPUl9MSU1JVCA+PSB0aGlzLmJvdW5kYXJ5LnggJiYgeCArIHRhYmxlX3NlbGVjdGlvbl9FUlJPUl9MSU1JVCA8PSB0aGlzLmJvdW5kYXJ5LngxIHx8IHggLSB0YWJsZV9zZWxlY3Rpb25fRVJST1JfTElNSVQgKyB3aWR0aCA+PSB0aGlzLmJvdW5kYXJ5LnggJiYgeCAtIHRhYmxlX3NlbGVjdGlvbl9FUlJPUl9MSU1JVCArIHdpZHRoIDw9IHRoaXMuYm91bmRhcnkueDEpICYmICh5ICsgdGFibGVfc2VsZWN0aW9uX0VSUk9SX0xJTUlUID49IHRoaXMuYm91bmRhcnkueSAmJiB5ICsgdGFibGVfc2VsZWN0aW9uX0VSUk9SX0xJTUlUIDw9IHRoaXMuYm91bmRhcnkueTEgfHwgeSAtIHRhYmxlX3NlbGVjdGlvbl9FUlJPUl9MSU1JVCArIGhlaWdodCA+PSB0aGlzLmJvdW5kYXJ5LnkgJiYgeSAtIHRhYmxlX3NlbGVjdGlvbl9FUlJPUl9MSU1JVCArIGhlaWdodCA8PSB0aGlzLmJvdW5kYXJ5LnkxKTtcblxuICAgICAgaWYgKGlzQ2VsbEludGVyc2VjdGVkKSB7XG4gICAgICAgIHRoaXMuYm91bmRhcnkgPSBjb21wdXRlQm91bmRhcnlGcm9tUmVjdHModGhpcy5ib3VuZGFyeSwge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlU2VsZWN0ZWRUZHMoKSB7XG4gICAgY29uc3QgdGFibGVDb250YWluZXIgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmZpbmQodGhpcy50YWJsZSk7XG4gICAgY29uc3QgdGFibGVDZWxscyA9IHRhYmxlQ29udGFpbmVyLmRlc2NlbmRhbnRzKFRhYmxlQ2VsbCk7XG4gICAgcmV0dXJuIHRhYmxlQ2VsbHMucmVkdWNlKChzZWxlY3RlZENlbGxzLCB0YWJsZUNlbGwpID0+IHtcbiAgICAgIGxldCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBnZXRSZWxhdGl2ZVJlY3QodGFibGVDZWxsLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICAgIGxldCBpc0NlbGxJbmNsdWRlZCA9IHggKyB0YWJsZV9zZWxlY3Rpb25fRVJST1JfTElNSVQgPj0gdGhpcy5ib3VuZGFyeS54ICYmIHggLSB0YWJsZV9zZWxlY3Rpb25fRVJST1JfTElNSVQgKyB3aWR0aCA8PSB0aGlzLmJvdW5kYXJ5LngxICYmIHkgKyB0YWJsZV9zZWxlY3Rpb25fRVJST1JfTElNSVQgPj0gdGhpcy5ib3VuZGFyeS55ICYmIHkgLSB0YWJsZV9zZWxlY3Rpb25fRVJST1JfTElNSVQgKyBoZWlnaHQgPD0gdGhpcy5ib3VuZGFyeS55MTtcblxuICAgICAgaWYgKGlzQ2VsbEluY2x1ZGVkKSB7XG4gICAgICAgIHNlbGVjdGVkQ2VsbHMucHVzaCh0YWJsZUNlbGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZWN0ZWRDZWxscztcbiAgICB9LCBbXSk7XG4gIH1cblxuICByZXBvc2l0aW9uSGVscExpbmVzKCkge1xuICAgIGNvbnN0IHRhYmxlVmlld1Njcm9sbExlZnQgPSB0aGlzLnRhYmxlLnBhcmVudE5vZGUuc2Nyb2xsTGVmdDtcbiAgICBjc3ModGhpcy5sZWZ0LCB7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgbGVmdDogXCJcIi5jb25jYXQodGhpcy5ib3VuZGFyeS54IC0gdGFibGVWaWV3U2Nyb2xsTGVmdCAtIDEsIFwicHhcIiksXG4gICAgICB0b3A6IFwiXCIuY29uY2F0KHRoaXMuYm91bmRhcnkueSwgXCJweFwiKSxcbiAgICAgIGhlaWdodDogXCJcIi5jb25jYXQodGhpcy5ib3VuZGFyeS5oZWlnaHQgKyAxLCBcInB4XCIpLFxuICAgICAgd2lkdGg6ICcxcHgnXG4gICAgfSk7XG4gICAgY3NzKHRoaXMucmlnaHQsIHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICBsZWZ0OiBcIlwiLmNvbmNhdCh0aGlzLmJvdW5kYXJ5LngxIC0gdGFibGVWaWV3U2Nyb2xsTGVmdCwgXCJweFwiKSxcbiAgICAgIHRvcDogXCJcIi5jb25jYXQodGhpcy5ib3VuZGFyeS55LCBcInB4XCIpLFxuICAgICAgaGVpZ2h0OiBcIlwiLmNvbmNhdCh0aGlzLmJvdW5kYXJ5LmhlaWdodCArIDEsIFwicHhcIiksXG4gICAgICB3aWR0aDogJzFweCdcbiAgICB9KTtcbiAgICBjc3ModGhpcy50b3AsIHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICBsZWZ0OiBcIlwiLmNvbmNhdCh0aGlzLmJvdW5kYXJ5LnggLSAxIC0gdGFibGVWaWV3U2Nyb2xsTGVmdCwgXCJweFwiKSxcbiAgICAgIHRvcDogXCJcIi5jb25jYXQodGhpcy5ib3VuZGFyeS55LCBcInB4XCIpLFxuICAgICAgd2lkdGg6IFwiXCIuY29uY2F0KHRoaXMuYm91bmRhcnkud2lkdGggKyAxLCBcInB4XCIpLFxuICAgICAgaGVpZ2h0OiAnMXB4J1xuICAgIH0pO1xuICAgIGNzcyh0aGlzLmJvdHRvbSwge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgIGxlZnQ6IFwiXCIuY29uY2F0KHRoaXMuYm91bmRhcnkueCAtIDEgLSB0YWJsZVZpZXdTY3JvbGxMZWZ0LCBcInB4XCIpLFxuICAgICAgdG9wOiBcIlwiLmNvbmNhdCh0aGlzLmJvdW5kYXJ5LnkxICsgMSwgXCJweFwiKSxcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdCh0aGlzLmJvdW5kYXJ5LndpZHRoICsgMSwgXCJweFwiKSxcbiAgICAgIGhlaWdodDogJzFweCdcbiAgICB9KTtcbiAgfSAvLyBiYXNlZCBvbiBzZWxlY3RlZFRkcyBjb21wdXRlIHBvc2l0aW9ucyBvZiBoZWxwIGxpbmVzXG4gIC8vIEl0IGlzIHVzZWZ1bCB3aGVuIHNlbGVjdGVkVGRzIGFyZSBub3QgY2hhbmdlZFxuXG5cbiAgcmVmcmVzaEhlbHBMaW5lc1Bvc2l0aW9uKCkge1xuICAgIGNvbnN0IHN0YXJ0UmVjdCA9IGdldFJlbGF0aXZlUmVjdCh0aGlzLnNlbGVjdGVkVGRzWzBdLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICBjb25zdCBlbmRSZWN0ID0gZ2V0UmVsYXRpdmVSZWN0KHRoaXMuc2VsZWN0ZWRUZHNbdGhpcy5zZWxlY3RlZFRkcy5sZW5ndGggLSAxXS5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB0aGlzLnF1aWxsLnJvb3QucGFyZW50Tm9kZSk7XG4gICAgdGhpcy5ib3VuZGFyeSA9IGNvbXB1dGVCb3VuZGFyeUZyb21SZWN0cyhzdGFydFJlY3QsIGVuZFJlY3QpO1xuICAgIHRoaXMucmVwb3NpdGlvbkhlbHBMaW5lcygpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBMSU5FX1BPU0lUSU9OUy5mb3JFYWNoKGRpcmVjdGlvbiA9PiB7XG4gICAgICB0aGlzW2RpcmVjdGlvbl0ucmVtb3ZlKCk7XG4gICAgICB0aGlzW2RpcmVjdGlvbl0gPSBudWxsO1xuICAgIH0pO1xuICAgIHRoaXMucXVpbGwucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLnNlbGVjdGluZ0hhbmRsZXIsIGZhbHNlKTtcbiAgICB0aGlzLnF1aWxsLm9mZigndGV4dC1jaGFuZ2UnLCB0aGlzLmNsZWFyU2VsZWN0aW9uSGFuZGxlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24oc3RhcnRSZWN0LCBlbmRSZWN0KSB7XG4gICAgdGhpcy5ib3VuZGFyeSA9IGNvbXB1dGVCb3VuZGFyeUZyb21SZWN0cyhnZXRSZWxhdGl2ZVJlY3Qoc3RhcnRSZWN0LCB0aGlzLnF1aWxsLnJvb3QucGFyZW50Tm9kZSksIGdldFJlbGF0aXZlUmVjdChlbmRSZWN0LCB0aGlzLnF1aWxsLnJvb3QucGFyZW50Tm9kZSkpO1xuICAgIHRoaXMuY29ycmVjdEJvdW5kYXJ5KCk7XG4gICAgdGhpcy5zZWxlY3RlZFRkcyA9IHRoaXMuY29tcHV0ZVNlbGVjdGVkVGRzKCk7XG4gICAgdGhpcy5yZXBvc2l0aW9uSGVscExpbmVzKCk7XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICB0aGlzLmJvdW5kYXJ5ID0ge307XG4gICAgdGhpcy5zZWxlY3RlZFRkcyA9IFtdO1xuICAgIExJTkVfUE9TSVRJT05TLmZvckVhY2goZGlyZWN0aW9uID0+IHtcbiAgICAgIHRoaXNbZGlyZWN0aW9uXSAmJiBjc3ModGhpc1tkaXJlY3Rpb25dLCB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxufVxuXG5mdW5jdGlvbiBjb21wdXRlQm91bmRhcnlGcm9tUmVjdHMoc3RhcnRSZWN0LCBlbmRSZWN0KSB7XG4gIGxldCB4ID0gTWF0aC5taW4oc3RhcnRSZWN0LngsIGVuZFJlY3QueCwgc3RhcnRSZWN0LnggKyBzdGFydFJlY3Qud2lkdGggLSAxLCBlbmRSZWN0LnggKyBlbmRSZWN0LndpZHRoIC0gMSk7XG4gIGxldCB4MSA9IE1hdGgubWF4KHN0YXJ0UmVjdC54LCBlbmRSZWN0LngsIHN0YXJ0UmVjdC54ICsgc3RhcnRSZWN0LndpZHRoIC0gMSwgZW5kUmVjdC54ICsgZW5kUmVjdC53aWR0aCAtIDEpO1xuICBsZXQgeSA9IE1hdGgubWluKHN0YXJ0UmVjdC55LCBlbmRSZWN0LnksIHN0YXJ0UmVjdC55ICsgc3RhcnRSZWN0LmhlaWdodCAtIDEsIGVuZFJlY3QueSArIGVuZFJlY3QuaGVpZ2h0IC0gMSk7XG4gIGxldCB5MSA9IE1hdGgubWF4KHN0YXJ0UmVjdC55LCBlbmRSZWN0LnksIHN0YXJ0UmVjdC55ICsgc3RhcnRSZWN0LmhlaWdodCAtIDEsIGVuZFJlY3QueSArIGVuZFJlY3QuaGVpZ2h0IC0gMSk7XG4gIGxldCB3aWR0aCA9IHgxIC0geDtcbiAgbGV0IGhlaWdodCA9IHkxIC0geTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHgxLFxuICAgIHksXG4gICAgeTEsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH07XG59XG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Fzc2V0cy9pY29ucy9pY29uX29wZXJhdGlvbl8xLnN2Z1xudmFyIGljb25fb3BlcmF0aW9uXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIGljb25fb3BlcmF0aW9uXzFfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaWNvbl9vcGVyYXRpb25fMSk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvYXNzZXRzL2ljb25zL2ljb25fb3BlcmF0aW9uXzIuc3ZnXG52YXIgaWNvbl9vcGVyYXRpb25fMiA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG52YXIgaWNvbl9vcGVyYXRpb25fMl9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihpY29uX29wZXJhdGlvbl8yKTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9hc3NldHMvaWNvbnMvaWNvbl9vcGVyYXRpb25fMy5zdmdcbnZhciBpY29uX29wZXJhdGlvbl8zID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbnZhciBpY29uX29wZXJhdGlvbl8zX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGljb25fb3BlcmF0aW9uXzMpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Fzc2V0cy9pY29ucy9pY29uX29wZXJhdGlvbl80LnN2Z1xudmFyIGljb25fb3BlcmF0aW9uXzQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xudmFyIGljb25fb3BlcmF0aW9uXzRfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaWNvbl9vcGVyYXRpb25fNCk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvYXNzZXRzL2ljb25zL2ljb25fb3BlcmF0aW9uXzUuc3ZnXG52YXIgaWNvbl9vcGVyYXRpb25fNSA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG52YXIgaWNvbl9vcGVyYXRpb25fNV9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihpY29uX29wZXJhdGlvbl81KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9hc3NldHMvaWNvbnMvaWNvbl9vcGVyYXRpb25fNi5zdmdcbnZhciBpY29uX29wZXJhdGlvbl82ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbnZhciBpY29uX29wZXJhdGlvbl82X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGljb25fb3BlcmF0aW9uXzYpO1xuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Fzc2V0cy9pY29ucy9pY29uX29wZXJhdGlvbl83LnN2Z1xudmFyIGljb25fb3BlcmF0aW9uXzcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xudmFyIGljb25fb3BlcmF0aW9uXzdfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaWNvbl9vcGVyYXRpb25fNyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvYXNzZXRzL2ljb25zL2ljb25fb3BlcmF0aW9uXzguc3ZnXG52YXIgaWNvbl9vcGVyYXRpb25fOCA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG52YXIgaWNvbl9vcGVyYXRpb25fOF9kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihpY29uX29wZXJhdGlvbl84KTtcblxuLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9hc3NldHMvaWNvbnMvaWNvbl9vcGVyYXRpb25fOS5zdmdcbnZhciBpY29uX29wZXJhdGlvbl85ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbnZhciBpY29uX29wZXJhdGlvbl85X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGljb25fb3BlcmF0aW9uXzkpO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9tb2R1bGVzL3RhYmxlLW9wZXJhdGlvbi1tZW51LmpzXG5cbiAvLyBzdmcgaWNvbnNcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgTUVOVV9NSU5fSEVJSEdUID0gMTUwO1xuY29uc3QgTUVOVV9XSURUSCA9IDIwMDtcbmNvbnN0IHRhYmxlX29wZXJhdGlvbl9tZW51X0VSUk9SX0xJTUlUID0gNTtcbmNvbnN0IERFRkFVTFRfQ0VMTF9DT0xPUlMgPSBbJ3doaXRlJywgJ3JlZCcsICd5ZWxsb3cnLCAnYmx1ZSddO1xuY29uc3QgREVGQVVMVF9DT0xPUl9TVUJUSVRMRSA9ICdCYWNrZ3JvdW5kIENvbG9ycyc7XG5jb25zdCBNRU5VX0lURU1TX0RFRkFVTFQgPSB7XG4gIGluc2VydENvbHVtblJpZ2h0OiB7XG4gICAgdGV4dDogJ0luc2VydCBjb2x1bW4gcmlnaHQnLFxuICAgIGljb25TcmM6IGljb25fb3BlcmF0aW9uXzFfZGVmYXVsdC5hLFxuXG4gICAgaGFuZGxlcigpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpO1xuICAgICAgbGV0IGNvbEluZGV4ID0gZ2V0Q29sVG9vbENlbGxJbmRleEJ5Qm91bmRhcnkodGhpcy5jb2x1bW5Ub29sQ2VsbHMsIHRoaXMuYm91bmRhcnksIChjZWxsUmVjdCwgYm91bmRhcnkpID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGNlbGxSZWN0LnggKyBjZWxsUmVjdC53aWR0aCAtIGJvdW5kYXJ5LngxKSA8PSB0YWJsZV9vcGVyYXRpb25fbWVudV9FUlJPUl9MSU1JVDtcbiAgICAgIH0sIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRhYmxlQ29udGFpbmVyLmluc2VydENvbHVtbih0aGlzLmJvdW5kYXJ5LCBjb2xJbmRleCwgdHJ1ZSwgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuICAgICAgdGhpcy50YWJsZUNvbHVtblRvb2wudXBkYXRlVG9vbENlbGxzKCk7XG4gICAgICB0aGlzLnF1aWxsLnVwZGF0ZShleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbih0aGlzLnF1aWxsLmdldEluZGV4KG5ld0NvbHVtblswXSksIDAsIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuc291cmNlcy5TSUxFTlQpO1xuICAgICAgdGhpcy50YWJsZVNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obmV3Q29sdW1uWzBdLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIG5ld0NvbHVtblswXS5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICB9XG5cbiAgfSxcbiAgaW5zZXJ0Q29sdW1uTGVmdDoge1xuICAgIHRleHQ6ICdJbnNlcnQgY29sdW1uIGxlZnQnLFxuICAgIGljb25TcmM6IGljb25fb3BlcmF0aW9uXzJfZGVmYXVsdC5hLFxuXG4gICAgaGFuZGxlcigpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpO1xuICAgICAgbGV0IGNvbEluZGV4ID0gZ2V0Q29sVG9vbENlbGxJbmRleEJ5Qm91bmRhcnkodGhpcy5jb2x1bW5Ub29sQ2VsbHMsIHRoaXMuYm91bmRhcnksIChjZWxsUmVjdCwgYm91bmRhcnkpID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGNlbGxSZWN0LnggLSBib3VuZGFyeS54KSA8PSB0YWJsZV9vcGVyYXRpb25fbWVudV9FUlJPUl9MSU1JVDtcbiAgICAgIH0sIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRhYmxlQ29udGFpbmVyLmluc2VydENvbHVtbih0aGlzLmJvdW5kYXJ5LCBjb2xJbmRleCwgZmFsc2UsIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICAgIHRoaXMudGFibGVDb2x1bW5Ub29sLnVwZGF0ZVRvb2xDZWxscygpO1xuICAgICAgdGhpcy5xdWlsbC51cGRhdGUoZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24odGhpcy5xdWlsbC5nZXRJbmRleChuZXdDb2x1bW5bMF0pLCAwLCBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuU0lMRU5UKTtcbiAgICAgIHRoaXMudGFibGVTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG5ld0NvbHVtblswXS5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBuZXdDb2x1bW5bMF0uZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgfVxuXG4gIH0sXG4gIGluc2VydFJvd1VwOiB7XG4gICAgdGV4dDogJ0luc2VydCByb3cgdXAnLFxuICAgIGljb25TcmM6IGljb25fb3BlcmF0aW9uXzNfZGVmYXVsdC5hLFxuXG4gICAgaGFuZGxlcigpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpO1xuICAgICAgY29uc3QgYWZmZWN0ZWRDZWxscyA9IHRhYmxlQ29udGFpbmVyLmluc2VydFJvdyh0aGlzLmJvdW5kYXJ5LCBmYWxzZSwgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuICAgICAgdGhpcy5xdWlsbC51cGRhdGUoZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24odGhpcy5xdWlsbC5nZXRJbmRleChhZmZlY3RlZENlbGxzWzBdKSwgMCwgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlNJTEVOVCk7XG4gICAgICB0aGlzLnRhYmxlU2VsZWN0aW9uLnNldFNlbGVjdGlvbihhZmZlY3RlZENlbGxzWzBdLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGFmZmVjdGVkQ2VsbHNbMF0uZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgfVxuXG4gIH0sXG4gIGluc2VydFJvd0Rvd246IHtcbiAgICB0ZXh0OiAnSW5zZXJ0IHJvdyBkb3duJyxcbiAgICBpY29uU3JjOiBpY29uX29wZXJhdGlvbl80X2RlZmF1bHQuYSxcblxuICAgIGhhbmRsZXIoKSB7XG4gICAgICBjb25zdCB0YWJsZUNvbnRhaW5lciA9IGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuZmluZCh0aGlzLnRhYmxlKTtcbiAgICAgIGNvbnN0IGFmZmVjdGVkQ2VsbHMgPSB0YWJsZUNvbnRhaW5lci5pbnNlcnRSb3codGhpcy5ib3VuZGFyeSwgdHJ1ZSwgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuICAgICAgdGhpcy5xdWlsbC51cGRhdGUoZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24odGhpcy5xdWlsbC5nZXRJbmRleChhZmZlY3RlZENlbGxzWzBdKSwgMCwgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlNJTEVOVCk7XG4gICAgICB0aGlzLnRhYmxlU2VsZWN0aW9uLnNldFNlbGVjdGlvbihhZmZlY3RlZENlbGxzWzBdLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGFmZmVjdGVkQ2VsbHNbMF0uZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgfVxuXG4gIH0sXG4gIG1lcmdlQ2VsbHM6IHtcbiAgICB0ZXh0OiAnTWVyZ2Ugc2VsZWN0ZWQgY2VsbHMnLFxuICAgIGljb25TcmM6IGljb25fb3BlcmF0aW9uXzVfZGVmYXVsdC5hLFxuXG4gICAgaGFuZGxlcigpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpOyAvLyBjb21wdXRlIG1lcmdlZCBDZWxsIHJvd3NwYW4sIGVxdWFsIHRvIGxlbmd0aCBvZiBzZWxlY3RlZCByb3dzXG5cbiAgICAgIGNvbnN0IHJvd3NwYW4gPSB0YWJsZUNvbnRhaW5lci5yb3dzKCkucmVkdWNlKChzdW0sIHJvdykgPT4ge1xuICAgICAgICBsZXQgcm93UmVjdCA9IGdldFJlbGF0aXZlUmVjdChyb3cuZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuXG4gICAgICAgIGlmIChyb3dSZWN0LnkgPiB0aGlzLmJvdW5kYXJ5LnkgLSB0YWJsZV9vcGVyYXRpb25fbWVudV9FUlJPUl9MSU1JVCAmJiByb3dSZWN0LnkgKyByb3dSZWN0LmhlaWdodCA8IHRoaXMuYm91bmRhcnkueSArIHRoaXMuYm91bmRhcnkuaGVpZ2h0ICsgdGFibGVfb3BlcmF0aW9uX21lbnVfRVJST1JfTElNSVQpIHtcbiAgICAgICAgICBzdW0gKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdW07XG4gICAgICB9LCAwKTsgLy8gY29tcHV0ZSBtZXJnZWQgY2VsbCBjb2xzcGFuLCBlcXVhbCB0byBsZW5ndGggb2Ygc2VsZWN0ZWQgY29sc1xuXG4gICAgICBjb25zdCBjb2xzcGFuID0gdGhpcy5jb2x1bW5Ub29sQ2VsbHMucmVkdWNlKChzdW0sIGNlbGwpID0+IHtcbiAgICAgICAgbGV0IGNlbGxSZWN0ID0gZ2V0UmVsYXRpdmVSZWN0KGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcblxuICAgICAgICBpZiAoY2VsbFJlY3QueCA+IHRoaXMuYm91bmRhcnkueCAtIHRhYmxlX29wZXJhdGlvbl9tZW51X0VSUk9SX0xJTUlUICYmIGNlbGxSZWN0LnggKyBjZWxsUmVjdC53aWR0aCA8IHRoaXMuYm91bmRhcnkueCArIHRoaXMuYm91bmRhcnkud2lkdGggKyB0YWJsZV9vcGVyYXRpb25fbWVudV9FUlJPUl9MSU1JVCkge1xuICAgICAgICAgIHN1bSArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICAgIH0sIDApO1xuICAgICAgY29uc3QgbWVyZ2VkQ2VsbCA9IHRhYmxlQ29udGFpbmVyLm1lcmdlQ2VsbHModGhpcy5ib3VuZGFyeSwgdGhpcy5zZWxlY3RlZFRkcywgcm93c3BhbiwgY29sc3BhbiwgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuICAgICAgdGhpcy5xdWlsbC51cGRhdGUoZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgICAgdGhpcy50YWJsZVNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obWVyZ2VkQ2VsbC5kb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBtZXJnZWRDZWxsLmRvbU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgIH1cblxuICB9LFxuICB1bm1lcmdlQ2VsbHM6IHtcbiAgICB0ZXh0OiAnVW5tZXJnZSBjZWxscycsXG4gICAgaWNvblNyYzogaWNvbl9vcGVyYXRpb25fNl9kZWZhdWx0LmEsXG5cbiAgICBoYW5kbGVyKCkge1xuICAgICAgY29uc3QgdGFibGVDb250YWluZXIgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmZpbmQodGhpcy50YWJsZSk7XG4gICAgICB0YWJsZUNvbnRhaW5lci51bm1lcmdlQ2VsbHModGhpcy5zZWxlY3RlZFRkcywgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuICAgICAgdGhpcy5xdWlsbC51cGRhdGUoZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgICAgdGhpcy50YWJsZVNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cblxuICB9LFxuICBkZWxldGVDb2x1bW46IHtcbiAgICB0ZXh0OiAnRGVsZXRlIHNlbGVjdGVkIGNvbHVtbnMnLFxuICAgIGljb25TcmM6IGljb25fb3BlcmF0aW9uXzdfZGVmYXVsdC5hLFxuXG4gICAgaGFuZGxlcigpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpO1xuICAgICAgbGV0IGNvbEluZGV4ZXMgPSBnZXRDb2xUb29sQ2VsbEluZGV4ZXNCeUJvdW5kYXJ5KHRoaXMuY29sdW1uVG9vbENlbGxzLCB0aGlzLmJvdW5kYXJ5LCAoY2VsbFJlY3QsIGJvdW5kYXJ5KSA9PiB7XG4gICAgICAgIHJldHVybiBjZWxsUmVjdC54ICsgdGFibGVfb3BlcmF0aW9uX21lbnVfRVJST1JfTElNSVQgPiBib3VuZGFyeS54ICYmIGNlbGxSZWN0LnggKyBjZWxsUmVjdC53aWR0aCAtIHRhYmxlX29wZXJhdGlvbl9tZW51X0VSUk9SX0xJTUlUIDwgYm91bmRhcnkueDE7XG4gICAgICB9LCB0aGlzLnF1aWxsLnJvb3QucGFyZW50Tm9kZSk7XG4gICAgICBsZXQgaXNEZWxldGVUYWJsZSA9IHRhYmxlQ29udGFpbmVyLmRlbGV0ZUNvbHVtbnModGhpcy5ib3VuZGFyeSwgY29sSW5kZXhlcywgdGhpcy5xdWlsbC5yb290LnBhcmVudE5vZGUpO1xuXG4gICAgICBpZiAoIWlzRGVsZXRlVGFibGUpIHtcbiAgICAgICAgdGhpcy50YWJsZUNvbHVtblRvb2wudXBkYXRlVG9vbENlbGxzKCk7XG4gICAgICAgIHRoaXMucXVpbGwudXBkYXRlKGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuc291cmNlcy5VU0VSKTtcbiAgICAgICAgdGhpcy50YWJsZVNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH1cblxuICB9LFxuICBkZWxldGVSb3c6IHtcbiAgICB0ZXh0OiAnRGVsZXRlIHNlbGVjdGVkIHJvd3MnLFxuICAgIGljb25TcmM6IGljb25fb3BlcmF0aW9uXzhfZGVmYXVsdC5hLFxuXG4gICAgaGFuZGxlcigpIHtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpO1xuICAgICAgdGFibGVDb250YWluZXIuZGVsZXRlUm93KHRoaXMuYm91bmRhcnksIHRoaXMucXVpbGwucm9vdC5wYXJlbnROb2RlKTtcbiAgICAgIHRoaXMucXVpbGwudXBkYXRlKGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuc291cmNlcy5VU0VSKTtcbiAgICAgIHRoaXMudGFibGVTZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgfSxcbiAgZGVsZXRlVGFibGU6IHtcbiAgICB0ZXh0OiAnRGVsZXRlIHRhYmxlJyxcbiAgICBpY29uU3JjOiBpY29uX29wZXJhdGlvbl85X2RlZmF1bHQuYSxcblxuICAgIGhhbmRsZXIoKSB7XG4gICAgICBjb25zdCBiZXR0ZXJUYWJsZU1vZHVsZSA9IHRoaXMucXVpbGwuZ2V0TW9kdWxlKCdiZXR0ZXItdGFibGUnKTtcbiAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5maW5kKHRoaXMudGFibGUpO1xuICAgICAgYmV0dGVyVGFibGVNb2R1bGUuaGlkZVRhYmxlVG9vbHMoKTtcbiAgICAgIHRhYmxlQ29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgdGhpcy5xdWlsbC51cGRhdGUoZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgIH1cblxuICB9XG59O1xuY2xhc3MgdGFibGVfb3BlcmF0aW9uX21lbnVfVGFibGVPcGVyYXRpb25NZW51IHtcbiAgY29uc3RydWN0b3IocGFyYW1zLCBxdWlsbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGJldHRlclRhYmxlTW9kdWxlID0gcXVpbGwuZ2V0TW9kdWxlKCdiZXR0ZXItdGFibGUnKTtcbiAgICB0aGlzLnRhYmxlU2VsZWN0aW9uID0gYmV0dGVyVGFibGVNb2R1bGUudGFibGVTZWxlY3Rpb247XG4gICAgdGhpcy50YWJsZSA9IHBhcmFtcy50YWJsZTtcbiAgICB0aGlzLnF1aWxsID0gcXVpbGw7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLm1lbnVJdGVtcyA9IE9iamVjdC5hc3NpZ24oe30sIE1FTlVfSVRFTVNfREVGQVVMVCwgb3B0aW9ucy5pdGVtcyk7XG4gICAgdGhpcy50YWJsZUNvbHVtblRvb2wgPSBiZXR0ZXJUYWJsZU1vZHVsZS5jb2x1bW5Ub29sO1xuICAgIHRoaXMuYm91bmRhcnkgPSB0aGlzLnRhYmxlU2VsZWN0aW9uLmJvdW5kYXJ5O1xuICAgIHRoaXMuc2VsZWN0ZWRUZHMgPSB0aGlzLnRhYmxlU2VsZWN0aW9uLnNlbGVjdGVkVGRzO1xuICAgIHRoaXMuZGVzdHJveUhhbmRsZXIgPSB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNvbHVtblRvb2xDZWxscyA9IHRoaXMudGFibGVDb2x1bW5Ub29sLmNvbFRvb2xDZWxscygpO1xuICAgIHRoaXMuY29sb3JTdWJUaXRsZSA9IG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5jb2xvci50ZXh0ID8gb3B0aW9ucy5jb2xvci50ZXh0IDogREVGQVVMVF9DT0xPUl9TVUJUSVRMRTtcbiAgICB0aGlzLmNlbGxDb2xvcnMgPSBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuY29sb3IuY29sb3JzID8gb3B0aW9ucy5jb2xvci5jb2xvcnMgOiBERUZBVUxUX0NFTExfQ09MT1JTO1xuICAgIHRoaXMubWVudUluaXRpYWwocGFyYW1zKTtcbiAgICB0aGlzLm1vdW50KCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuZGVzdHJveUhhbmRsZXIsIGZhbHNlKTtcbiAgfVxuXG4gIG1vdW50KCkge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kb21Ob2RlKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kb21Ob2RlLnJlbW92ZSgpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmRlc3Ryb3lIYW5kbGVyLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBtZW51SW5pdGlhbChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIHRhYmxlLFxuICAgICAgbGVmdCxcbiAgICAgIHRvcFxuICAgIH0gPSBfcmVmO1xuICAgIHRoaXMuZG9tTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tTm9kZS5jbGFzc0xpc3QuYWRkKCdxbGJ0LW9wZXJhdGlvbi1tZW51Jyk7XG4gICAgY3NzKHRoaXMuZG9tTm9kZSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiBcIlwiLmNvbmNhdChsZWZ0LCBcInB4XCIpLFxuICAgICAgdG9wOiBcIlwiLmNvbmNhdCh0b3AsIFwicHhcIiksXG4gICAgICAnbWluLWhlaWdodCc6IFwiXCIuY29uY2F0KE1FTlVfTUlOX0hFSUhHVCwgXCJweFwiKSxcbiAgICAgIHdpZHRoOiBcIlwiLmNvbmNhdChNRU5VX1dJRFRILCBcInB4XCIpXG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMubWVudUl0ZW1zKSB7XG4gICAgICBpZiAodGhpcy5tZW51SXRlbXNbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMubWVudUl0ZW1DcmVhdG9yKE9iamVjdC5hc3NpZ24oe30sIE1FTlVfSVRFTVNfREVGQVVMVFtuYW1lXSwgdGhpcy5tZW51SXRlbXNbbmFtZV0pKSk7XG5cbiAgICAgICAgaWYgKFsnaW5zZXJ0Um93RG93bicsICd1bm1lcmdlQ2VsbHMnXS5pbmRleE9mKG5hbWUpID4gLTEpIHtcbiAgICAgICAgICB0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQoZGl2aWRpbmdDcmVhdG9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBpZiBjb2xvcnMgb3B0aW9uIGlzIGZhbHNlLCBkaXNhYmxlZCBiZyBjb2xvclxuXG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbG9yICYmIHRoaXMub3B0aW9ucy5jb2xvciAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZG9tTm9kZS5hcHBlbmRDaGlsZChkaXZpZGluZ0NyZWF0b3IoKSk7XG4gICAgICB0aGlzLmRvbU5vZGUuYXBwZW5kQ2hpbGQoc3ViVGl0bGVDcmVhdG9yKHRoaXMuY29sb3JTdWJUaXRsZSkpO1xuICAgICAgdGhpcy5kb21Ob2RlLmFwcGVuZENoaWxkKHRoaXMuY29sb3JzSXRlbUNyZWF0b3IodGhpcy5jZWxsQ29sb3JzKSk7XG4gICAgfSAvLyBjcmVhdGUgZGl2aWRpbmcgbGluZVxuXG5cbiAgICBmdW5jdGlvbiBkaXZpZGluZ0NyZWF0b3IoKSB7XG4gICAgICBjb25zdCBkaXZpZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2aWRpbmcuY2xhc3NMaXN0LmFkZCgncWxidC1vcGVyYXRpb24tbWVudS1kaXZpZGluZycpO1xuICAgICAgcmV0dXJuIGRpdmlkaW5nO1xuICAgIH0gLy8gY3JlYXRlIHN1YnRpdGxlIGZvciBtZW51XG5cblxuICAgIGZ1bmN0aW9uIHN1YlRpdGxlQ3JlYXRvcih0aXRsZSkge1xuICAgICAgY29uc3Qgc3ViVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHN1YlRpdGxlLmNsYXNzTGlzdC5hZGQoJ3FsYnQtb3BlcmF0aW9uLW1lbnUtc3VidGl0bGUnKTtcbiAgICAgIHN1YlRpdGxlLmlubmVyVGV4dCA9IHRpdGxlO1xuICAgICAgcmV0dXJuIHN1YlRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIGNvbG9yc0l0ZW1DcmVhdG9yKGNvbG9ycykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3FsYnQtb3BlcmF0aW9uLWNvbG9yLXBpY2tlcicpO1xuICAgIGNvbG9ycy5mb3JFYWNoKGNvbG9yID0+IHtcbiAgICAgIGxldCBjb2xvckJveCA9IGNvbG9yQm94Q3JlYXRvcihjb2xvcik7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKGNvbG9yQm94KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNvbG9yQm94Q3JlYXRvcihjb2xvcikge1xuICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBib3guY2xhc3NMaXN0LmFkZCgncWxidC1vcGVyYXRpb24tY29sb3ItcGlja2VyLWl0ZW0nKTtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29sb3InLCBjb2xvcik7XG4gICAgICBib3guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgICBib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGRzID0gc2VsZi50YWJsZVNlbGVjdGlvbi5zZWxlY3RlZFRkcztcblxuICAgICAgICBpZiAoc2VsZWN0ZWRUZHMgJiYgc2VsZWN0ZWRUZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNlbGVjdGVkVGRzLmZvckVhY2godGFibGVDZWxsID0+IHtcbiAgICAgICAgICAgIHRhYmxlQ2VsbC5mb3JtYXQoJ2NlbGwtYmcnLCBjb2xvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGZhbHNlKTtcbiAgICAgIHJldHVybiBib3g7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBtZW51SXRlbUNyZWF0b3IoX3JlZjIpIHtcbiAgICBsZXQge1xuICAgICAgdGV4dCxcbiAgICAgIGljb25TcmMsXG4gICAgICBoYW5kbGVyXG4gICAgfSA9IF9yZWYyO1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3FsYnQtb3BlcmF0aW9uLW1lbnUtaXRlbScpO1xuICAgIGNvbnN0IGljb25TcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGljb25TcGFuLmNsYXNzTGlzdC5hZGQoJ3FsYnQtb3BlcmF0aW9uLW1lbnUtaWNvbicpO1xuICAgIGljb25TcGFuLmlubmVySFRNTCA9IGljb25TcmM7XG4gICAgY29uc3QgdGV4dFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGV4dFNwYW4uY2xhc3NMaXN0LmFkZCgncWxidC1vcGVyYXRpb24tbWVudS10ZXh0Jyk7XG4gICAgdGV4dFNwYW4uaW5uZXJUZXh0ID0gdGV4dDtcbiAgICBub2RlLmFwcGVuZENoaWxkKGljb25TcGFuKTtcbiAgICBub2RlLmFwcGVuZENoaWxkKHRleHRTcGFuKTtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlci5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxufVxuXG5mdW5jdGlvbiBnZXRDb2xUb29sQ2VsbEluZGV4QnlCb3VuZGFyeShjZWxscywgYm91bmRhcnksIGNvbmRpdGlvbkZuLCBjb250YWluZXIpIHtcbiAgcmV0dXJuIGNlbGxzLnJlZHVjZSgoZmluZEluZGV4LCBjZWxsKSA9PiB7XG4gICAgbGV0IGNlbGxSZWN0ID0gZ2V0UmVsYXRpdmVSZWN0KGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGNvbnRhaW5lcik7XG5cbiAgICBpZiAoY29uZGl0aW9uRm4oY2VsbFJlY3QsIGJvdW5kYXJ5KSkge1xuICAgICAgZmluZEluZGV4ID0gY2VsbHMuaW5kZXhPZihjZWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmluZEluZGV4O1xuICB9LCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbFRvb2xDZWxsSW5kZXhlc0J5Qm91bmRhcnkoY2VsbHMsIGJvdW5kYXJ5LCBjb25kaXRpb25GbiwgY29udGFpbmVyKSB7XG4gIHJldHVybiBjZWxscy5yZWR1Y2UoKGZpbmRJbmRleGVzLCBjZWxsKSA9PiB7XG4gICAgbGV0IGNlbGxSZWN0ID0gZ2V0UmVsYXRpdmVSZWN0KGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGNvbnRhaW5lcik7XG5cbiAgICBpZiAoY29uZGl0aW9uRm4oY2VsbFJlY3QsIGJvdW5kYXJ5KSkge1xuICAgICAgZmluZEluZGV4ZXMucHVzaChjZWxscy5pbmRleE9mKGNlbGwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmluZEluZGV4ZXM7XG4gIH0sIFtdKTtcbn1cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3V0aWxzL25vZGUtbWF0Y2hlcnMuanNcblxuXG5jb25zdCBEZWx0YSA9IGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuaW1wb3J0KCdkZWx0YScpOyAvLyByZWJ1aWxkIGRlbHRhXG5cbmZ1bmN0aW9uIG1hdGNoVGFibGVDZWxsKG5vZGUsIGRlbHRhLCBzY3JvbGwpIHtcbiAgY29uc3Qgcm93ID0gbm9kZS5wYXJlbnROb2RlO1xuICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICdUQUJMRScgPyByb3cucGFyZW50Tm9kZSA6IHJvdy5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpO1xuICBjb25zdCBjZWxscyA9IEFycmF5LmZyb20ocm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJykpO1xuICBjb25zdCByb3dJZCA9IHJvd3MuaW5kZXhPZihyb3cpICsgMTtcbiAgY29uc3QgY2VsbElkID0gY2VsbHMuaW5kZXhPZihub2RlKSArIDE7XG4gIGNvbnN0IGNvbHNwYW4gPSBub2RlLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpIHx8IGZhbHNlO1xuICBjb25zdCByb3dzcGFuID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSB8fCBmYWxzZTtcbiAgY29uc3QgY2VsbEJnID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2VsbC1iZycpIHx8IG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yOyAvLyBUaGUgdGQgZnJvbSBleHRlcm5hbCB0YWJsZSBoYXMgbm8gJ2RhdGEtY2VsbC1iZycgXG4gIC8vIGJ1Z2ZpeDogZW1wdHkgdGFibGUgY2VsbHMgY29waWVkIGZyb20gb3RoZXIgcGxhY2Ugd2lsbCBiZSByZW1vdmVkIHVuZXhwZWN0ZWRseVxuXG4gIGlmIChkZWx0YS5sZW5ndGgoKSA9PT0gMCkge1xuICAgIGRlbHRhID0gbmV3IERlbHRhKCkuaW5zZXJ0KCdcXG4nLCB7XG4gICAgICAndGFibGUtY2VsbC1saW5lJzoge1xuICAgICAgICByb3c6IHJvd0lkLFxuICAgICAgICBjZWxsOiBjZWxsSWQsXG4gICAgICAgIHJvd3NwYW4sXG4gICAgICAgIGNvbHNwYW5cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsdGE7XG4gIH1cblxuICBkZWx0YSA9IGRlbHRhLnJlZHVjZSgobmV3RGVsdGEsIG9wKSA9PiB7XG4gICAgaWYgKG9wLmluc2VydCAmJiB0eXBlb2Ygb3AuaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgIGxldCBpbnNlcnRTdHIgPSBvcC5pbnNlcnQ7XG4gICAgICBsZXQgc3RhcnQgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wLmluc2VydC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaW5zZXJ0U3RyLmNoYXJBdChpKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnXFxuJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goaW5zZXJ0U3RyLnN1YnN0cmluZyhzdGFydCwgaSkpO1xuICAgICAgICAgICAgbGluZXMucHVzaCgnXFxuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YWlsU3RyID0gaW5zZXJ0U3RyLnN1YnN0cmluZyhzdGFydCk7XG4gICAgICBpZiAodGFpbFN0cikgbGluZXMucHVzaCh0YWlsU3RyKTtcbiAgICAgIGxpbmVzLmZvckVhY2godGV4dCA9PiB7XG4gICAgICAgIHRleHQgPT09ICdcXG4nID8gbmV3RGVsdGEuaW5zZXJ0KCdcXG4nLCBvcC5hdHRyaWJ1dGVzKSA6IG5ld0RlbHRhLmluc2VydCh0ZXh0LCBfb21pdChvcC5hdHRyaWJ1dGVzLCBbJ3RhYmxlJywgJ3RhYmxlLWNlbGwtbGluZSddKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RGVsdGEuaW5zZXJ0KG9wLmluc2VydCwgb3AuYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0RlbHRhO1xuICB9LCBuZXcgRGVsdGEoKSk7XG4gIHJldHVybiBkZWx0YS5yZWR1Y2UoKG5ld0RlbHRhLCBvcCkgPT4ge1xuICAgIGlmIChvcC5pbnNlcnQgJiYgdHlwZW9mIG9wLmluc2VydCA9PT0gJ3N0cmluZycgJiYgb3AuaW5zZXJ0LnN0YXJ0c1dpdGgoJ1xcbicpKSB7XG4gICAgICBuZXdEZWx0YS5pbnNlcnQob3AuaW5zZXJ0LCBPYmplY3QuYXNzaWduKHt9LCBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgIHJvdzogcm93SWRcbiAgICAgIH0sIG9wLmF0dHJpYnV0ZXMudGFibGUpLCB7XG4gICAgICAgICd0YWJsZS1jZWxsLWxpbmUnOiB7XG4gICAgICAgICAgcm93OiByb3dJZCxcbiAgICAgICAgICBjZWxsOiBjZWxsSWQsXG4gICAgICAgICAgcm93c3BhbixcbiAgICAgICAgICBjb2xzcGFuLFxuICAgICAgICAgICdjZWxsLWJnJzogY2VsbEJnXG4gICAgICAgIH1cbiAgICAgIH0sIF9vbWl0KG9wLmF0dHJpYnV0ZXMsIFsndGFibGUnXSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYnVnZml4OiByZW1vdmUgYmFja2dyb3VuZCBhdHRyIGZyb20gdGhlIGRlbHRhIG9mIHRhYmxlIGNlbGxcbiAgICAgIC8vICAgICAgICAgdG8gcHJldmVudCB1bmV4Y2VwdGVkIGJhY2tncm91bmQgYXR0ciBhcHBlbmQuXG4gICAgICBpZiAob3AuYXR0cmlidXRlcyAmJiBvcC5hdHRyaWJ1dGVzLmJhY2tncm91bmQgJiYgb3AuYXR0cmlidXRlcy5iYWNrZ3JvdW5kID09PSBjb252ZXJ0VG9IZXgoY2VsbEJnKSkge1xuICAgICAgICBuZXdEZWx0YS5pbnNlcnQob3AuaW5zZXJ0LCBPYmplY3QuYXNzaWduKHt9LCBfb21pdChvcC5hdHRyaWJ1dGVzLCBbJ3RhYmxlJywgJ3RhYmxlLWNlbGwtbGluZScsICdiYWNrZ3JvdW5kJ10pKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdEZWx0YS5pbnNlcnQob3AuaW5zZXJ0LCBPYmplY3QuYXNzaWduKHt9LCBfb21pdChvcC5hdHRyaWJ1dGVzLCBbJ3RhYmxlJywgJ3RhYmxlLWNlbGwtbGluZSddKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdEZWx0YTtcbiAgfSwgbmV3IERlbHRhKCkpO1xufSAvLyByZXBsYWNlIHRoIHRhZyB3aXRoIHRkIHRhZ1xuXG5mdW5jdGlvbiBtYXRjaFRhYmxlSGVhZGVyKG5vZGUsIGRlbHRhLCBzY3JvbGwpIHtcbiAgY29uc3Qgcm93ID0gbm9kZS5wYXJlbnROb2RlO1xuICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnROb2RlLnRhZ05hbWUgPT09ICdUQUJMRScgPyByb3cucGFyZW50Tm9kZSA6IHJvdy5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpO1xuICBjb25zdCBjZWxscyA9IEFycmF5LmZyb20ocm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJykpO1xuICBjb25zdCByb3dJZCA9IHJvd3MuaW5kZXhPZihyb3cpICsgMTtcbiAgY29uc3QgY2VsbElkID0gY2VsbHMuaW5kZXhPZihub2RlKSArIDE7XG4gIGNvbnN0IGNvbHNwYW4gPSBub2RlLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpIHx8IGZhbHNlO1xuICBjb25zdCByb3dzcGFuID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3Jvd3NwYW4nKSB8fCBmYWxzZTsgLy8gYnVnZml4OiBlbXB0eSB0YWJsZSBjZWxscyBjb3BpZWQgZnJvbSBvdGhlciBwbGFjZSB3aWxsIGJlIHJlbW92ZWQgdW5leHBlY3RlZGx5XG5cbiAgaWYgKGRlbHRhLmxlbmd0aCgpID09PSAwKSB7XG4gICAgZGVsdGEgPSBuZXcgRGVsdGEoKS5pbnNlcnQoJ1xcbicsIHtcbiAgICAgICd0YWJsZS1jZWxsLWxpbmUnOiB7XG4gICAgICAgIHJvdzogcm93SWQsXG4gICAgICAgIGNlbGw6IGNlbGxJZCxcbiAgICAgICAgcm93c3BhbixcbiAgICAgICAgY29sc3BhblxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZWx0YTtcbiAgfVxuXG4gIGRlbHRhID0gZGVsdGEucmVkdWNlKChuZXdEZWx0YSwgb3ApID0+IHtcbiAgICBpZiAob3AuaW5zZXJ0ICYmIHR5cGVvZiBvcC5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgICAgbGV0IGluc2VydFN0ciA9IG9wLmluc2VydDtcbiAgICAgIGxldCBzdGFydCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3AuaW5zZXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbnNlcnRTdHIuY2hhckF0KGkpID09PSAnXFxuJykge1xuICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCdcXG4nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZXMucHVzaChpbnNlcnRTdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCdcXG4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhaWxTdHIgPSBpbnNlcnRTdHIuc3Vic3RyaW5nKHN0YXJ0KTtcbiAgICAgIGlmICh0YWlsU3RyKSBsaW5lcy5wdXNoKHRhaWxTdHIpOyAvLyBidWdmaXg6IG5vICdcXG4nIGluIG9wLmluc2VydCwgcHVzaCBhICdcXG4nIHRvIGxpbmVzXG5cbiAgICAgIGlmIChsaW5lcy5pbmRleE9mKCdcXG4nKSA8IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnXFxuJyk7XG4gICAgICB9XG5cbiAgICAgIGxpbmVzLmZvckVhY2godGV4dCA9PiB7XG4gICAgICAgIHRleHQgPT09ICdcXG4nID8gbmV3RGVsdGEuaW5zZXJ0KCdcXG4nLCB7XG4gICAgICAgICAgJ3RhYmxlLWNlbGwtbGluZSc6IHtcbiAgICAgICAgICAgIHJvdzogcm93SWQsXG4gICAgICAgICAgICBjZWxsOiBjZWxsSWQsXG4gICAgICAgICAgICByb3dzcGFuLFxuICAgICAgICAgICAgY29sc3BhblxuICAgICAgICAgIH1cbiAgICAgICAgfSkgOiBuZXdEZWx0YS5pbnNlcnQodGV4dCwgb3AuYXR0cmlidXRlcyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RGVsdGEuaW5zZXJ0KG9wLmluc2VydCwgb3AuYXR0cmlidXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0RlbHRhO1xuICB9LCBuZXcgRGVsdGEoKSk7XG4gIHJldHVybiBkZWx0YS5yZWR1Y2UoKG5ld0RlbHRhLCBvcCkgPT4ge1xuICAgIGlmIChvcC5pbnNlcnQgJiYgdHlwZW9mIG9wLmluc2VydCA9PT0gJ3N0cmluZycgJiYgb3AuaW5zZXJ0LnN0YXJ0c1dpdGgoJ1xcbicpKSB7XG4gICAgICBuZXdEZWx0YS5pbnNlcnQob3AuaW5zZXJ0LCBPYmplY3QuYXNzaWduKHt9LCB7XG4gICAgICAgICd0YWJsZS1jZWxsLWxpbmUnOiB7XG4gICAgICAgICAgcm93OiByb3dJZCxcbiAgICAgICAgICBjZWxsOiBjZWxsSWQsXG4gICAgICAgICAgcm93c3BhbixcbiAgICAgICAgICBjb2xzcGFuXG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RGVsdGEuaW5zZXJ0KG9wLmluc2VydCwgT2JqZWN0LmFzc2lnbih7fSwgX29taXQob3AuYXR0cmlidXRlcywgWyd0YWJsZScsICd0YWJsZS1jZWxsLWxpbmUnXSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RGVsdGE7XG4gIH0sIG5ldyBEZWx0YSgpKTtcbn0gLy8gc3VwcGxlbWVudCBjb2xncm91cCBhbmQgY29sXG5cbmZ1bmN0aW9uIG1hdGNoVGFibGUobm9kZSwgZGVsdGEsIHNjcm9sbCkge1xuICBsZXQgbmV3Q29sRGVsdGEgPSBuZXcgRGVsdGEoKTtcbiAgY29uc3QgdG9wUm93ID0gbm9kZS5xdWVyeVNlbGVjdG9yKCd0cicpOyAvLyBidWdmaXg6IGVtcHR5IHRhYmxlIHdpbGwgcmV0dXJuIGVtcHR5IGRlbHRhXG5cbiAgaWYgKHRvcFJvdyA9PT0gbnVsbCkgcmV0dXJuIG5ld0NvbERlbHRhO1xuICBjb25zdCBjZWxsc0luVG9wUm93ID0gQXJyYXkuZnJvbSh0b3BSb3cucXVlcnlTZWxlY3RvckFsbCgndGQnKSkuY29uY2F0KEFycmF5LmZyb20odG9wUm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJykpKTtcbiAgY29uc3QgbWF4Q2VsbHNOdW1iZXIgPSBjZWxsc0luVG9wUm93LnJlZHVjZSgoc3VtLCBjZWxsKSA9PiB7XG4gICAgY29uc3QgY2VsbENvbHNwYW4gPSBjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpIHx8IDE7XG4gICAgc3VtID0gc3VtICsgcGFyc2VJbnQoY2VsbENvbHNwYW4sIDEwKTtcbiAgICByZXR1cm4gc3VtO1xuICB9LCAwKTtcbiAgY29uc3QgY29sc051bWJlciA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgnY29sJykubGVuZ3RoOyAvLyBpc3N1ZSAjMlxuICAvLyBidWdmaXg6IHRoZSB0YWJsZSBjb3BpZWQgZnJvbSBFeGNlbCBoYWQgc29tZSBkZWZhdWx0IGNvbCB0YWdzIG1pc3NpbmdcbiAgLy8gICAgICAgICBhZGQgbWlzc2luZyBjb2wgdGFnc1xuXG4gIGlmIChjb2xzTnVtYmVyID09PSBtYXhDZWxsc051bWJlcikge1xuICAgIHJldHVybiBkZWx0YTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heENlbGxzTnVtYmVyIC0gY29sc051bWJlcjsgaSsrKSB7XG4gICAgICBuZXdDb2xEZWx0YS5pbnNlcnQoJ1xcbicsIHtcbiAgICAgICAgJ3RhYmxlLWNvbCc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb2xzTnVtYmVyID09PSAwKSByZXR1cm4gbmV3Q29sRGVsdGEuY29uY2F0KGRlbHRhKTtcbiAgICBsZXQgbGFzdE51bWJlciA9IDA7XG4gICAgcmV0dXJuIGRlbHRhLnJlZHVjZSgoZmluYWxEZWx0YSwgb3ApID0+IHtcbiAgICAgIGZpbmFsRGVsdGEuaW5zZXJ0KG9wLmluc2VydCwgb3AuYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmIChvcC5hdHRyaWJ1dGVzICYmIG9wLmF0dHJpYnV0ZXNbJ3RhYmxlLWNvbCddKSB7XG4gICAgICAgIGxhc3ROdW1iZXIgKz0gb3AuaW5zZXJ0Lmxlbmd0aDtcblxuICAgICAgICBpZiAobGFzdE51bWJlciA9PT0gY29sc051bWJlcikge1xuICAgICAgICAgIGZpbmFsRGVsdGEgPSBmaW5hbERlbHRhLmNvbmNhdChuZXdDb2xEZWx0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbmFsRGVsdGE7XG4gICAgfSwgbmV3IERlbHRhKCkpO1xuICB9XG59XG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9xdWlsbC1iZXR0ZXItdGFibGUuanNcblxuXG5cbiAvLyBpbXBvcnQgdGFibGUgbm9kZSBtYXRjaGVyc1xuXG5cblxuY29uc3QgTW9kdWxlID0gZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5pbXBvcnQoJ2NvcmUvbW9kdWxlJyk7XG5jb25zdCBxdWlsbF9iZXR0ZXJfdGFibGVfRGVsdGEgPSBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLmltcG9ydCgnZGVsdGEnKTtcblxuXG5jbGFzcyBxdWlsbF9iZXR0ZXJfdGFibGVfQmV0dGVyVGFibGUgZXh0ZW5kcyBNb2R1bGUge1xuICBzdGF0aWMgcmVnaXN0ZXIoKSB7XG4gICAgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5yZWdpc3RlcihUYWJsZUNvbCwgdHJ1ZSk7XG4gICAgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5yZWdpc3RlcihUYWJsZUNvbEdyb3VwLCB0cnVlKTtcbiAgICBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnJlZ2lzdGVyKFRhYmxlQ2VsbExpbmUsIHRydWUpO1xuICAgIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEucmVnaXN0ZXIoVGFibGVDZWxsLCB0cnVlKTtcbiAgICBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnJlZ2lzdGVyKFRhYmxlUm93LCB0cnVlKTtcbiAgICBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnJlZ2lzdGVyKFRhYmxlQm9keSwgdHJ1ZSk7XG4gICAgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5yZWdpc3Rlcih0YWJsZV9UYWJsZUNvbnRhaW5lciwgdHJ1ZSk7XG4gICAgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5yZWdpc3Rlcih0YWJsZV9UYWJsZVZpZXdXcmFwcGVyLCB0cnVlKTtcbiAgICBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnJlZ2lzdGVyKHRhYmxlX1RhYmxlVmlld1dyYXBwZXIsIHRydWUpOyAvLyByZWdpc3RlciBjdXN0b21pemVkIEhlYWRlcu+8jG92ZXJ3cml0aW5nIHF1aWxsIGJ1aWx0LWluIEhlYWRlclxuICAgIC8vIFF1aWxsLnJlZ2lzdGVyKCdmb3JtYXRzL2hlYWRlcicsIEhlYWRlciwgdHJ1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihxdWlsbCwgb3B0aW9ucykge1xuICAgIHN1cGVyKHF1aWxsLCBvcHRpb25zKTsgLy8gaGFuZGxlIGNsaWNrIG9uIHF1aWxsLWJldHRlci10YWJsZVxuXG4gICAgdGhpcy5xdWlsbC5yb290LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZ0ID0+IHtcbiAgICAgIC8vIGJ1Z2ZpeDogZXZ0LnBhdGggaXMgdW5kZWZpbmVkIGluIFNhZmFyaSwgRkYsIE1pY3JvIEVkZ2VcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRFdmVudENvbXBvc2VkUGF0aChldnQpO1xuICAgICAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoIDw9IDApIHJldHVybjtcbiAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHBhdGguZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICByZXR1cm4gbm9kZS50YWdOYW1lICYmIG5vZGUudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnVEFCTEUnICYmIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdWlsbC1iZXR0ZXItdGFibGUnKTtcbiAgICAgIH0pWzBdO1xuXG4gICAgICBpZiAodGFibGVOb2RlKSB7XG4gICAgICAgIC8vIGN1cnJlbnQgdGFibGUgY2xpY2tlZFxuICAgICAgICBpZiAodGhpcy50YWJsZSA9PT0gdGFibGVOb2RlKSByZXR1cm47IC8vIG90aGVyIHRhYmxlIGNsaWNrZWRcblxuICAgICAgICBpZiAodGhpcy50YWJsZSkgdGhpcy5oaWRlVGFibGVUb29scygpO1xuICAgICAgICB0aGlzLnNob3dUYWJsZVRvb2xzKHRhYmxlTm9kZSwgcXVpbGwsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRhYmxlKSB7XG4gICAgICAgIC8vIG90aGVyIGNsaWNrZWRcbiAgICAgICAgdGhpcy5oaWRlVGFibGVUb29scygpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTsgLy8gaGFuZGxlIHJpZ2h0IGNsaWNrIG9uIHF1aWxsLWJldHRlci10YWJsZVxuXG4gICAgdGhpcy5xdWlsbC5yb290LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZXZ0ID0+IHtcbiAgICAgIGlmICghdGhpcy50YWJsZSkgcmV0dXJuIHRydWU7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTsgLy8gYnVnZml4OiBldnQucGF0aCBpcyB1bmRlZmluZWQgaW4gU2FmYXJpLCBGRiwgTWljcm8gRWRnZVxuXG4gICAgICBjb25zdCBwYXRoID0gZ2V0RXZlbnRDb21wb3NlZFBhdGgoZXZ0KTtcbiAgICAgIGlmICghcGF0aCB8fCBwYXRoLmxlbmd0aCA8PSAwKSByZXR1cm47XG4gICAgICBjb25zdCB0YWJsZU5vZGUgPSBwYXRoLmZpbHRlcihub2RlID0+IHtcbiAgICAgICAgcmV0dXJuIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RBQkxFJyAmJiBub2RlLmNsYXNzTGlzdC5jb250YWlucygncXVpbGwtYmV0dGVyLXRhYmxlJyk7XG4gICAgICB9KVswXTtcbiAgICAgIGNvbnN0IHJvd05vZGUgPSBwYXRoLmZpbHRlcihub2RlID0+IHtcbiAgICAgICAgcmV0dXJuIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSJyAmJiBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3cnKTtcbiAgICAgIH0pWzBdO1xuICAgICAgY29uc3QgY2VsbE5vZGUgPSBwYXRoLmZpbHRlcihub2RlID0+IHtcbiAgICAgICAgcmV0dXJuIG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1REJyAmJiBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yb3cnKTtcbiAgICAgIH0pWzBdO1xuICAgICAgbGV0IGlzVGFyZ2V0Q2VsbFNlbGVjdGVkID0gdGhpcy50YWJsZVNlbGVjdGlvbi5zZWxlY3RlZFRkcy5tYXAodGFibGVDZWxsID0+IHRhYmxlQ2VsbC5kb21Ob2RlKS5pbmNsdWRlcyhjZWxsTm9kZSk7XG5cbiAgICAgIGlmICh0aGlzLnRhYmxlU2VsZWN0aW9uLnNlbGVjdGVkVGRzLmxlbmd0aCA8PSAwIHx8ICFpc1RhcmdldENlbGxTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnRhYmxlU2VsZWN0aW9uLnNldFNlbGVjdGlvbihjZWxsTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgY2VsbE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50YWJsZU9wZXJhdGlvbk1lbnUpIHRoaXMudGFibGVPcGVyYXRpb25NZW51ID0gdGhpcy50YWJsZU9wZXJhdGlvbk1lbnUuZGVzdHJveSgpO1xuXG4gICAgICBpZiAodGFibGVOb2RlKSB7XG4gICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25NZW51ID0gbmV3IHRhYmxlX29wZXJhdGlvbl9tZW51X1RhYmxlT3BlcmF0aW9uTWVudSh7XG4gICAgICAgICAgdGFibGU6IHRhYmxlTm9kZSxcbiAgICAgICAgICByb3c6IHJvd05vZGUsXG4gICAgICAgICAgY2VsbDogY2VsbE5vZGUsXG4gICAgICAgICAgbGVmdDogZXZ0LnBhZ2VYLFxuICAgICAgICAgIHRvcDogZXZ0LnBhZ2VZXG4gICAgICAgIH0sIHF1aWxsLCBvcHRpb25zLm9wZXJhdGlvbk1lbnUpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTsgLy8gYWRkIGtleWJvYXJkIGJpbmRpbmfvvJpCYWNrc3BhY2VcbiAgICAvLyBwcmV2ZW50IHVzZXIgaGl0cyBiYWNrc3BhY2UgdG8gZGVsZXRlIHRhYmxlIGNlbGxcblxuICAgIGNvbnN0IEtleUJvYXJkID0gcXVpbGwuZ2V0TW9kdWxlKCdrZXlib2FyZCcpO1xuICAgIHF1aWxsLmtleWJvYXJkLmFkZEJpbmRpbmcoe1xuICAgICAga2V5OiAnQmFja3NwYWNlJ1xuICAgIH0sIHt9LCBmdW5jdGlvbiAocmFuZ2UsIGNvbnRleHQpIHtcbiAgICAgIGlmIChyYW5nZS5pbmRleCA9PT0gMCB8fCB0aGlzLnF1aWxsLmdldExlbmd0aCgpIDw9IDEpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgW2xpbmVdID0gdGhpcy5xdWlsbC5nZXRMaW5lKHJhbmdlLmluZGV4KTtcblxuICAgICAgaWYgKGNvbnRleHQub2Zmc2V0ID09PSAwKSB7XG4gICAgICAgIGNvbnN0IFtwcmV2XSA9IHRoaXMucXVpbGwuZ2V0TGluZShyYW5nZS5pbmRleCAtIDEpO1xuXG4gICAgICAgIGlmIChwcmV2ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAocHJldi5zdGF0aWNzLmJsb3ROYW1lID09PSAndGFibGUtY2VsbC1saW5lJyAmJiBsaW5lLnN0YXRpY3MuYmxvdE5hbWUgIT09ICd0YWJsZS1jZWxsLWxpbmUnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7IC8vIHNpbmNlIG9ubHkgb25lIG1hdGNoZWQgYmluZGluZ3MgY2FsbGJhY2sgd2lsbCBleGN1dGUuXG4gICAgLy8gZXhwZWN0ZWQgbXkgYmluZGluZyBjYWxsYmFjayBleGN1dGUgZmlyc3RcbiAgICAvLyBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mIGJpbmRpbmcgY2FsbGJhY2tzXG5cbiAgICBsZXQgdGhpc0JpbmRpbmcgPSBxdWlsbC5rZXlib2FyZC5iaW5kaW5nc1snQmFja3NwYWNlJ10ucG9wKCk7XG4gICAgcXVpbGwua2V5Ym9hcmQuYmluZGluZ3NbJ0JhY2tzcGFjZSddLnNwbGljZSgwLCAxLCB0aGlzQmluZGluZyk7IC8vIGFkZCBNYXRjaGVycyB0byBtYXRjaCBhbmQgcmVuZGVyIHF1aWxsLWJldHRlci10YWJsZSBmb3IgaW5pdGlhbGl6YXRpb25cbiAgICAvLyBvciBwYXN0aW5nXG5cbiAgICBxdWlsbC5jbGlwYm9hcmQuYWRkTWF0Y2hlcigndGQnLCBtYXRjaFRhYmxlQ2VsbCk7XG4gICAgcXVpbGwuY2xpcGJvYXJkLmFkZE1hdGNoZXIoJ3RoJywgbWF0Y2hUYWJsZUhlYWRlcik7XG4gICAgcXVpbGwuY2xpcGJvYXJkLmFkZE1hdGNoZXIoJ3RhYmxlJywgbWF0Y2hUYWJsZSk7IC8vIHF1aWxsLmNsaXBib2FyZC5hZGRNYXRjaGVyKCdoMSwgaDIsIGgzLCBoNCwgaDUsIGg2JywgbWF0Y2hIZWFkZXIpXG4gICAgLy8gcmVtb3ZlIG1hdGNoZXIgZm9yIHRyIHRhZ1xuXG4gICAgcXVpbGwuY2xpcGJvYXJkLm1hdGNoZXJzID0gcXVpbGwuY2xpcGJvYXJkLm1hdGNoZXJzLmZpbHRlcihtYXRjaGVyID0+IHtcbiAgICAgIHJldHVybiBtYXRjaGVyWzBdICE9PSAndHInO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0VGFibGUoKSB7XG4gICAgbGV0IHJhbmdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnF1aWxsLmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChyYW5nZSA9PSBudWxsKSByZXR1cm4gW251bGwsIG51bGwsIG51bGwsIC0xXTtcbiAgICBjb25zdCBbY2VsbExpbmUsIG9mZnNldF0gPSB0aGlzLnF1aWxsLmdldExpbmUocmFuZ2UuaW5kZXgpO1xuXG4gICAgaWYgKGNlbGxMaW5lID09IG51bGwgfHwgY2VsbExpbmUuc3RhdGljcy5ibG90TmFtZSAhPT0gVGFibGVDZWxsTGluZS5ibG90TmFtZSkge1xuICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBudWxsLCAtMV07XG4gICAgfVxuXG4gICAgY29uc3QgY2VsbCA9IGNlbGxMaW5lLnRhYmxlQ2VsbCgpO1xuICAgIGNvbnN0IHJvdyA9IGNlbGwucm93KCk7XG4gICAgY29uc3QgdGFibGUgPSByb3cudGFibGUoKTtcbiAgICByZXR1cm4gW3RhYmxlLCByb3csIGNlbGwsIG9mZnNldF07XG4gIH1cblxuICBpbnNlcnRUYWJsZShyb3dzLCBjb2x1bW5zKSB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLnF1aWxsLmdldFNlbGVjdGlvbih0cnVlKTtcbiAgICBpZiAocmFuZ2UgPT0gbnVsbCkgcmV0dXJuO1xuICAgIGxldCBjdXJyZW50QmxvdCA9IHRoaXMucXVpbGwuZ2V0TGVhZihyYW5nZS5pbmRleClbMF07XG4gICAgbGV0IGRlbHRhID0gbmV3IHF1aWxsX2JldHRlcl90YWJsZV9EZWx0YSgpLnJldGFpbihyYW5nZS5pbmRleCk7XG5cbiAgICBpZiAoaXNJblRhYmxlQ2VsbChjdXJyZW50QmxvdCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbiBub3QgaW5zZXJ0IHRhYmxlIGludG8gYSB0YWJsZSBjZWxsLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZWx0YS5pbnNlcnQoJ1xcbicpOyAvLyBpbnNlcnQgdGFibGUgY29sdW1uXG5cbiAgICBkZWx0YSA9IG5ldyBBcnJheShjb2x1bW5zKS5maWxsKCdcXG4nKS5yZWR1Y2UoKG1lbW8sIHRleHQpID0+IHtcbiAgICAgIG1lbW8uaW5zZXJ0KHRleHQsIHtcbiAgICAgICAgJ3RhYmxlLWNvbCc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1lbW87XG4gICAgfSwgZGVsdGEpOyAvLyBpbnNlcnQgdGFibGUgY2VsbCBsaW5lIHdpdGggZW1wdHkgbGluZVxuXG4gICAgZGVsdGEgPSBuZXcgQXJyYXkocm93cykuZmlsbCgwKS5yZWR1Y2UobWVtbyA9PiB7XG4gICAgICBsZXQgdGFibGVSb3dJZCA9IHRhYmxlX3Jvd0lkKCk7XG4gICAgICByZXR1cm4gbmV3IEFycmF5KGNvbHVtbnMpLmZpbGwoJ1xcbicpLnJlZHVjZSgobWVtbywgdGV4dCkgPT4ge1xuICAgICAgICBtZW1vLmluc2VydCh0ZXh0LCB7XG4gICAgICAgICAgJ3RhYmxlLWNlbGwtbGluZSc6IHtcbiAgICAgICAgICAgIHJvdzogdGFibGVSb3dJZCxcbiAgICAgICAgICAgIGNlbGw6IHRhYmxlX2NlbGxJZCgpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICB9LCBtZW1vKTtcbiAgICB9LCBkZWx0YSk7XG4gICAgdGhpcy5xdWlsbC51cGRhdGVDb250ZW50cyhkZWx0YSwgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHJhbmdlLmluZGV4ICsgY29sdW1ucyArIDEsIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuc291cmNlcy5BUEkpO1xuICB9XG5cbiAgc2hvd1RhYmxlVG9vbHModGFibGUsIHF1aWxsLCBvcHRpb25zKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1uVG9vbCA9IG5ldyB0YWJsZV9jb2x1bW5fdG9vbF9UYWJsZUNvbHVtblRvb2wodGFibGUsIHF1aWxsLCBvcHRpb25zKTtcbiAgICB0aGlzLnRhYmxlU2VsZWN0aW9uID0gbmV3IHRhYmxlX3NlbGVjdGlvbl9UYWJsZVNlbGVjdGlvbih0YWJsZSwgcXVpbGwsIG9wdGlvbnMpO1xuICB9XG5cbiAgaGlkZVRhYmxlVG9vbHMoKSB7XG4gICAgdGhpcy5jb2x1bW5Ub29sICYmIHRoaXMuY29sdW1uVG9vbC5kZXN0cm95KCk7XG4gICAgdGhpcy50YWJsZVNlbGVjdGlvbiAmJiB0aGlzLnRhYmxlU2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB0aGlzLnRhYmxlT3BlcmF0aW9uTWVudSAmJiB0aGlzLnRhYmxlT3BlcmF0aW9uTWVudS5kZXN0cm95KCk7XG4gICAgdGhpcy5jb2x1bW5Ub29sID0gbnVsbDtcbiAgICB0aGlzLnRhYmxlU2VsZWN0aW9uID0gbnVsbDtcbiAgICB0aGlzLnRhYmxlT3BlcmF0aW9uTWVudSA9IG51bGw7XG4gICAgdGhpcy50YWJsZSA9IG51bGw7XG4gIH1cblxufVxuXG5xdWlsbF9iZXR0ZXJfdGFibGVfQmV0dGVyVGFibGUua2V5Ym9hcmRCaW5kaW5ncyA9IHtcbiAgJ3RhYmxlLWNlbGwtbGluZSBiYWNrc3BhY2UnOiB7XG4gICAga2V5OiAnQmFja3NwYWNlJyxcbiAgICBmb3JtYXQ6IFsndGFibGUtY2VsbC1saW5lJ10sXG4gICAgY29sbGFwc2VkOiB0cnVlLFxuICAgIG9mZnNldDogMCxcblxuICAgIGhhbmRsZXIocmFuZ2UsIGNvbnRleHQpIHtcbiAgICAgIGNvbnN0IFtsaW5lLCBvZmZzZXRdID0gdGhpcy5xdWlsbC5nZXRMaW5lKHJhbmdlLmluZGV4KTtcblxuICAgICAgaWYgKCFsaW5lLnByZXYgfHwgbGluZS5wcmV2LnN0YXRpY3MuYmxvdE5hbWUgIT09ICd0YWJsZS1jZWxsLWxpbmUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gIH0sXG4gICd0YWJsZS1jZWxsLWxpbmUgZGVsZXRlJzoge1xuICAgIGtleTogJ0RlbGV0ZScsXG4gICAgZm9ybWF0OiBbJ3RhYmxlLWNlbGwtbGluZSddLFxuICAgIGNvbGxhcHNlZDogdHJ1ZSxcbiAgICBzdWZmaXg6IC9eJC8sXG5cbiAgICBoYW5kbGVyKCkge31cblxuICB9LFxuICAndGFibGUtY2VsbC1saW5lIGVudGVyJzoge1xuICAgIGtleTogJ0VudGVyJyxcbiAgICBzaGlmdEtleTogbnVsbCxcbiAgICBmb3JtYXQ6IFsndGFibGUtY2VsbC1saW5lJ10sXG5cbiAgICBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7XG4gICAgICAvLyBidWdmaXg6IGEgdW5leHBlY3RlZCBuZXcgbGluZSBpbnNlcnRlZCB3aGVuIHVzZXIgY29tcG9zaXRpb25lbmQgd2l0aCBoaXR0aW5nIEVudGVyXG4gICAgICBpZiAodGhpcy5xdWlsbC5zZWxlY3Rpb24gJiYgdGhpcy5xdWlsbC5zZWxlY3Rpb24uY29tcG9zaW5nKSByZXR1cm47XG4gICAgICBjb25zdCBTY29wZSA9IGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuaW1wb3J0cy5wYXJjaG1lbnQuU2NvcGU7XG5cbiAgICAgIGlmIChyYW5nZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucXVpbGwuc2Nyb2xsLmRlbGV0ZUF0KHJhbmdlLmluZGV4LCByYW5nZS5sZW5ndGgpOyAvLyBTbyB3ZSBkbyBub3QgdHJpZ2dlciB0ZXh0LWNoYW5nZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lRm9ybWF0cyA9IE9iamVjdC5rZXlzKGNvbnRleHQuZm9ybWF0KS5yZWR1Y2UoKGZvcm1hdHMsIGZvcm1hdCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5xdWlsbC5zY3JvbGwucXVlcnkoZm9ybWF0LCBTY29wZS5CTE9DSykgJiYgIUFycmF5LmlzQXJyYXkoY29udGV4dC5mb3JtYXRbZm9ybWF0XSkpIHtcbiAgICAgICAgICBmb3JtYXRzW2Zvcm1hdF0gPSBjb250ZXh0LmZvcm1hdFtmb3JtYXRdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdHM7XG4gICAgICB9LCB7fSk7IC8vIGluc2VydCBuZXcgY2VsbExpbmUgd2l0aCBsaW5lRm9ybWF0c1xuXG4gICAgICB0aGlzLnF1aWxsLmluc2VydFRleHQocmFuZ2UuaW5kZXgsICdcXG4nLCBsaW5lRm9ybWF0c1sndGFibGUtY2VsbC1saW5lJ10sIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuc291cmNlcy5VU0VSKTsgLy8gRWFybGllciBzY3JvbGwuZGVsZXRlQXQgbWlnaHQgaGF2ZSBtZXNzZWQgdXAgb3VyIHNlbGVjdGlvbixcbiAgICAgIC8vIHNvIGluc2VydFRleHQncyBidWlsdCBpbiBzZWxlY3Rpb24gcHJlc2VydmF0aW9uIGlzIG5vdCByZWxpYWJsZVxuXG4gICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZS5pbmRleCArIDEsIGV4dGVybmFsX2NvbW1vbmpzX3F1aWxsX2NvbW1vbmpzMl9xdWlsbF9hbWRfcXVpbGxfcm9vdF9RdWlsbF9kZWZhdWx0LmEuc291cmNlcy5TSUxFTlQpO1xuICAgICAgdGhpcy5xdWlsbC5mb2N1cygpO1xuICAgICAgT2JqZWN0LmtleXMoY29udGV4dC5mb3JtYXQpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgIGlmIChsaW5lRm9ybWF0c1tuYW1lXSAhPSBudWxsKSByZXR1cm47XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRleHQuZm9ybWF0W25hbWVdKSkgcmV0dXJuO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2xpbmsnKSByZXR1cm47XG4gICAgICAgIHRoaXMucXVpbGwuZm9ybWF0KG5hbWUsIGNvbnRleHQuZm9ybWF0W25hbWVdLCBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfSxcbiAgJ3RhYmxlLWNlbGwtbGluZSB1cCc6IG1ha2VUYWJsZUFycm93SGFuZGxlcih0cnVlKSxcbiAgJ3RhYmxlLWNlbGwtbGluZSBkb3duJzogbWFrZVRhYmxlQXJyb3dIYW5kbGVyKGZhbHNlKSxcbiAgJ2Rvd24tdG8tdGFibGUnOiB7XG4gICAga2V5OiAnQXJyb3dEb3duJyxcbiAgICBjb2xsYXBzZWQ6IHRydWUsXG5cbiAgICBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBjb250ZXh0LmxpbmUubmV4dDtcblxuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuc3RhdGljcy5ibG90TmFtZSA9PT0gJ3RhYmxlLXZpZXcnKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENlbGwgPSB0YXJnZXQudGFibGUoKS5yb3dzKClbMF0uY2hpbGRyZW4uaGVhZDtcbiAgICAgICAgY29uc3QgdGFyZ2V0TGluZSA9IHRhcmdldENlbGwuY2hpbGRyZW4uaGVhZDtcbiAgICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24odGFyZ2V0TGluZS5vZmZzZXQodGhpcy5xdWlsbC5zY3JvbGwpLCAwLCBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gIH0sXG4gICd1cC10by10YWJsZSc6IHtcbiAgICBrZXk6ICdBcnJvd1VwJyxcbiAgICBjb2xsYXBzZWQ6IHRydWUsXG5cbiAgICBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBjb250ZXh0LmxpbmUucHJldjtcblxuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuc3RhdGljcy5ibG90TmFtZSA9PT0gJ3RhYmxlLXZpZXcnKSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0YXJnZXQudGFibGUoKS5yb3dzKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldENlbGwgPSByb3dzW3Jvd3MubGVuZ3RoIC0gMV0uY2hpbGRyZW4uaGVhZDtcbiAgICAgICAgY29uc3QgdGFyZ2V0TGluZSA9IHRhcmdldENlbGwuY2hpbGRyZW4uaGVhZDtcbiAgICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24odGFyZ2V0TGluZS5vZmZzZXQodGhpcy5xdWlsbC5zY3JvbGwpLCAwLCBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZUFycm93SGFuZGxlcih1cCkge1xuICByZXR1cm4ge1xuICAgIGtleTogdXAgPyAnQXJyb3dVcCcgOiAnQXJyb3dEb3duJyxcbiAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgZm9ybWF0OiBbJ3RhYmxlLWNlbGwtbGluZSddLFxuXG4gICAgaGFuZGxlcihyYW5nZSwgY29udGV4dCkge1xuICAgICAgLy8gVE9ETyBtb3ZlIHRvIHRhYmxlIG1vZHVsZVxuICAgICAgY29uc3Qga2V5ID0gdXAgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICBjb25zdCB0YXJnZXRMaW5lID0gY29udGV4dC5saW5lW2tleV07XG4gICAgICBpZiAodGFyZ2V0TGluZSAhPSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGNvbnN0IGNlbGwgPSBjb250ZXh0LmxpbmUucGFyZW50O1xuICAgICAgY29uc3QgdGFyZ2V0Um93ID0gY2VsbC5wYXJlbnRba2V5XTtcblxuICAgICAgaWYgKHRhcmdldFJvdyAhPSBudWxsICYmIHRhcmdldFJvdy5zdGF0aWNzLmJsb3ROYW1lID09PSAndGFibGUtcm93Jykge1xuICAgICAgICBsZXQgdGFyZ2V0Q2VsbCA9IHRhcmdldFJvdy5jaGlsZHJlbi5oZWFkO1xuICAgICAgICBsZXQgdG90YWxDb2xzcGFuT2ZUYXJnZXRDZWxsID0gcGFyc2VJbnQodGFyZ2V0Q2VsbC5mb3JtYXRzKClbJ2NvbHNwYW4nXSwgMTApO1xuICAgICAgICBsZXQgY3VyID0gY2VsbDtcbiAgICAgICAgbGV0IHRvdGFsQ29sc3Bhbk9mQ3VyID0gcGFyc2VJbnQoY3VyLmZvcm1hdHMoKVsnY29sc3BhbiddLCAxMCk7IC8vIGdldCB0YXJnZXRDZWxsIGFib3ZlIGN1cnJlbnQgY2VsbCBkZXBlbmRzIG9uIGNvbHNwYW5cblxuICAgICAgICB3aGlsZSAoY3VyLnByZXYgIT0gbnVsbCkge1xuICAgICAgICAgIGN1ciA9IGN1ci5wcmV2O1xuICAgICAgICAgIHRvdGFsQ29sc3Bhbk9mQ3VyICs9IHBhcnNlSW50KGN1ci5mb3JtYXRzKClbJ2NvbHNwYW4nXSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRhcmdldENlbGwubmV4dCAhPSBudWxsICYmIHRvdGFsQ29sc3Bhbk9mVGFyZ2V0Q2VsbCA8IHRvdGFsQ29sc3Bhbk9mQ3VyKSB7XG4gICAgICAgICAgdGFyZ2V0Q2VsbCA9IHRhcmdldENlbGwubmV4dDtcbiAgICAgICAgICB0b3RhbENvbHNwYW5PZlRhcmdldENlbGwgKz0gcGFyc2VJbnQodGFyZ2V0Q2VsbC5mb3JtYXRzKClbJ2NvbHNwYW4nXSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0YXJnZXRDZWxsLm9mZnNldCh0aGlzLnF1aWxsLnNjcm9sbCk7XG4gICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKGluZGV4LCAwLCBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0YXJnZXRMaW5lID0gY2VsbC50YWJsZSgpLnBhcmVudFtrZXldO1xuXG4gICAgICAgIGlmICh0YXJnZXRMaW5lICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodXApIHtcbiAgICAgICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHRhcmdldExpbmUub2Zmc2V0KHRoaXMucXVpbGwuc2Nyb2xsKSArIHRhcmdldExpbmUubGVuZ3RoKCkgLSAxLCAwLCBleHRlcm5hbF9jb21tb25qc19xdWlsbF9jb21tb25qczJfcXVpbGxfYW1kX3F1aWxsX3Jvb3RfUXVpbGxfZGVmYXVsdC5hLnNvdXJjZXMuVVNFUik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHRhcmdldExpbmUub2Zmc2V0KHRoaXMucXVpbGwuc2Nyb2xsKSwgMCwgZXh0ZXJuYWxfY29tbW9uanNfcXVpbGxfY29tbW9uanMyX3F1aWxsX2FtZF9xdWlsbF9yb290X1F1aWxsX2RlZmF1bHQuYS5zb3VyY2VzLlVTRVIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzVGFibGVDZWxsKGJsb3QpIHtcbiAgcmV0dXJuIGJsb3Quc3RhdGljcy5ibG90TmFtZSA9PT0gVGFibGVDZWxsLmJsb3ROYW1lO1xufVxuXG5mdW5jdGlvbiBpc0luVGFibGVDZWxsKGN1cnJlbnQpIHtcbiAgcmV0dXJuIGN1cnJlbnQgJiYgY3VycmVudC5wYXJlbnQgPyBpc1RhYmxlQ2VsbChjdXJyZW50LnBhcmVudCkgPyB0cnVlIDogaXNJblRhYmxlQ2VsbChjdXJyZW50LnBhcmVudCkgOiBmYWxzZTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcXVpbGxfYmV0dGVyX3RhYmxlID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAocXVpbGxfYmV0dGVyX3RhYmxlX0JldHRlclRhYmxlKTtcblxuLyoqKi8gfSksXG4vKiAxMSAqLyxcbi8qIDEyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cblxuLyoqKi8gfSlcbi8qKioqKiovIF0pW1wiZGVmYXVsdFwiXTtcbn0pOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/quill-better-table/dist/quill-better-table.js\n");
/***/ })
};
;