module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./src/0globals.js": /*!*************************!*\ !*** ./src/0globals.js ***! \*************************/ /*! exports provided: minimumDiscordVersion, currentDiscordVersion, minSupportedVersion, bbdVersion, LCChanelog, bbdChangelog, settings, defaultCookie, settingsCookie, settingsRPC, defaultRPC, bdpluginErrors, bdthemeErrors, bdConfig, bdthemes, bdplugins, pluginCookie, themeCookie */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumDiscordVersion", function() { return minimumDiscordVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "currentDiscordVersion", function() { return currentDiscordVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minSupportedVersion", function() { return minSupportedVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdVersion", function() { return bbdVersion; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LCChanelog", function() { return LCChanelog; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdChangelog", function() { return bbdChangelog; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultCookie", function() { return defaultCookie; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsCookie", function() { return settingsCookie; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsRPC", function() { return settingsRPC; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultRPC", function() { return defaultRPC; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdpluginErrors", function() { return bdpluginErrors; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemeErrors", function() { return bdthemeErrors; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdConfig", function() { return bdConfig; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemes", function() { return bdthemes; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdplugins", function() { return bdplugins; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluginCookie", function() { return pluginCookie; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "themeCookie", function() { return themeCookie; }); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/webpackModules */ "./src/modules/webpackModules.js"); const minimumDiscordVersion = "0.0.306"; const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.306"; const minSupportedVersion = "0.3.0"; const bbdVersion = "0.3.4"; const LCChanelog = { description: "Lightcord's changelog", changes: [{ title: "What's New?", items: ["Lightcord is now available !", "We removed emotes. That's sad for people who were actually using it, but it was leading to more loading time and some basic words were emote."] }], image: "https://i.imgur.com/sfNhqwP.png", title: "Lightcord", subtitle: "v" + electron__WEBPACK_IMPORTED_MODULE_0__["remote"].getGlobal("BuildInfo").version, footer: function () { const TextElement = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Text"); const ModalStack = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("push", "update", "pop", "popWithKey"); if (!TextElement || !ModalStack) return null; const Anchor = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.displayName == "Anchor"); const AnchorClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("anchorUnderlineOnHover") || { anchor: "anchor-3Z-8Bb", anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB" }; const joinSupportServer = click => { click.preventDefault(); click.stopPropagation(); ModalStack.pop(); _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].joinLC(); }; const supportLink = Anchor ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(Anchor, { onClick: joinSupportServer }, "Join our Discord Server.") : _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement("a", { className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`, onClick: joinSupportServer }, "Join our Discord Server."); return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(TextElement, { size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD }, "Need support? ", supportLink); }() }; const bbdChangelog = { description: "BBD's changelog.", changes: [{ title: "What's New?", items: ["**Lightcord** is now using BandagedBD. That means all plugins you were using can be used too !", "**Window Transparency** changes were made to more compatible with external window managers and addons like Glasscord.", "Initialization sequence has once again been changed slightly to hopefully improve loading times."] }, { title: "Bug Fixes", type: "fixed", items: ["Some fixes related to showing modals in the `BdApi`."] }] }; const settings = { "Custom css live update": { id: "bda-css-0", info: "", implemented: true, hidden: true, cat: "core" }, "Custom css auto udpate": { id: "bda-css-1", info: "", implemented: true, hidden: true, cat: "core" }, "BetterDiscord Blue": { id: "bda-gs-b", info: "Replace Discord blue with BD Blue", implemented: false, hidden: false, cat: "core" }, /* Core */ /* ====== */ "Public Servers": { id: "bda-gs-1", info: "Display public servers button", implemented: true, hidden: false, cat: "core", category: "modules" }, "Minimal Mode": { id: "bda-gs-2", info: "Hide elements and reduce the size of elements.", implemented: true, hidden: false, cat: "core", category: "modules" }, "Voice Mode": { id: "bda-gs-4", info: "Only show voice chat", implemented: true, hidden: false, cat: "core", category: "modules" }, "Hide Channels": { id: "bda-gs-3", info: "Hide channels in minimal mode", implemented: true, hidden: false, cat: "core", category: "modules" }, "Dark Mode": { id: "bda-gs-5", info: "Make certain elements dark by default(wip)", implemented: true, hidden: false, cat: "core", category: "modules" }, "Voice Disconnect": { id: "bda-dc-0", info: "Disconnect from voice server when closing Discord", implemented: true, hidden: false, cat: "core", category: "modules" }, "24 Hour Timestamps": { id: "bda-gs-6", info: "Replace 12hr timestamps with proper ones", implemented: true, hidden: false, cat: "core", category: "modules" }, "Colored Text": { id: "bda-gs-7", info: "Make text color the same as role color", implemented: true, hidden: false, cat: "core", category: "modules" }, "Normalize Classes": { id: "fork-ps-4", info: "Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)", implemented: true, hidden: false, cat: "core", category: "modules" }, /* Content */ "Content Error Modal": { id: "fork-ps-1", info: "Shows a modal with plugin/theme errors", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Scan Plugins": { id: "fork-ps-6", info: "Scan plugins for any threat that can be hidden inside.", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Show Toasts": { id: "fork-ps-2", info: "Shows a small notification for important information", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Scroll To Settings": { id: "fork-ps-3", info: "Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)", implemented: true, hidden: false, cat: "core", category: "content manager" }, "Automatic Loading": { id: "fork-ps-5", info: "Automatically loads, reloads, and unloads plugins and themes", implemented: true, hidden: false, cat: "core", category: "content manager" }, /* Developer */ "Developer Mode": { id: "bda-gs-8", info: "Developer Mode Toggle", implemented: true, hidden: false, cat: "core", category: "developer settings" }, "Copy Selector": { id: "fork-dm-1", info: "Adds a \"Copy Selector\" option to context menus when developer mode is active", implemented: true, hidden: false, cat: "core", category: "developer settings" }, "React DevTools": { id: "reactDevTools", info: "Adds react developer tools to the devtools. Must be installed in Google Chrome on your pc.", implemented: true, hidden: true, cat: "core", category: "developer settings" }, /** Lightcord */ "Disable BetterDiscord": { id: "bd-disable", info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).", implemented: false, hidden: false, cat: "lightcord", category: "Lightcord" }, "Blur Personnal Informations": { id: "lightcord-6", info: "Blur sensitive informations like email, payment infos and more.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Calling Ring Beat": { id: "lightcord-2", info: "Enable Discord's special calling beat.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Developer Options": { id: "lightcord-1", info: "Enable Discord's & Lightcord's Internal Developer Options. This allow the \"Experiments\" tab, the \"Developer Options\" tab and the \"Api Components\" tab.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Ad Block": { id: "lightcord-4", info: "Block any BOT that dms you with an invite link. Even in an embed.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Enable Lightcord Servers": { id: "lightcord-5", info: "Enable Lightcord's servers. Disabling this will disable custom badges.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Disable typing": { id: "lightcord-7", info: "Don't let other see you're typing.", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, "Lightcord Tabs": { id: "lightcord-8", info: "Allows you to launch multiple instances of Lightcord in the same window (EXPERIMENTAL).", implemented: true, hidden: false, cat: "lightcord", category: "Lightcord" }, /** Lightcord Window */ "Always-on-Top": { id: "lightcord-3", info: "Enable window's Always-on-Top mode, where Lightcord stays on top of other applications.", implemented: true, hidden: false, cat: "lightcord", category: "Window" }, /** RichPresence */ "Enable": { id: "lightcord-presence-1", info: "Enable RichPresence below.", implemented: true, hidden: false, cat: "status" } }; const defaultCookie = { "bda-gs-1": true, "bda-gs-2": false, "bda-gs-3": false, "bda-gs-4": false, "bda-gs-5": true, "bda-gs-6": false, "bda-gs-7": false, "bda-gs-8": true, "bda-es-0": true, "bda-es-1": true, "bda-es-2": true, "bda-es-4": false, "bda-es-6": true, "bda-es-7": true, "bda-gs-b": false, "bda-es-8": true, "bda-dc-0": false, "bda-css-0": false, "bda-css-1": false, "bda-es-9": true, "fork-dm-1": false, "fork-ps-1": true, "fork-ps-2": true, "fork-ps-3": true, "fork-ps-4": true, "fork-ps-5": true, "fork-ps-6": true, "fork-es-2": false, "fork-es-3": true, "fork-wp-1": false, "fork-wp-2": false, "fork-beta": true, "reactDevTools": false, "lightcord-1": false, "lightcord-2": true, "lightcord-presence-1": false, "lightcord-3": false, "lightcord-4": false, "lightcord-5": true, "lightcord-6": true, "lightcord-7": false, "lightcord-8": false }; const settingsCookie = {}; const settingsRPC = {}; const defaultRPC = { "name": "Lightcord", "application_id": "711416957718757418", "state": "Lightcord Client", "details": "Browsing Discord", "timestamps.start": Date.now(), "assets.small": null, "assets.large": "712323821037682791" }; const bdpluginErrors = []; const bdthemeErrors = []; // define for backwards compatibility const bdConfig = Object.create(BetterDiscordConfig); const bdthemes = {}; const bdplugins = {}; const pluginCookie = {}; const themeCookie = {}; /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CoreWrapper; }); /* harmony import */ var _localStorageFix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localStorageFix */ "./src/localStorageFix.js"); /* harmony import */ var _loadingIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loadingIcon */ "./src/loadingIcon.js"); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./0globals */ "./src/0globals.js"); /* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/bdApi */ "./src/modules/bdApi.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/classNormalizer */ "./src/modules/classNormalizer.js"); /* harmony import */ var _modules_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/core */ "./src/modules/core.js"); Object(_localStorageFix__WEBPACK_IMPORTED_MODULE_0__["default"])(); Object(_loadingIcon__WEBPACK_IMPORTED_MODULE_1__["default"])(); const deprecateGlobal = (key, value) => { // value = typeof(value) !== "object" ? value : new Proxy(value, { // get: function(obj, mod) { // if (!obj.hasOwnProperty(mod)) return undefined; // return obj[mod]; // }, // set: function(obj, mod) { // if (obj.hasOwnProperty(mod)) return Utils.err("Deprecated Global", "Trying to overwrite deprecated BD globals"); // } // }); Object.defineProperty(window, key, { get() { _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"].warn("Deprecated Global", `"${key}" will be removed in future versions. Please only use BdApi.`); return value; } }); }; const globalKeys = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_2__); for (const key of globalKeys) deprecateGlobal(key, _0globals__WEBPACK_IMPORTED_MODULE_2__[key]); deprecateGlobal("BDV2", _modules_v2__WEBPACK_IMPORTED_MODULE_4__["default"]); deprecateGlobal("pluginModule", _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]); deprecateGlobal("themeModule", _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]); deprecateGlobal("Utils", _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"]); deprecateGlobal("BDEvents", _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__["default"]); deprecateGlobal("settingsPanel", _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__["default"]); deprecateGlobal("DataStore", _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__["default"]); deprecateGlobal("ContentManager", _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"]); deprecateGlobal("ClassNormalizer", _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__["default"]); window.BdApi = _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__["default"]; deprecateGlobal("mainCore", _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"]); class CoreWrapper { constructor(bdConfig) { _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig); } init() { // deprecateGlobal("mainCore", this.mainCore); _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init(); } } // function patchModuleLoad() { // const namespace = "betterdiscord"; // const prefix = `${namespace}/`; // const Module = require("module"); // const load = Module._load; // // const resolveFilename = Module._resolveFilename; // Module._load = function(request) { // if (request === namespace || request.startsWith(prefix)) { // const requested = request.substr(prefix.length); // if (requested == "api") return BdApi; // } // return load.apply(this, arguments); // }; // // Module._resolveFilename = function (request, parent, isMain) { // // if (request === "betterdiscord" || request.startsWith("betterdiscord/")) { // // const contentPath = PluginManager.getPluginPathByModule(parent); // // if (contentPath) return request; // // } // // return resolveFilename.apply(this, arguments); // // }; // return function() { // Module._load = load; // }; // } // patchModuleLoad(); // var settingsPanel, voiceMode,, dMode, publicServersModule; // var bdConfig = null; /***/ }), /***/ "./src/loadingIcon.js": /*!****************************!*\ !*** ./src/loadingIcon.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (() => { const v2Loader = document.createElement("div"); v2Loader.className = "bd-loaderv2"; v2Loader.title = "BandagedBD is loading..."; document.body.appendChild(v2Loader); }); /***/ }), /***/ "./src/localStorageFix.js": /*!********************************!*\ !*** ./src/localStorageFix.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (function () { const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get; Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", { get: function () { const contentWindow = Reflect.apply(contentWindowGetter, this, arguments); return new Proxy(contentWindow, { getOwnPropertyDescriptor: function (obj, prop) { if (prop === "localStorage") return undefined; return Object.getOwnPropertyDescriptor(obj, prop); }, get: function (obj, prop) { if (prop === "localStorage") return null; const val = obj[prop]; if (typeof val === "function") return val.bind(obj); return val; } }); } }); // Prevent interception by patching Reflect.apply and Function.prototype.bind Object.defineProperty(Reflect, "apply", { value: Reflect.apply, writable: false, configurable: false }); Object.defineProperty(Function.prototype, "bind", { value: Function.prototype.bind, writable: false, configurable: false }); const oOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function () { const url = arguments[1]; if (url.toLowerCase().includes("api/webhooks")) return null; return Reflect.apply(oOpen, this, arguments); }; }); /***/ }), /***/ "./src/modules/24hour.js": /*!*******************************!*\ !*** ./src/modules/24hour.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony default export */ __webpack_exports__["default"] = (new class TFHour { inject24Hour() { if (this.cancel24Hour) return; const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`); const convert = data => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return; const matched = data.returnValue.match(twelveHour); if (!matched || matched.length !== 4) return; if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`); return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`); }; const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", { after: convert }); // Called in Cozy mode const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", { after: convert }); // Called in Compact mode this.cancel24Hour = () => { cancelCozy(); cancelCompact(); }; // Cancel both } remove24Hour() { if (this.cancel24Hour) this.cancel24Hour(); } }()); /***/ }), /***/ "./src/modules/AntiAdDM.js": /*!*********************************!*\ !*** ./src/modules/AntiAdDM.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); const dispatcher = window.Lightcord.DiscordModules.dispatcher; const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default; let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0]; let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0]; const blocked = {}; let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0]; function getCurrentUser() { if (userModule) return userModule.default.getCurrentUser(); return null; } /* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM { constructor() { this.antiDM = this.antiDM.bind(this); this.enabled = false; } enable() { if (this.enabled) return; this.enabled = true; dispatcher.subscribe("MESSAGE_CREATE", this.antiDM); } disable() { if (!this.enabled) return; this.enabled = false; dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM); } antiDM(ev) { if (!ev.message.author.bot) return; if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return; const channel = ChannelModule.getChannel(ev.message.channel_id); if (!channel) return; // might be broken if (channel.type !== 1) return; if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again. if (scanMessage(ev.message)) { blocked[ev.message.author.id] = true; _utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, { "type": "warning" }); if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0]; relationShipModule.default.addRelationship(ev.message.author.id, { location: "ContextMenu" }, 2); if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0]; DMModule.default.closePrivateChannel(channel.id, false); } } }()); function scanMessage(message) { if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true; if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true; return false; } function EmbedsContains(message, search) { let embeds = message.embeds; if (embeds.length === 0) return false; return embeds.map(embed => { if (embed.type !== "rich") return false; if ((embed.title || "").includes(search)) return true; if ((embed.description || "").includes(search)) return true; if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true; if (embed.fields.map(e => { return e.value.includes(search) || e.name.includes(search); }).includes(true)) return true; return false; }).includes(true); } /***/ }), /***/ "./src/modules/CustomRichPresence.js": /*!*******************************************!*\ !*** ./src/modules/CustomRichPresence.js ***! \*******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default; const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes; const socketId = "lightcord-spoof-socket"; const pid = process.pid; /* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence { constructor() { this.enabled = false; this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]; } get formatedGame() { if (!this.game) return null; if (this.enabled === false) return null; let game = { name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name, application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id, details: this.game.details || undefined, state: this.game.state || undefined, timestamps: this.game["timestamps.start"] ? { start: this.game["timestamps.start"] } : undefined, assets: this.game["assets.large"] ? { large_image: this.game["assets.large"], small_image: this.game["assets.small"] || undefined } : undefined }; return game; } sendGame() { dispatcher.dispatch({ type: ActionTypes.LOCAL_ACTIVITY_UPDATE, socketId, pid, activity: this.formatedGame }); } enable() { if (this.enabled) return; this.enabled = true; console.log("Enabling custom RichPresence"); this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"])); this.sendGame(); } disable() { if (!this.enabled) return; this.enabled = false; console.log("Disabling custom RichPresence"); this.sendGame(); } async fetchAssets(applicationId) { let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId); if (assets.undefined && typeof assets.undefined === "number") { throw new Error("Unknown Application"); } return assets; } set(activity) { this.game = activity; this.sendGame(); } }()); /***/ }), /***/ "./src/modules/bdApi.js": /*!******************************!*\ !*** ./src/modules/bdApi.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); const BdApi = { get React() { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React; }, get ReactDOM() { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom; }, get ReactComponent() { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent; }, get WindowConfigFile() { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile; }, get settings() { return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]; }, get emotes() { return {}; }, // deprecated, deleted all emotes from betterdiscord. get screenWidth() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0); }, get screenHeight() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); } }; BdApi.getAllWindowPreferences = function () { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences(); }; BdApi.getWindowPreference = function (key) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key); }; BdApi.setWindowPreference = function (key, value) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value); }; //Inject CSS to document head //id = id of element //css = custom css BdApi.injectCSS = function (id, css) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css); }; //Clear css/remove any element //id = id of element BdApi.clearCSS = function (id) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id)); }; //Inject CSS to document head //id = id of element //css = custom css BdApi.linkJS = function (id, url) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url); }; //Clear css/remove any element //id = id of element BdApi.unlinkJS = function (id) { _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id)); }; //Get another plugin //name = name of plugin BdApi.getPlugin = function (name) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) { return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin; } return null; }; //Get BetterDiscord Core BdApi.getCore = function () { _utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`); return _core__WEBPACK_IMPORTED_MODULE_1__["default"]; }; /** * Shows a generic but very customizable modal. * @param {string} title - title of the modal * @param {string} content - a string of text to display in the modal */ BdApi.alert = function (title, content) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, { cancelText: null }); }; /** * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks. * @param {string} title - title of the modal * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly. * @param {object} [options] - options to modify the modal * @param {boolean} [options.danger=false] - whether the main button should be red or not * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button * @param {string} [options.cancelText=Cancel] - text for the cancel button * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned * @returns {string} - the key used for this modal */ BdApi.showConfirmationModal = function (title, content, options = {}) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, options); }; //Show toast alert BdApi.showToast = function (content, options = {}) { _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showToast(content, options); }; // Finds module BdApi.findModule = function (filter) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.find(filter); }; // Finds module BdApi.findAllModules = function (filter) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findAll(filter); }; // Finds module BdApi.findModuleByProps = function (...props) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByUniqueProperties(props); }; BdApi.findModuleByPrototypes = function (...protos) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByPrototypes(protos); }; BdApi.findModuleByDisplayName = function (name) { return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByDisplayName(name); }; // Gets react instance BdApi.getInternalInstance = function (node) { if (!(node instanceof window.jQuery) && !(node instanceof Element)) return undefined; if (node instanceof jQuery) node = node[0]; return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].getInternalInstance(node); }; // Gets data BdApi.loadData = function (pluginName, key) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getPluginData(pluginName, key); }; BdApi.getData = BdApi.loadData; // Sets data BdApi.saveData = function (pluginName, key, data) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setPluginData(pluginName, key, data); }; BdApi.setData = BdApi.saveData; // Deletes data BdApi.deleteData = function (pluginName, key) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].deletePluginData(pluginName, key); }; // Patches other functions BdApi.monkeyPatch = function (what, methodName, options) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(what, methodName, options); }; // Event when element is removed BdApi.onRemoved = function (node, callback) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].onRemoved(node, callback); }; // Wraps function in try..catch BdApi.suppressErrors = function (method, message) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].suppressErrors(method, message); }; // Tests for valid JSON BdApi.testJSON = function (data) { return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].testJSON(data); }; BdApi.isPluginEnabled = function (name) { return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]; }; BdApi.isThemeEnabled = function (name) { return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name]; }; BdApi.isSettingEnabled = function (id) { return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]; }; BdApi.enableSetting = function (id) { return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, true); }; BdApi.disableSetting = function (id) { return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, false); }; BdApi.toggleSetting = function (id) { return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, !_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]); }; // Gets data BdApi.getBDData = function (key) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getBDData(key); }; // Sets data BdApi.setBDData = function (key, data) { return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setBDData(key, data); }; const makeAddonAPI = (cookie, list, manager) => new class AddonAPI { get folder() { return manager.folder; } isEnabled(name) { return !!cookie[name]; } enable(name) { return manager.enable(name); } disable(name) { return manager.disable(name); } toggle(name) { if (cookie[name]) this.disable(name);else this.enable(name); } reload(name) { return manager.reload(name); } get(name) { if (list.hasOwnProperty(name)) { if (list[name].plugin) return list[name].plugin; return list[name]; } return null; } getAll() { return Object.keys(list).map(k => this.get(k)).filter(a => a); } }(); BdApi.Plugins = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"], _pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]); BdApi.Themes = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"], _themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]); /* harmony default export */ __webpack_exports__["default"] = (BdApi); window.Lightcord.BetterDiscord.BdApi = BdApi; /***/ }), /***/ "./src/modules/bdEvents.js": /*!*********************************!*\ !*** ./src/modules/bdEvents.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* BDEvents */ const EventEmitter = __webpack_require__(/*! events */ "events"); /* harmony default export */ __webpack_exports__["default"] = (new class BDEvents extends EventEmitter { constructor() { super(); window.Lightcord.BetterDiscord.BDEvents = this; } dispatch(eventName, ...args) { this.emit(eventName, ...args); } off(eventName, eventAction) { this.removeListener(eventName, eventAction); } }()); /***/ }), /***/ "./src/modules/blurPrivate.js": /*!************************************!*\ !*** ./src/modules/blurPrivate.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /** * Credits to @hellbound1337 on github for the css */ let selectors; const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa; function getSelectors() { let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0]; if (!standardSidebarView) return null; let defaultClassName = removeDa(standardSidebarView.standardSidebarView); let selects = []; selects.push(`#app-mount .${defaultClassName} .payment-info .${removeDa(BDModules.get(e => e.description && typeof e.description === "string" && e.description.includes("formText"))[0].description)}`); selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.paymentSourceRow)[0].paymentSourceRow)} .${removeDa(BDModules.get(e => e.subText && e.descriptionWrapper)[0].subText)}`); selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.userSettingsAccount)[0].userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`); return selects; } /* harmony default export */ __webpack_exports__["default"] = (new class BlurPrivate { constructor() { this.enabled = false; } enable() { if (this.enabled) return; this.enabled = true; selectors = selectors || getSelectors(); if (!selectors) console.error(new Error("Couldn't find selectors to blur personnal informations.")); _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("blurPrivate", ` ${selectors[0]}, ${selectors[1]}, ${selectors[2]} { transition: all 150ms cubic-bezier(.55,.085,.68,.53); filter: blur(4px); opacity: .8; } ${selectors[0]}:hover, ${selectors[1]}:hover, ${selectors[2]}:hover { transition: all 150ms cubic-bezier(.55,.09,.68,.53); filter: none; opacity: 1; }`); } disable() { if (!this.enabled) return; this.enabled = false; _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate"); } }()); /***/ }), /***/ "./src/modules/classNormalizer.js": /*!****************************************!*\ !*** ./src/modules/classNormalizer.js ***! \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); const normalizedPrefix = "da"; const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`); /* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer { constructor() { window.Lightcord.BetterDiscord.BDEvents = this; } stop() { if (!this.hasPatched) return; this.unpatchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this))); this.revertElement(document.querySelector("#app-mount")); this.hasPatched = false; } start() { if (this.hasPatched) return; this.patchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this))); this.normalizeElement(document.querySelector("#app-mount")); this.hasPatched = true; this.patchDOMMethods(); } patchClassModules(modules) { for (const module of modules) { this.patchClassModule(normalizedPrefix, module); } } unpatchClassModules(modules) { for (const module of modules) { this.unpatchClassModule(normalizedPrefix, module); } } shouldIgnore(value) { if (!isNaN(value)) return true; if (value.endsWith("px") || value.endsWith("ch") || value.endsWith("em") || value.endsWith("ms")) return true; if (value.startsWith("layerContainer-")) return true; if (value.startsWith("#") && (value.length == 7 || value.length == 4)) return true; if (value.includes("calc(") || value.includes("rgba")) return true; return false; } moduleFilter(module) { if (typeof module !== "object" || Array.isArray(module)) return false; if (module.__esModule) return false; if (!Object.keys(module).length) return false; for (const baseClassName in module) { const value = module[baseClassName]; if (typeof value !== "string") return false; if (this.shouldIgnore(value)) continue; if (value.split("-").length === 1) return false; if (!randClass.test(value.split(" ")[0])) return false; } return true; } patchClassModule(componentName, classNames) { for (const baseClassName in classNames) { const value = classNames[baseClassName]; if (this.shouldIgnore(value)) continue; const classList = value.split(" "); for (const normalClass of classList) { const match = normalClass.match(randClass); if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know const camelCase = match[1].split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(""); classNames[baseClassName] += ` ${componentName}-${camelCase}`; } } } unpatchClassModule(componentName, classNames) { for (const baseClassName in classNames) { const value = classNames[baseClassName]; if (this.shouldIgnore(value)) continue; let newString = ""; const classList = value.split(" "); for (const normalClass of classList) { if (normalClass.startsWith(`${componentName}-`)) continue; newString += ` ${normalClass}`; } classNames[baseClassName] = newString.trim(); } } normalizeElement(element) { if (!(element instanceof Element)) return; const classes = element.classList; for (let c = 0, clen = classes.length; c < clen; c++) { if (!randClass.test(classes[c])) continue; const match = classes[c].match(randClass)[1]; const newClass = match.split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(""); element.classList.add(`${normalizedPrefix}-${newClass}`); } for (const child of element.children) this.normalizeElement(child); } revertElement(element) { if (!(element instanceof Element)) return; if (element.children && element.children.length) this.revertElement(element.children[0]); if (element.nextElementSibling) this.revertElement(element.nextElementSibling); const classes = element.classList; const toRemove = []; for (let c = 0; c < classes.length; c++) { if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]); } element.classList.remove(...toRemove); } patchDOMMethods() { const contains = DOMTokenList.prototype.contains; DOMTokenList.prototype.contains = function (token) { // const tokens = token.split(" "); return Reflect.apply(contains, this, [token.split(" ")[0]]); // return tokens.every(t => contains.call(this, t)); }; const add = DOMTokenList.prototype.add; DOMTokenList.prototype.add = function (...tokens) { for (let t = 0; t < tokens.length; t++) { tokens[t] = tokens[t].split(" ")[0]; } return Reflect.apply(add, this, tokens); }; const remove = DOMTokenList.prototype.remove; DOMTokenList.prototype.remove = function (...tokens) { for (let t = 0; t < tokens.length; t++) { tokens[t] = tokens[t].split(" ")[0]; } return Reflect.apply(remove, this, tokens); }; } }()); /***/ }), /***/ "./src/modules/coloredText.js": /*!************************************!*\ !*** ./src/modules/coloredText.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony default export */ __webpack_exports__["default"] = (new class ColoredText { injectColoredText() { if (this.cancelColoredText) return; if (!_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent) return; this.cancelColoredText = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent, "default", { before: data => { const props = data.methodArguments[0]; if (!props || !props.childrenMessageContent) return; const messageContent = props.childrenMessageContent; if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != "MessageContent") return; const originalType = messageContent.type.type; if (originalType.__originalMethod) return; // Don't patch again messageContent.type.type = function (props) { const returnValue = originalType(props); const roleColor = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"] ? props.message.colorString || "" : ""; returnValue.props.style = { color: roleColor }; return returnValue; }; messageContent.type.type.__originalMethod = originalType; Object.assign(messageContent.type.type, originalType); } }); } removeColoredText() { let classNameMarkup = BDModules.get(e => e.markup)[0].markup; document.querySelectorAll("." + classNameMarkup.split(" ")[0]).forEach(elem => { elem.style.setProperty("color", ""); }); } }()); /***/ }), /***/ "./src/modules/contentManager.js": /*!***************************************!*\ !*** ./src/modules/contentManager.js ***! \***************************************/ /*! exports provided: addonCache, default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addonCache", function() { return addonCache; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! crypto */ "crypto"); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js"); /* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! events */ "events"); /* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_7__); const path = __webpack_require__(/*! path */ "path"); const fs = __webpack_require__(/*! fs */ "fs"); const Module = __webpack_require__(/*! module */ "module").Module; Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules")); class MetaError extends Error { constructor(message) { super(message); this.name = "MetaError"; } } const originalJSRequire = Module._extensions[".js"]; const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => { return null; }; const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/; const escapedAtRegex = /^\\@/; let addonCache = {}; let hasPatched = false; /* harmony default export */ __webpack_exports__["default"] = (new class ContentManager { constructor() { this.timeCache = {}; this.watchers = {}; } patchExtensions() { if (hasPatched) return; hasPatched = true; Module._extensions[".js"] = this.getContentRequire("plugin"); Module._extensions[".css"] = this.getContentRequire("theme"); } get pluginsFolder() { return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/"))); } get themesFolder() { return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/"))); } loadAddonCertifierCache() { if (typeof _dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes") !== "string") { _dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}")); } else { try { addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes"))); } catch (e) { _dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}")); addonCache = {}; } } Object.keys(addonCache).forEach(key => { let value = addonCache[key]; if (!value || typeof value !== "object" || Array.isArray(value)) return delete addonCache[key]; let props = [{ key: "timestamp", type: "number" }, { key: "result", type: "object" }, { key: "hash", type: "string" }]; for (let prop of props) { if (!(prop.key in value) || typeof value[prop.key] !== prop.type) { delete addonCache[key]; return; } } if (value.hash !== key) { delete addonCache[key]; return; } if (value.result.suspect) { // refetch from remote to be sure you're up to date. delete addonCache[key]; return; } }); this.saveAddonCache(); } saveAddonCache() { _dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])(JSON.stringify(addonCache))); } watchContent(contentType) { if (this.watchers[contentType]) return; const isPlugin = contentType === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; const fileEnding = isPlugin ? ".plugin.js" : ".theme.css"; this.watchers[contentType] = fs.watch(baseFolder, { persistent: false }, async (eventType, filename) => { if (!eventType || !filename || !filename.endsWith(fileEnding)) return; await new Promise(r => setTimeout(r, 50)); try { fs.statSync(path.resolve(baseFolder, filename)); } catch (err) { if (err.code !== "ENOENT") return; delete this.timeCache[filename]; if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename); return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename); } if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return; const stats = fs.statSync(path.resolve(baseFolder, filename)); if (!stats || !stats.mtime || !stats.mtime.getTime()) return; if (typeof stats.mtime.getTime() !== "number") return; if (this.timeCache[filename] == stats.mtime.getTime()) return; this.timeCache[filename] = stats.mtime.getTime(); if (eventType == "rename") { if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename); } if (eventType == "change") { if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename); } }); } unwatchContent(contentType) { if (!this.watchers[contentType]) return; this.watchers[contentType].close(); delete this.watchers[contentType]; } extractMeta(content) { const firstLine = content.split("\n")[0]; const hasOldMeta = firstLine.includes("//META"); if (hasOldMeta) return this.parseOldMeta(content); const hasNewMeta = firstLine.includes("/**"); if (hasNewMeta) return this.parseNewMeta(content); throw new MetaError("META was not found."); } parseOldMeta(content) { const meta = content.split("\n")[0]; const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//")); if (meta.indexOf("META") < 0) throw new MetaError("META was not found."); const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta); if (!parsed) throw new MetaError("META could not be parsed."); if (!parsed.name) throw new MetaError("META missing name data."); parsed.format = "json"; return parsed; } parseNewMeta(content) { const block = content.split("/**", 2)[1].split("*/", 1)[0]; const out = {}; let field = ""; let accum = ""; for (const line of block.split(splitRegex)) { if (line.length === 0) continue; if (line.charAt(0) === "@" && line.charAt(1) !== " ") { out[field] = accum; const l = line.indexOf(" "); field = line.substr(1, l - 1); accum = line.substr(l + 1); } else { accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@"); } } out[field] = accum.trim(); delete out[""]; out.format = "jsdoc"; return out; } getContentRequire(type) { const isPlugin = type === "plugin"; const self = this; const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire; return function (module, filename) { const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder; const possiblePath = path.resolve(baseFolder, path.basename(filename)); if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments); let content = fs.readFileSync(filename, "utf8"); content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content); const stats = fs.statSync(filename); const meta = self.extractMeta(content); meta.filename = path.basename(filename); meta.added = stats.atimeMs; meta.modified = stats.mtimeMs; meta.size = stats.size; if (!isPlugin) { meta.css = content; if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n"); content = `module.exports = ${JSON.stringify(meta)};`; } if (isPlugin) { module._compile(content, module.filename); const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports); if (didExport) { meta.type = module.exports; module.exports = meta; content = ""; } else { // Utils.warn("Module Not Exported", `${meta.name}, please start setting module.exports`); content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`; } } module._compile(content, filename); }; } makePlaceholderPlugin(data) { return { plugin: { start: () => {}, getName: () => { return data.name || data.filename; }, getAuthor: () => { return "???"; }, getDescription: () => { return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates."; }, getVersion: () => { return "???"; } }, name: data.name || data.filename, filename: data.filename, source: data.source ? data.source : "", website: data.website ? data.website : "" }; } async loadContent(filename, type) { if (typeof filename === "undefined" || typeof type === "undefined") return; const isPlugin = type === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) { let result = await new Promise(resolve => { Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["processFile"])(path.resolve(baseFolder, filename), result => { console.log(result); resolve(result); }, hash => { resolve({ suspect: false, hash: hash, filename: filename, name: filename }); }, true); }); if (result) { addonCache[result.hash] = { timestamp: Date.now(), hash: result.hash, result: result }; this.saveAddonCache(); if (result.suspect) { return { name: filename, file: filename, message: "This plugin might be dangerous (" + result.harm + ").", error: new Error("This plugin might be dangerous (" + result.harm + ").") }; } } } try { window.require(path.resolve(baseFolder, filename)); } catch (error) { return { name: filename, file: filename, message: "Could not be compiled.", error: { message: error.message, stack: error.stack } }; } const content = window.require(path.resolve(baseFolder, filename)); if (!content.name) return { name: filename, file: filename, message: "Cannot escape the ID.", error: { message: "Cannot read property 'replace' of undefined", stack: "Cannot read property 'replace' of undefined" } }; content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name); if (isPlugin) { if (!content.type) return; try { content.plugin = new content.type(); delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()]; _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()] = content; } catch (error) { return { name: filename, file: filename, message: "Could not be constructed.", error: { message: error.message, stack: error.stack } }; } } else { delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name]; _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name] = content; } } unloadContent(filename, type) { if (typeof filename === "undefined" || typeof type === "undefined") return; const isPlugin = type === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; try { delete window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))]; } catch (err) { return { name: filename, file: filename, message: "Could not be unloaded.", error: { message: err.message, stack: err.stack } }; } } isLoaded(filename, type) { const isPlugin = type === "plugin"; const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder; try { window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))]; } catch (err) { return false; } return true; } async reloadContent(filename, type) { const cantUnload = this.unloadContent(filename, type); if (cantUnload) return cantUnload; return await this.loadContent(filename, type); } loadNewContent(type) { const isPlugin = type === "plugin"; const fileEnding = isPlugin ? ".plugin.js" : ".theme.css"; const basedir = isPlugin ? this.pluginsFolder : this.themesFolder; const files = fs.readdirSync(basedir); const contentList = Object.values(isPlugin ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"] : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]); const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name); const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile()); return { added, removed }; } async loadAllContent(type) { this.patchExtensions(); const isPlugin = type === "plugin"; const fileEnding = isPlugin ? ".plugin.js" : ".theme.css"; const basedir = isPlugin ? this.pluginsFolder : this.themesFolder; const errors = []; const files = fs.readdirSync(basedir); for (const filename of files) { if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue; const error = await this.loadContent(filename, type); if (error) errors.push(error); } return errors; } loadPlugins() { return this.loadAllContent("plugin"); } loadThemes() { return this.loadAllContent("theme"); } }()); /** * Don't expose contentManager - could be dangerous for now */ /***/ }), /***/ "./src/modules/core.js": /*!*****************************!*\ !*** ./src/modules/core.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js"); /* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _svg_lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/lightcord */ "./src/svg/lightcord.jsx"); /* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js"); /* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js"); /* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile)); // this.init(); } Core.prototype.setConfig = function (config) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config); }; Core.prototype.init = async function () { if (!Array.prototype.flat) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding."); return; } if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").

Please download the latest version from GitHub"); return; } if (window.ED) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with EnhancedDiscord. Please uninstall one of them."); return; } if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes("Patched")) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with Powercord. Please uninstall one of them."); return; } _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttributes.bind(this), "LC Plugin Certifier Patch")(); /* const latestLocalVersion = bdConfig.updater ? bdConfig.updater.LatestVersion : bdConfig.latestVersion; if (latestLocalVersion > bdConfig.version) { Utils.showConfirmationModal("Update Available", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, "You can either update and restart now, or later."], { confirmText: "Update Now", cancelText: "Maybe Later", onConfirm: async () => { const onUpdateFailed = () => {Utils.alert("Could Not Update", `Unable to update automatically, please download the installer and reinstall normally.

Download Installer`);}; try { const didUpdate = await this.updateInjector(); if (!didUpdate) return onUpdateFailed(); const app = require("electron").remote.app; app.relaunch(); app.exit(); } catch (err) { onUpdateFailed(); } } }); }*/ _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings"); this.initSettings(); await this.checkForGuilds(); _v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings"); _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Addons Cache"); await _contentManager__WEBPACK_IMPORTED_MODULE_16__["default"].loadAddonCertifierCache(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins"); await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes"); await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes(); _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss"))); window.addEventListener("beforeunload", function () { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click(); }); _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon"); if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer"); this.initObserver(); // Show loading errors if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors"); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({ plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"], themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"] }); } const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]); _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]); } _emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"].start(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchSocial.bind(this), "BD Social Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildPills.bind(this), "BD Guild Pills Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildListItems.bind(this), "BD Guild List Items Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttachment.bind(this), "LC Plugin Certifier Patch")(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].haveInstalledDefault) { let alert = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings."); await new Promise(resolve => { alert.onClose(resolve); }); } const logo = document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark"); if (logo) { logo.style.top = "3px"; logo.innerHTML = ` `; } }; Core.prototype.patchAttributes = async function () { let attribsPatchs = []; this.cancelPatchAttributes = function () { attribsPatchs.forEach(e => e()); }; while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100)); // TODO: try to patch correctly the user popout on a next update const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); ensureExported(e => e.default && e.default.displayName === "DiscordTag").then(DiscordTag => { let DiscordTagComp = DiscordTag.default; DiscordTag.default = function (props) { let returnValue = DiscordTagComp(props); let id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); let badgeDiv = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { style: { display: "inline", marginTop: "5px" } }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("span", { id: "badges-" + id, key: "badges-" + id, style: { display: "inherit" } })); let children = [returnValue]; if (props.user.id === "249746236008169473") { // Rauenzi: BandagedBD Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-logo" })))); } else if (props.user.id === "696481194443014174" || props.user.id === "696003456611385396") { // Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-logo" })))); } children.push(badgeDiv); let div = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { style: { display: "block" } }, children); applyBadges(id, props.user, false); return div; }; }); attribsPatchs.push(_utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", { after: data => { if (data.methodArguments[0].childrenMessageContent.props.message) { // this can be a blocked message (not opened) data.returnValue.props["data-message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id; } } })); /* attribsPatchs.push(Utils.monkeyPatch(v2.MessageComponent, "default", {after: (data) => { data.returnValue.props["message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id }}))*/ }; Core.prototype.checkForGuilds = function () { let timesChecked = 0; return new Promise(resolve => { const checkForGuilds = function () { const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.wrapper.split(" ")[0]; if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++; const guild = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.listItem.split(" ")[0]; const blob = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.blobContainer.split(" ")[0]; if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true); setTimeout(checkForGuilds, 100); }; if (document.readyState != "loading") setTimeout(checkForGuilds, 100); document.addEventListener("DOMContentLoaded", () => { setTimeout(checkForGuilds, 100); }); }); }; Core.prototype.injectExternals = async function () { await _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript("ace-script", "https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js"); if (window.require.original) window.require = window.require.original; }; Core.prototype.initSettings = function () { _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize(); if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) { if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]); } if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]); } _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings(); } else { _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].loadSettings(); for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] == undefined) { _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"][setting]; _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings(); } } } window.Lightcord.Api.ensureExported(e => e.default && e.default.prototype && e.default.prototype.getPredicateSections).then(settingModule => { let getPredicateSections = settingModule.default.prototype.getPredicateSections; settingModule.default.prototype.getPredicateSections = function () { let result = getPredicateSections.call(this, ...arguments); if (result[1].section === "My Account") { // user settings, not guild settings let poped = []; poped.push(result.pop()); poped.push(result.pop()); poped.push(result.pop()); poped.push(result.pop()); result.push(..._settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar(this)); while (poped[0]) { result.push(poped.pop()); } } return result; }; }); }; let classNameLayer; let classNameSocialLinks; let classNameModal; Core.prototype.initObserver = function () { const mainObserver = new MutationObserver(mutations => { for (let i = 0, mlen = mutations.length; i < mlen; i++) { const mutation = mutations[i]; if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"] !== "undefined") _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].rawObserver(mutation); // if there was nothing added, skip if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue; const node = mutation.addedNodes[0]; if (!classNameLayer) classNameLayer = BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer; if (!classNameSocialLinks) classNameSocialLinks = BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks; if (!classNameModal) classNameModal = BDModules.get(e => e.modal && typeof e.modal === "string" && e.inner && typeof e.inner === "string" && !e.responsiveWidthMobile)[0].modal; if (node.classList.contains(classNameLayer)) { if (node.getAttribute("aria-label") === "GUILD_SETTINGS") { node.setAttribute("layer-id", "server-settings"); node.setAttribute("id", "server-settings"); } if (node.getElementsByClassName(classNameSocialLinks).length) { node.setAttribute("layer-id", "user-settings"); node.setAttribute("id", "user-settings"); } } if (node.parentElement == document.body && node.querySelector("#ace_settingsmenu")) node.id = "ace_settingsmenu_container"; // Emoji Picker //node.getElementsByClassName("emojiPicker-3m1S-j").length && !node.querySelector(".emojiPicker-3m1S-j").parentElement.classList.contains("animatorLeft-1EQxU0") //if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector("."+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node); } }); mainObserver.observe(document, { childList: true, subtree: true }); }; Core.prototype.showChangelogModal = function (options = {}) { return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(options); }; Core.prototype.alert = function (title, content) { return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert(title, content); }; Core.prototype.patchSocial = function () { if (this.socialPatch) return; const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "TabBar"); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!TabBar) return; this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(TabBar.prototype, "render", { after: data => { const children = data.returnValue.props.children; if (!children || !children.length || children.length < 3) return; if (children[children.length - 3].type.displayName !== "Separator") return; if (!children[children.length - 2].type.toString().includes("socialLinks")) return; if (Anchor) { let socialModule1 = BDModules.get(e => e.socialLinks)[0]; const original = children[children.length - 2].type; const newOne = function () { const returnVal = original(...arguments); returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-social-link " + socialModule1.link, href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-social-logo" })))); returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-social-link " + socialModule1.link, href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-social-logo" })))); return returnVal; }; children[children.length - 2].type = newOne; } let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash]; const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].branch})`; const additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: `${classNameColorMuted} ${sizes.size12}` }, `Lightcord ${electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { className: classNameVersionHash + " da-versionHash" }, `(${(electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").commit || "Unknown").slice(0, 7)})`)), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: `${classNameColorMuted} ${sizes.size12}` }, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { className: classNameVersionHash + " da-versionHash" }, versionHash))]; const originalVersions = children[children.length - 1].type; children[children.length - 1].type = function () { const returnVal = originalVersions(...arguments); returnVal.props.children.splice(1, 0, additional); return returnVal; }; } }); }; const getGuildClasses = function () { const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("wrapper", "unreadMentionsBar"); const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("guildsError", "selected"); const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("blobContainer"); return Object.assign({}, guildsWrapper, guilds, pill); }; Core.prototype.patchGuildListItems = function () { if (this.guildListItemsPatch) return; const GuildClasses = getGuildClasses(); const listItemClass = GuildClasses.listItem.split(" ")[0]; const blobClass = GuildClasses.blobContainer.split(" ")[0]; const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement); const GuildComponent = reactInstance.return.type; if (!GuildComponent) return; this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(GuildComponent.prototype, "render", { after: data => { if (data.returnValue && data.thisObject) { const returnValue = data.returnValue; const guildData = data.thisObject.props; let className = returnValue.props.className; className += " bd-guild"; if (guildData.unread) className += " bd-unread"; if (guildData.selected) className += " bd-selected"; if (guildData.audio) className += " bd-audio"; if (guildData.video) className += " bd-video"; if (guildData.badge) className += " bd-badge"; if (guildData.animatable) className += " bd-animatable"; returnValue.props.className = className; return returnValue; } } }); }; Core.prototype.patchGuildPills = function () { if (this.guildPillPatch) return; const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d")); if (!guildPill) return; this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", { after: data => { const props = data.methodArguments[0]; if (props.unread) data.returnValue.props.className += " bd-unread"; if (props.selected) data.returnValue.props.className += " bd-selected"; if (props.hovered) data.returnValue.props.className += " bd-hovered"; return data.returnValue; } }); }; Core.prototype.patchGuildSeparator = function () { if (this.guildSeparatorPatch) return; const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds"); const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem"); if (!guildComponents || !Guilds) return; const GuildSeparator = function () { const returnValue = guildComponents.Separator(...arguments); returnValue.props.className += " bd-guild-separator"; return returnValue; }; this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", { after: data => { data.returnValue.props.children[1].props.children[3].type = GuildSeparator; } }); }; Core.prototype.patchAttachment = function () { if (this.AttachmentPatch) return; const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!Anchor || !Attachment || !Attachment.default) return; this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", { after: data => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) return; const attachment = data.methodArguments[0] || null; const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children"); if (!children || !attachment || !attachment.url) return; if (!Array.isArray(children)) return; const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { id: "certified-" + id })); _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id); } }); }; Core.prototype.patchMessageHeader = function () { if (this.messageHeaderPatch) return; const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp"); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!Anchor || !MessageHeader || !MessageHeader.default) return; this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", { after: data => { const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props"); const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children"); if (!children || !author || !author.id) return; // if (header && header.className) header.className += " " if (!Array.isArray(children)) return; if (author.id === "249746236008169473") { // Rauenzi: BandagedBD Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-logo" })))); } else if (author.id === "696481194443014174" || author.id === "696003456611385396") { // Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-chat-badge", href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-logo" })))); } const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { id: "badges-" + id, style: { display: "inline" } })); applyBadges(id, author, true); } }); }; function applyBadges(id, user, chat) { process.nextTick(() => { const div = document.getElementById("badges-" + id); if (!div || div.childNodes.length > 0) return; if (div.childNodes.length) return; let blockDiv = document.createElement("div"); blockDiv.style.display = "none"; div.appendChild(blockDiv); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); _distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => { badges.forEach(badge => { const props = { svg: { size: "16px", className: "bd-logo", width: "16px" } }; badge.scopes.forEach(scope => { if (scope === "user") { // require user props.user = user; } }); if (!badge.href) { props.Anchor = Anchor; props.href = { className: chat ? "bd-chat-badge" : "bd-member-badge", title: badge.name, target: "_blank" }; } const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: badge.name }, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, { href: badge.href, className: chat ? "bd-chat-badge" : "bd-member-badge", title: badge.name, target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)); const div2 = document.createElement("div"); _v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2); div2.childNodes.forEach(node => { div.appendChild(node); }); }); }); }); } Core.prototype.patchMemberList = function () { if (this.memberListPatch) return; const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem"); const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor"); if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return; this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", { after: data => { const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user"); const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children"); if (!children || !user || !user.id) return; // if (header && header.className) header.className += " " if (!Array.isArray(children)) return; if (user.id === "249746236008169473") { children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "BandagedBD Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-member-badge", href: "https://github.com/rauenzi/BetterDiscordApp", title: "BandagedBD", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "16px", className: "bd-logo" })))); } else if (user.id === "696481194443014174" || user.id === "696003456611385396") { children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], { color: "black", side: "top", text: "Lightcord Developer" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, { className: "bd-member-badge", href: "https://github.com/Lightcord/Lightcord", title: "Lightcord", target: "_blank" }, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], { size: "16px", className: "bd-logo" })))); } const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])(); children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", { id: "badges-" + id })); applyBadges(id, user, false); } }); }; Core.prototype.updateInjector = async function () { const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath; if (!injectionPath) return false; const fs = __webpack_require__(/*! fs */ "fs"); const path = __webpack_require__(/*! path */ "path"); const rmrf = __webpack_require__(/*! rimraf */ "rimraf"); const yauzl = __webpack_require__(/*! yauzl */ "yauzl"); const mkdirp = __webpack_require__(/*! mkdirp */ "mkdirp"); const request = /*require("request");*/ null; const parentPath = path.resolve(injectionPath, ".."); const folderName = path.basename(injectionPath); const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip"; const savedZip = path.resolve(parentPath, "injector.zip"); const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); // Download the injector zip file _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Downloading " + zipLink); let success = await new Promise(resolve => { request.get({ url: zipLink, encoding: null }, async (error, response, body) => { if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy const alreadyExists = await new Promise(res => fs.exists(savedZip, res)); if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res)); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Writing " + savedZip); fs.writeFile(savedZip, body, err => resolve(!err)); }); }); if (!success) return success; // Check and delete rename extraction const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res)); if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file const zipfile = await new Promise(r => yauzl.open(savedZip, { lazyEntries: true }, (err, zip) => r(zip))); zipfile.on("entry", function (entry) { // Skip directories, they are handled with mkdirp if (entry.fileName.endsWith("/")) return zipfile.readEntry(); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories const fullPath = path.resolve(parentPath, entry.fileName); mkdirp.sync(path.dirname(fullPath)); zipfile.openReadStream(entry, function (err, readStream) { if (err) return success = false; readStream.on("end", function () { zipfile.readEntry(); }); // Go to next file after this readStream.pipe(fs.createWriteStream(fullPath)); }); }); zipfile.readEntry(); // Start reading // Wait for the final file to finish await new Promise(resolve => zipfile.once("end", resolve)); // Save a backup in case something goes wrong during final step const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`); await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`); success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err))); if (!success) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Failed to rename the final directory"); return success; } // If rename had issues, delete what we tried to rename and restore backup if (!success) { _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Something went wrong... restoring backups."); await new Promise(resolve => rmrf(extractedFolder, resolve)); await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve)); return success; } // If we've gotten to this point, everything should have gone smoothly. // Cleanup the backup folder then remove the zip await new Promise(resolve => rmrf(backupFolder, resolve)); await new Promise(resolve => fs.unlink(savedZip, resolve)); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Injector Updated!"); return success; }; /* harmony default export */ __webpack_exports__["default"] = (new Core()); /** * Don't expose core - could be dangerous for now */ /***/ }), /***/ "./src/modules/dataStore.js": /*!**********************************!*\ !*** ./src/modules/dataStore.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); const __non_webpack_require__ = window.require; const fs = __webpack_require__(/*! fs */ "fs"); const path = __webpack_require__(/*! path */ "path"); const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable"; /* harmony default export */ __webpack_exports__["default"] = (new class DataStore { constructor() { this.data = { settings: { stable: {}, canary: {}, ptb: {} } }; this.pluginData = {}; window.Lightcord.BetterDiscord.DataStore = this; } initialize() { try { if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary"); const data = JSON.parse(fs.readFileSync(this.BDFile, "binary")); if (data.hasOwnProperty("settings")) this.data = data; if (!fs.existsSync(this.settingsFile)) return; let settings = __non_webpack_require__(this.settingsFile); fs.unlinkSync(this.settingsFile); if (settings.hasOwnProperty("settings")) settings = Object.assign({ stable: {}, canary: {}, ptb: {} }, { [releaseChannel]: settings });else settings = Object.assign({ stable: {}, canary: {}, ptb: {} }, settings); this.setBDData("settings", settings); } catch (err) { console.error(err); _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Corrupt Storage", "The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload."); } } get injectionPath() { return this._injectionPath = null; if (this._injectionPath) return this._injectionPath; const electron = __webpack_require__(/*! electron */ "electron").remote.app; const base = electron.getAppPath(); const roamingBase = electron.getPath("userData"); const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector"); const location = path.resolve(base, "..", "app"); const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null; if (!realLocation) return this._injectionPath = null; return this._injectionPath = realLocation; } get configFile() { return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json")); } get BDFile() { return this._BDFile || (this._BDFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdstorage.json")); } get settingsFile() { return this._settingsFile || (this._settingsFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdsettings.json")); } getPluginFile(pluginName) { return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_2__["default"].pluginsFolder, pluginName + ".config.json"); } getSettingGroup(key) { return this.data.settings[releaseChannel][key] || null; } setSettingGroup(key, data) { this.data.settings[releaseChannel][key] = data; fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary"); } getBDData(key) { return this.data[key] || ""; } setBDData(key, value) { this.data[key] = value; fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary"); } getPluginData(pluginName, key) { if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key]; if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined; this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName))); return this.pluginData[pluginName][key]; } setPluginData(pluginName, key, value) { if (value === undefined) return; if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {}; this.pluginData[pluginName][key] = value; fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary"); } deletePluginData(pluginName, key) { if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {}; delete this.pluginData[pluginName][key]; fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary"); } }()); /***/ }), /***/ "./src/modules/devMode.js": /*!********************************!*\ !*** ./src/modules/devMode.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony default export */ __webpack_exports__["default"] = (new class DevMode { constructor() { this.debugListener = this.debugListener.bind(this); this.copySelectorListener = this.copySelectorListener.bind(this); } start() { this.startDebugListener(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) this.startCopySelector(); } stop() { this.stopDebugListener(); this.stopCopySelector(); } startDebugListener() { this.stopDebugListener(); document.addEventListener("keydown", this.debugListener); } stopDebugListener() { document.removeEventListener("keydown", this.debugListener); } startCopySelector() { this.stopCopySelector(); document.addEventListener("contextmenu", this.copySelectorListener); } stopCopySelector() { document.removeEventListener("contextmenu", this.copySelectorListener); } debugListener(e) { if (e.which === 119 || e.which == 118) { //F8 console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", ""); debugger; // eslint-disable-line no-debugger e.preventDefault(); e.stopImmediatePropagation(); } } copySelectorListener(e) { try { e.stopPropagation(); const selector = this.getSelector(e.target); let [classLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0], BDModules.get(e => e.menu)[0]]; function attach() { if (!classItems || !classLayer.layer) return console.log(classItems, classLayer.layer); let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.menu)); if (!cm) { const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount > ." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classLayer.layerContainer)); const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); cmWrap.append(cm); container.append(cmWrap); cmWrap.style.top = e.clientY + "px"; cmWrap.style.left = e.clientX + "px"; cmWrap.setAttribute("role", "menu"); cmWrap.setAttribute("tabindex", "-1"); cmWrap.id = "bd-copy-selector-context"; cmWrap.setAttribute("aria-label", "Copy Selector Actions"); const scrollerClasses = BDModules.get(e => e.scrollerWrap)[0]; const scrollerWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); scrollerWrap.append(scroller); cm.append(scrollerWrap); const removeCM = function (e) { if (e.keyCode && e.keyCode !== 27) return; cmWrap.remove(); document.removeEventListener("click", removeCM); document.removeEventListener("contextmenu", removeCM); document.removeEventListener("keyup", removeCM); }; document.addEventListener("click", removeCM); document.addEventListener("contextmenu", removeCM); document.addEventListener("keyup", removeCM); } const cmWrap = cm.parentElement; const scroller = cm.childNodes[0].childNodes[0]; const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
`); /** * @type {HTMLElement} */ const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(``); cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`
Copy Selector
`)); cmi.addEventListener("click", () => { _v2__WEBPACK_IMPORTED_MODULE_1__["default"].NativeModule.copy(selector); cmWrap.style.display = "none"; }); cmi.addEventListener("mouseover", e => { let elements = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].queryAll("div[role=menuitem]." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.focused)); elements && elements.forEach(elem => elem.classList.remove(classItems.focused)); cmi.classList.add(classItems.focused); }); cmi.addEventListener("mouseout", e => { cmi.classList.remove(classItems.focused); }); cmg.append(cmi); if (scroller.childNodes.length) { // apend a separator const separator = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(``); scroller.append(separator); } scroller.append(cmg); if (cmWrap.clientHeight < cmWrap.scrollHeight) { console.log("overflowing " + cmWrap.style.top); cmWrap.style.top = cmWrap.style.top - cmg.clientHeight + "px"; console.log("overflowing" + cmWrap.style.top); } } setTimeout(attach, 1); } catch (e) { console.error(e); } } getSelector(element) { if (element.id) return `#${element.id}`; /** * * @param {HTMLElement} el */ function fullPath(el) { var names = []; while (el.parentNode) { if (el.id) { names.unshift('#' + el.id); break; } else { if (el == el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase() + Array.from(el.classList.entries()).map(e => "." + e).join(""));else { for (var c = 1, e = el; e.previousElementSibling; e = e.previousElementSibling, c++); names.unshift(el.tagName.toLowerCase() + (typeof el.className === "string" && el.className || "").split(" ").filter(e => !!e).map(e => "." + e).join("") + ":nth-child(" + c + ")"); } el = el.parentNode; } } return names.join(" > "); } return fullPath(element); /* const rules = this.getRules(element); const latestRule = rules[rules.length - 1]; if (latestRule) return latestRule.selectorText; else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`; return `.${Array.from(element.parentElement.classList).join(".")}`;*/ } getRules(element, css = element.ownerDocument.styleSheets) { //if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element); const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp")); const rules = sheets.map(s => [...(s.cssRules || [])]).flat(); const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*")); return elementRules; } }()); /***/ }), /***/ "./src/modules/disableTyping.js": /*!**************************************!*\ !*** ./src/modules/disableTyping.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (new class DisableTyping { constructor() { window.Lightcord.Api.ensureExported(e => e.default && e.default.startTyping).then(typingModule => { let self = this; const startTyping = typingModule.default.startTyping; typingModule.default.startTyping = function () { if (self.disabled) return startTyping.call(this, ...arguments); }; const stopTyping = typingModule.default.stopTyping; typingModule.default.stopTyping = function () { if (self.disabled) return stopTyping.call(this, ...arguments); }; this.disabled = true; }); window.Lightcord.BetterDiscord.DisableTyping = this; } disable() { this.disabled = true; } enable() { this.disabled = false; } }()); /***/ }), /***/ "./src/modules/distant.js": /*!********************************!*\ !*** ./src/modules/distant.js ***! \********************************/ /*! exports provided: uuidv4, default, Constants, Routes */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; }); /* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx"); /* harmony import */ var _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../svg/LightcordUser */ "./src/svg/LightcordUser.jsx"); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-fetch */ "node-fetch"); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../svg/circus */ "./src/svg/circus.jsx"); function uuidv4() { // Generate UUID (No crypto rng) return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : r & 0x3 | 0x8; return v.toString(16); }); } const awaitingBadgesPromises = {}; let badgesToFetch = []; /* harmony default export */ __webpack_exports__["default"] = (new class DistantServer { constructor() { this._cache = { badges: {} }; window.Lightcord.BetterDiscord.DistantServer = this; } get cache() { return this._cache; } set cache(data) { if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data; return this._cache = Object.assign(this._cache, data); } /* async delete(){ BdApi.showToast("Deleting all infos about you on Lightcord Servers...", {type: "warn"}) return handleRequest(Routes.delete, "delete") .then(async res => { if(res.status !== 200){ BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"}) throw new Error(`Couldn't delete all informations: ${(res.status+" "+res.statusText+" "+await res.text())}`) } console.info(`Succesfully deleted informations.`) BdApi.showToast("Succesfully deleted informations", {type: "success"}) window.Lightcord.Api.Authorization = null return res.json() }).catch((err) => { BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {type: "error"}) throw new Error(`Couldn't delete all informations: ${err.stack}`) }) }*/ /** * Get custom badges from the user ID. * @param {string} user The user ID * @returns {Promise} */ async getBadges(user) { if (this.cache.badges[user]) return this.cache.badges[user]; if (awaitingBadgesPromises[user]) return awaitingBadgesPromises[user]; let resolve; const newPromise = new Promise(res => resolve = res); awaitingBadgesPromises[user] = newPromise; const badges = []; for (let badge of Constants.badges) { if (badge.defaultUsers.includes(user)) badges.push(badge); } const fetchedBadges = await new Promise(resolve => { if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) return resolve([]); badgesToFetch.push([user, resolve]); setTimeout(() => { let users = badgesToFetch; if (users.length === 0) return; badgesToFetch = []; handleRequest(Routes.badges, "POST", JSON.stringify(users.map(e => e[0]))).then(async res => { if (res.status !== 200) { // Couldn't fetch badges: server error users.forEach(data => { data[1]([]); // resolve no badge fetched }); } const responseBody = await res.json(); for (let user of responseBody) { let promise = users.find(promise => promise[0] === user.user_id); promise[1](user.badges); } }).catch(err => { // Couldn't fetch badges: error if (!(err instanceof LightcordError)) console.error(err); users.forEach(data => { data[1]([]); // resolve no badge fetched }); }); }, 0); }); for (let badge of fetchedBadges) { if (!Constants.badges.find(e => e.id === badge)) continue; // We do not have the Component, skip it. if (badges.find(e => e.id === badge)) continue; // Already inserted. badges.push(Constants.badges.find(e => e.id === badge)); } this.cache = { badges: Object.assign(this.cache.badges, { [user]: badges }) }; setTimeout(() => { delete this.cache.badges[user]; }, 600000); resolve(badges); delete awaitingBadgesPromises[user]; return badges; } }()); const handleRequest = function (route, method, data) { if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) { return Promise.reject(new LightcordError("The current settings blocked the request.")); } return node_fetch__WEBPACK_IMPORTED_MODULE_2___default()(`${Constants.SERVER_URL}/api/v1${route}`, { method, headers: { "CLIENT": "Lightcord", "Authorization": window.Lightcord.Api.Authorization || "None::Anonymous" }, ...(data ? { body: data } : {}) }); }; class LightcordError extends Error { constructor() { super(...arguments); this.name = "LightcordError"; } } const Constants = { SERVER_URL: "https://lightcord.deroku.xyz", badges: [// TODO: /*{ name: "Lightcord User", id: "01cfa7b0-7cdb-4b0e-8258-9c6a78235c93", defaultUsers: [], scopes: [ "user" ], component: LightcordUserBadge }, */ { name: "Lightcord Bug Hunter", id: "f04698f5-816b-41e3-bd01-92291193d7a5", defaultUsers: ["696481194443014174", "696003456611385396"], scopes: [], component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"], href: "https://github.com/lightcord/lightcord/wiki/badges#bug_hunter" }, { name: "Buffoon", id: "06904d31-65b4-41ec-a50c-8658bbd1af96", defaultUsers: ["389016895543705602", "664600134528663565", "625350657829896224"], scopes: [], component: _svg_circus__WEBPACK_IMPORTED_MODULE_4__["default"], href: "https://youtu.be/EJtb6z-dlT8?t=145" }] }; const Routes = { badges: `/users/badges` }; /***/ }), /***/ "./src/modules/domtools.js": /*!*********************************!*\ !*** ./src/modules/domtools.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DOMTools; }); /** * Copyright 2018 Zachary Rauen * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is furnished * to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * From: https://github.com/rauenzi/BDPluginLibrary */ /** * @interface * @name Offset * @property {number} top - Top offset of the target element. * @property {number} right - Right offset of the target element. * @property {number} bottom - Bottom offset of the target element. * @property {number} left - Left offset of the target element. * @property {number} height - Outer height of the target element. * @property {number} width - Outer width of the target element. */ /** * Function that automatically removes added listener. * @callback module:DOMTools~CancelListener */ class DOMTools { static escapeID(id) { return id.replace(/^[^a-z]+|[^\w-]+/gi, "-"); } /** * Adds a style to the document. * @param {string} id - identifier to use as the element id * @param {string} css - css to add to the document */ static addStyle(id, css) { document.head.append(DOMTools.createElement(``)); } /** * Removes a style from the document. * @param {string} id - original identifier used */ static removeStyle(id) { const element = document.getElementById(id); if (element) element.remove(); } /** * Adds/requires a remote script to be loaded * @param {string} id - identifier to use for this script * @param {string} url - url from which to load the script * @returns {Promise} promise that resolves when the script is loaded */ static addScript(id, url) { return new Promise(resolve => { const script = document.createElement("script"); script.id = id; script.src = url; script.type = "text/javascript"; script.onload = resolve; document.head.append(script); }); } /** * Removes a remote script from the document. * @param {string} id - original identifier used */ static removeScript(id) { id = this.escapeID(id); const element = document.getElementById(id); if (element) element.remove(); } // https://javascript.info/js-animation static animate({ timing = _ => _, update, duration }) { const start = performance.now(); requestAnimationFrame(function animate(time) { // timeFraction goes from 0 to 1 let timeFraction = (time - start) / duration; if (timeFraction > 1) timeFraction = 1; // calculate the current animation state const progress = timing(timeFraction); update(progress); // draw it if (timeFraction < 1) { requestAnimationFrame(animate); } }); } /** * This is my shit version of not having to use `$` from jQuery. Meaning * that you can pass a selector and it will automatically run {@link module:DOMTools.query}. * It also means that you can pass a string of html and it will perform and return `parseHTML`. * @see module:DOMTools.parseHTML * @see module:DOMTools.query * @param {string} selector - Selector to query or HTML to parse * @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query` */ static Q(selector) { const element = this.parseHTML(selector); const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1; if (isHTML) return element; return this.query(selector); } /** * Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided * `document` is used by default. * @param {string} selector - Selector to query * @param {Element} [baseElement] - Element to base the query from * @returns {(Element|null)} - The found element or null if not found */ static query(selector, baseElement) { if (!baseElement) baseElement = document; return baseElement.querySelector(selector); } /** * Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided * `document` is used by default. * @param {string} selector - Selector to query * @param {Element} [baseElement] - Element to base the query from * @returns {Array} - Array of all found elements */ static queryAll(selector, baseElement) { if (!baseElement) baseElement = document; return baseElement.querySelectorAll(selector); } /** * Parses a string of HTML and returns the results. If the second parameter is true, * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}. * This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node. * * If the second parameter is false, then the return value will be the list of parsed * nodes and there were multiple top level nodes, otherwise the single node is returned. * @param {string} html - HTML to be parsed * @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment` * @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing */ static parseHTML(html, fragment = false) { const template = document.createElement("template"); template.innerHTML = html; const node = template.content.cloneNode(true); if (fragment) return node; return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0]; } /** Alternate name for {@link module:DOMTools.parseHTML} */ static createElement(html, fragment = false) { return this.parseHTML(html, fragment); } /** * Takes a string of html and escapes it using the brower's own escaping mechanism. * @param {String} html - html to be escaped */ static escapeHTML(html) { const textNode = document.createTextNode(""); const spanElement = document.createElement("span"); spanElement.append(textNode); textNode.nodeValue = html; return spanElement.innerHTML; } /** * Adds a list of classes from the target element. * @param {Element} element - Element to edit classes of * @param {...string} classes - Names of classes to add * @returns {Element} - `element` to allow for chaining */ static addClass(element, ...classes) { classes = classes.flat().filter(c => c); for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" "); classes = classes.flat().filter(c => c); element.classList.add(...classes); return element; } /** * Removes a list of classes from the target element. * @param {Element} element - Element to edit classes of * @param {...string} classes - Names of classes to remove * @returns {Element} - `element` to allow for chaining */ static removeClass(element, ...classes) { for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" "); classes = classes.flat().filter(c => c); element.classList.remove(...classes); return element; } /** * When only one argument is present: Toggle class value; * i.e., if class exists then remove it and return false, if not, then add it and return true. * When a second argument is present: * If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it. * @param {Element} element - Element to edit classes of * @param {string} classname - Name of class to toggle * @param {boolean} [indicator] - Optional indicator for if the class should be toggled * @returns {Element} - `element` to allow for chaining */ static toggleClass(element, classname, indicator) { classname = classname.toString().split(" ").filter(c => c); if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c)); return element; } /** * Checks if an element has a specific class * @param {Element} element - Element to edit classes of * @param {string} classname - Name of class to check * @returns {boolean} - `true` if the element has the class, `false` otherwise. */ static hasClass(element, classname) { return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c)); } /** * Replaces one class with another * @param {Element} element - Element to edit classes of * @param {string} oldName - Name of class to replace * @param {string} newName - New name for the class * @returns {Element} - `element` to allow for chaining */ static replaceClass(element, oldName, newName) { element.classList.replace(oldName, newName); return element; } /** * Appends `thisNode` to `thatNode` * @param {Node} thisNode - Node to be appended to another node * @param {Node} thatNode - Node for `thisNode` to be appended to * @returns {Node} - `thisNode` to allow for chaining */ static appendTo(thisNode, thatNode) { if (typeof thatNode == "string") thatNode = this.query(thatNode); if (!thatNode) return null; thatNode.append(thisNode); return thisNode; } /** * Prepends `thisNode` to `thatNode` * @param {Node} thisNode - Node to be prepended to another node * @param {Node} thatNode - Node for `thisNode` to be prepended to * @returns {Node} - `thisNode` to allow for chaining */ static prependTo(thisNode, thatNode) { if (typeof thatNode == "string") thatNode = this.query(thatNode); if (!thatNode) return null; thatNode.prepend(thisNode); return thisNode; } /** * Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`. * @param {Node} thisNode - The node to insert * @param {Node} targetNode - Node to insert after in the tree * @returns {Node} - `thisNode` to allow for chaining */ static insertAfter(thisNode, targetNode) { targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling); return thisNode; } /** * Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`. * @param {Node} thisNode - The node to insert * @param {Node} newNode - Node to insert after in the tree * @returns {Node} - `thisNode` to allow for chaining */ static after(thisNode, newNode) { thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling); return thisNode; } /** * Gets the next sibling element that matches the selector. * @param {Element} element - Element to get the next sibling of * @param {string} [selector=""] - Optional selector * @returns {Element} - The sibling element */ static next(element, selector = "") { return selector ? element.querySelector("+ " + selector) : element.nextElementSibling; } /** * Gets all subsequent siblings. * @param {Element} element - Element to get next siblings of * @returns {NodeList} - The list of siblings */ static nextAll(element) { return element.querySelectorAll("~ *"); } /** * Gets the subsequent siblings until an element matches the selector. * @param {Element} element - Element to get the following siblings of * @param {string} selector - Selector to stop at * @returns {Array} - The list of siblings */ static nextUntil(element, selector) { const next = []; while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling); return next; } /** * Gets the previous sibling element that matches the selector. * @param {Element} element - Element to get the previous sibling of * @param {string} [selector=""] - Optional selector * @returns {Element} - The sibling element */ static previous(element, selector = "") { const previous = element.previousElementSibling; if (selector) return previous && previous.matches(selector) ? previous : null; return previous; } /** * Gets all preceeding siblings. * @param {Element} element - Element to get preceeding siblings of * @returns {NodeList} - The list of siblings */ static previousAll(element) { const previous = []; while (element.previousElementSibling) previous.push(element = element.previousElementSibling); return previous; } /** * Gets the preceeding siblings until an element matches the selector. * @param {Element} element - Element to get the preceeding siblings of * @param {string} selector - Selector to stop at * @returns {Array} - The list of siblings */ static previousUntil(element, selector) { const previous = []; while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling); return previous; } /** * Find which index in children a certain node is. Similar to jQuery's `$.index()` * @param {HTMLElement} node - The node to find its index in parent * @returns {number} Index of the node */ static indexInParent(node) { const children = node.parentNode.childNodes; let num = 0; for (let i = 0; i < children.length; i++) { if (children[i] == node) return num; if (children[i].nodeType == 1) num++; } return -1; } /** Shorthand for {@link module:DOMTools.indexInParent} */ static index(node) { return this.indexInParent(node); } /** * Gets the parent of the element if it matches the selector, * otherwise returns null. * @param {Element} element - Element to get parent of * @param {string} [selector=""] - Selector to match parent * @returns {(Element|null)} - The sibling element or null */ static parent(element, selector = "") { return !selector || element.parentElement.matches(selector) ? element.parentElement : null; } /** * Gets all children of Element that match the selector if provided. * @param {Element} element - Element to get all children of * @param {string} selector - Selector to match the children to * @returns {Array} - The list of children */ static findChild(element, selector) { return element.querySelector(":scope > " + selector); } /** * Gets all children of Element that match the selector if provided. * @param {Element} element - Element to get all children of * @param {string} selector - Selector to match the children to * @returns {Array} - The list of children */ static findChildren(element, selector) { return element.querySelectorAll(":scope > " + selector); } /** * Gets all ancestors of Element that match the selector if provided. * @param {Element} element - Element to get all parents of * @param {string} [selector=""] - Selector to match the parents to * @returns {Array} - The list of parents */ static parents(element, selector = "") { const parents = []; if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));else while (element.parentElement) parents.push(element = element.parentElement); return parents; } /** * Gets the ancestors until an element matches the selector. * @param {Element} element - Element to get the ancestors of * @param {string} selector - Selector to stop at * @returns {Array} - The list of parents */ static parentsUntil(element, selector) { const parents = []; while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement); return parents; } /** * Gets all siblings of the element that match the selector. * @param {Element} element - Element to get all siblings of * @param {string} [selector="*"] - Selector to match the siblings to * @returns {Array} - The list of siblings */ static siblings(element, selector = "*") { return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector)); } /** * Sets or gets css styles for a specific element. If `value` is provided * then it sets the style and returns the element to allow for chaining, * otherwise returns the style. * @param {Element} element - Element to set the CSS of * @param {string} attribute - Attribute to get or set * @param {string} [value] - Value to set for attribute * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned. */ static css(element, attribute, value) { if (typeof value == "undefined") return global.getComputedStyle(element)[attribute]; element.style[attribute] = value; return element; } /** * Sets or gets the width for a specific element. If `value` is provided * then it sets the width and returns the element to allow for chaining, * otherwise returns the width. * @param {Element} element - Element to set the CSS of * @param {string} [value] - Width to set * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned. */ static width(element, value) { if (typeof value == "undefined") return parseInt(getComputedStyle(element).width); element.style.width = value; return element; } /** * Sets or gets the height for a specific element. If `value` is provided * then it sets the height and returns the element to allow for chaining, * otherwise returns the height. * @param {Element} element - Element to set the CSS of * @param {string} [value] - Height to set * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned. */ static height(element, value) { if (typeof value == "undefined") return parseInt(getComputedStyle(element).height); element.style.height = value; return element; } /** * Sets the inner text of an element if given a value, otherwise returns it. * @param {Element} element - Element to set the text of * @param {string} [text] - Content to set * @returns {string} - Either the string set by this call or the current text content of the node. */ static text(element, text) { if (typeof text == "undefined") return element.textContent; return element.textContent = text; } /** * Returns the innerWidth of the element. * @param {Element} element - Element to retrieve inner width of * @return {number} - The inner width of the element. */ static innerWidth(element) { return element.clientWidth; } /** * Returns the innerHeight of the element. * @param {Element} element - Element to retrieve inner height of * @return {number} - The inner height of the element. */ static innerHeight(element) { return element.clientHeight; } /** * Returns the outerWidth of the element. * @param {Element} element - Element to retrieve outer width of * @return {number} - The outer width of the element. */ static outerWidth(element) { return element.offsetWidth; } /** * Returns the outerHeight of the element. * @param {Element} element - Element to retrieve outer height of * @return {number} - The outer height of the element. */ static outerHeight(element) { return element.offsetHeight; } /** * Gets the offset of the element in the page. * @param {Element} element - Element to get offset of * @return {Offset} - The offset of the element */ static offset(element) { return element.getBoundingClientRect(); } static get listeners() { return this._listeners || (this._listeners = {}); } /** * This is similar to jQuery's `on` function and can *hopefully* be used in the same way. * * Rather than attempt to explain, I'll show some example usages. * * The following will add a click listener (in the `myPlugin` namespace) to `element`. * `DOMTools.on(element, "click.myPlugin", () => {console.log("clicked!");});` * * The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element. * `DOMTools.on(element, "click.myPlugin", ".block", () => {console.log("clicked!");});` * * The following will add a click listener (without namespace) to `element`. * `DOMTools.on(element, "click", () => {console.log("clicked!");});` * * The following will add a click listener (without namespace) to `element` that only fires once. * `const cancel = DOMTools.on(element, "click", () => {console.log("fired!"); cancel();});` * * @param {Element} element - Element to add listener to * @param {string} event - Event to listen to with option namespace (e.g. "event.namespace") * @param {(string|callable)} delegate - Selector to run on element to listen to * @param {callable} [callback] - Function to fire on event * @returns {module:DOMTools~CancelListener} - A function that will undo the listener */ static on(element, event, delegate, callback) { const [type, namespace] = event.split("."); const hasDelegate = delegate && callback; if (!callback) callback = delegate; const eventFunc = !hasDelegate ? callback : function (event) { if (event.target.matches(delegate)) { callback(event); } }; element.addEventListener(type, eventFunc); const cancel = () => { element.removeEventListener(type, eventFunc); }; if (namespace) { if (!this.listeners[namespace]) this.listeners[namespace] = []; const newCancel = () => { cancel(); this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1); }; this.listeners[namespace].push({ event: type, element: element, cancel: newCancel }); return newCancel; } return cancel; } /** * Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself * and removes the listener upon the first firing of the desired event. * * @param {Element} element - Element to add listener to * @param {string} event - Event to listen to with option namespace (e.g. "event.namespace") * @param {(string|callable)} delegate - Selector to run on element to listen to * @param {callable} [callback] - Function to fire on event * @returns {module:DOMTools~CancelListener} - A function that will undo the listener */ static once(element, event, delegate, callback) { const [type, namespace] = event.split("."); const hasDelegate = delegate && callback; if (!callback) callback = delegate; const eventFunc = !hasDelegate ? function (event) { callback(event); element.removeEventListener(type, eventFunc); } : function (event) { if (!event.target.matches(delegate)) return; callback(event); element.removeEventListener(type, eventFunc); }; element.addEventListener(type, eventFunc); const cancel = () => { element.removeEventListener(type, eventFunc); }; if (namespace) { if (!this.listeners[namespace]) this.listeners[namespace] = []; const newCancel = () => { cancel(); this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1); }; this.listeners[namespace].push({ event: type, element: element, cancel: newCancel }); return newCancel; } return cancel; } static __offAll(event, element) { const [type, namespace] = event.split("."); let matchFilter = listener => listener.event == type, defaultFilter = _ => _; if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element; const listeners = this.listeners[namespace] || []; const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter); for (let c = 0; c < list.length; c++) list[c].cancel(); } /** * This is similar to jQuery's `off` function and can *hopefully* be used in the same way. * * Rather than attempt to explain, I'll show some example usages. * * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`. * `DOMTools.off(element, "click.myPlugin", onClick);` * * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element. * `DOMTools.off(element, "click.myPlugin", ".block", onClick);` * * The following will remove a click listener (without namespace) from `element`. * `DOMTools.off(element, "click", onClick);` * * The following will remove all listeners in namespace `myPlugin` from `element`. * `DOMTools.off(element, ".myPlugin");` * * The following will remove all click listeners in namespace `myPlugin` from *all elements*. * `DOMTools.off("click.myPlugin");` * * The following will remove all listeners in namespace `myPlugin` from *all elements*. * `DOMTools.off(".myPlugin");` * * @param {(Element|string)} element - Element to remove listener from * @param {string} [event] - Event to listen to with option namespace (e.g. "event.namespace") * @param {(string|callable)} [delegate] - Selector to run on element to listen to * @param {callable} [callback] - Function to fire on event * @returns {Element} - The original element to allow for chaining */ static off(element, event, delegate, callback) { if (typeof element == "string") return this.__offAll(element); const [type, namespace] = event.split("."); if (namespace) return this.__offAll(event, element); const hasDelegate = delegate && callback; if (!callback) callback = delegate; const eventFunc = !hasDelegate ? callback : function (event) { if (event.target.matches(delegate)) { callback(event); } }; element.removeEventListener(type, eventFunc); return element; } /** * Adds a listener for when the node is added/removed from the document body. * The listener is automatically removed upon firing. * @param {HTMLElement} node - node to wait for * @param {callable} callback - function to be performed on event * @param {boolean} onMount - determines if it should fire on Mount or on Unmount */ static onMountChange(node, callback, onMount = true) { const wrappedCallback = () => { this.observer.unsubscribe(wrappedCallback); callback(); }; this.observer.subscribe(wrappedCallback, mutation => { const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes); const directMatch = nodes.indexOf(node) > -1; const parentMatch = nodes.some(parent => parent.contains(node)); return directMatch || parentMatch; }); return node; } /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */ static onMount(node, callback) { return this.onMountChange(node, callback); } /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */ static onUnmount(node, callback) { return this.onMountChange(node, callback, false); } /** Alias for {@link module:DOMTools.onMount} */ static onAdded(node, callback) { return this.onMount(node, callback); } /** Alias for {@link module:DOMTools.onUnmount} */ static onRemoved(node, callback) { return this.onUnmount(node, callback, false); } /** * Helper function which combines multiple elements into one parent element * @param {Array} elements - array of elements to put into a single parent */ static wrap(elements) { const domWrapper = this.parseHTML(`
`); for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]); return domWrapper; } /** * Resolves the node to an HTMLElement. This is mainly used by library modules. * @param {(jQuery|Element)} node - node to resolve */ static resolveElement(node) { if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined; return node instanceof jQuery ? node[0] : node; } } window.Lightcord.BetterDiscord.DOM = DOMTools; /***/ }), /***/ "./src/modules/emojiModule.js": /*!************************************!*\ !*** ./src/modules/emojiModule.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); const Constants = { EmojiRegex: //g }; let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0]; let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0]; let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0]; let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0]; let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0]; let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0]; let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0]; let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext); /* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule { constructor() { this.init().catch(err => _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("EmojiModule", "An error occured", err)); // better logging } async init() { /** Emoji AutoComplete */ if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete"); if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions); if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults); if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING); if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching); if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext); if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) { console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates); const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions; AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) { const value = getAutocompleteOptions.call(this, ...arguments); value.LIGHTCORD_EMOJIS = { matches(arg1, arg2) { let condition = arg2.length > 1 && "." === arg1; setEmojiUsable(condition); return condition; }, queryResults(t) { let results = EmojiModuleQuery.default.queryEmojiResults(t, e); return results; }, renderResults(e, t, n, r, a) { return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) { return { emoji: e, key: e.id || e.uniqueName || e.name, sentinel: ".", guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null }; }, function (e) { return "." + e + "."; }); }, getPlainText(id, guild) { var emojis = guild.emojis; if (null == emojis || null == emojis[id]) return ""; var emoji = emojis[id], isAnimated = emoji.animated ? "a" : ""; return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">"; }, getRawText(id, guild) { var emojis = guild.emojis; if (null == emojis || null == emojis[id]) return ""; var emoji = emojis[id], isAnimated = emoji.animated ? "a" : ""; return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">"; } }; return value; }; } else { console.error(new Error("Couldn't start autocompletion of Lightcord's emojis.")); } /** Emoji display */ while (!_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100)); if (!this.cancelEmojiRender) { // TODO: Proper emoji formatting / rendering this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent, "default", { before: data => { const message = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message"); if (!message) return; const content = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content"); if (!content || !content.length) return; /** * @type {{ * raw: string, * name: string, * id: string, * animated: boolean * }[]} */ let emojis = []; const newContent = []; for (let node of content) { if (typeof node !== "string") { newContent.push(node); continue; } ; let parsed; let hasParsed = false; do { parsed = Constants.EmojiRegex.exec(node); if (parsed) { hasParsed = true; if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0]; const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]); if (emoji) { emojis.push({ animated: emoji.animated, name: emoji.name, id: emoji.id, raw: parsed[0] }); } else { emojis.push({ animated: parsed[0].startsWith(" { if (!word) return ""; const emoji = emojis.find(e => e.raw == word); if (!emoji) return word; if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0]; return React.createElement(CustomEmojiModule.CustomEmoji, { emoji: { name: `.${emoji.name}.`, emojiId: emoji.id, animated: emoji.animated, jumboable: arr.length === 1 && content.length === 1 } }); }).reduce((previous, current) => { if (previous.length === 0) return [current]; if (typeof current === "string") { if (typeof previous[previous.length - 1] === "string") { previous[previous.length - 1] += ` ${current}`; return previous; } previous.push(" " + current); return previous; } previous.push(" ", current); return previous; }, []); newContent.push(...words); } else { newContent.push(node); } } while (data.methodArguments[0].childrenMessageContent.props.content[0]) { data.methodArguments[0].childrenMessageContent.props.content.shift(); } while (newContent[0]) { data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift()); } } }); } /* let userModule window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "EmojiPickerListRow") .then(EmojiPickerListRow => { let classs = EmojiPickerListRow.default EmojiPickerListRow.default = class EmojiPickerListRow extends React.Component { constructor(props){ super(props) } render(){ if(!userModule)userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0] if(!userModule)return React.createElement(classs, this.props) let user = userModule.default.getCurrentUser() if(!user.hasPremiumSubscription)return React.createElement(classs, this.props) return React.createElement(classs, Object.assign({}, this.props, { emojiDescriptors: this.props.emojiDescriptors.map(e => { e.isDisabled = false }) })) } } EmojiPickerListRow.default.displayName = "EmojiPickerListRow" })*/ } disable() { if (!this.cancelEmoteRender) return; this.cancelEmoteRender(); this.cancelEmoteRender = null; } start() {} }()); function D(e, t, n, r, o, i, s, u, l, c) { if (null == n || 0 === n.length) return null; var d = n.map(function (e, n) { return React.createElement(u, Object.assign({ onClick: o, onHover: r, selected: t === n, index: n }, l(e, n))); }); return [R(i, s, e, c), d]; } function R(e, t, n, r) { var a = n.length > 0 ? e.format({ prefix: r(n) }) : t; if (Array.isArray(a)) { a.unshift(React.createElement("strong", {}, "[Lightcord] ")); } else { a = "[LIGHTCORD] " + a; } return React.createElement(AutocompleteModule.default.Title, { title: a }, a); } R.displayName = "renderHeader"; let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0]; let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled; let isUsable = false; let hasPatched = false; function setEmojiUsable(usable) { isUsable = usable; if (hasPatched) return; if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0]; if (!EmojiFilterModule) return; if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled; hasPatched = true; EmojiFilterModule.default.isEmojiDisabled = function (emoji) { if (isUsable) { if (emoji.surrogates || emoji.diversity) return true; return false; } return isEmojiDisabled.call(this, ...arguments); }; } /***/ }), /***/ "./src/modules/pluginCertifier.js": /*!****************************************!*\ !*** ./src/modules/pluginCertifier.js ***! \****************************************/ /*! exports provided: default, checkViruses, checkHash, processFile, processAttachment, decryptSettingsCache, encryptSettingsCache */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkViruses", function() { return checkViruses; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkHash", function() { return checkHash; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processFile", function() { return processFile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processAttachment", function() { return processAttachment; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptSettingsCache", function() { return decryptSettingsCache; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encryptSettingsCache", function() { return encryptSettingsCache; }); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ "node-fetch"); /* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ "crypto"); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); const cache = {}; const cache2 = {}; /* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier { constructor() { window.Lightcord.BetterDiscord.PluginCertifier = this; } patch(attachment, id) { process.nextTick(() => { processAttachment(attachment, id); }); } start() {} isTrusted(hash) { return cache[hash] && !cache[hash].suspect; } }()); function checkViruses(hash, data, resultCallback, removeCallback, filename) { data = data.toString("utf8"); let isHarmful = false; for (let keyword of data.split(/[^\w\d]+/g)) { for (let oof of ["token", "email", "phone", "MFA", "2fa", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) { if (keyword.toLowerCase().includes(oof.toLowerCase()) && !keyword.toLowerCase() === "domtokenlist") { console.log(oof, keyword); isHarmful = "token stealer/virus"; break; } } if (isHarmful) break; } if (!isHarmful) { /** * @type {string} */ const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing the META comment from plugins if (/var [\w\d_$]+=\["/gi.test(no_comments)) { isHarmful = "obfuscation/hidden code"; } if (!isHarmful) { const regexps = [ /** hexadecimal */ /_0x\w{4}\('0x[\dabcdef]+'\)/g, /_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g, // _0x8db7('0x0', 'x1]f') /** mangled */ /\w+\('0x[\dabcdef]+'\)/g, // b('0x0') /\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // b('0x0', 'x1]f') ]; for (let regex of regexps) { if (isHarmful) break; if (regex.test(no_comments)) isHarmful = "obfuscation/hidden code"; } } } if (!isHarmful) return removeCallback(hash); cache[hash] = { suspect: true, name: hashToUrl[hash].split("/").pop(), type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme", harm: isHarmful, hash: hash, filename }; console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`); resultCallback(cache[hash]); } const hashToUrl = {}; function checkHash(hash, data, filename, resultCallback, removeCallback) { console.log(`File: ${filename} hash: ${hash}`); if (!cache[hash]) { node_fetch__WEBPACK_IMPORTED_MODULE_0___default()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/" + hash, { // Using node-fetch to bypass cors headers: { "User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent // have to set user-agent } }).then(async res => { if (res.status !== 200) { if (filename.endsWith(".theme.css")) return removeCallback(hash); checkViruses(hash, data, resultCallback, removeCallback, filename); return; } const result = await res.json(); result.hash = hash; result.filename = filename; cache[hash] = result; resultCallback(result); }).catch(console.error); } else { const result = cache[hash]; resultCallback(result); } } function processFile(__path, resultCallback, removeCallback = hash => {}, isFromLoader = false) { const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256"); let data = Buffer.alloc(0); Object(fs__WEBPACK_IMPORTED_MODULE_6__["createReadStream"])(__path).on("data", chunk => { data = Buffer.concat([data, chunk]); hash.update(chunk); }).on("end", () => { const hashResult = hash.digest("hex"); hashToUrl[hashResult] = __path; if (isFromLoader && _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]) { let value = _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]; if (value.timestamp < Date.now() - 6.048e+8) { delete _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]; _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"].saveAddonCache(); } else { resultCallback(value.result); return; } } checkHash(hashResult, data, Object(path__WEBPACK_IMPORTED_MODULE_7__["basename"])(__path), resultCallback, removeCallback); }); } function processAttachment(attachment, id) { if (!document.getElementById(id)) return; if (!attachment.url.startsWith("https://cdn.discordapp.com/")) return document.getElementById(id).remove(); if (!attachment.filename.endsWith(".plugin.js") && !attachment.filename.endsWith(".theme.css")) return document.getElementById(id).remove(); node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, { headers: { "User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent } }).then(res => { if (res.status !== 200) throw new Error("File doesn't exist."); const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256"); let data = Buffer.alloc(0); res.body.on("data", chunk => { data = Buffer.concat([data, chunk]); hash.update(chunk); }); res.body.on("end", () => { const hashResult = hash.digest("hex"); cache2[attachment.url] = hashResult; hashToUrl[hashResult] = attachment.url; checkHash(hashResult, data, attachment.filename, result => { renderToElements(id, result, attachment.filename); }, () => { let elem = document.getElementById(id); if (elem) elem.remove(); }); }); }).catch(() => {}); } let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]; let childModule = BDModules.get(e => e.childContainer)[0]; /** * * @param {HTMLDivElement[]} elements * @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result */ function renderToElements(id, result, filename) { const div = document.getElementById(id); if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore. if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]; if (!childModule) childModule = BDModules.get(e => e.childContainer)[0]; if (result.suspect) { try { div.parentNode.style.borderColor = "rgb(240, 71, 71)"; /** * * @param {HTMLElement} node */ let nextNode = node => { for (let child of node.children) { if (child.tagName === "A") { child.addEventListener("click", e => { e.preventDefault(); e.stopImmediatePropagation(); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", { confirmText: "Download Anyway", cancelText: "Don't !", danger: true, onCancel: () => {}, onConfirm: () => { electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href); } }); }); } else if (["div"].includes(child.tagName.toLowerCase())) { nextNode(child); } } }; nextNode(div.parentNode); } catch (e) { console.error(e); } _v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: result.type + " " + result.name + " is potentially dangerous." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: BDModules.get(e => e.svg)[0].svg, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 40 32" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", { x: "0", y: "0", width: "32", height: "32", mask: "url(#svg-mask-avatar-status-round-32)", fill: "#f04747", mask: "url(#svg-mask-status-dnd)", className: BDModules.get(e => e.pointerEvents)[0].pointerEvents })))), div); } else if (!result.official) { div.parentNode.style.borderColor = "#4087ed"; let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", { style: { display: "inherit" } }, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: result.type + " " + result.name + " is certified by Lightcord." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px", float: "left" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "#4f545c", "fill-rule": "evenodd", d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z" })), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: childModule.childContainer }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "#ffffff", d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z" }))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Install this " + result.type.toLowerCase() + " on Lightcord." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px" }, onClick() { _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically install and launch this " + result.type.toLowerCase() + ". You don't have anything to do.", { confirmText: "Download and Install", cancelText: "I've changed my mind", danger: false, onCancel: () => {}, onConfirm: () => { let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]; console.log(link); node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => { if (res.status !== 200) throw new Error("Status was not 200"); let content = await res.buffer(); let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename); console.log(installPath); Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed."); }).catch(err => { err = err instanceof Error ? err : new Error(err); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, { type: "error" }); }); } }); } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 24 24", style: { color: "rgb(67, 181, 129)", cursor: "pointer" } }, React.createElement("g", { fill: "none", "fill-rule": "evenodd" }, React.createElement("path", { d: "M0 0h24v24H0z" }), React.createElement("path", { class: "fill", fill: "currentColor", d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z" })))))]); _v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div); } else { div.parentNode.style.borderColor = "#4087ed"; let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", { style: { display: "inherit" } }, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: result.type + " " + result.name + " was made by the developers of Lightcord.", style: "brand" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px", float: "left" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2", stroke: "#36393f", style: { color: "#4087ed" } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "currentColor", "fill-rule": "evenodd", d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z" })), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: childModule.childContainer }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 16 15.2" }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", { fill: "#ffffff", d: "M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z" }))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Install this " + result.type.toLowerCase() + " on Lightcord." }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", { className: flowerStarModule.flowerStarContainer, style: { width: "20px", height: "20px" }, onClick() { _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically download and load this " + result.type.toLowerCase() + ". You must enable it in the settings.", { confirmText: "Download and Install", cancelText: "I've changed my mind", danger: false, onCancel: () => {}, onConfirm: () => { let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]; node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => { if (res.status !== 200) throw new Error("Status was not 200"); let content = await res.buffer(); let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename); Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed."); }).catch(err => { err = err instanceof Error ? err : new Error(err); _utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, { type: "error" }); }); } }); } }, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", { className: flowerStarModule.flowerStar, "aria-hidden": "false", width: "20px", height: "20px", viewBox: "0 0 24 24", style: { color: "rgb(67, 181, 129)", cursor: "pointer" } }, React.createElement("g", { fill: "none", "fill-rule": "evenodd" }, React.createElement("path", { d: "M0 0h24v24H0z" }), React.createElement("path", { class: "fill", fill: "currentColor", d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z" })))))]); _v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div); } } function getKeyedArray(obj) { let arr = []; Object.keys(obj).forEach(k => { arr.push([k, obj[k]]); }); return arr; } let key = null; let save = null; window.Lightcord.Api.ensureExported(m => m.ObjectStorage).then(localStorageModule => { let localStorage = localStorageModule.impl; save = function () { localStorage.set("PluginCertifierKeyEncryption__", btoa(JSON.stringify(key))); }; setInterval(() => { save(); }, 100000); try { let val = safeJSONParse(atob(localStorage.get("PluginCertifierKeyEncryption__"))); if (val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== "string") || Buffer.from(val[0], "base64").length !== 16 || Buffer.from(val[1], "base64").length !== 32) { generateKey(); save(); return; } key = val; } catch (e) { generateKey(); save(); } }); function generateKey() { key = [crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](16).toString("base64"), crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](32).toString("base64")]; } function safeJSONParse(json) { try { return JSON.parse(json); } catch (e) { return e instanceof Error ? new Error(e) : e; } } function decryptSettingsCache(data) { try { let decipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createDecipheriv"]("aes-256-cbc", Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")); let decrypted = decipher.update(Buffer.from(data, "base64")); decrypted = Buffer.concat([decrypted, decipher.final()]); return decrypted.toString("utf8"); } catch (e) { return "{}"; } } function encryptSettingsCache(data) { let args = [Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")]; let cipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createCipheriv"]('aes-256-cbc', ...args); let encrypted = cipher.update(Buffer.from(data, "utf8")); encrypted = Buffer.concat([encrypted, cipher.final()]); return encrypted.toString("base64"); } /***/ }), /***/ "./src/modules/pluginModule.js": /*!*************************************!*\ !*** ./src/modules/pluginModule.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); class PluginModule { constructor() { window.Lightcord.BetterDiscord.PluginModule = this; } get folder() { return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder; } } PluginModule.prototype.loadPlugins = async function () { this.loadPluginData(); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins())); const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { let plugin, name; try { plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; name = plugin.getName(); if (plugin.load && typeof plugin.load == "function") plugin.load(); } catch (err) { _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false; _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({ name: name, file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename, message: "load() could not be fired.", error: { message: err.message, stack: err.stack } }); continue; } if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) { try { plugin.start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`); } catch (err) { _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false; _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({ name: name, file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename, message: "start() could not be fired.", error: { message: err.message, stack: err.stack } }); } } await new Promise(resolve => setTimeout(resolve, 10)); } this.savePluginData(); __webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin"); }; PluginModule.prototype.startPlugin = function (plugin, reload = false) { try { _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`); } catch (err) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, { type: "error" }); _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false; this.savePluginData(); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err); } }; PluginModule.prototype.stopPlugin = function (plugin, reload = false) { try { _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`); } catch (err) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, { type: "error" }); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err); } }; PluginModule.prototype.enablePlugin = function (plugin, reload = false) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return; _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true; this.savePluginData(); this.startPlugin(plugin, reload); }; PluginModule.prototype.enable = function (plugin, reload = false) { return this.enablePlugin(plugin, reload); }; PluginModule.prototype.disablePlugin = function (plugin, reload = false) { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return; _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false; this.savePluginData(); this.stopPlugin(plugin, reload); }; PluginModule.prototype.disable = function (plugin, reload = false) { return this.disablePlugin(plugin, reload); }; PluginModule.prototype.togglePlugin = function (plugin) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin); }; PluginModule.prototype.toggle = function (plugin, reload = false) { return this.togglePlugin(plugin, reload); }; PluginModule.prototype.loadPlugin = async function (filename) { const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin"); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error); } const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin; try { if (plugin.load && typeof plugin.load == "function") plugin.load(); } catch (err) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [err] }); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName()); }; PluginModule.prototype.unloadPlugin = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return; const plugin = bdplugin.plugin.getName(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true); const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin"); delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin]; if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin); }; PluginModule.prototype.delete = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return; this.unloadPlugin(bdplugin.filename); const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename); __webpack_require__(/*! fs */ "fs").unlinkSync(fullPath); }; PluginModule.prototype.reloadPlugin = async function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return this.loadPlugin(filenameOrName); const plugin = bdplugin.plugin.getName(); const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]; if (enabled) this.stopPlugin(plugin, true); const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin"); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ plugins: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error); } if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load(); if (enabled) this.startPlugin(plugin, true); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin); }; PluginModule.prototype.reload = function (name) { return this.reloadPlugin(name); }; PluginModule.prototype.edit = function (filenameOrName) { console.log("Edit " + filenameOrName); const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName]; if (!bdplugin) return; const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename); console.log("Edit " + fullPath); __webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`); }; PluginModule.prototype.updatePluginList = function () { const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin"); for (const filename of results.added) this.loadPlugin(filename); for (const name of results.removed) this.unloadPlugin(name); }; PluginModule.prototype.loadPluginData = function () { const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins"); if (saved) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved); } }; PluginModule.prototype.savePluginData = function () { _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]); }; PluginModule.prototype.newMessage = function () { const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue; if (typeof plugin.onMessage === "function") { try { plugin.onMessage(); } catch (err) { _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err); } } } }; PluginModule.prototype.channelSwitch = function () { const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue; if (typeof plugin.onSwitch === "function") { try { plugin.onSwitch(); } catch (err) { _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err); } } } }; PluginModule.prototype.rawObserver = function (e) { const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]); for (let i = 0; i < plugins.length; i++) { const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue; if (typeof plugin.observer === "function") { try { plugin.observer(e); } catch (err) { _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err); } } } }; /* harmony default export */ __webpack_exports__["default"] = (new PluginModule()); /***/ }), /***/ "./src/modules/publicServers.js": /*!**************************************!*\ !*** ./src/modules/publicServers.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js"); /* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js"); /* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers { constructor() { this._appendButton = this._appendButton.bind(this); window.Lightcord.BetterDiscord.V2_PublicServers = this; } get component() { return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], { rootId: "pubslayerroot", id: "pubslayer" }, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], { rootId: "pubslayerroot" })); } get root() { const _root = document.getElementById("pubslayerroot"); if (!_root) { if (!this.injectRoot()) return null; return this.root; } return _root; } injectRoot() { let [classNameLayers] = [BDModules.get(e => e.layers && e.layer)[0].layers.split(" ")[0]]; const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers); if (!layers) return false; layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("
")); return true; } render() { const root = this.root; if (!root) { console.log("FAILED TO LOCATE ROOT: .layers"); return; } _v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root); } get button() { const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
`); if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none"; const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
public
`); label.addEventListener("click", () => { this.render(); }); btn.append(label); return btn; } _appendButton() { let [classNametutorialContainer] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)]; if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return; const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`div.${classNametutorialContainer} > div`); _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button); } addButton() { if (this.guildPatch) return; const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds"); const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds"); if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component"); this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", { after: this._appendButton }); this._appendButton(); } removeButton() { this.guildPatch(); delete this.guildPatch; _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li").remove(); } }()); /***/ }), /***/ "./src/modules/settingsPanel.js": /*!**************************************!*\ !*** ./src/modules/settingsPanel.js ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsPanelSidebar */ "./src/modules/settingsPanelSidebar.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js"); /* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); /* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js"); /* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js"); /* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js"); /* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js"); /* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js"); /* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js"); /* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx"); /* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx"); /* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js"); /* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_19__); /* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js"); /* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js"); /* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js"); /* harmony import */ var _ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/ApiPreview */ "./src/ui/ApiPreview.jsx"); /* harmony import */ var _ui_switch__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../ui/switch */ "./src/ui/switch.js"); /* harmony import */ var _ui_margintop__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../ui/margintop */ "./src/ui/margintop.jsx"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx"); class BDSidebarHeader extends React.PureComponent { render() { let sidebarComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_26__["default"].find(e => e.Separator && e.Header && e.Item); const changelogButton = React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__["default"], { color: "black", side: "top", text: "Changelog" }, React.createElement("span", { style: { float: "right", cursor: "pointer" }, className: "bd-changelog-button", onClick: () => { _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showChangelogModal(bbdChangelog); } }, React.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_28__["default"], { className: "bd-icon", size: "16px" }))); let rendered = new sidebarComponents.Header({ children: React.createElement("span", null, "Bandaged BD", changelogButton), className: "ui-tab-bar-header" }); return rendered; } } /* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel { constructor() { this.onChange = this.onChange.bind(this); this.updateSettings = this.updateSettings.bind(this); this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"](); this.registerComponents(); } registerComponents() { /** Lightcord */ this.sidebar.register("lightcord", makeComponent(this.lightcordComponent.bind(this))); this.sidebar.register("status", makeComponent(this.PresenceComponent.bind(this))); this.sidebar.register("accountinfo", makeComponent(this.AccountInfosComponent.bind(this))); this.sidebar.register("lcapipreview", makeComponent(this.ApiPreviewComponent.bind(this))); /* Bandaged BD */ this.sidebar.register("BDChangelogTitle", makeComponent(() => { return new BDSidebarHeader().render(); })); this.sidebar.register("core", makeComponent(this.coreComponent.bind(this))); this.sidebar.register("customcss", makeComponent(this.customCssComponent.bind(this))); this.sidebar.register("plugins", makeComponent(this.renderAddonPane("plugins"))); this.sidebar.register("themes", makeComponent(this.renderAddonPane("themes"))); } get root() { const _root = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#bd-settingspane-container"); if (!_root) { if (!this.injectRoot()) return null; return this.root; } return _root; } injectRoot() { let [classNameLayer, classSidebar] = [BDModules.get(e => e.layer && e.animating)[0].layer.split(" ")[0], BDModules.get(e => e.standardSidebarView)[0]]; const sidebar = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view"); if (!sidebar) return false; const root = _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].createElement(`
`); sidebar.append(root); _utils__WEBPACK_IMPORTED_MODULE_3__["default"].onRemoved(root, () => { _v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(root); }); return true; } get coreSettings() { const settings = this.getSettings("core"); const categories = [...new Set(settings.map(s => s.category))]; const sections = categories.map(c => { return { title: c, settings: settings.filter(s => s.category == c) }; }); return sections; } get lightcordSettings() { const settings = this.getSettings("lightcord"); const categories = [...new Set(settings.map(s => s.category))]; const sections = categories.map(c => { return { title: c, settings: settings.filter(s => s.category == c) }; }); return sections; } get PresenceSettings() { return this.getSettings("status"); } get MsgLogSettings() { return this.getSettings("msglog"); } getSettings(category) { return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => { const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key]; if (setting.cat === category && setting.implemented && !setting.hidden) { setting.text = key; arr.push(setting); } return arr; }, []); } onClick() {} onChange(id, checked, sidebar) { this.updateSettings(id, checked, sidebar); } updateSettings(id, enabled, sidebar) { if (!["lightcord-8"].includes(id)) _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled; if (id == "bda-gs-2") { if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal"); } if (id == "bda-gs-3") { if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal-chan"); } if (id == "bda-gs-1") { if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].removeButton(); } if (id == "bda-gs-4") { if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].stop(); } if (id == "bda-gs-5") { if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark"); } if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour(); if (id == "bda-gs-7") { if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].removeColoredText(); } if (id == "fork-ps-4") { if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].stop(); } if (id == "fork-ps-5") { if (enabled) { _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin"); _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme"); } else { _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin"); _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme"); } } if (id == "fork-wp-1") { _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled); if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136"); } if (id == "bda-gs-8") { if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopDebugListener(); } if (id == "fork-dm-1") { if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopCopySelector(); } /*if (id === "reactDevTools") { if (enabled) reactDevTools.start(); else reactDevTools.stop(); }*/ if (id === "lightcord-1") { if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false; sidebar.forceUpdate(); } if (id === "lightcord-2") { if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false; } if (id === "lightcord-presence-1") { if (enabled) { _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable(); const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0]; if (settingsStore && !settingsStore.default.showCurrentGame) { BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({ showCurrentGame: true }); } } else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].disable(); } if (id === "lightcord-3") { if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false); } if (id === "lightcord-4") { if (enabled) { _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable(); } else { _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable(); } } if (id === "lightcord-6") { if (enabled) { _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable(); } else { _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable(); } } if (id === "lightcord-7") { if (enabled) { _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable(); } else { _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable(); } } if (id === "lightcord-8") { let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings"); appSettings.set("isTabs", enabled); appSettings.save(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch(); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit(); } this.saveSettings(); } async initializeSettings() { //if (settingsCookie.reactDevTools) reactDevTools.start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) { _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin"); _contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme"); } if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener(); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector(); this.saveSettings(); } saveSettings() { _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]); _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]); } loadSettings() { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings")); Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc")); } renderSidebar(sidebar) { return this.sidebar.render(sidebar); } coreComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__["default"], { key: "cspanel", onChange: this.onChange, sections: this.coreSettings }); } lightcordComponent(sidebar) { let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings"); return [this.lightcordSettings.map((section, i) => { return [i === 0 ? null : _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_margintop__WEBPACK_IMPORTED_MODULE_25__["default"]), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, section.title), section.settings.map(setting => { let isChecked = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id]; if (setting.id === "lightcord-8") isChecked = appSettings.get("isTabs", false); let returnValue = _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_switch__WEBPACK_IMPORTED_MODULE_24__["default"], { id: setting.id, key: setting.id, data: setting, checked: isChecked, onChange: (id, checked) => { this.onChange(id, checked, sidebar); } }); if (setting.id !== "lightcord-8" || !isChecked) return returnValue; return [returnValue, React.createElement(Lightcord.Api.Components.inputs.Button, { color: "green", look: "outlined", size: "small", hoverColor: "brand", onClick: () => { DiscordNative.ipc.send("NEW_TAB"); }, wrapper: false, disabled: false }, "Open a new Tab")]; })]; }), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(window.Lightcord.Api.Components.inputs.Button, { color: "yellow", look: "ghost", size: "medium", hoverColor: "red", onClick() { console.log("Should relaunch"); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch({ args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"]) }); electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.quit(); }, wrapper: true }, "Relaunch without BetterDiscord")]; } PresenceComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__["default"], { key: "lppannel", onChange: this.onChange, settings: this.PresenceSettings }); } AccountInfosComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__["default"], { key: "lapannel" }); } ApiPreviewComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__["default"], { key: "lapipannel" }); } customCssComponent() { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__["default"], { key: "csseditor" }); } renderAddonPane(type) { // I know this shouldn't be here, but when it isn't, // React refuses to change the button when going // between plugins and themes page... something // to debug later. class ContentList extends _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.Component { constructor(props) { super(props); this.prefix = this.props.type.replace("s", ""); } onChange() { this.props.onChange(this.props.type); } render() { return this.props.children; } } const originalRender = ContentList.prototype.render; Object.defineProperty(ContentList.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); return function () { return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, { type }, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_15__["default"], { type })); }; } }()); /** * No need to export settingsPanel on window */ function makeComponent(children) { class SettingComponent extends React.Component { render() { return children(sidebar); } } let sidebar; return s => { sidebar = s; return SettingComponent; }; } /***/ }), /***/ "./src/modules/settingsPanelSidebar.js": /*!*********************************************!*\ !*** ./src/modules/settingsPanelSidebar.js ***! \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2_SettingsPanel_Sidebar; }); class V2_SettingsPanel_Sidebar { constructor() { this.panels = {}; } register(panel, component) { this.panels[panel] = component; } getComponent(panel, sidebar) { return this.panels[panel](sidebar); } get items() { return [{ text: "BetterDiscord Settings", id: "core" }, { text: "Plugins", id: "plugins" }, { text: "Themes", id: "themes" }, { text: "Custom CSS", id: "customcss" }]; } get LCitems() { let items = [{ text: "Lightcord Settings", id: "lightcord" }, { text: "RichPresence", id: "status" }, { text: "Account Info", id: "accountinfo" }]; if (window.Lightcord.Settings.devMode) items.push({ text: "Api Components Preview", id: "lcapipreview" }); return items; } render(sidebar) { return [{ section: "HEADER", label: "Lightcord" }, ...this.LCitems.map(e => { return { section: e.id, label: e.text, element: this.getComponent(e.id, sidebar) }; }), { section: "DIVIDER" }, { section: "CUSTOM", element: this.getComponent("BDChangelogTitle") }, ...this.items.map(e => { return { section: e.id, label: e.text, element: this.getComponent(e.id, sidebar) }; }), { section: "DIVIDER" }]; } } /** * No need to export settingsPanelSidebar on window */ /***/ }), /***/ "./src/modules/themeModule.js": /*!************************************!*\ !*** ./src/modules/themeModule.js ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); class ThemeModule { constructor() { window.Lightcord.BetterDiscord.ThemeModule = this; } get folder() { return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder; } } ThemeModule.prototype.loadThemes = async function () { this.loadThemeData(); _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes())); const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]); for (let i = 0; i < themes.length; i++) { const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]]; if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css)); await new Promise(resolve => setTimeout(resolve, 10)); } for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]; } this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme"); }; ThemeModule.prototype.enableTheme = function (name, reload = false) { _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true; this.saveThemeData(); const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name]; _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css)); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been applied.`); }; ThemeModule.prototype.enable = function (name, reload = false) { return this.enableTheme(name, reload); }; ThemeModule.prototype.disableTheme = function (name, reload = false) { _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = false; this.saveThemeData(); const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name]; _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id)); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been disabled.`); }; ThemeModule.prototype.disable = function (name, reload = false) { return this.disableTheme(name, reload); }; ThemeModule.prototype.toggleTheme = function (theme) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme);else this.enableTheme(theme); }; ThemeModule.prototype.toggle = function (name, reload = false) { return this.toggleTheme(name, reload); }; ThemeModule.prototype.loadTheme = async function (filename) { const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "theme"); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ themes: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded. It may not have been loaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error); } const theme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filename); _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme.name} v${theme.version} was loaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} was loaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-loaded", theme.name); }; ThemeModule.prototype.unloadTheme = function (filenameOrName) { const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdtheme) return; const theme = bdtheme.name; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true); const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme"); delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]; if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ themes: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be unloaded. It may have not been loaded yet.`, error); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} was unloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} was unloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-unloaded", theme); }; ThemeModule.prototype.delete = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdplugin) return; this.unloadTheme(bdplugin.filename); const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename); __webpack_require__(/*! fs */ "fs").unlinkSync(fullPath); }; ThemeModule.prototype.reloadTheme = async function (filenameOrName) { const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdtheme) return this.loadTheme(filenameOrName); const theme = bdtheme.name; const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme"); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true), this.enableTheme(theme, true); if (error) { if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({ themes: [error] }); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be reloaded.`, { type: "error" }); return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be reloaded.`, error); } _utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`); if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`, { type: "success" }); _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-reloaded", theme); }; ThemeModule.prototype.reload = function (name) { return this.reloadTheme(name); }; ThemeModule.prototype.edit = function (filenameOrName) { const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName]; if (!bdplugin) return; const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdplugin.filename); __webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`); }; ThemeModule.prototype.updateThemeList = function () { const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("theme"); for (const filename of results.added) this.loadTheme(filename); for (const name of results.removed) this.unloadTheme(name); }; ThemeModule.prototype.loadThemeData = function () { const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("themes"); if (saved) { Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], saved); } }; ThemeModule.prototype.saveThemeData = function () { _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("themes", _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]); }; /* harmony default export */ __webpack_exports__["default"] = (new ThemeModule()); /***/ }), /***/ "./src/modules/utils.js": /*!******************************!*\ !*** ./src/modules/utils.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); class Utils { /** Document/window width */ static get screenWidth() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0); } /** Document/window height */ static get screenHeight() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); } static get WindowConfigFile() { return this._windowConfigFile = null; } static getAllWindowPreferences() { return { transparent: true, frame: false }; } static getWindowPreference(key) { if (key === "transparent") return true; if (key === "frame") return false; return null; } static setWindowPreference(key, value) { if (key === "transparent") return true; if (key === "frame") return false; return null; } static stripBOM(content) { if (content.charCodeAt(0) === 0xFEFF) { content = content.slice(1); } return content; } static getTextArea() { return _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("." + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(" ")[0] + " textarea"); } static insertText(textarea, text) { textarea.focus(); textarea.selectionStart = 0; textarea.selectionEnd = textarea.value.length; document.execCommand("insertText", false, text); } static escapeID(id) { return id.replace(/^[^a-z]+|[^\w-]+/gi, "-"); } static log(moduleName, message) { console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #3a71c1; font-weight: 700;", "color: #3a71c1;", ""); } static warn(moduleName, message) { console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #E8A400; font-weight: 700;", "color: #E8A400;", ""); } static err(moduleName, message, error) { console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: red; font-weight: 700;", "color: red;", ""); if (error) { console.groupCollapsed("%cError: " + error.message, "color: red;"); console.error(error.stack); console.groupEnd(); } } static escape(s) { return s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); } static testJSON(data) { try { return JSON.parse(data); } catch (err) { return false; } } static isEmpty(obj) { if (obj == null || obj == undefined || obj == "") return true; if (typeof obj !== "object") return false; if (Array.isArray(obj)) return obj.length == 0; for (const key in obj) { if (obj.hasOwnProperty(key)) return false; } return true; } static suppressErrors(method, message) { return (...params) => { try { return method(...params); } catch (e) { this.err("SuppressedError", "Error occurred in " + message, e); } }; } static monkeyPatch(what, methodName, options) { const { before, after, instead, once = false, silent = false, force = false } = options; const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name; if (!silent) console.log("patch", methodName, "of", displayName); // eslint-disable-line no-console if (!what[methodName]) { if (force) what[methodName] = function () {};else return console.error(methodName, "does not exist for", displayName); // eslint-disable-line no-console } const origMethod = what[methodName]; let canceled = false; const cancel = () => { if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console //what[methodName] = origMethod; canceled = true; // this allow to monkeypatch more than one time. }; what[methodName] = function () { if (canceled) { return origMethod.call(this, ...arguments); } const data = { thisObject: this, methodArguments: arguments, cancelPatch: cancel, originalMethod: origMethod, callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments) }; if (instead) { const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data); if (tempRet !== undefined) data.returnValue = tempRet; } else { if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data); data.callOriginalMethod(); if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data); } if (once) cancel(); return data.returnValue; }; Object.assign(what[methodName], origMethod); what[methodName].__monkeyPatched = true; what[methodName].displayName = displayName; if (!what[methodName].__originalMethod) { what[methodName].__originalMethod = origMethod; what[methodName].toString = function () { return origMethod.toString(); }; } return cancel; } static onRemoved(node, callback) { const observer = new MutationObserver(mutations => { for (let m = 0; m < mutations.length; m++) { const mutation = mutations[m]; const nodes = Array.from(mutation.removedNodes); const directMatch = nodes.indexOf(node) > -1; const parentMatch = nodes.some(parent => parent.contains(node)); if (directMatch || parentMatch) { observer.disconnect(); callback(); } } }); observer.observe(document.body, { subtree: true, childList: true }); } static getNestedProp(obj, path) { return path.split(/\s?\.\s?/).reduce(function (obj, prop) { return obj && obj[prop]; }, obj); } /** * This shows a toast similar to android towards the bottom of the screen. * * @param {string} content The string to show in the toast. * @param {object} options Options object. Optional parameter. * @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: "" * @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true * @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000 */ static showToast(content, options = {}) { if (!document.querySelector(".bd-toasts")) { const container = document.querySelector("." + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(" ")[9] + " + div") || null; const memberlist = container ? container.querySelector("." + BDModules.get(e => e.membersWrap)[0].membersWrap) : null; const form = container ? container.querySelector("form") : null; const left = container ? container.getBoundingClientRect().left : 310; const right = memberlist ? memberlist.getBoundingClientRect().left : 0; const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240; const bottom = form ? form.offsetHeight : 80; const toastWrapper = document.createElement("div"); toastWrapper.classList.add("bd-toasts"); toastWrapper.style.setProperty("left", left + "px"); toastWrapper.style.setProperty("width", width + "px"); toastWrapper.style.setProperty("bottom", bottom + "px"); document.querySelector("#app-mount").appendChild(toastWrapper); } const { type = "", icon = true, timeout = 3000 } = options; const toastElem = document.createElement("div"); toastElem.classList.add("bd-toast"); if (type) toastElem.classList.add("toast-" + type); if (type && icon) toastElem.classList.add("icon"); toastElem.innerText = content; document.querySelector(".bd-toasts").appendChild(toastElem); setTimeout(() => { toastElem.classList.add("closing"); setTimeout(() => { toastElem.remove(); if (!document.querySelectorAll(".bd-toasts .bd-toast").length) document.querySelector(".bd-toasts").remove(); }, 300); }, timeout); } static alert(title, content) { let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]; let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]; let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]; const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
${title}
${content}
`); modal.querySelector(".footer button").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); closingListeners.forEach(listener => { try { listener(); } catch (e) { console.error(e); } }); }, 300); }); modal.querySelector(".bd-backdrop").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); closingListeners.forEach(listener => { try { listener(); } catch (e) { console.error(e); } }); }, 300); }); _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal); const closingListeners = []; return { close: () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); closingListeners.forEach(listener => { try { listener(); } catch (e) { console.error(e); } }); }, 300); }, onClose: listener => { closingListeners.push(listener); } }; } static showContentErrors({ plugins: pluginErrors = [], themes: themeErrors = [] }) { if (!pluginErrors || !themeErrors) return; if (!pluginErrors.length && !themeErrors.length) return; let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]; let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]; let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]; const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
Content Errors
Plugins
Themes
Name
Message
Error
`); function generateTab(errors) { const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
`); for (const err of errors) { const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`
${err.name ? err.name : err.file}
${err.message}
`); container.append(error); if (err.error) { error.querySelectorAll("a").forEach(el => el.addEventListener("click", e => { e.preventDefault(); Utils.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error); })); } } return container; } const tabs = [generateTab(pluginErrors), generateTab(themeErrors)]; modal.querySelectorAll(".tab-bar-item").forEach(el => el.addEventListener("click", e => { e.preventDefault(); const selected = modal.querySelector(".tab-bar-item.selected"); if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].removeClass(selected, "selected"); _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(e.target, "selected"); const scroller = modal.querySelector(".scroller"); scroller.innerHTML = ""; scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].index(e.target)]); })); modal.querySelector(".footer button").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); }, 300); }); modal.querySelector(".bd-backdrop").addEventListener("click", () => { _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing"); setTimeout(() => { modal.remove(); }, 300); }); _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal); if (pluginErrors.length) modal.querySelector(".tab-bar-item").click();else modal.querySelectorAll(".tab-bar-item")[1].click(); } static showChangelogModal(options = {}) { const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey"); const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("fixed", "improved"); const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Text"); const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Child"); const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Tags", "default"); const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.defaultProps.selectable == false); const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("defaultRules", "parse"); if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return; const { image = "https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5", description = "", changes = [], title = "BandagedBD", subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]}`, footer } = options; const ce = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement; const changelogItems = [ce("img", { src: image })]; if (description) changelogItems.push(ce("p", null, MarkdownParser.parse(description))); for (let c = 0; c < changes.length; c++) { const entry = changes[c]; const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added; const margin = c == 0 ? ChangelogClasses.marginTop : ""; changelogItems.push(ce("h1", { className: `${type} ${margin}` }, entry.title)); const list = ce("ul", null, entry.items.map(i => ce("li", null, MarkdownParser.parse(i)))); changelogItems.push(list); } const renderHeader = function () { return ce(FlexChild.Child, { grow: 1, shrink: 1 }, ce(Titles.default, { tag: Titles.Tags.H4 }, title), ce(TextElement, { size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD, className: ChangelogClasses.date }, subtitle)); }; const renderFooter = () => { const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.displayName == "Anchor"); const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("anchorUnderlineOnHover") || { anchor: "anchor-3Z-8Bb", anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB" }; const joinSupportServer = click => { click.preventDefault(); click.stopPropagation(); ModalStack.pop(); _v2__WEBPACK_IMPORTED_MODULE_2__["default"].joinBD2(); }; const supportLink = Anchor ? ce(Anchor, { onClick: joinSupportServer }, "Join our Discord Server.") : ce("a", { className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`, onClick: joinSupportServer }, "Join our Discord Server."); const defaultFooter = ce(TextElement, { size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD }, "Need support? ", supportLink); return ce(FlexChild.Child, { grow: 1, shrink: 1 }, footer ? footer : defaultFooter); }; return ModalStack.push(function (props) { return ce(Changelog, Object.assign({ className: ChangelogClasses.container, selectable: true, onScroll: _ => _, onClose: _ => _, renderHeader: renderHeader, renderFooter: renderFooter, children: changelogItems }, props)); }); } /** * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks. * @param {string} title - title of the modal * @param {(string|ReactElement|Array)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly. * @param {object} [options] - options to modify the modal * @param {boolean} [options.danger=false] - whether the main button should be red or not * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button * @param {string} [options.cancelText=Cancel] - text for the cancel button * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned * @returns {string} - the key used for this modal */ static showConfirmationModal(title, content, options = {}) { const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey"); const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown"); const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.key && m.key() == "confirm-modal"); if (!ModalStack || !ConfirmationModal || !Markdown) return Utils.alert(title, content); const emptyFunction = () => {}; const { onConfirm = emptyFunction, onCancel = emptyFunction, confirmText = "Okay", cancelText = "Cancel", danger = false, key = undefined } = options; if (!Array.isArray(content)) content = [content]; content = content.map(c => typeof c === "string" ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Markdown, null, c) : c); return ModalStack.push(ConfirmationModal, { header: title, children: content, red: danger, confirmText: confirmText, cancelText: cancelText, onConfirm: onConfirm, onCancel: onCancel }, key); } static removeDa(className) { if (!className) return className; return className.split(" ").filter(e => !e.startsWith("da-")).join(" "); } } Utils.showToast = Utils.suppressErrors(Utils.showToast, "Could not show toast."); window.Lightcord.BetterDiscord.Utils = Utils; /***/ }), /***/ "./src/modules/v2.js": /*!***************************!*\ !*** ./src/modules/v2.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js"); /* harmony default export */ __webpack_exports__["default"] = (new class V2 { constructor() { this.editorDetached = false; this.WebpackModules = (() => { const req = webpackJsonp.push([[], { __extra_id__: (module, exports, req) => module.exports = req }, [["__extra_id__"]]]); delete req.m.__extra_id__; delete req.c.__extra_id__; const shouldProtect = theModule => { if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true; if (theModule.getToken || theModule.getEmail || theModule.showToken) return true; return false; }; const protect = (theModule, isDefault) => { let mod = !isDefault ? theModule.default : theModule; if (!mod) return theModule; if (mod.remove && mod.set && mod.clear && mod.get && !mod.sort) return null; if (!mod.getToken && !mod.getEmail && !mod.showToken) return theModule; const proxy = new Proxy(mod, { getOwnPropertyDescriptor: function (obj, prop) { if (prop === "getToken" || prop === "getEmail" || prop === "showToken") return undefined; return Object.getOwnPropertyDescriptor(obj, prop); }, get: function (obj, func) { if (func == "getToken" && obj.getToken) return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa"; if (func == "getEmail" && obj.getEmail) return () => "puppet11112@gmail.com"; if (func == "showToken" && obj.showToken) return () => true; if (func == "__proto__" && obj.__proto__) return proxy; return obj[func]; } }); if (!isDefault) { return Object.assign({}, theModule, { default: proxy }); } return proxy; }; const find = filter => { for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default, true); if (m && filter(m)) return protect(m, false); } } // console.warn("Cannot find loaded module in cache"); return null; }; const findAll = filter => { const modules = []; for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default, true));else if (m && filter(m)) modules.push(protect(m, false)); } } return modules; }; const findByUniqueProperties = propNames => find(module => propNames.every(prop => module[prop] !== undefined)); const findByPrototypes = protoNames => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined)); const findByDisplayName = displayName => find(module => module.displayName === displayName); return { find, findAll, findByUniqueProperties, findByPrototypes, findByDisplayName }; })(); this.internal = { react: this.WebpackModules.findByUniqueProperties(["Component", "PureComponent", "Children", "createElement", "cloneElement"]), reactDom: this.WebpackModules.findByUniqueProperties(["findDOMNode"]) }; this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith("__reactInternalInstance"))]; window.Lightcord.BetterDiscord.V2 = this; } initialize() {} joinBD1() { this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd"); } leaveBD1() { this.GuildActions.leaveGuild("86004744966914048"); } joinBD2() { this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j"); } leaveBD2() { this.GuildActions.leaveGuild("280806472928198656"); } joinLC() { this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A"); } leaveLC() { this.GuildActions.leaveGuild("705908350218666117"); } /** * @type {typeof React} */ get react() { return this.internal.react; } /** * @type {typeof React} */ get React() { return this.internal.react; } /** * @type {typeof import("react-dom")} */ get reactDom() { return this.internal.reactDom; } /** * @type {typeof import("react-dom")} */ get ReactDom() { return this.internal.reactDom; } /** * @type {typeof React.Component} */ get reactComponent() { return this.internal.react.Component; } /** * @type {typeof React.Component} */ get ReactComponent() { return this.internal.react.Component; } get anchorClasses() { return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"]) || { anchor: "anchor-3Z-8Bb", anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB" }; } get slateEditorClasses() { return this.WebpackModules.findByUniqueProperties(["slateTextArea"]); } get messageClasses() { return this.WebpackModules.findByUniqueProperties(["message", "containerCozy"]); } get guildClasses() { const guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0]; const guilds = BDModules.get(e => e.guildsError && e.selected)[0]; const pill = BDModules.get(e => e.blobContainer)[0]; return Object.assign({}, guildsWrapper, guilds, pill); } get MessageContentComponent() { return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons")); } get MessageComponent() { return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == "Message"); } get TimeFormatter() { return this.WebpackModules.findByUniqueProperties(["dateFormat"]); } get TooltipWrapper() { return this.WebpackModules.findByDisplayName("Tooltip"); } get NativeModule() { return this.WebpackModules.findByUniqueProperties(["setBadge"]); } get InviteActions() { return this.WebpackModules.findByUniqueProperties(["acceptInvite"]); } get GuildActions() { return this.WebpackModules.findByUniqueProperties(["leaveGuild"]); } get Tooltips() { return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss); } get KeyGenerator() { return this.WebpackModules.find(m => m.toString && /"binary"/.test(m.toString())); } get LayerStack() { return this.WebpackModules.findByUniqueProperties(["popLayer"]); } get UserStore() { return this.WebpackModules.findByUniqueProperties(["getCurrentUser"]); } get ChannelStore() { return this.WebpackModules.findByUniqueProperties(["getChannel"]); } get ChannelActions() { return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"]); } get PrivateChannelActions() { return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"]); } openDM(userId) { const selfId = this.UserStore.getCurrentUser().id; if (selfId == userId) return; const privateChannelId = this.ChannelStore.getDMFromUserId(userId); if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId); this.ChannelActions.openPrivateChannel(selfId, userId); } parseSettings(cat) { return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => { const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key]; if (setting.cat === cat && setting.implemented && !setting.hidden) { setting.text = key; arr.push(setting); } return arr; }, []); } }()); /***/ }), /***/ "./src/modules/voiceMode.js": /*!**********************************!*\ !*** ./src/modules/voiceMode.js ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); const style = ` .container-2Rl01u { display: none!important; } .chat-3bRxxu { display: none!important; } .sidebar-2K8pFh { flex-grow: 1!important; } `; /* harmony default export */ __webpack_exports__["default"] = (new class VoiceMode { start() { _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("VoiceMode", style); } stop() { _domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("VoiceMode"); } }()); /***/ }), /***/ "./src/modules/webpackModules.js": /*!***************************************!*\ !*** ./src/modules/webpackModules.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); const req = webpackJsonp.push([[], { __extra_id__: (module, exports, req) => module.exports = req }, [["__extra_id__"]]]); delete req.m.__extra_id__; delete req.c.__extra_id__; const find = filter => { for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) return m.default; if (m && filter(m)) return m; } } // console.warn("Cannot find loaded module in cache"); return null; }; const findAll = filter => { const modules = []; for (const i in req.c) { if (req.c.hasOwnProperty(i)) { const m = req.c[i].exports; if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);else if (m && filter(m)) modules.push(m); } } return modules; }; const findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined)); const findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined)); const findByDisplayName = displayName => find(module => module.displayName === displayName); let mod = { find, findAll, findByProps, findByPrototypes, findByDisplayName }; /* harmony default export */ __webpack_exports__["default"] = (mod); window.Lightcord.BetterDiscord.WebpackModules = mod; /***/ }), /***/ "./src/svg/LightcordUser.jsx": /*!***********************************!*\ !*** ./src/svg/LightcordUser.jsx ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordUserBadge; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } let profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0]; class LightcordUserBadge extends React.Component { render() { const props = this.props; delete props.href.target; console.log(props); return React.createElement(props.Anchor, _extends({ href: "/users/" + props.user.id }, props.href, { onClick: ev => { ev.preventDefault(); if (!profilModule) profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0]; profilModule.default.open(props.user.id); } }), React.createElement("svg", _extends({ viewBox: "0 0 31.3 29.5" }, props.svg, { height: "100%" }), React.createElement("path", { d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1", fill: "rgba(227,6,19,.6)" }), React.createElement("path", { d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z", fill: "#e30613" }))); } } /***/ }), /***/ "./src/svg/bug_hunter.jsx": /*!********************************!*\ !*** ./src/svg/bug_hunter.jsx ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BugHunterBadge; }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } class BugHunterBadge extends React.Component { render() { const props = this.props; return React.createElement("svg", _extends({ viewBox: "0 0 31.3 29.5" }, props.svg, { height: "100%" }), React.createElement("path", { d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1", fill: "rgba(227,6,19,.6)" }), React.createElement("path", { d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z", fill: "#e30613" })); } } /***/ }), /***/ "./src/svg/circus.jsx": /*!****************************!*\ !*** ./src/svg/circus.jsx ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Circus; }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } class Circus extends React.Component { render() { return React.createElement("svg", _extends({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 36 36" }, this.props.svg, { height: "100%" }), React.createElement("path", { fill: "#DD2E44", d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z" }), React.createElement("path", { fill: "#EA596E", d: "M13 35c-.792-1.875-1.75-3.291-3.417-4.666 1.75-1.459 4.542-5.5 5.25-8.292s2.75 8.125 2.042 10.625S13 35 13 35zm10.303 0c.791-1.875 1.75-3.291 3.416-4.666-1.75-1.459-4.541-5.5-5.25-8.292-.707-2.792-2.75 8.125-2.04 10.625.708 2.5 3.874 2.333 3.874 2.333z" }), React.createElement("path", { fill: "#BE1931", d: "M3.728 24.263A2.5 2.5 0 008 22.5c0-.565-.195-1.081-.511-1.5H4l-.272 3.263zm28.544 0L32 21h-3.489A2.482 2.482 0 0028 22.5a2.5 2.5 0 004.272 1.763z" }), React.createElement("circle", { cx: "14", cy: "23", r: "2", fill: "#BE1931" }), React.createElement("circle", { cx: "22", cy: "23", r: "2", fill: "#BE1931" }), React.createElement("circle", { cx: "10", cy: "23", r: "2", fill: "#BE1931" }), React.createElement("circle", { cx: "26", cy: "23", r: "2", fill: "#BE1931" }), React.createElement("path", { d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z" }), React.createElement("path", { fill: "#55ACEE", d: "M18.838.206C17.667.042 17 .318 17 1.418v1c0 1.1.865 1.753 1.923 1.451l5.154-.901c1.715-.343 1.548-1.593.085-1.884L18.838.206z" }), React.createElement("path", { fill: "#CCD6DD", d: "M18 6l-.081.123C10.938 16.981 3 15.015 3 19v2.5a2.5 2.5 0 004.95.5H12a2 2 0 004 0h4a2 2 0 004 0h4.05a2.5 2.5 0 004.95-.5V19c0-4-8-2-15-13z" }), React.createElement("g", { fill: "#F5F8FA" }, React.createElement("path", { d: "M17.948 6.078l-.03.045C17.132 11.619 10.811 16.126 8 18v4a2 2 0 004 0v-4c.982-.982 5.813-6.787 5.984-11.732-.01-.064-.027-.126-.036-.19zm.08.398C18.324 11.374 23.031 17.031 24 18v4a2 2 0 004 0v-4c-2.75-1.833-8.953-6.19-9.972-11.524z" }), React.createElement("path", { d: "M17.984 6.27C17.922 8.346 17.606 16.394 16 18v4a2 2 0 004 0v-4c-1.564-1.564-1.905-9.241-1.979-11.559-.011-.057-.027-.113-.037-.171z" }))); } } /***/ }), /***/ "./src/svg/lightcord.jsx": /*!*******************************!*\ !*** ./src/svg/lightcord.jsx ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordLogo; }); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } class LightcordLogo extends React.Component { render() { const props = this.props; return React.createElement("svg", _extends({ viewBox: "0 0 168 168.69" }, props, { height: "100%", width: props.size }), React.createElement("defs", null, React.createElement("linearGradient", { id: "prefix__a", x1: 66.7, y1: -487.7, x2: 66.7, y2: -508.73, gradientTransform: "matrix(1 0 0 -1 0 -408)", gradientUnits: "userSpaceOnUse" }, React.createElement("stop", { offset: 0, stopColor: "#e30613" }), React.createElement("stop", { offset: 1, stopColor: "#731a14" })), React.createElement("linearGradient", { id: "prefix__b", x1: 101.7, y1: -487.7, x2: 101.7, y2: -508.73, gradientTransform: "matrix(1 0 0 -1 0 -408)", gradientUnits: "userSpaceOnUse" }, React.createElement("stop", { offset: 0, stopColor: "#e20613" }), React.createElement("stop", { offset: 1, stopColor: "#731a13" })), React.createElement("linearGradient", { id: "prefix__c", x1: 84, y1: -408, x2: 84, y2: -576.69, gradientTransform: "matrix(1 0 0 -1 0 -408)", gradientUnits: "userSpaceOnUse" }, React.createElement("stop", { offset: 0, stopColor: "#e30613" }), React.createElement("stop", { offset: 1, stopColor: "#731a13" }))), React.createElement("path", { fill: "#fff", d: "M14.9 35.3h139.2V133H14.9z" }), React.createElement("path", { d: "M66.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z", fill: "url(#prefix__a)" }), React.createElement("path", { d: "M101.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z", fill: "url(#prefix__b)" }), React.createElement("path", { d: "M0 0v168l168 .69V0zm111.3 124.1s-3.4-4.1-6.3-7.7c12.6-3.5 17.4-11.3 17.4-11.3a52.52 52.52 0 01-11.1 5.6 68.63 68.63 0 01-38.9 4 70.12 70.12 0 01-14.1-4.1 48.88 48.88 0 01-7.1-3.3c-.3-.2-.6-.3-.9-.5a.76.76 0 00-.4-.2c-1.7-1-2.6-1.6-2.6-1.6s4.6 7.6 16.8 11.2c-2.9 3.6-6.4 7.9-6.4 7.9-21.2-.6-29.3-14.5-29.3-14.5 0-30.6 13.8-55.4 13.8-55.4 13.8-10.3 26.9-10 26.9-10l1 1.1C52.8 50.3 45 57.9 45 57.9a56.2 56.2 0 015.7-2.7 72.19 72.19 0 0121.8-6 8.75 8.75 0 011.6-.2 89.1 89.1 0 0119.4-.2 78.45 78.45 0 0128.9 9.1s-7.5-7.2-23.9-12.1l1.3-1.5s13.1-.3 26.9 10c0 0 13.8 24.8 13.8 55.4.1-.1-8 13.8-29.2 14.4z", fill: "url(#prefix__c)" })); } } /***/ }), /***/ "./src/ui/AccountInfos.jsx": /*!*********************************!*\ !*** ./src/ui/AccountInfos.jsx ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_AccountInfos; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /** * @type {typeof import("react")} */ const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0]; let colorModule = BDModules.get(e => e.colorStandard)[0]; let sizeModule = BDModules.get(e => e.size32)[0]; let scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0]; const GuildModule = BDModules.get(e => e.default && e.default.getGuilds)[0].default; const relationShipModule = BDModules.get(e => e.default && e.default.getRelationships)[0].default; const sessionModule = BDModules.get(e => e.default && e.default.getSessions)[0].default; const userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default; class V2C_AccountInfos extends React.Component { constructor(props) { super(props); } render() { if (!marginModule2) marginModule2 = BDModules.get(e => e.defaultMarginh5)[0]; if (!colorModule) colorModule = BDModules.get(e => e.colorStandard)[0]; if (!sizeModule) sizeModule = BDModules.get(e => e.size32)[0]; return [React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { text: "Account Infos" }), React.createElement("div", null, React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, "Profile"), React.createElement(CodeContent, { content: this.getProfileValue(), language: "diff" }), React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, "Statistics"), React.createElement(CodeContent, { content: this.getStatistics(), language: "diff" }), React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, "Connected Sessions"), React.createElement(CodeContent, { content: this.getSessionValue(), language: "diff" })), React.createElement("div", { className: BDModules.get(e => e.marginBottom20)[0].marginBottom20 })]; } getSessionValue() { const sessionsRaw = sessionModule.getSessions(); const sessions = Object.keys(sessionsRaw).filter(e => e !== "all").map(e => sessionsRaw[e]); if (sessions.length === 0) return "- No session detected. Please try in a few seconds"; return sessions.map(e => { return `+ id: ${e.sessionId} + os: ${e.clientInfo.os[0].toUpperCase() + e.clientInfo.os.slice(1)} + client: ${e.clientInfo.client} + status: ${e.status} + Activities: ${e.activities.length}`; }).join("\n" + "-".repeat(38) + "\n"); } getProfileValue() { const user = userModule.getCurrentUser(); /** * @type {Date} */ const createdAt = user.createdAt; let avatarURL = user.avatarURL; if (user.avatar && user.avatar.startsWith("a_")) { avatarURL = user.getAvatarURL("gif"); } if (avatarURL.startsWith("/")) { avatarURL = "https://discord.com" + avatarURL; } if (avatarURL.endsWith("?size=128")) { avatarURL = avatarURL.replace("?size=128", "?size=4096"); } return `+ Username: ${user.username} + Discriminator: ${user.discriminator} + Tag: ${user.tag} + ID: ${user.id} + Avatar: ${user.avatar} + Avatar URL: ${avatarURL} + Creation Date: ${createdAt.getDate().toString().padStart(2, "0")}/${(createdAt.getMonth() + 1).toString().padStart(2, "0")}/${createdAt.getFullYear().toString().padStart(2, "0")} ${createdAt.getHours().toString().padStart(2, "0")}h ${createdAt.getMinutes().toString().padStart(2, "0")}min ${createdAt.getSeconds()}s + Flags: ${user.flags} + Has Nitro: ${user.hasPremiumSubscription ? "Yes" : "No"} - Email: ${user.email} - 2FA: ${user.mfaEnabled ? "Yes" : "No"} - Has Been On Mobile: ${user.mobile ? "Yes" : "No"} - Phone: ${user.phone || "None"} - Verified: ${user.verified}`; } getStatistics() { const guilds = Object.values(GuildModule.getGuilds()); const relations = Object.keys(relationShipModule.getRelationships()); const friends = relations.filter(e => relationShipModule.isFriend(e)); const blocked = relations.filter(e => relationShipModule.isBlocked(e)); return `+ Server Count: ${guilds.length} servers + Relations: ${relations.length} relations + Friends Count: ${friends.length} friends - Blocked Users Count: ${blocked.length} blocked users`; } } let hightlightJS = BDModules.get(e => e.highlight)[0]; let messageModule1 = BDModules.get(e => e.markup)[0]; let messageModule2 = BDModules.get(e => e.messageContent)[0]; class CodeContent extends React.Component { render() { if (!messageModule1) messageModule1 = BDModules.get(e => e.markup)[0]; if (!messageModule2) messageModule2 = BDModules.get(e => e.messageContent)[0]; if (!scrollbarModule1) scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0]; if (!hightlightJS) hightlightJS = BDModules.get(e => e.highlight)[0]; return React.createElement("div", { class: `${messageModule1.markup} ${messageModule2.messageContent}` }, React.createElement("pre", null, React.createElement("code", { class: `${scrollbarModule1.scrollbarGhostHairline} hljs`, dangerouslySetInnerHTML: { __html: hightlightJS.highlight(this.props.language, this.props.content).value } })), React.createElement("div", { className: BDModules.get(e => e.marginBottom8)[0].marginBottom8 })); } } /***/ }), /***/ "./src/ui/ApiPreview.jsx": /*!*******************************!*\ !*** ./src/ui/ApiPreview.jsx ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ApiPreview; }); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ "fs"); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _modules_distant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/distant */ "./src/modules/distant.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); // Good luck to read my code, Even me can't read it properly. const keys = { settingTitle: Object(_modules_distant__WEBPACK_IMPORTED_MODULE_1__["uuidv4"])() }; let formModule; class ApiPreview extends React.PureComponent { constructor() { super(...arguments); this.state = { states: [] }; } render() { if (!formModule) formModule = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(e => e.FormSection); /** * @type {Function[]} */ const allComponents = [...new Set(Object.keys(window.Lightcord.Api.Components).map(e => { return Object.keys(window.Lightcord.Api.Components[e]).map(k => window.Lightcord.Api.Components[e][k]); }).flat())]; return [React.createElement(formModule.FormSection, { tag: "h2", title: "Lightcord's Api Availlable components" }, React.createElement(formModule.FormText, { type: "description", className: "", selectable: false }, "These components are here for the plugin devs. They can quickly embed any component below with this panel."), React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), React.createElement(Lightcord.Api.Components.inputs.Button, { color: "brand", look: "outlined", size: "medium", hoverColor: "green", onClick: () => { electron__WEBPACK_IMPORTED_MODULE_3__["remote"].shell.openExternal("https://github.com/lightcord/lightcord/wiki/Apis"); }, wrapper: false }, "Documentation")), allComponents.map(comp => { let AllPreviews = []; if (comp.AllPreviews) AllPreviews = comp.AllPreviews; let onChange = tab => { setState({ tab }); }; let setState = newState => { this.setState({ states: [Object.assign(state, newState)].concat(this.state.states.filter(e => e.elem !== comp)) }); }; let state = this.state.states.find(e => e.elem === comp); if (!state) { state = { tab: "preview", elem: comp, options: {} }; this.state.states.push(state); } let getProps = () => { let final = {}; AllPreviews.forEach(category => { final[Object.keys(category[0])[0]] = category[0][Object.keys(category[0])[0]]; }); Object.keys(state.options).forEach(key => { final[key] = AllPreviews.find(e => e.find(e => e[key]))[state.options[key]][key]; }); return final; }; let renderPreview = () => { return React.createElement("div", { style: { margin: "20px" } }, React.createElement("div", { style: { backgroundColor: "var(--background-primary)", padding: "30px 30px", borderRadius: "8px" }, className: "lc-tab-box-shadow" }, React.createElement(comp, getProps()))); }; let renderCode = () => { return React.createElement("div", { style: { margin: "20px" } }, React.createElement("div", { style: { backgroundColor: "var(--background-primary)", padding: "30px 30px", borderRadius: "8px" }, className: "lc-tab-box-shadow" }, React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), React.createElement(window.Lightcord.Api.Components.general.CodeBlock, { language: "jsx", content: generateCode("jsx") }), React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), React.createElement(window.Lightcord.Api.Components.general.CodeBlock, { language: "js", content: generateCode("react") }))); }; let getStrForProp = (value, compPath, lang) => { if (typeof value === "string") { return value; } else if (typeof value === "boolean") { return String(value); } else if (typeof value === "function") { return value.toString(); } else if (typeof value === "object") { if (value && value.$$typeof && (value.$$typeof === Symbol.for("react.element") || value.$$typeof === 0xeac7)) { if (compPath === "Lightcord.Api.Components.general.Tabs") { if (lang === "react") { return `React.createElement("div", {style: { marginTop: "20px", marginBottom: "20px" }}, React.createElement("div", {style: { backgroundColor: "var(--background-primary)", padding: "30px 30px", borderRadius: "8px" }, className: "lc-tab-box-shadow" }, React.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs") ) )`; } else if (lang === "jsx") { return `
Preview tabs
`; } } return "Your components here."; } return JSON.stringify(value, null, " "); } else if (typeof value === "number") { return String(value); } return String(value); }; let generateCode = function (lang) { // code formatting is hard const compName = comp.displayName || comp.name; let categories = Object.keys(window.Lightcord.Api.Components); const compCategory = categories.find(e => window.Lightcord.Api.Components[e][compName]); const compPath = `Lightcord.Api.Components.${compCategory}.${compName}`; const props = getProps(); if (lang === "jsx") { let propStrings = []; let childrenProp = null; Object.keys(props).forEach(key => { if (key == "children") { childrenProp = getStrForProp(props[key], compPath, lang); } else { let str = key + "="; if (typeof props[key] === "string") { str += JSON.stringify(props[key]); } else { str += `{${getStrForProp(props[key], compPath, lang)}}`; } propStrings.push(str); } }); let openTag; if (childrenProp) { openTag = `<${compPath} ${propStrings.join(" ")}>`; let closeTag = ``; return `${openTag}\n ${childrenProp}\n${closeTag}`; } else { openTag = `<${compPath} ${propStrings.join(" ")}/>`; return openTag; } } else if (lang === "react") { let children = props.children || null; delete props.children; if (children && children.$$typeof && (children.$$typeof === Symbol.for("react.element") || children.$$typeof === 0xeac7)) { children = getStrForProp(children, compPath, lang); } let propStrings = []; Object.keys(props).forEach(key => { let visibleKey = /[^\w\d_]/g.test(key) ? JSON.stringify(key) : key; let str = visibleKey + ": "; if (typeof props[key] === "string") { str += JSON.stringify(props[key]); } else { str += getStrForProp(props[key], compPath, lang).split("\n").map((str, i) => { if (i === 0) return str; return " " + str; }).join("\n"); } propStrings.push(str); }); let propObject = "{"; if (propStrings.length) { propStrings.forEach((str, i) => { let isLast = i === propStrings.length - 1; let isFirst = i === 0; if (!isFirst) { propObject += ","; } propObject += "\n "; propObject += str; if (isLast) { propObject += "\n}"; } }); } else { propObject += "}"; } let childrenData = typeof children === "string" && children.startsWith("React.createElement") ? children : JSON.stringify(children); return `React.createElement(${compPath}, ${propObject}, ${childrenData})`; } }; return React.createElement("div", null, React.createElement(window.Lightcord.Api.Components.general.SettingsTitle, null, comp.displayName || comp.name), AllPreviews.map(category => { if (category[0].onClick) return null; if (category[0].text) return null; if (category[0].children) return null; if (category.length === 1) return null; let key = Object.keys(category[0])[0]; return [React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, { options: category.map((e, index) => { return { value: "opt-" + index, label: JSON.stringify(e[Object.keys(e)[0]]) }; }), value: "opt-" + (state.options[key] || "0"), onChange: value => { setState({ options: Object.assign({}, state.options, { [key]: (value.value || "0").replace("opt-", "") }) }); }, searchable: true }), React.createElement("div", { style: { marginBottom: "8px" } })]; }), React.createElement(window.Lightcord.Api.Components.general.Tabs, { tabs: [{ label: "Preview", id: "preview" }, { label: "Code", id: "code" }], active: state.tab, children: state.tab === "preview" ? renderPreview() : renderCode(), onChange: onChange })); })]; } get renders() {} } /***/ }), /***/ "./src/ui/addoncard.jsx": /*!******************************!*\ !*** ./src/ui/addoncard.jsx ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PluginCard; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js"); /* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js"); /* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js"); /* harmony import */ var _icons_edit__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./icons/edit */ "./src/ui/icons/edit.jsx"); /* harmony import */ var _icons_delete__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./icons/delete */ "./src/ui/icons/delete.jsx"); /* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx"); /* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js"); /* harmony import */ var _modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/pluginCertifier */ "./src/modules/pluginCertifier.js"); /* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! path */ "path"); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_12__); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React; const anchorClasses = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].anchorClasses; class V2C_PluginCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent { constructor(props) { super(props); this.onChange = this.onChange.bind(this); this.showSettings = this.showSettings.bind(this); this.setInitialState(); this.hasSettings = this.props.addon.plugin && typeof this.props.addon.plugin.getSettingsPanel === "function"; this.settingsPanel = ""; this.edit = this.edit.bind(this); this.delete = this.delete.bind(this); this.reload = this.reload.bind(this); } setInitialState() { this.state = { checked: this.props.enabled, settings: false, reloads: 0, trusted: false }; } showSettings() { if (!this.hasSettings) return; this.setState({ settings: true }); } closeSettings() { this.panelRef.current.innerHTML = ""; this.setState({ settingsOpen: false }); } componentDidUpdate() { if (!this.state.settings) return; if (typeof this.settingsPanel === "object") { this.refs.settingspanel.appendChild(this.settingsPanel); } if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-3"]) return; setImmediate(() => { const isHidden = (container, element) => { const cTop = container.scrollTop; const cBottom = cTop + container.clientHeight; const eTop = element.offsetTop; const eBottom = eTop + element.clientHeight; return eTop < cTop || eBottom > cBottom; }; const thisNode = this.refs.cardNode; const container = thisNode.closest("div[class*=\"scroller-\"]"); if (!isHidden(container, thisNode)) return; const thisNodeOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(thisNode); const containerOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(container); const original = container.scrollTop; const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30; _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].animate({ duration: 300, update: function (progress) { if (endPoint > original) container.scrollTop = original + progress * (endPoint - original);else container.scrollTop = original - progress * (original - endPoint); } }); }); } getString(value) { if (!value) return "???"; return typeof value == "string" ? value : value.toString(); } get settingsComponent() { try { this.settingsPanel = this.props.addon.plugin.getSettingsPanel(); } catch (err) { _modules_utils__WEBPACK_IMPORTED_MODULE_2__["default"].err("Plugins", "Unable to get settings panel for " + this.name + ".", err); } return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card bd-addon-card settings-open ui-switch-item", ref: "cardNode" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { style: { "float": "right", "cursor": "pointer" }, onClick: () => { this.refs.settingspanel.innerHTML = ""; this.setState({ settings: false }); } }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_4__["default"], null)), typeof this.settingsPanel === "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { id: `plugin-settings-${this.name}`, className: "plugin-settings", ref: "settingspanel" }), typeof this.settingsPanel !== "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { id: `plugin-settings-${this.name}`, className: "plugin-settings", ref: "settingspanel", dangerouslySetInnerHTML: { __html: this.settingsPanel } })); } buildTitle(name, version, author) { const title = "{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/); const nameIndex = title.findIndex(s => s == "{{name}}"); if (nameIndex) title[nameIndex] = React.createElement("span", { className: "name bda-name" }, name); const versionIndex = title.findIndex(s => s == "{{version}}"); if (nameIndex) title[versionIndex] = React.createElement("span", { className: "version bda-version" }, version); const authorIndex = title.findIndex(s => s == "{{author}}"); if (nameIndex) { const props = { className: "author bda-author" }; if (author.link || author.id) { props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`; props.target = "_blank"; if (author.link) props.href = author.link; if (author.id) props.onClick = () => { _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer(); _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].openDM(author.id); }; } title[authorIndex] = React.createElement(author.link || author.id ? "a" : "span", props, author.name); } return title.flat(); } makeLink(title, url) { const props = { className: "bda-link bda-link-website", target: "_blank" }; if (typeof url == "string") props.href = url; if (typeof url == "function") props.onClick = event => { event.preventDefault(); event.stopPropagation(); url(); }; return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("a", props, title); } makeButton(title, children, action) { return React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], { color: "black", side: "top", text: title }, React.createElement("div", { className: "bd-addon-button", onClick: action }, children)); } componentWillUnmount() { this.unmounted = true; } get links() { const links = []; const addon = this.props.addon; if (addon.website) links.push(this.makeLink("Website", addon.website)); if (addon.source) links.push(this.makeLink("Source", addon.source)); if (addon.invite) { links.push(this.makeLink("Support Server", () => { const tester = /\.gg\/(.*)$/; let code = addon.invite; if (tester.test(code)) code = code.match(tester)[1]; _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer(); _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].InviteActions.acceptInviteAndTransitionToInviteChannel(code); })); } if (addon.donate) links.push(this.makeLink("Donate", addon.donate)); if (addon.patreon) links.push(this.makeLink("Patreon", addon.patreon)); return links; } get footer() { const links = this.links; return (links.length || this.hasSettings) && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card-footer bda-footer" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("span", { className: "bd-addon-links bda-links" }, ...links.map((element, index) => index < links.length - 1 ? [element, " | "] : element).flat()), this.hasSettings && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", { onClick: this.showSettings, className: "bd-button bda-settings-button", disabled: !this.state.checked }, "Settings")); } onChange() { this.props.toggle && this.props.toggle(this.name); this.setState({ checked: !this.state.checked }); } edit() { this.props.edit(this.name); } delete() { this.props.remove(this.name); } reload() { this.props.reload(this.name); } get name() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name); } get author() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author); } get description() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description); } get version() { return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version); } render() { if (this.state.settings) return this.settingsComponent; const { authorId, authorLink } = this.props.addon; const style = {}; if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) { if (!this.isScanning) { this.isScanning = true; Object(_modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__["processFile"])(Object(path__WEBPACK_IMPORTED_MODULE_12__["resolve"])(this.props.addon.filename.endsWith(".plugin.js") ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].themesFolder, this.props.addon.filename), result => { if (this.unmounted) return; this.setState({ isTrusted: result.suspect ? "suspect" : true }); }, () => {}); } else { if (this.state.isTrusted === true) { style.borderColor = "#4087ed"; } if (this.state.isTrusted === "suspect") { style.borderColor = "rgb(240, 71, 71)"; } } } return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card bd-addon-card settings-closed ui-switch-item", style }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-addon-header bda-header" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-card-title bda-header-title" }, this.buildTitle(this.name, this.version, { name: this.author, id: authorId, link: authorLink })), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-addon-controls bda-controls" }, this.props.edit && this.makeButton("Edit", React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], { className: "bd-icon" }), this.edit), this.props.remove && this.makeButton("Delete", React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], { className: "bd-icon" }), this.delete), this.props.reload && this.makeButton("Reload", React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_5__["default"], { className: "bd-icon" }), this.reload), React.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_8__["default"], { onChange: this.onChange, checked: this.state.checked }))), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-scroller-wrap bda-description-wrap scroller-wrap fade" }, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", { className: "bd-scroller bd-addon-description bda-description scroller" }, this.description)), this.footer); } } const originalRender = V2C_PluginCard.prototype.render; Object.defineProperty(V2C_PluginCard.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/addonlist.jsx": /*!******************************!*\ !*** ./src/ui/addonlist.jsx ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CardList; }); /* harmony import */ var _errorBoundary__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errorBoundary */ "./src/ui/errorBoundary.js"); /* harmony import */ var _contentColumn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentColumn */ "./src/ui/contentColumn.js"); /* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools */ "./src/ui/tools.js"); /* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js"); /* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx"); /* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scroller */ "./src/ui/scroller.js"); /* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx"); /* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx"); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js"); /* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); /* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js"); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js"); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const Tooltip = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__["default"].findByDisplayName("Tooltip"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].react; class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].reactComponent { constructor(props) { super(props); this.state = { sort: "name", ascending: true, query: "" }; this.isPlugins = this.props.type == "plugins"; this.cookie = this.isPlugins ? _0globals__WEBPACK_IMPORTED_MODULE_8__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_8__["themeCookie"]; this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"]; this.sort = this.sort.bind(this); this.reverse = this.reverse.bind(this); this.search = this.search.bind(this); } openFolder() { __webpack_require__(/*! electron */ "electron").shell.openItem(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].themesFolder); } edit(name) { console.log(name); this.manager.edit(name); } async delete(name) { const shouldDelete = await this.confirmDelete(name); if (!shouldDelete) return; this.manager.delete(name); } confirmDelete(name) { return new Promise(resolve => { _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__["default"].showConfirmationModal("Are You Sure?", `Are you sure you want to delete ${name}?`, { danger: true, confirmText: "Delete", onConfirm: () => { resolve(true); }, onCancel: () => { resolve(false); } }); }); } get sortOptions() { return [{ label: "Name", value: "name" }, { label: "Author", value: "author" }, { label: "Version", value: "version" }, { label: "Recently Added", value: "added" }, { label: "Last Modified", value: "modified" }, { label: "File Size", value: "size" }]; } get directions() { return [{ label: "Ascending", value: true }, { label: "Descending", value: false }]; } reverse(value) { this.setState({ ascending: value }); } sort(value) { this.setState({ sort: value }); } search(event) { this.setState({ query: event.target.value.toLocaleLowerCase() }); } getProps(addon) { return { key: this.getName(addon), enabled: this.cookie[this.getName(addon)], toggle: this.manager.toggle.bind(this.manager), //edit: this.edit.bind(this), remove: this.delete.bind(this), addon: addon, hash: addon.hash }; } getString(value) { if (!value) return "???"; return typeof value == "string" ? value : value.toString(); } get list() { return this.props.type === "plugins" ? Object.values(bdplugins) : Object.values(bdthemes); } getAddons() { const sortedAddons = this.list.sort((a, b) => { const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1); const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : a[this.state.sort]; const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : b[this.state.sort]; if (typeof first == "string") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase()); if (first > second) return 1; if (second > first) return -1; return 0; }); if (!this.state.ascending) sortedAddons.reverse(); const rendered = []; for (let a = 0; a < sortedAddons.length; a++) { const addon = sortedAddons[a]; if (this.state.query) { let matches = null; const name = this.getName(addon); const author = this.getAuthor(addon); const description = this.getDescription(addon); const version = this.getVersion(addon); if (name) matches = name.toLocaleLowerCase().includes(this.state.query); if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query); if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query); if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query); if (!matches) continue; } const props = this.getProps(addon); rendered.push(React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({}, props, { reload: !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && this.manager.reload.bind(this.manager) })))); } return rendered; } getName(addon) { return this.getString(addon.plugin ? addon.plugin.getName() : addon.name); } getAuthor(addon) { return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author); } getDescription(addon) { return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description); } getVersion(addon) { return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version); } renderCheckUpdates() { if (!window.ZeresPluginLibrary) return null; if (!window.PluginUpdates) return null; if (typeof window.PluginUpdates.checkAll !== "function") return null; if (!this.isPlugins) return null; return React.createElement("tooltipWrap", { text: "Checks for updates of plugins that support this feature. Right-click for a list." }, React.createElement("span", { style: { marginLeft: "10px" } }, React.createElement(Lightcord.Api.Components.inputs.Button, { color: "brand", look: "filled", size: "min", hoverColor: "default", onClick: () => { try { _modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("Plugin update check in progress.", { type: "info" }); window.PluginUpdates.checkAll().then(() => { _modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("Plugin update check complete.", { type: "success" }); }).catch(err => { console.error(err); _modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("An error occured while checking update.", { type: "error" }); }); } catch (e) { console.error(e); _modules_utils__WEBPACK_IMPORTED_MODULE_15__["default"].showToast("An error occured while checking update.", { type: "error" }); } }, wrapper: false, disabled: false }, "Check for Updates"))); } render() { const refreshIcon = React.createElement(Tooltip, { color: "black", position: "top", text: "Reload List" }, props => React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, { className: "bd-icon bd-reload bd-reload-header", size: "18px", onClick: async () => { if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"].updateThemeList(); this.forceUpdate(); } }))); const addonCards = this.getAddons(); return React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], { title: `${this.props.type.toUpperCase()}—${addonCards.length}` }, React.createElement("button", { key: "folder-button", className: "bd-button bd-pfbtn", onClick: this.openFolder.bind(this) }, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), this.renderCheckUpdates(), !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && refreshIcon, React.createElement("div", { className: "bd-controls bd-addon-controls" }, React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_7__["default"], { onChange: this.search, placeholder: `Search ${this.props.type}...` }), React.createElement("div", { className: "bd-addon-dropdowns" }, React.createElement("div", { className: "bd-select-wrapper" }, React.createElement("label", { className: "bd-label" }, "Sort by:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], { options: this.sortOptions, onChange: this.sort, style: "transparent" })), React.createElement("div", { className: "bd-select-wrapper" }, React.createElement("label", { className: "bd-label" }, "Order:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], { options: this.directions, onChange: this.reverse, style: "transparent" })))), React.createElement("div", { className: "bda-slist bd-addon-list" }, addonCards)); } } const originalRender = CardList.prototype.render; Object.defineProperty(CardList.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/bdLogo.js": /*!**************************!*\ !*** ./src/ui/bdLogo.js ***! \**************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDLogo; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class BDLogo extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", { height: "100%", width: this.props.size || "16px", className: "bd-logo " + this.props.className, style: { fillRule: "evenodd", clipRule: "evenodd", strokeLinecap: "round", strokeLinejoin: "round" }, viewBox: "0 0 2000 2000" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("metadata", null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("defs", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", { id: "shadow1" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", { "dx": "20", "dy": "0", "stdDeviation": "20", "flood-color": "rgba(0,0,0,0.35)" })), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", { id: "shadow2" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", { "dx": "15", "dy": "0", "stdDeviation": "20", "flood-color": "rgba(255,255,255,0.15)" })), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", { id: "shadow3" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", { "dx": "10", "dy": "0", "stdDeviation": "20", "flood-color": "rgba(0,0,0,0.35)" }))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { style: { filter: "url(#shadow3)" }, d: "M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z", fill: "#171717", opacity: "1" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { style: { filter: "url(#shadow2)" }, d: "M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z", fill: "#3E82E5", opacity: "1" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { style: { filter: "url(#shadow1)" }, d: "M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z", fill: "#FFFFFF", opacity: "1" }))); } } /***/ }), /***/ "./src/ui/checkbox.js": /*!****************************!*\ !*** ./src/ui/checkbox.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Checkbox; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_Checkbox extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.onClick = this.onClick.bind(this); this.setInitialState(); } setInitialState() { this.state = { checked: this.props.checked || false }; } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("li", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "checkbox " + BDModules.get(e => e.checkboxElement)[0].checkbox, onClick: this.onClick }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "checkbox-inner " + BDModules.get(e => e.checkboxInner)[0].checkboxInner }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", { className: BDModules.get(e => e.checkboxElement)[0].checkboxElement, checked: this.state.checked, onChange: () => {}, type: "checkbox" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, this.props.text))); } onClick() { this.props.onChange(this.props.id, !this.state.checked); this.setState({ checked: !this.state.checked }); } } /***/ }), /***/ "./src/ui/components/dropdown.jsx": /*!****************************************!*\ !*** ./src/ui/components/dropdown.jsx ***! \****************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Select; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _icons_downarrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/downarrow */ "./src/ui/icons/downarrow.jsx"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Select extends React.Component { constructor(props) { super(props); this.state = { open: false, value: this.props.value || this.props.options[0].value }; this.dropdown = React.createRef(); this.onChange = this.onChange.bind(this); this.showMenu = this.showMenu.bind(this); this.hideMenu = this.hideMenu.bind(this); } showMenu(event) { event.preventDefault(); this.setState({ open: true }, () => { document.addEventListener("click", this.hideMenu); }); } hideMenu() { this.setState({ open: false }, () => { document.removeEventListener("click", this.hideMenu); }); } onChange(value) { this.setState({ value }); if (this.props.onChange) this.props.onChange(value); } get selected() { return this.props.options.find(o => o.value == this.state.value); } get options() { const selected = this.selected; return React.createElement("div", { className: "bd-select-options" }, this.props.options.map(opt => React.createElement("div", { className: `bd-select-option${selected.value == opt.value ? " selected" : ""}`, onClick: this.onChange.bind(this, opt.value) }, opt.label))); } render() { const style = this.props.style == "transparent" ? " bd-select-transparent" : ""; const isOpen = this.state.open ? " menu-open" : ""; return React.createElement("div", { className: `bd-select${style}${isOpen}`, onClick: this.showMenu, ref: this.dropdown }, React.createElement("div", { className: "bd-select-value" }, this.selected.label), React.createElement(_icons_downarrow__WEBPACK_IMPORTED_MODULE_1__["default"], { className: "bd-select-arrow" }), this.state.open && this.options); } } // return
// //
//
//
{this.selected.label}
// //
//
// {this.state.open && this.options} //
; /***/ }), /***/ "./src/ui/components/search.jsx": /*!**************************************!*\ !*** ./src/ui/components/search.jsx ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _icons_search__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/search */ "./src/ui/icons/search.jsx"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Search extends React.Component { render() { return React.createElement("div", { className: "bd-search-wrapper" }, React.createElement("input", { onChange: this.props.onChange, onKeyDown: this.props.onKeyDown, type: "text", className: "bd-search", placeholder: this.props.placeholder, maxLength: "50" }), React.createElement(_icons_search__WEBPACK_IMPORTED_MODULE_1__["default"], null)); } } /***/ }), /***/ "./src/ui/components/switch.jsx": /*!**************************************!*\ !*** ./src/ui/components/switch.jsx ***! \**************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Switch; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Switch extends React.Component { constructor(props) { super(props); this.state = { checked: this.props.checked }; this.onChange = this.onChange.bind(this); } onChange(value) { if (this.props.disabled) return; this.props.onChange(value); this.setState({ checked: value }); } render() { return React.createElement(Lightcord.Api.Components.inputs.Switch, { onChange: this.onChange, value: this.state.checked }); } } /***/ }), /***/ "./src/ui/contentColumn.js": /*!*********************************!*\ !*** ./src/ui/contentColumn.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ContentColumn; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_ContentColumn extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } static get displayName() { return "ContentColumn"; } render() { //let contentModule = BDModules.get(e => e.contentColumn)[0] let title = this.props.title ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, this.props.title) : null; return [title, this.props.children]; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default", style: { padding: "60px 40px 0px" } }, title, this.props.children); } } /***/ }), /***/ "./src/ui/cssEditor.js": /*!*****************************!*\ !*** ./src/ui/cssEditor.js ***! \*****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditor; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js"); /* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cssEditorDetached */ "./src/ui/cssEditorDetached.js"); class V2C_CssEditor extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent { constructor(props) { super(props); const self = this; self.props.lines = 0; self.setInitialState(); self.attach = self.attach.bind(self); self.detachedEditor = _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__["default"], { attach: self.attach }); self.onClick = self.onClick.bind(self); self.updateCss = self.updateCss.bind(self); self.saveCss = self.saveCss.bind(self); self.detach = self.detach.bind(self); } setInitialState() { this.state = { detached: this.props.detached || _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached }; } componentDidMount() { // this.updateLineCount(); this.editor = ace.edit("bd-customcss-editor"); this.editor.setTheme("ace/theme/monokai"); this.editor.session.setMode("ace/mode/css"); this.editor.setShowPrintMargin(false); this.editor.setFontSize(14); this.editor.on("change", () => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return; this.saveCss(); this.updateCss(); }); } componentWillUnmount() { this.editor.destroy(); } componentDidUpdate(prevProps, prevState) { const self = this; if (prevState.detached && !self.state.detached) { _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.detachedRoot); } } codeMirror() {} get options() { return { lineNumbers: true, mode: "css", indentUnit: 4, theme: "material", scrollbarStyle: "simple" }; } get css() { const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss"); let ccss = ""; if (_ccss && _ccss !== "") { ccss = atob(_ccss); } return ccss; } updateLineCount() { const lineCount = this.refs.editor.value.split("\n").length; if (lineCount == this.props.lines) return; this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + "."; this.props.lines = lineCount; } render() { const self = this; const { detached } = self.state; return [detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "editor-detached" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], { text: "Custom CSS Editor" }), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("h3", null, "Editor Detached"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { className: "btn btn-primary", onClick: () => { self.attach(); } }, "Attach")), !detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], { text: "Custom CSS Editor" }), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "editor-wrapper" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-editor", className: "editor", ref: "editor" }, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-attach-controls" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", { className: "checkbox-group" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_6__["default"], { id: "live-update", text: "Live Update", onChange: this.onChange, checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] })), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-detach-controls-button" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "3px 0 0 3px", borderRight: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("update"); } }, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0", borderLeft: "1px solid #2d2d2d", borderRight: "1px solid #2d2d2d" }, className: "btn btn-primary", onClick: () => { self.onClick("save"); } }, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0 3px 3px 0", borderLeft: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("detach"); } }, "Detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { style: { fontSize: "10px", marginLeft: "5px" } }, "Unsaved changes are lost on detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "help-text" }, "Press ", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("code", { className: "inline" }, "ctrl"), "+", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { className: "inline" }, ","), " with the editor focused to access the editor's settings."))))]; } onClick(arg) { const self = this; switch (arg) { case "update": self.updateCss(); break; case "save": self.saveCss(); break; case "detach": self.detach(); break; } } onChange(id, checked) { switch (id) { case "live-update": _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked; _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings(); break; } } updateCss() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss"); _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue()); } saveCss() { _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue())); } detach() { const self = this; self.setState({ detached: true }); const droot = self.detachedRoot; if (!droot) { console.log("FAILED TO INJECT ROOT: .app"); return; } _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(self.detachedEditor, droot); } get detachedRoot() { const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container"); if (!_root) { if (!this.injectDetachedRoot()) return null; return this.detachedRoot; } return _root; } injectDetachedRoot() { const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]); if (!app) return false; _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
`), app); return true; } attach() { const self = this; self.setState({ detached: false }); } } /***/ }), /***/ "./src/ui/cssEditorDetached.js": /*!*************************************!*\ !*** ./src/ui/cssEditorDetached.js ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditorDetached; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js"); /* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js"); class V2C_CssEditorDetached extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent { constructor(props) { super(props); const self = this; self.onClick = self.onClick.bind(self); self.updateCss = self.updateCss.bind(self); self.saveCss = self.saveCss.bind(self); self.onChange = self.onChange.bind(self); } componentDidMount() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor"); _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = true; // this.updateLineCount(); this.editor = ace.edit("bd-customcss-editor-detached"); this.editor.setTheme("ace/theme/monokai"); this.editor.session.setMode("ace/mode/css"); this.editor.setShowPrintMargin(false); this.editor.setFontSize(14); this.editor.on("change", () => { if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return; this.saveCss(); this.updateCss(); }); } componentWillUnmount() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor"); _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = false; this.editor.destroy(); } updateLineCount() { const lineCount = this.refs.editor.value.split("\n").length; if (lineCount == this.props.lines) return; this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + "."; this.props.lines = lineCount; } get options() { return { lineNumbers: true, mode: "css", indentUnit: 4, theme: "material", scrollbarStyle: "simple" }; } get css() { const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss"); let ccss = ""; if (_ccss && _ccss !== "") { ccss = atob(_ccss); } return ccss; } get root() { const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container"); if (!_root) { if (!this.injectRoot()) return null; return this.detachedRoot; } return _root; } injectRoot() { const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]); if (!app) return false; _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`
`), app); return true; } render() { const self = this; return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "bd-detached-css-editor", id: "bd-customcss-detach-editor" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-innerpane" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { className: "editor-wrapper" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-editor-detached", className: "editor", ref: "editor" }, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-attach-controls" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", { className: "checkbox-group" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_5__["default"], { id: "live-update", text: "Live Update", onChange: self.onChange, checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] })), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { id: "bd-customcss-detach-controls-button" }, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "3px 0 0 3px", borderRight: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("update"); } }, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0", borderLeft: "1px solid #2d2d2d", borderRight: "1px solid #2d2d2d" }, className: "btn btn-primary", onClick: () => { self.onClick("save"); } }, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", { style: { borderRadius: "0 3px 3px 0", borderLeft: "1px solid #3f4146" }, className: "btn btn-primary", onClick: () => { self.onClick("attach"); } }, "Attach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { style: { fontSize: "10px", marginLeft: "5px" } }, "Unsaved changes are lost on attach"))))); } onChange(id, checked) { switch (id) { case "live-update": _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked; _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings(); break; } } onClick(id) { const self = this; switch (id) { case "attach": if (_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#editor-detached")) self.props.attach(); _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.root); self.root.remove(); break; case "update": self.updateCss(); break; case "save": self.saveCss(); break; } } updateCss() { _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss"); _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue()); } saveCss() { _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue())); } } /***/ }), /***/ "./src/ui/errorBoundary.js": /*!*********************************!*\ !*** ./src/ui/errorBoundary.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDErrorBoundary; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class BDErrorBoundary extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch() { this.setState({ hasError: true }); } render() { if (this.state.hasError) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "react-error" }, "Component Error"); return this.props.children; } } const originalRender = BDErrorBoundary.prototype.render; Object.defineProperty(BDErrorBoundary.prototype, "render", { enumerable: false, configurable: false, set: function () { console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); }, get: () => originalRender }); /***/ }), /***/ "./src/ui/icons/delete.jsx": /*!*********************************!*\ !*** ./src/ui/icons/delete.jsx ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Delete; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Delete extends React.Component { render() { const size = this.props.size || "24px"; return React.createElement("svg", { className: this.props.className || "", fill: "#FFFFFF", viewBox: "0 0 24 24", style: { width: size, height: size }, onClick: this.props.onClick }, React.createElement("path", { fill: "none", d: "M0 0h24v24H0V0z" }), React.createElement("path", { d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z" }), React.createElement("path", { fill: "none", d: "M0 0h24v24H0z" })); } } /***/ }), /***/ "./src/ui/icons/downarrow.jsx": /*!************************************!*\ !*** ./src/ui/icons/downarrow.jsx ***! \************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DownArrow; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class DownArrow extends React.Component { render() { const size = this.props.size || "16px"; return React.createElement("svg", { className: this.props.className || "", fill: "#FFFFFF", viewBox: "0 0 24 24", style: { width: size, height: size } }, React.createElement("path", { d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z" })); } } /***/ }), /***/ "./src/ui/icons/edit.jsx": /*!*******************************!*\ !*** ./src/ui/icons/edit.jsx ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Edit; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Edit extends React.Component { render() { const size = this.props.size || "24px"; return React.createElement("svg", { className: this.props.className || "", viewBox: "0 0 24 24", fill: "#FFFFFF", style: { width: size, height: size }, onClick: this.props.onClick }, React.createElement("path", { d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z" }), React.createElement("path", { d: "M0 0h24v24H0z", fill: "none" })); } } /***/ }), /***/ "./src/ui/icons/history.jsx": /*!**********************************!*\ !*** ./src/ui/icons/history.jsx ***! \**********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return History; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); { /* */ } const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class History extends React.Component { render() { const size = this.props.size || "18px"; return React.createElement("svg", { viewBox: "0 0 24 24", fill: "#FFFFFF", className: this.props.className || "", style: { width: size, height: size }, onClick: this.props.onClick }, React.createElement("path", { d: "M0 0h24v24H0z", fill: "none" }), React.createElement("path", { d: "M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z" })); } } /***/ }), /***/ "./src/ui/icons/search.jsx": /*!*********************************!*\ !*** ./src/ui/icons/search.jsx ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; class Search extends React.Component { render() { const size = this.props.size || "16px"; return React.createElement("svg", { className: this.props.className || "", fill: "#FFFFFF", viewBox: "0 0 24 24", style: { width: size, height: size } }, React.createElement("path", { fill: "none", d: "M0 0h24v24H0V0z" }), React.createElement("path", { d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" })); } } /***/ }), /***/ "./src/ui/margintop.jsx": /*!******************************!*\ !*** ./src/ui/margintop.jsx ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MarginTop; }); let marginModule = BDModules.get(e => e.marginTop60)[0]; class MarginTop extends React.Component { render() { if (!marginModule) marginModule = BDModules.get(e => e.marginTop60)[0]; return React.createElement("div", { className: marginModule.marginTop60 }); } } /***/ }), /***/ "./src/ui/presenceSettings.jsx": /*!*************************************!*\ !*** ./src/ui/presenceSettings.jsx ***! \*************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PresenceSettings; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js"); /* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js"); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js"); /* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! electron */ "electron"); /* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_7__); /* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React; let V2C_PresenceSettingsModules; class V2C_PresenceSettings extends React.Component { constructor(props) { super(props); this.state = { data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getSettingGroup("rpc") || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], assets: [] }; this.preview = null; this.isfetching = false; if (this.state.data.application_id) { this.fetchAssets(); } this.assetComponents = new Set(); } updateWhenFetched(comp) { this.assetComponents.add(comp); } /** * * @param {InputText} setting */ onChange(setting, value) { let defaultSetting = RPCProps.find(e => e.id === setting.props.id); this.setState({ data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"], this.state.data, { [defaultSetting.id]: !!value ? value : null }), assets: this.state.assets }); if (setting.props.id === "application_id") { this.fetchAssets(); } _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]); this.preview.forceUpdate(); _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]); } fetchAssets() { if (this.isfetching === true) { let app = this.state.data.application_id; setTimeout(() => { if (this.state.data.application_id !== app) { return; } this.fetchAssets(); }, 5000); } if (!this.state.data.application_id) { this.setState({ data: this.state.data, assets: [] }); this.forceUpdate(); this.assetComponents.forEach(e => e.forceUpdate()); return; } this.isfetching = true; _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].fetchAssets(this.state.data.application_id).then(assets => { this.isfetching = false; this.setState({ data: this.state.data, assets: Object.keys(assets).map(k => { let asset = assets[k]; return { id: asset.id, name: asset.name, type: asset.type }; }) }); this.forceUpdate(); this.assetComponents.forEach(e => e.forceUpdate()); }).catch(() => { this.isfetching = false; this.setState({ data: this.state.data, assets: [] }); this.forceUpdate(); this.assetComponents.forEach(e => e.forceUpdate()); }); } updatePreview(data) { this.setState({ data }); } get modules() { return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [BDModules.get(e => e.marginBottom20)[0]]); } render() { let [marginModule] = this.modules; return [React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], { title: "RichPresence Settings", settings: this.props.settings, onChange: this.props.onChange }), React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { text: "RichPresence" }), React.createElement("div", null, this.optionsComponents), React.createElement("div", null, React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_8__["default"], null), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { text: "Preview" }), React.createElement(RpcPreview, { settings: this })), React.createElement("div", { className: marginModule.marginBottom20 }), React.createElement("button", { style: { opacity: 0.01 }, onClick: window.ohgodohfuck }, "Oh god Oh fuck"), React.createElement("button", { style: { opacity: 0.01 }, onClick: () => { electron__WEBPACK_IMPORTED_MODULE_7__["remote"].shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4"); } }, "See ? I pulled a litle sneaky on ya")]; } get optionsComponents() { return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => { if (e.type === "text") { return React.createElement(InputText, { setting: e, manager: this, id: e.id }); } else if (e.type === "number") { let array = [React.createElement(InputNumber, { setting: e, manager: this, id: e.id })]; /* if(e.id === "timestamps.start"){ array.unshift( { DiscordNative.clipboard.copy(Date.now()+"") }} />) }*/ return array; } else if (e.type === "choice") { if (["assets.small", "assets.large"].includes(e.id)) { return React.createElement(InputChoice, { setting: e, manager: this, id: e.id, choices: [{ value: "none", label: "No assets" }].concat(this.state.assets.map(e => { return { value: "asset-" + e.id, label: e.name }; })) }); } else { return "Unknown choice."; } } })); } } const RPCProps = [{ title: "Application ID", id: "application_id", type: "number", placeholder: "711416957718757418" }, { title: "Name", id: "name", type: "text", placeholder: "Lightcord" }, { title: "Details", id: "details", type: "text", placeholder: "Browsing Discord" }, { title: "State", id: "state", type: "text", placeholder: "Lightcord Client" }, { title: "Timestamp Start", id: "timestamps.start", type: "number", get placeholder() { return Date.now(); } }, { title: "LargeAsset", id: "assets.large", type: "choice" }, { title: "SmallAsset", id: "assets.small", type: "choice" }]; let inputTextModules; class InputText extends React.PureComponent { get modules() { if (inputTextModules && inputTextModules[0]) return inputTextModules; return inputTextModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0]]; } constructor(props) { super(props); let setting = this.props.setting; this.state = { data: this.props.manager.state.data[setting.id] }; this.input = React.createElement(window.Lightcord.Api.Components.inputs.TextInput, { placeholder: setting.placeholder, name: setting.id, value: this.state.data, onChange: value => { this.setState({ data: value }); if (!this.lastEdited || this.lastEdited < Date.now() - 500) { this.props.manager.onChange(this, value); this.lastEdited = Date.now(); } else if (!this.isTiming) { this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data); this.isTiming = null; this.lastEdited = Date.now(); }, 500); } }, type: "text" }); } render() { let setting = this.props.setting; let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule, inputModule, sizeModule2] = this.modules; return React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, setting.title), this.input), React.createElement(Divider, null)); } } let InputNumberModules; class InputNumber extends React.PureComponent { get modules() { return InputNumberModules || (InputNumberModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0], BDModules.get(e => e.colorTransparent)[0]]); } constructor(props) { super(props); let setting = this.props.setting; this.state = { data: this.props.manager.state.data[setting.id] }; this.input = React.createElement(window.Lightcord.Api.Components.inputs.TextInput, { placeholder: setting.placeholder, name: setting.id, value: this.state.data, type: "number", onChange: (value, name, input) => { value = value.replace(/[^\d]+/g, ""); if (value == this.state.data) { input.setValue(value); return; } if (!this.lastEdited || this.lastEdited < Date.now() - 500) { this.props.manager.onChange(this, value); this.lastEdited = Date.now(); } else if (!this.isTiming) { this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data); this.isTiming = null; this.lastEdited = Date.now(); }, 500); } this.setState({ data: value }); }, type: "text" }); } render() { let setting = this.props.setting; let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules; return React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, setting.title), this.input, setting.id === "timestamps.start" ? React.createElement(Lightcord.Api.Components.inputs.Button, { onClick: () => { DiscordNative.clipboard.copy(Date.now() + ""); }, color: "brand" }, "Copy current timestamp") : null), React.createElement(Divider, null)); } } let InputChoiceModules; class InputChoice extends React.PureComponent { constructor(props) { super(props); let setting = this.props.setting; this.state = { data: this.props.manager.state.data[setting.id] ? "asset-" + this.props.manager.state.data[setting.id] : "none" }; this.props.manager.updateWhenFetched(this); } onChange(data) { let value = data.value; if (!this.lastEdited || this.lastEdited < Date.now() - 500) { this.props.manager.onChange(this, value === "none" ? null : value.replace("asset-", "")); this.lastEdited = Date.now(); } else if (!this.isTiming) { this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data === "none" ? null : this.state.data.replace("asset-", "")); this.isTiming = null; this.lastEdited = Date.now(); }, 500); } this.setState({ data: value }); this.forceUpdate(); } get modules() { return InputChoiceModules || (InputChoiceModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0]]); } render() { let setting = this.props.setting; let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules; let options = this.props.manager.state.assets.map(e => { return { value: "asset-" + e.id, label: e.name }; }); options.unshift({ value: "none", label: "No assets" }); return React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, React.createElement("h5", { className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 }, setting.title), React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, { value: this.state.data, options: options, onChange: this.onChange.bind(this) })), React.createElement(Divider, null)); } } let DividerModules = []; class Divider extends React.PureComponent { get modules() { return DividerModules && DividerModules[0] ? DividerModules : DividerModules = [BDModules.get(e => e.divider && Object.keys(e).length === 1)[0], BDModules.get(e => e.dividerDefault)[0]]; } render() { let [divider, dividerDefault] = this.modules; return React.createElement("div", { class: `${divider.divider} ${dividerDefault.dividerDefault}` }); } } class DiscordButton extends React.Component { render() { let rowModule = BDModules.get(e => e.removeKeybind)[0]; let marginModule = BDModules.get(e => e.marginBottom20)[0]; let flexModule = BDModules.get(e => e._horizontal)[0]; return React.createElement("div", { className: rowModule.row + " " + marginModule.marginBottom20 }, React.createElement("div", { className: `${rowModule.item} ${flexModule.flexChild}` }, React.createElement(Lightcord.Api.Components.inputs.Button, { onClick: this.props.onClick, color: "brand" }, this.props.title))); } } class RpcPreview extends React.Component { constructor(props = {}) { super(props); this.state = { active: "profile" }; this.tabs = []; this.props.settings.preview = this; } changeTab(tab) { let ancientTab = this.state.active; if (ancientTab === tab.props.id) return; this.tabs.forEach(e => { e.setActive(false); }); tab.setActive(true); this.setState({ active: tab.props.id }); } render() { let preview = new this.preview({ preview: this }); preview.setState(this.state.rpc); return React.createElement("div", { className: "lc-tabWrapper" }, React.createElement("div", { className: "lc-tabnav", style: { flex: "0 1 auto" } }, React.createElement(Tab, { preview: this, title: "Full Profile", id: "profile" }), React.createElement(Tab, { preview: this, title: "User Popout", id: "popout" })), preview.render()); } isActive(tab) { return this.state.active === tab; } get preview() { if (this.state.active === "profile") return Profile; return Popout; } } class Tab extends React.Component { constructor(props) { super(props); this.state = { active: props.preview.isActive(props.id) }; props.preview.tabs.push(this); } setActive(isActive) { this.setState({ active: !!isActive }); } render() { let className = `lc-navItem`; if (this.state.active) { className += ` lc-navItemActive`; } else { className += ` lc-navItemInactive`; } return React.createElement("div", { className: className, onClick: () => { this.props.preview.changeTab(this); } }, this.props.title); } } let popoutModule; class Popout extends React.Component { // TODO: Probably use internal Components instead of making it from scratch. get modules() { return popoutModule || (popoutModule = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.default && e.default.getCurrentUser)[0].default]); } render() { let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1, userModule1] = this.modules; let user = userModule1.getCurrentUser(); let avatarURL = user.avatarURL; if (user.avatar && user.avatar.startsWith("a_")) { avatarURL = user.getAvatarURL("gif"); } let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data); timestampClass = timestampClass || activityModule1.timestamp; let images = (() => { if (!data["assets.large"]) return null; let images = []; if (data["assets.large"]) { images.push(React.createElement("img", { alt: "", src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`, class: `${activityModule1.assetsLargeImageUserPopout} ${data["assets.small"] ? activityModule1.assetsLargeMaskUserPopout : ""}` })); } if (data["assets.small"]) { images.push(React.createElement("img", { alt: "", src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`, class: activityModule1.assetsSmallImageUserPopout })); } if (!images.length) return null; return React.createElement("div", { class: activityModule1.assets }, images); })(); return React.createElement("div", { className: "lc-userPopout lc-tab-box-shadow" }, React.createElement("div", { class: rootModule1.userPopout, role: "dialog", tabindex: "-1" }, React.createElement("div", { class: rootModule1.headerPlaying }, React.createElement("div", { class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`, style: { flex: "1 1 auto" } }, React.createElement("div", { class: rootModule1.avatarWrapperNormal, role: "button", tabindex: "0" }, React.createElement("div", { class: avatarModule1, role: "img", style: { width: "80px", height: "80px" } }, React.createElement("svg", { width: "92", height: "80", viewBox: "0 0 92 80", class: `${avatarModule1.mask} ${avatarModule1.svg}` }, React.createElement("foreignObject", { x: "0", y: "0", width: "80", height: "80", mask: "url(#svg-mask-avatar-status-round-80)" }, React.createElement("img", { src: avatarURL, alt: " ", class: avatarModule1.avatar })), React.createElement(Status, null))), React.createElement("svg", { width: "80", height: "80", class: rootModule1.avatarHint, viewBox: "0 0 80 80" }, React.createElement("foreignObject", { x: "0", y: "0", width: "80", height: "80", mask: "url(#svg-mask-avatar-status-round-80)" }, React.createElement("div", { class: rootModule1.avatarHintInner }, Messages.VIEW_PROFILE)))), React.createElement("div", { class: rootModule1.headerText }, React.createElement("div", { class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`, style: { flex: "1 1 auto" } }, React.createElement("div", { class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}` }, React.createElement("span", { class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}` }, user.username), React.createElement("span", null, "#", user.discriminator))))), React.createElement("div", { class: `${activityModule1.activityUserPopout} ${rootModule1.activity}` }, React.createElement("h3", { class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}` }, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", { class: activityModule1.bodyNormal }, images, React.createElement("div", { class: images ? activityModule1.contentImagesUserPopout : activityModule1.contentNoImagesUserPopout, style: { flex: "1 1 auto" } }, (() => { if (!data.name) return null; return React.createElement("h3", { class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`, title: data.name }, React.createElement("span", { class: activityModule1.activityName }, data.name)); })(), (() => { if (!data.details) return null; return React.createElement("div", { title: data.title, class: activityModule1.details }, data.details); })(), (() => { if (!data.state) return null; return React.createElement("div", { class: activityModule1.state }, React.createElement("span", { title: data.state }, data.state)); })(), (() => { if (!data["timestamps.start"]) return null; let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages); return React.createElement("div", { class: activityModule1.timestamp }, React.createElement(timeComponent, { timestamps: { end: null, start: data["timestamps.start"] } })); })())))), React.createElement("div", { class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}` }, React.createElement("div", { class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}` }, React.createElement("div", { class: rootModule1.bodyTitle }, Messages.NOTE), React.createElement("div", { class: `${noteModule1.note} ${rootModule1.note}` }, React.createElement("textarea", { placeholder: Messages.NOTE_PLACEHOLDER, maxlength: "256", autocorrect: "off", class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline, style: { height: "36px" }, disabled: true })))), React.createElement("div", { class: rootModule1.footer }, React.createElement("div", { class: `${rootModule1.protip} ${protipModule1.inline}` }, React.createElement("h3", { class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`, style: { color: "rgb(67, 181, 129)" } }, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement("div", { class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}` }, Messages.CONTEXT_MENU_HINT))))); } } let StatusModules; class Status extends React.Component { get modules() { return StatusModules || (StatusModules = [BDModules.get(e => e.default && e.default.getPresence)[0], BDModules.get(e => e.pointerEvents)[0].pointerEvents]); } render() { let [getPresence, pointerEvents] = this.modules; let status = getPresence.default.getPresence().status; if (status === "invisible") status = "offline"; return React.createElement("rect", { width: "16", height: "16", x: "60", y: "60", fill: "#ffffff", mask: `url(#svg-mask-status-${status})`, className: pointerEvents }); } } let timestampClass = ""; let ProfileModules; class Profile extends React.Component { // TODO: Probably use internal Components instead of making it from scratch. get modules() { return ProfileModules || (ProfileModules = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages]); } render() { let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser(); let avatarURL = user.avatarURL; if (user.avatar && user.avatar.startsWith("a_")) { avatarURL = user.getAvatarURL("gif"); } let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = this.modules; let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data); timestampClass = timestampClass || activityModule1.timestamp; let images = (() => { if (!data["assets.large"]) return null; let images = []; if (data["assets.large"]) { images.push(React.createElement("img", { alt: "", src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`, class: `${activityModule1.assetsLargeImageProfile} ${data["assets.small"] ? activityModule1.assetsLargeMaskProfile : ""}` })); } if (data["assets.small"]) { images.push(React.createElement("img", { alt: "", src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`, class: activityModule1.assetsSmallImageProfile })); } if (!images.length) return null; return React.createElement("div", { class: activityModule1.assets }, images); })(); return [React.createElement("div", { className: "lc-tab lc-tab-box-shadow" }, React.createElement("div", { class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`, style: { flex: "1 1 auto" } }, React.createElement("div", { class: rootModule1.topSectionPlaying }, React.createElement("header", { class: rootModule1.header }, React.createElement("div", { class: `${rootModule1.avatar} ${avatarModule1.wrapper}`, role: "img", style: { width: "80px", height: "80px" } }, React.createElement("svg", { width: "92", height: "80", viewBox: "0 0 92 80", class: `${avatarModule1.mask} ${avatarModule1.svg}` }, React.createElement("foreignObject", { x: "0", y: "0", width: "80", height: "80", mask: "url(#svg-mask-avatar-status-round-80)" }, React.createElement("img", { src: avatarURL, alt: " ", class: avatarModule1.avatar })), React.createElement(Status, null))), React.createElement("div", { class: `${rootModule1.headerInfo}` }, React.createElement("div", { class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}` }, React.createElement("span", { class: `${rootModule1.username} ${rootModule1.username}` }, user.username), React.createElement("span", { class: rootModule1.discriminator }, "#", user.discriminator)), React.createElement("div", { class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`, style: { flex: "1 1 auto" } }, React.createElement(Badges, null)))), React.createElement("div", { class: rootModule1.headerFill }, React.createElement("div", { class: `${activityModule1.activityProfile} ${rootModule1.activity}` }, React.createElement("h3", { class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}` }, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", { class: activityModule1.bodyNormal }, images, React.createElement("div", { class: images ? activityModule1.contentImagesProfile : activityModule1.contentNoImagesUserPopout, style: { flex: "1 1 auto" } }, (() => { if (!data.name) return null; return React.createElement("h3", { class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`, title: data.name }, React.createElement("span", { class: activityModule1.activityName }, data.name)); })(), (() => { if (!data.details) return null; return React.createElement("div", { title: data.title, class: activityModule1.details }, data.details); })(), (() => { if (!data.state) return null; return React.createElement("div", { class: activityModule1.state }, React.createElement("span", { title: data.state }, data.state)); })(), (() => { if (!data["timestamps.start"]) return null; let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages); return React.createElement("div", { class: activityModule1.timestamp }, React.createElement(timeComponent, { timestamps: { end: null, start: data["timestamps.start"] } })); })()))))), React.createElement("div", { class: rootModule1.body }, React.createElement("div", { class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}` }, React.createElement("div", { class: scrollerModule1.scroller }, React.createElement("div", { class: rootModule1.userInfoSection }, React.createElement("div", { class: rootModule1.userInfoSectionHeader }, Messages.NOTE), React.createElement("div", { class: `${rootModule1.note} ${noteModule1.note}` }, React.createElement("textarea", { placeholder: Messages.NOTE_PLACEHOLDER, maxlength: "256", autocorrect: "off", class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline, style: { height: "40px" }, disabled: true }))), React.createElement(ConnectedAccounts, null))))))]; } } class ConnectedAccounts extends React.Component { render() { let accounts = []; let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0]; let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default; let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1); for (let acc of accs) { accounts.push(React.createElement(ConnectedAccount, { acc: acc })); } if (accounts.length > 0) { return React.createElement("div", { class: rootModule1.userInfoSection }, React.createElement("div", { class: rootModule1.connectedAccounts }, accounts)); } return null; } } class ConnectedAccount extends React.Component { render() { let [flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default]; let acc = this.props.acc; let constantsSocial = SocialConstants.get(acc.type); return React.createElement("div", { class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`, style: { flex: "0 1 auto" } }, React.createElement("img", { alt: `Logo ${constantsSocial.name}`, class: rootModule1.connectedAccountIcon, src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey }), React.createElement("div", { class: rootModule1.connectedAccountNameInner }, React.createElement("div", { class: rootModule1.connectedAccountName }, acc.name), acc.verified ? React.createElement("span", null, React.createElement("div", { class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`, style: { width: "16px", height: "16px" } }, React.createElement("svg", { class: flowerModule1.flowerStar, width: "16", height: "16", viewBox: "0 0 16 15.2" }, React.createElement("path", { fill: "#4f545c", "fill-rule": "evenodd", d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z" })), React.createElement("div", { class: flowerModule1.childContainer }, React.createElement("svg", { width: "16", height: "16", viewBox: "0 0 16 15.2" }, React.createElement("path", { d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z", fill: "#ffffff" }))))) : null), React.createElement("a", { class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`, rel: "noreferrer noopener", target: "_blank", role: "button", tabindex: "0" }, React.createElement("svg", { class: rootModule1.connectedAccountOpenIcon, width: "24", height: "24", viewBox: "0 0 24 24" }, React.createElement("path", { fill: "currentColor", d: "M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z" }), React.createElement("path", { fill: "currentColor", d: "M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z" })))); } } class Badges extends React.Component { render() { let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser(); let rootModule = BDModules.get(e => e.topSectionStreaming)[0]; let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags; let badges = []; let serialized = []; for (let flagName in UserFlags) { if (user.hasFlag(UserFlags[flagName])) serialized.push(flagName); } for (let flagName of serialized) { let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, " ").split(" ").map(e => e[0].toUpperCase() + e.slice(1)).join("")}`; searchable = searchable.replace("HypesquadOnline", "HypeSquadOnline"); if (!rootModule[searchable]) continue; badges.push(React.createElement(Badge, { name: searchable })); } if (user.hasPremiumSubscription) { badges.push(React.createElement(Badge, { name: "profileBadgePremium" })); } return badges; } } class Badge extends React.Component { render() { let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0]; return React.createElement("div", { class: rootModule1.profileBadgeWrapper }, React.createElement("div", null, React.createElement("div", { class: "", role: "button", tabindex: "0" }, React.createElement("div", { class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}` })))); } } class Timestamp extends React.Component { render() { return React.createElement("div", { className: timestampClass }, this.props.message); } } /***/ }), /***/ "./src/ui/publicservers/layer.js": /*!***************************************!*\ !*** ./src/ui/publicservers/layer.js ***! \***************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js"); class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.keyupListener = this.keyupListener.bind(this); } keyupListener(e) { if (e.which === 27) { _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode); } } componentDidMount() { window.addEventListener("keyup", this.keyupListener); const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`; thisNode.style.opacity = progress; if (progress == 1) { setImmediate(() => { thisNode.style.transform = ""; thisNode.style.opacity = ""; }); } } }); } componentWillUnmount() { window.removeEventListener("keyup", this.keyupListener); const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`; thisNode.style.opacity = 1 - progress; if (progress == 1) { setImmediate(() => { thisNode.remove(); }); } } }); const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen"); layer.classList.remove("publicServersOpen"); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`; layer.style.opacity = progress; if (progress == 1) { setImmediate(() => { layer.style.transform = ""; layer.style.opacity = ""; }); } } }); } componentWillMount() { const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]"); layer.classList.add("publicServersOpen"); _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({ duration: 200, update: function (progress) { layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`; layer.style.opacity = 1 - progress; } }); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer, id: this.props.id, ref: "root", style: { opacity: 0, transform: "scale(1.1) translateZ(0px)" } }, this.props.children); } } /***/ }), /***/ "./src/ui/publicservers/publicServers.js": /*!***********************************************!*\ !*** ./src/ui/publicservers/publicServers.js ***! \***********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js"); /* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js"); /* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js"); /* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js"); /* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js"); class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.setInitialState(); this.close = this.close.bind(this); this.changeCategory = this.changeCategory.bind(this); this.search = this.search.bind(this); this.searchKeyDown = this.searchKeyDown.bind(this); this.checkConnection = this.checkConnection.bind(this); this.join = this.join.bind(this); this.connect = this.connect.bind(this); this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]); this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]); this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]); this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]); } componentDidMount() { this.checkConnection(); } setInitialState() { this.state = { selectedCategory: -1, title: "Loading...", loading: true, servers: [], next: null, connection: { state: 0, user: null } }; } close() { _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId)); } search(query, clear) { const self = this; fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, { method: "get" }).then(async res => { if (res.status !== 200) throw await res.text(); let data = await res.json(); let servers = data.results.reduce((arr, server) => { server.joined = false; arr.push(server); // arr.push(); return arr; }, []); if (!clear) { servers = self.state.servers.concat(servers); } else {//servers.unshift(self.bdServer); } let end = data.size + data.from; data.next = `?from=${end}`; if (self.state.term) data.next += `&term=${self.state.term}`; if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`; if (end >= data.total) { end = data.total; data.next = null; } let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`; if (self.state.term) title += ` for ${self.state.term}`; self.setState({ loading: false, title: title, servers: servers, next: data.next }); if (clear) { //console.log(self); self.refs.sbv.refs.contentScroller.scrollTop = 0; } }).catch(err => { console.error(err); return self.setState({ loading: false, title: "Failed to load servers. Check console for details" }); }); } async join(serverCard) { if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code); await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`, { method: "GET", credentials: "include", mode: "cors", headers: { "Accept": "application/json", "Content-Type": "application/json" } }); serverCard.setState({ joined: true }); } connect() { const self = this; const options = self.windowOptions; options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2); options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2); self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options); const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info"; self.joinWindow.webContents.on("did-navigate", (event, url) => { if (url != "https://auth.discordservers.com/info") return; self.joinWindow.close(); self.checkConnection(); }); self.joinWindow.loadURL(url); } get windowOptions() { return { width: 500, height: 550, backgroundColor: "#282b30", show: true, resizable: false, maximizable: false, minimizable: false, alwaysOnTop: true, frame: false, center: false, webPreferences: { nodeIntegration: false } }; } get bdServer() { const server = { name: "BetterDiscord", online: "7500+", members: "20000+", categories: ["community", "programming", "support"], description: "Official BetterDiscord server for support etc", identifier: "86004744966914048", iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp", nativejoin: true, invite_code: "0Tmfo5ZbORCRqbAd", pinned: true }; const server2 = { name: "Lightcord", online: "30+", members: "50+", categories: ["community", "programming", "support"], description: "Official Lightcord server for support etc", identifier: "86004744966914048", iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4", nativejoin: true, invite_code: "7eFff2A", pinned: true }; const guildList = this.SortedGuildStore.getFlattenedGuildIds(); const defaultList = this.AvatarDefaults.DEFAULT_AVATARS; return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], { server: server2, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)] }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], { server: server, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)] })]; } get endPoint() { return "https://search.discordservers.com"; } get joinEndPoint() { return "https://j.discordservers.com"; } get connectEndPoint() { return "https://join.discordservers.com/connect"; } async checkConnection() { const self = this; try { const response = await fetch(`https://auth.discordservers.com/info`, { method: "GET", credentials: "include", mode: "cors", headers: { "Accept": "application/json", "Content-Type": "application/json" } }); const data = await response.json(); self.setState({ selectedCategory: 0, connection: { state: 2, user: data } }); self.search("", true); } catch (error) { console.error(error); self.setState({ title: "Not connected to discordservers.com!", loading: true, selectedCategory: -1, connection: { state: 1, user: null } }); } } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], { ref: "sbv" }, this.component); } get component() { return { sidebar: { component: this.sidebar }, content: { component: this.content }, tools: { component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], { key: "pt", ref: "tools", onClick: this.close }) } }; } get sidebar() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "sidebar", key: "ps" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar SIDE" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-header", style: { fontSize: "16px" } }, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], { text: "Categories" }), this.categoryButtons.map((value, index) => { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], { id: index, onClick: this.changeCategory, key: index, text: value, selected: this.state.selectedCategory === index }); }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection)); } get searchInput() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-form-item" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-text-input flex-vertical", style: { width: "172px", marginLeft: "10px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", { ref: "searchinput", onKeyDown: this.searchKeyDown, onChange: () => {}, type: "text", className: "input default", placeholder: "Search...", maxLength: "50" }))); } searchKeyDown(e) { const self = this; if (self.state.loading || e.which !== 13) return; self.setState({ loading: true, title: "Loading...", term: e.target.value }); let query = `?term=${e.target.value}`; if (self.state.selectedCategory !== 0) { query += `&category=${self.categoryButtons[self.state.selectedCategory]}`; } self.search(query, true); } get categoryButtons() { return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"]; } changeCategory(id) { const self = this; if (self.state.loading) return; self.refs.searchinput.value = ""; self.setState({ loading: true, selectedCategory: id, title: "Loading...", term: null }); if (id === 0) { self.search("", true); return; } self.search(`?category=${self.categoryButtons[id]}`, true); } get content() { const self = this; const guildList = this.SortedGuildStore.getFlattenedGuildIds(); const defaultList = this.AvatarDefaults.DEFAULT_AVATARS; if (self.state.connection.state === 1) return self.notConnected; let columnModule = BDModules.get(e => e.contentColumnDefault)[0]; return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { ref: "content", key: "pc", className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], { text: self.state.title }), self.bdServer, self.state.servers.map(server => { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], { key: server.identifier, server: server, join: self.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)] }); }), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", onClick: () => { if (self.state.loading) return; self.setState({ loading: true }); self.search(self.state.next, false); }, className: "ui-button filled brand small grow", style: { width: "100%", marginTop: "10px", marginBottom: "10px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], { text: self.state.title }))]; } get notConnected() { const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title }); let columnModule = BDModules.get(e => e.contentColumnDefault)[0]; return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { key: "ncc", ref: "content", className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { onClick: self.connect, type: "button", className: "ui-button filled brand small grow", style: { display: "inline-block", minHeight: "18px", marginLeft: "10px", lineHeight: "14px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Connect"))), self.bdServer)]; } get footer() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-header" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", { href: "https://discordservers.com", target: "_blank" }, "Discordservers.com")); } get connection() { const self = this; const { connection } = self.state; if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null); return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", { style: { color: "#b9bbbe", fontSize: "10px", marginLeft: "10px" } }, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { style: { padding: "5px 10px 0 10px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { style: { width: "100%", minHeight: "20px" }, type: "button", className: "ui-button filled brand small grow" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents", onClick: self.connect }, "Reconnect")))); } } /***/ }), /***/ "./src/ui/publicservers/serverCard.js": /*!********************************************!*\ !*** ./src/ui/publicservers/serverCard.js ***! \********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback; this.state = { imageError: false, joined: this.props.guildList.includes(this.props.server.identifier) }; } render() { const { server } = this.props; let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0]; let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0]; let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0]; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to { className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}` }, // BDV2.react.createElement( // "div", // { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", { ref: "img", className: "bd-server-image", src: server.iconUrl, onError: this.handleError.bind(this), draggable: false }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: flexModule.flexChild + " bd-server-content" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", { className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name" }, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", { className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count" }, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: flexModule.horizontal + " " + wrapModule.noWrap }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scroller-2FKFPG scroller bd-server-description" }, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "flexChild-faoVW3 bd-server-tags", style: { flex: "1 1 auto" } }, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY", style: { minHeight: "12px", marginTop: "4px", backgroundColor: "#3ac15c" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug", style: { minHeight: "12px", marginTop: "4px", backgroundColor: "#c13a3a" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", { type: "button", className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN", style: { minHeight: "12px", marginTop: "4px" }, onClick: () => { this.join(); } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-button-contents" }, "Join")))) // ) ); } handleError() { this.props.server.iconUrl = this.props.fallback; this.setState({ imageError: true }); } join() { this.props.join(this); //this.setState({joined: true}); } } /***/ }), /***/ "./src/ui/publicservers/sidebarView.js": /*!*********************************************!*\ !*** ./src/ui/publicservers/sidebarView.js ***! \*********************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js"); class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { const { sidebar, content, tools } = this.props.children; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "standardSidebarView-3F1I7i ui-standard-sidebar-view" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "sidebarRegion-VFTUkN sidebar-region" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], { key: "sidebarScroller", ref: "sidebarScroller", sidebar: true, fade: sidebar.fade || true, dark: sidebar.dark || true }, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "contentRegion-3nDuYy content-region" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "contentTransitionWrap-3hqOEW content-transition-wrap" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller", ref: "contentScroller" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default" }, content.component), tools.component))))); } } /***/ }), /***/ "./src/ui/reloadIcon.js": /*!******************************!*\ !*** ./src/ui/reloadIcon.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "#dcddde", className: "bd-reload " + this.props.className, onClick: this.props.onClick, style: { width: this.props.size || "24px", height: this.props.size || "24px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { fill: "none", d: "M0 0h24v24H0z" })); } } /***/ }), /***/ "./src/ui/scroller.js": /*!****************************!*\ !*** ./src/ui/scroller.js ***! \****************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { //scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0]; let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0]; let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`; let scrollerClass = scrollerModule1.scroller + " scroller"; /* fuck */ if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`; if (this.props.contentColumn) { scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller"; /* fuck */ wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`; } const { children } = this.props; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { key: "scrollerwrap", className: wrapperClass }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { key: "scroller", ref: "scroller", className: scrollerClass }, children)); } } /***/ }), /***/ "./src/ui/sectionedSettingsPanel.js": /*!******************************************!*\ !*** ./src/ui/sectionedSettingsPanel.js ***! \******************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SectionedSettingsPanel; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js"); /* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return this.props.sections.map((section, i) => { return [i !== 0 ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_margintop__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, { onChange: this.props.onChange }))]; }); } } /***/ }), /***/ "./src/ui/settingsGroup.js": /*!*********************************!*\ !*** ./src/ui/settingsGroup.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; }); /* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); /* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js"); class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent { constructor(props) { super(props); } render() { const { title, settings, button } = this.props; const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", { key: "title-button", className: "bd-pfbtn", onClick: button.onClick }, button.title) : null; return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], { text: title }), buttonComponent, settings.map(setting => { return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], { id: setting.id, key: setting.id, data: setting, checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id], onChange: (id, checked) => { this.props.onChange(id, checked); } }); })]; } } /***/ }), /***/ "./src/ui/settingsTitle.js": /*!*********************************!*\ !*** ./src/ui/settingsTitle.js ***! \*********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20 render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", { className: "ui-form-title h2 margin-reset margin-bottom-20" }, this.props.text); } } /***/ }), /***/ "./src/ui/switch.js": /*!**************************!*\ !*** ./src/ui/switch.js ***! \**************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx"); class SwitchItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.onChange = this.onChange.bind(this); } onChange() { this.props.checked = !this.props.checked; this.props.onChange(this.props.id, this.props.checked); } render() { const { text, info } = this.props.data; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h3", { className: "ui-form-title h3 margin-reset margin-reset ui-flex-child" }, text), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_1__["default"], { onChange: this.onChange, checked: this.props.checked })), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-form-text style-description margin-top-4", style: { flex: "1 1 auto" } }, info)); } } /***/ }), /***/ "./src/ui/tabBarHeader.js": /*!********************************!*\ !*** ./src/ui/tabBarHeader.js ***! \********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarHeader; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_TabBarHeader extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-header" }, this.props.text, this.props.button); } } /***/ }), /***/ "./src/ui/tabBarItem.js": /*!******************************!*\ !*** ./src/ui/tabBarItem.js ***! \******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarItem; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_TabBarItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.setInitialState(); this.onClick = this.onClick.bind(this); } setInitialState() { this.state = { selected: this.props.selected || false }; } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: `ui-tab-bar-item${this.props.selected ? " selected" : ""}`, onClick: this.onClick }, this.props.text); } onClick() { if (this.props.onClick) { this.props.onClick(this.props.id); } } } /***/ }), /***/ "./src/ui/tabBarSeparator.js": /*!***********************************!*\ !*** ./src/ui/tabBarSeparator.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarSeparator; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_TabBarSeparator extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "ui-tab-bar-separator margin-top-8 margin-bottom-8" }); } } /***/ }), /***/ "./src/ui/timestampRender.js": /*!***********************************!*\ !*** ./src/ui/timestampRender.js ***! \***********************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react; const intervalModule1 = BDModules.get(e => e.Interval)[0]; /* harmony default export */ __webpack_exports__["default"] = (function (component, Messages) { class TimeRender extends React.PureComponent { constructor(props) { super(props); this._interval = new intervalModule1.Interval(); this.state = Object.assign({}, this.getUpdatedTime()); } componentDidMount() { let self = this; this._interval.start(1e3, function () { return self.setState(self.getUpdatedTime()); }); } componentWillUnmount() { this._interval.stop(); } componentDidUpdate(activity) { if (activity.timestamps.end === this.props.timestamps.end && activity.timestamps.start === this.props.timestamps.start) return; this.setState(this.getUpdatedTime()); } getUpdatedTime() { let timestamps = this.props.timestamps; let now = Date.now() / 1e3; if (null != timestamps.end) { return this.getDiff(now, checkUnix(timestamps.end) / 1e3); } if (null != timestamps.start) { return this.getDiff(checkUnix(timestamps.start) / 1e3, now); } return { hours: 0, minutes: 0, seconds: 0 }; } renderTime(number, removeZero) { if (removeZero === undefined) removeZero = false; if (removeZero && number <= 0) return -1; if (number < 10) return "0" + number; return number; } getDiff(timestamp, now) { let hours = Math.max(now - timestamp, 0); let seconds = Math.floor(hours) % 60; let minutes = Math.floor(hours / 60) % 60; return { hours: Math.floor(hours / 3600) % 24, minutes, seconds }; } render() { let props = this.props; let timestamps = props.timestamps; let usedProps = function (props, items) { if (null == props) return {}; let timestamps = {}; let keys = Object.keys(props); for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (!items.indexOf(key) >= 0) { timestamps[key] = props[key]; } } return timestamps; }(props, ["timestamps"]); let state = this.state; let hours = state.hours; let minutes = state.minutes; let seconds = state.seconds; let data = { hours: this.renderTime(hours, !0), minutes: this.renderTime(minutes), seconds: this.renderTime(seconds) }; if (timestamps.end !== null) { return React.createElement(component, Object.assign({}, usedProps, { message: Messages.USER_ACTIVITY_TIMESTAMP_END.format(data) })); } if (timestamps.start !== null) { return React.createElement(component, Object.assign({}, usedProps, { message: Messages.USER_ACTIVITY_TIMESTAMP_START.format(data) })); } return null; } } return TimeRender; }); ; function checkUnix(e) { return ("" + e).length < 13 ? 1e3 * e : e; } /***/ }), /***/ "./src/ui/tools.js": /*!*************************!*\ !*** ./src/ui/tools.js ***! \*************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Tools; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js"); class V2C_Tools extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); this.onClick = this.onClick.bind(this); } render() { let toolsModule = BDModules.get(e => e.toolsContainer)[0]; let containerModule = BDModules.get(e => e.container && e.closeButton && e.closeButtonBold)[0]; return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "tools-container " + toolsModule.toolsContainer }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "tools " + toolsModule.tools }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: containerModule.container }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "btn-close " + containerModule.closeButton, onClick: this.onClick }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_1__["default"], null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { className: "esc-text " + containerModule.keybind }, "ESC")))); } onClick() { if (this.props.onClick) { this.props.onClick(); } const closeButton = document.querySelector("." + BDModules.get(e => e.closeButton && e.keybindBold)[0].closeButton.split(" ")[0]); if (closeButton) closeButton.click(); } } /***/ }), /***/ "./src/ui/tooltip.js": /*!***************************!*\ !*** ./src/ui/tooltip.js ***! \***************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EmulatedTooltip; }); /* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); /* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); /** * Tooltip that automatically show and hide themselves on mouseenter and mouseleave events. * Will also remove themselves if the node to watch is removed from DOM through * a MutationObserver. * * Note this is not using Discord's internals but normal DOM manipulation and emulates * Discord's own tooltips as closely as possible. * * @module EmulatedTooltip * @version 0.0.1 */ //
//
//
//
User Settings
//
//
//
//
//
// Changelog //
//
let TooltipClasses; function getTooltipClasses() { if (TooltipClasses) return TooltipClasses; return TooltipClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("tooltip", "tooltipBlack"); } let TooltipLayers; function getTooltipLayers() { if (TooltipLayers) return TooltipLayers; return TooltipLayers = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("layer", "layerContainer"); } const getClass = function (sideOrColor) { const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1); const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`]; if (tooltipClass) return tooltipClass; return null; }; const classExists = function (sideOrColor) { return getClass(sideOrColor) ? true : false; }; const toPx = function (value) { return `${value}px`; }; /*
User Settings
*/ class EmulatedTooltip { /** * * @constructor * @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on * @param {string} tip - string to show in the tooltip * @param {object} options - additional options for the tooltip * @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow) * @param {string} [options.side=top] - can be any of top, right, bottom, left * @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen * @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover */ constructor(node, text, options = {}) { const { style = "black", side = "top", preventFlip = false, disabled = false } = options; this.node = node instanceof jQuery ? node[0] : node; this.label = text; this.style = style.toLowerCase(); this.side = side.toLowerCase(); this.preventFlip = preventFlip; this.disabled = disabled; if (!classExists(this.side)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Side ${this.side} does not exist.`); if (!classExists(this.style)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Style ${this.style} does not exist.`); this.element = document.createElement("div"); this.element.className = getTooltipLayers().layer + " " + getTooltipLayers().disabledPointerEvents; this.tooltipElement = document.createElement("div"); this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`; this.labelElement = document.createElement("div"); this.labelElement.className = getTooltipClasses().tooltipContent; const pointerElement = document.createElement("div"); pointerElement.className = getTooltipClasses().tooltipPointer; this.tooltipElement.append(pointerElement); this.tooltipElement.append(this.labelElement); this.element.append(this.tooltipElement); this.node.addEventListener("mouseenter", () => { if (this.disabled) return; this.show(); const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { const nodes = Array.from(mutation.removedNodes); const directMatch = nodes.indexOf(this.node) > -1; const parentMatch = nodes.some(parent => parent.contains(this.node)); if (directMatch || parentMatch) { this.hide(); observer.disconnect(); } }); }); observer.observe(document.body, { subtree: true, childList: true }); }); this.node.addEventListener("mouseleave", () => { this.hide(); }); } /** Container where the tooltip will be appended. */ get container() { return document.querySelector("." + BDModules.get(e => e.popouts)[0].popouts.split(" ")[0] + " ~ ." + BDModules.get(e => e.layerContainer)[0].layerContainer.split(" ")[0]); } /** Boolean representing if the tooltip will fit on screen above the element */ get canShowAbove() { return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0; } /** Boolean representing if the tooltip will fit on screen below the element */ get canShowBelow() { return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenHeight; } /** Boolean representing if the tooltip will fit on screen to the left of the element */ get canShowLeft() { return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0; } /** Boolean representing if the tooltip will fit on screen to the right of the element */ get canShowRight() { return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenWidth; } /** Hides the tooltip. Automatically called on mouseleave. */ hide() { this.element.remove(); this.tooltipElement.className = this._className; } /** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */ show() { this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`; this.labelElement.textContent = this.label; this.container.append(this.element); if (this.side == "top") { if (this.canShowAbove || !this.canShowAbove && this.preventFlip) this.showAbove();else this.showBelow(); } if (this.side == "bottom") { if (this.canShowBelow || !this.canShowBelow && this.preventFlip) this.showBelow();else this.showAbove(); } if (this.side == "left") { if (this.canShowLeft || !this.canShowLeft && this.preventFlip) this.showLeft();else this.showRight(); } if (this.side == "right") { if (this.canShowRight || !this.canShowRight && this.preventFlip) this.showRight();else this.showLeft(); } } /** Force showing the tooltip above the node. */ showAbove() { this.tooltipElement.classList.add(getClass("top")); this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10)); this.centerHorizontally(); } /** Force showing the tooltip below the node. */ showBelow() { this.tooltipElement.classList.add(getClass("bottom")); this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10)); this.centerHorizontally(); } /** Force showing the tooltip to the left of the node. */ showLeft() { this.tooltipElement.classList.add(getClass("left")); this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10)); this.centerVertically(); } /** Force showing the tooltip to the right of the node. */ showRight() { this.tooltipElement.classList.add(getClass("right")); this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10)); this.centerVertically(); } centerHorizontally() { const nodecenter = this.node.getBoundingClientRect().left + this.node.offsetWidth / 2; this.element.style.setProperty("left", toPx(nodecenter - this.element.offsetWidth / 2)); } centerVertically() { const nodecenter = this.node.getBoundingClientRect().top + this.node.offsetHeight / 2; this.element.style.setProperty("top", toPx(nodecenter - this.element.offsetHeight / 2)); } } /***/ }), /***/ "./src/ui/tooltipWrap.js": /*!*******************************!*\ !*** ./src/ui/tooltipWrap.js ***! \*******************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); /* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js"); /* harmony default export */ __webpack_exports__["default"] = (class extends React.Component { constructor(props) { super(props); } async componentDidMount() { const { style = "black", side = "top", text = "" } = this.props; this.node = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.findDOMNode(this); this.tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_1__["default"](this.node, text, { style, side }); } componentWillUnmount() { this.tooltip.hide(); delete this.tooltip; } render() { return this.props.children; } }); /***/ }), /***/ "./src/ui/xSvg.js": /*!************************!*\ !*** ./src/ui/xSvg.js ***! \************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_XSvg; }); /* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); class V2C_XSvg extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { constructor(props) { super(props); } render() { return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 12 12", style: { width: "18px", height: "18px" } }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", { className: "background", fill: "none", fillRule: "evenodd" }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { d: "M0 0h12v12H0" }), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", { className: "fill", fill: "#dcddde", d: "M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6" }))); } } /***/ }), /***/ "crypto": /*!*************************!*\ !*** external "crypto" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), /***/ "electron": /*!***************************!*\ !*** external "electron" ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("electron"); /***/ }), /***/ "events": /*!*************************!*\ !*** external "events" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("events"); /***/ }), /***/ "fs": /*!*********************!*\ !*** external "fs" ***! \*********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), /***/ "mkdirp": /*!*************************!*\ !*** external "mkdirp" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("mkdirp"); /***/ }), /***/ "module": /*!*************************!*\ !*** external "module" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("module"); /***/ }), /***/ "node-fetch": /*!*****************************!*\ !*** external "node-fetch" ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("node-fetch"); /***/ }), /***/ "path": /*!***********************!*\ !*** external "path" ***! \***********************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("path"); /***/ }), /***/ "rimraf": /*!*************************!*\ !*** external "rimraf" ***! \*************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("rimraf"); /***/ }), /***/ "yauzl": /*!************************!*\ !*** external "yauzl" ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = require("yauzl"); /***/ }) /******/ }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2NpcmN1cy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvbGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9sYXllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2VydmVyQ2FyZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2lkZWJhclZpZXcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2Nyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NHcm91cC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJJdGVtLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFyU2VwYXJhdG9yLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGltZXN0YW1wUmVuZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1rZGlycFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJpbXJhZlwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJ5YXV6bFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJMQ0NoYW5lbG9nIiwiZGVzY3JpcHRpb24iLCJjaGFuZ2VzIiwidGl0bGUiLCJpdGVtcyIsImltYWdlIiwic3VidGl0bGUiLCJyZW1vdGUiLCJnZXRHbG9iYWwiLCJ2ZXJzaW9uIiwiZm9vdGVyIiwiVGV4dEVsZW1lbnQiLCJXZWJwYWNrTW9kdWxlcyIsImZpbmRCeURpc3BsYXlOYW1lIiwiTW9kYWxTdGFjayIsImZpbmRCeVByb3BzIiwiQW5jaG9yIiwiZmluZCIsIm0iLCJkaXNwbGF5TmFtZSIsIkFuY2hvckNsYXNzZXMiLCJhbmNob3IiLCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyIiwiam9pblN1cHBvcnRTZXJ2ZXIiLCJjbGljayIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwicG9wIiwiQkRWMiIsImpvaW5MQyIsInN1cHBvcnRMaW5rIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50Iiwib25DbGljayIsImNsYXNzTmFtZSIsInNpemUiLCJTaXplcyIsIlNNQUxMIiwiY29sb3IiLCJDb2xvcnMiLCJTVEFOREFSRCIsImJiZENoYW5nZWxvZyIsInR5cGUiLCJzZXR0aW5ncyIsImlkIiwiaW5mbyIsImltcGxlbWVudGVkIiwiaGlkZGVuIiwiY2F0IiwiY2F0ZWdvcnkiLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwiYmRwbHVnaW5FcnJvcnMiLCJiZHRoZW1lRXJyb3JzIiwiYmRDb25maWciLCJPYmplY3QiLCJjcmVhdGUiLCJCZXR0ZXJEaXNjb3JkQ29uZmlnIiwiYmR0aGVtZXMiLCJiZHBsdWdpbnMiLCJwbHVnaW5Db29raWUiLCJ0aGVtZUNvb2tpZSIsImxvY2FsU3RvcmFnZUZpeCIsImxvYWRpbmdJY29uIiwiZGVwcmVjYXRlR2xvYmFsIiwia2V5IiwidmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsIlV0aWxzIiwid2FybiIsImdsb2JhbEtleXMiLCJrZXlzIiwiR2xvYmFscyIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwic2V0Q29uZmlnIiwiaW5pdCIsInYyTG9hZGVyIiwiZG9jdW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsInByb2Nlc3MiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIlJlYWN0RE9NIiwiUmVhY3REb20iLCJSZWFjdENvbXBvbmVudCIsIldpbmRvd0NvbmZpZ0ZpbGUiLCJlbW90ZXMiLCJzY3JlZW5XaWR0aCIsIk1hdGgiLCJtYXgiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRXaWR0aCIsImlubmVyV2lkdGgiLCJzY3JlZW5IZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJpbm5lckhlaWdodCIsImdldEFsbFdpbmRvd1ByZWZlcmVuY2VzIiwiZ2V0V2luZG93UHJlZmVyZW5jZSIsInNldFdpbmRvd1ByZWZlcmVuY2UiLCJpbmplY3RDU1MiLCJjc3MiLCJET00iLCJhZGRTdHlsZSIsImVzY2FwZUlEIiwiY2xlYXJDU1MiLCJyZW1vdmVTdHlsZSIsImxpbmtKUyIsImFkZFNjcmlwdCIsInVubGlua0pTIiwicmVtb3ZlU2NyaXB0IiwiZ2V0UGx1Z2luIiwiaGFzT3duUHJvcGVydHkiLCJwbHVnaW4iLCJnZXRDb3JlIiwibWFpbkNvcmUiLCJhbGVydCIsInNob3dDb25maXJtYXRpb25Nb2RhbCIsImNhbmNlbFRleHQiLCJvcHRpb25zIiwiZmluZE1vZHVsZSIsImZpbHRlciIsImZpbmRBbGxNb2R1bGVzIiwiZmluZEFsbCIsImZpbmRNb2R1bGVCeVByb3BzIiwicHJvcHMiLCJmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzIiwiZmluZE1vZHVsZUJ5UHJvdG90eXBlcyIsInByb3RvcyIsImZpbmRCeVByb3RvdHlwZXMiLCJmaW5kTW9kdWxlQnlEaXNwbGF5TmFtZSIsImdldEludGVybmFsSW5zdGFuY2UiLCJub2RlIiwialF1ZXJ5IiwiRWxlbWVudCIsImxvYWREYXRhIiwicGx1Z2luTmFtZSIsImdldFBsdWdpbkRhdGEiLCJnZXREYXRhIiwic2F2ZURhdGEiLCJzZXRQbHVnaW5EYXRhIiwic2V0RGF0YSIsImRlbGV0ZURhdGEiLCJkZWxldGVQbHVnaW5EYXRhIiwid2hhdCIsIm1ldGhvZE5hbWUiLCJvblJlbW92ZWQiLCJjYWxsYmFjayIsInN1cHByZXNzRXJyb3JzIiwibWV0aG9kIiwidGVzdEpTT04iLCJpc1BsdWdpbkVuYWJsZWQiLCJpc1RoZW1lRW5hYmxlZCIsImlzU2V0dGluZ0VuYWJsZWQiLCJlbmFibGVTZXR0aW5nIiwib25DaGFuZ2UiLCJkaXNhYmxlU2V0dGluZyIsInRvZ2dsZVNldHRpbmciLCJnZXRCRERhdGEiLCJzZXRCRERhdGEiLCJtYWtlQWRkb25BUEkiLCJjb29raWUiLCJsaXN0IiwibWFuYWdlciIsIkFkZG9uQVBJIiwiZm9sZGVyIiwiaXNFbmFibGVkIiwidG9nZ2xlIiwicmVsb2FkIiwiZ2V0QWxsIiwiayIsImEiLCJQbHVnaW5zIiwiVGhlbWVzIiwiQmV0dGVyRGlzY29yZCIsIkV2ZW50RW1pdHRlciIsInJlcXVpcmUiLCJldmVudE5hbWUiLCJhcmdzIiwiZW1pdCIsIm9mZiIsImV2ZW50QWN0aW9uIiwicmVtb3ZlTGlzdGVuZXIiLCJzZWxlY3RvcnMiLCJyZW1vdmVEYSIsImdldFNlbGVjdG9ycyIsInN0YW5kYXJkU2lkZWJhclZpZXciLCJkZWZhdWx0Q2xhc3NOYW1lIiwic2VsZWN0cyIsInB1c2giLCJwYXltZW50U291cmNlUm93Iiwic3ViVGV4dCIsImRlc2NyaXB0aW9uV3JhcHBlciIsInVzZXJTZXR0aW5nc0FjY291bnQiLCJ2aWV3Qm9keSIsIkJsdXJQcml2YXRlIiwiZXJyb3IiLCJET01Ub29scyIsIm5vcm1hbGl6ZWRQcmVmaXgiLCJyYW5kQ2xhc3MiLCJzdG9wIiwiaGFzUGF0Y2hlZCIsInVucGF0Y2hDbGFzc01vZHVsZXMiLCJtb2R1bGVGaWx0ZXIiLCJyZXZlcnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInBhdGNoQ2xhc3NNb2R1bGVzIiwibm9ybWFsaXplRWxlbWVudCIsInBhdGNoRE9NTWV0aG9kcyIsIm1vZHVsZXMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsInNwbGl0IiwiY29tcG9uZW50TmFtZSIsImNsYXNzTmFtZXMiLCJjbGFzc0xpc3QiLCJub3JtYWxDbGFzcyIsImNhbWVsQ2FzZSIsInMiLCJpIiwidG9VcHBlckNhc2UiLCJzbGljZSIsImpvaW4iLCJuZXdTdHJpbmciLCJ0cmltIiwiZWxlbWVudCIsImNsYXNzZXMiLCJjIiwiY2xlbiIsIm5ld0NsYXNzIiwiYWRkIiwiY2hpbGQiLCJjaGlsZHJlbiIsIm5leHRFbGVtZW50U2libGluZyIsInRvUmVtb3ZlIiwicmVtb3ZlIiwiY29udGFpbnMiLCJET01Ub2tlbkxpc3QiLCJ0b2tlbiIsInRva2VucyIsInQiLCJDb2xvcmVkVGV4dCIsImluamVjdENvbG9yZWRUZXh0IiwiY2FuY2VsQ29sb3JlZFRleHQiLCJNZXNzYWdlQ29tcG9uZW50IiwiYmVmb3JlIiwibWV0aG9kQXJndW1lbnRzIiwiY2hpbGRyZW5NZXNzYWdlQ29udGVudCIsIm1lc3NhZ2VDb250ZW50Iiwib3JpZ2luYWxUeXBlIiwiX19vcmlnaW5hbE1ldGhvZCIsInJvbGVDb2xvciIsImNvbG9yU3RyaW5nIiwic3R5bGUiLCJhc3NpZ24iLCJyZW1vdmVDb2xvcmVkVGV4dCIsImNsYXNzTmFtZU1hcmt1cCIsIm1hcmt1cCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZWxlbSIsInNldFByb3BlcnR5IiwicGF0aCIsImZzIiwiTW9kdWxlIiwiZ2xvYmFsUGF0aHMiLCJyZXNvbHZlIiwiYXBwIiwiZ2V0QXBwUGF0aCIsIk1ldGFFcnJvciIsIm9yaWdpbmFsSlNSZXF1aXJlIiwiX2V4dGVuc2lvbnMiLCJvcmlnaW5hbENTU1JlcXVpcmUiLCJzcGxpdFJlZ2V4IiwiZXNjYXBlZEF0UmVnZXgiLCJhZGRvbkNhY2hlIiwidGltZUNhY2hlIiwid2F0Y2hlcnMiLCJwYXRjaEV4dGVuc2lvbnMiLCJnZXRDb250ZW50UmVxdWlyZSIsInBsdWdpbnNGb2xkZXIiLCJfcGx1Z2luc0ZvbGRlciIsInJlYWxwYXRoU3luYyIsImRhdGFQYXRoIiwidGhlbWVzRm9sZGVyIiwiX3RoZW1lc0ZvbGRlciIsImxvYWRBZGRvbkNlcnRpZmllckNhY2hlIiwiZGF0YVN0b3JlIiwiZ2V0U2V0dGluZ0dyb3VwIiwic2V0U2V0dGluZ0dyb3VwIiwiZW5jcnlwdFNldHRpbmdzQ2FjaGUiLCJKU09OIiwicGFyc2UiLCJkZWNyeXB0U2V0dGluZ3NDYWNoZSIsImhhc2giLCJyZXN1bHQiLCJzdXNwZWN0Iiwic2F2ZUFkZG9uQ2FjaGUiLCJzdHJpbmdpZnkiLCJ3YXRjaENvbnRlbnQiLCJjb250ZW50VHlwZSIsImlzUGx1Z2luIiwiYmFzZUZvbGRlciIsImZpbGVFbmRpbmciLCJ3YXRjaCIsInBlcnNpc3RlbnQiLCJldmVudFR5cGUiLCJmaWxlbmFtZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsInN0YXRTeW5jIiwiZXJyIiwiY29kZSIsInVubG9hZFBsdWdpbiIsInVubG9hZFRoZW1lIiwiaXNGaWxlIiwic3RhdHMiLCJtdGltZSIsImdldFRpbWUiLCJsb2FkUGx1Z2luIiwibG9hZFRoZW1lIiwicmVsb2FkUGx1Z2luIiwicmVsb2FkVGhlbWUiLCJ1bndhdGNoQ29udGVudCIsImNsb3NlIiwiZXh0cmFjdE1ldGEiLCJmaXJzdExpbmUiLCJoYXNPbGRNZXRhIiwicGFyc2VPbGRNZXRhIiwiaGFzTmV3TWV0YSIsInBhcnNlTmV3TWV0YSIsIm1ldGEiLCJyYXdNZXRhIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwicGFyc2VkIiwiZm9ybWF0IiwiYmxvY2siLCJvdXQiLCJmaWVsZCIsImFjY3VtIiwibGluZSIsImNoYXJBdCIsImwiLCJzdWJzdHIiLCJzZWxmIiwib3JpZ2luYWxSZXF1aXJlIiwicG9zc2libGVQYXRoIiwiYmFzZW5hbWUiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3RyaXBCT00iLCJhZGRlZCIsImF0aW1lTXMiLCJtb2RpZmllZCIsIm10aW1lTXMiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwicHJvY2Vzc0ZpbGUiLCJ0aW1lc3RhbXAiLCJmaWxlIiwiaGFybSIsInN0YWNrIiwidW5sb2FkQ29udGVudCIsImNhY2hlIiwiaXNMb2FkZWQiLCJyZWxvYWRDb250ZW50IiwiY2FudFVubG9hZCIsImxvYWROZXdDb250ZW50IiwiYmFzZWRpciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJjb250ZW50TGlzdCIsInZhbHVlcyIsInJlbW92ZWQiLCJmIiwibG9hZEFsbENvbnRlbnQiLCJlcnJvcnMiLCJsb2FkUGx1Z2lucyIsImxvYWRUaGVtZXMiLCJjb25maWciLCJmbGF0IiwiRUQiLCJXZWJTb2NrZXQiLCJwYXRjaEF0dHJpYnV0ZXMiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJjb250ZW50TWFuYWdlciIsImF0b2IiLCJhZGRFdmVudExpc3RlbmVyIiwiUGx1Z2luQ2VydGlmaWVyIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImluaXRPYnNlcnZlciIsInNob3dDb250ZW50RXJyb3JzIiwicGx1Z2lucyIsInRoZW1lcyIsInByZXZpb3VzVmVyc2lvbiIsInNob3dDaGFuZ2Vsb2dNb2RhbCIsIkVtb2ppTW9kdWxlIiwicGF0Y2hTb2NpYWwiLCJwYXRjaEd1aWxkUGlsbHMiLCJwYXRjaEd1aWxkTGlzdEl0ZW1zIiwicGF0Y2hHdWlsZFNlcGFyYXRvciIsInBhdGNoTWVzc2FnZUhlYWRlciIsInBhdGNoTWVtYmVyTGlzdCIsInBhdGNoQXR0YWNobWVudCIsImhhdmVJbnN0YWxsZWREZWZhdWx0Iiwib25DbG9zZSIsImxvZ28iLCJ0b3AiLCJpbm5lckhUTUwiLCJhdHRyaWJzUGF0Y2hzIiwiY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzIiwidjIiLCJlbnN1cmVFeHBvcnRlZCIsInRoZW4iLCJEaXNjb3JkVGFnIiwiRGlzY29yZFRhZ0NvbXAiLCJ1dWlkdjQiLCJiYWRnZURpdiIsImRpc3BsYXkiLCJtYXJnaW5Ub3AiLCJ1c2VyIiwiVG9vbHRpcFdyYXAiLCJzaWRlIiwiaHJlZiIsInRhcmdldCIsIkJETG9nbyIsIkxpZ2h0Y29yZExvZ28iLCJkaXYiLCJhcHBseUJhZGdlcyIsInRpbWVzQ2hlY2tlZCIsIndyYXBwZXIiLCJndWlsZENsYXNzZXMiLCJndWlsZCIsImxpc3RJdGVtIiwiYmxvYiIsImJsb2JDb250YWluZXIiLCJkZWZlckxvYWRlZCIsInJlYWR5U3RhdGUiLCJpbmplY3RFeHRlcm5hbHMiLCJvcmlnaW5hbCIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJBcGkiLCJnZXRQcmVkaWNhdGVTZWN0aW9ucyIsInNldHRpbmdNb2R1bGUiLCJjYWxsIiwic2VjdGlvbiIsInBvcGVkIiwicmVuZGVyU2lkZWJhciIsImNsYXNzTmFtZUxheWVyIiwiY2xhc3NOYW1lU29jaWFsTGlua3MiLCJjbGFzc05hbWVNb2RhbCIsIm1haW5PYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtbGVuIiwibXV0YXRpb24iLCJyYXdPYnNlcnZlciIsImFkZGVkTm9kZXMiLCJsYXllciIsImFuaW1hdGluZyIsInNvY2lhbExpbmtzIiwibW9kYWwiLCJpbm5lciIsInJlc3BvbnNpdmVXaWR0aE1vYmlsZSIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInBhcmVudEVsZW1lbnQiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsInNvY2lhbFBhdGNoIiwiVGFiQmFyIiwidG9TdHJpbmciLCJzb2NpYWxNb2R1bGUxIiwibmV3T25lIiwicmV0dXJuVmFsIiwibGluayIsImNsYXNzTmFtZUNvbG9yTXV0ZWQiLCJzaXplcyIsImNsYXNzTmFtZVZlcnNpb25IYXNoIiwiY29sb3JNdXRlZCIsInNpemUzMiIsInZlcnNpb25IYXNoIiwiYnJhbmNoIiwiYWRkaXRpb25hbCIsInJlYWN0Iiwic2l6ZTEyIiwiZWxlY3Ryb24iLCJjb21taXQiLCJvcmlnaW5hbFZlcnNpb25zIiwic3BsaWNlIiwiZ2V0R3VpbGRDbGFzc2VzIiwiZ3VpbGRzV3JhcHBlciIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJjaGF0IiwibmV4dFRpY2siLCJnZXRFbGVtZW50QnlJZCIsImNoaWxkTm9kZXMiLCJibG9ja0RpdiIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwicmVuZGVyIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwidXBkYXRlSW5qZWN0b3IiLCJpbmplY3Rpb25QYXRoIiwicm1yZiIsInlhdXpsIiwibWtkaXJwIiwicmVxdWVzdCIsInBhcmVudFBhdGgiLCJmb2xkZXJOYW1lIiwiemlwTGluayIsInNhdmVkWmlwIiwiZXh0cmFjdGVkRm9sZGVyIiwic3VjY2VzcyIsImVuY29kaW5nIiwicmVzcG9uc2UiLCJzdGF0dXNDb2RlIiwiYWxyZWFkeUV4aXN0cyIsInJlcyIsImV4aXN0cyIsInJlbmFtZSIsInJvdW5kIiwicGVyZm9ybWFuY2UiLCJ3cml0ZUZpbGUiLCJ6aXBmaWxlIiwibGF6eUVudHJpZXMiLCJ6aXAiLCJvbiIsImVudHJ5IiwiZmlsZU5hbWUiLCJyZWFkRW50cnkiLCJmdWxsUGF0aCIsInN5bmMiLCJkaXJuYW1lIiwib3BlblJlYWRTdHJlYW0iLCJyZWFkU3RyZWFtIiwicGlwZSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwib25jZSIsImJhY2t1cEZvbGRlciIsInVubGluayIsIl9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIiwicmVsZWFzZUNoYW5uZWwiLCJnbG9iYWxzIiwiZ2V0UmVsZWFzZUNoYW5uZWwiLCJzdGFibGUiLCJjYW5hcnkiLCJwdGIiLCJwbHVnaW5EYXRhIiwiQkRGaWxlIiwid3JpdGVGaWxlU3luYyIsInNldHRpbmdzRmlsZSIsInVubGlua1N5bmMiLCJfaW5qZWN0aW9uUGF0aCIsImJhc2UiLCJyb2FtaW5nQmFzZSIsImdldFBhdGgiLCJyb2FtaW5nTG9jYXRpb24iLCJyZWFsTG9jYXRpb24iLCJjb25maWdGaWxlIiwiX2NvbmZpZ0ZpbGUiLCJfQkRGaWxlIiwiX3NldHRpbmdzRmlsZSIsImdldFBsdWdpbkZpbGUiLCJEZXZNb2RlIiwiZGVidWdMaXN0ZW5lciIsImNvcHlTZWxlY3Rvckxpc3RlbmVyIiwic3RhcnREZWJ1Z0xpc3RlbmVyIiwic3RhcnRDb3B5U2VsZWN0b3IiLCJzdG9wRGVidWdMaXN0ZW5lciIsInN0b3BDb3B5U2VsZWN0b3IiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwid2hpY2giLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzZWxlY3RvciIsImdldFNlbGVjdG9yIiwiY2xhc3NMYXllciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJtZW51IiwiYXR0YWNoIiwiY20iLCJxdWVyeSIsImNvbnRhaW5lciIsImxheWVyQ29udGFpbmVyIiwiY21XcmFwIiwic3R5bGVGbGV4aWJsZSIsImFjY29tbW9kYXRlU2Nyb2xsYmFyIiwiYXBwZW5kIiwiY2xpZW50WSIsImxlZnQiLCJjbGllbnRYIiwic2Nyb2xsZXJDbGFzc2VzIiwic2Nyb2xsZXJXcmFwIiwic2Nyb2xsZXJUaGVtZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmUiLCJzY3JvbGxlciIsInJlbW92ZUNNIiwia2V5Q29kZSIsImNtZyIsImNtaSIsIml0ZW0iLCJsYWJlbENvbnRhaW5lciIsImNvbG9yRGVmYXVsdCIsImxhYmVsIiwiTmF0aXZlTW9kdWxlIiwiY29weSIsImVsZW1lbnRzIiwicXVlcnlBbGwiLCJmb2N1c2VkIiwic2VwYXJhdG9yIiwic2Nyb2xsSGVpZ2h0IiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJmcm9tIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJnZXRSdWxlcyIsInN0eWxlU2hlZXRzIiwic2hlZXRzIiwicnVsZXMiLCJjc3NSdWxlcyIsImVsZW1lbnRSdWxlcyIsInNlbGVjdG9yVGV4dCIsIm1hdGNoZXMiLCJEaXNhYmxlVHlwaW5nIiwic3RhcnRUeXBpbmciLCJ0eXBpbmdNb2R1bGUiLCJkaXNhYmxlZCIsInN0b3BUeXBpbmciLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwibmV3UHJvbWlzZSIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJ1c2VycyIsImhhbmRsZVJlcXVlc3QiLCJSb3V0ZXMiLCJzdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJqc29uIiwicHJvbWlzZSIsInVzZXJfaWQiLCJjYXRjaCIsIkxpZ2h0Y29yZEVycm9yIiwicm91dGUiLCJyZWplY3QiLCJub2RlRmV0Y2giLCJTRVJWRVJfVVJMIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJCdWdIdW50ZXJCYWRnZSIsIkNpcmN1cyIsImhlYWQiLCJzY3JpcHQiLCJzcmMiLCJvbmxvYWQiLCJhbmltYXRlIiwidGltaW5nIiwiXyIsInVwZGF0ZSIsImR1cmF0aW9uIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidGltZSIsInRpbWVGcmFjdGlvbiIsInByb2dyZXNzIiwiUSIsInBhcnNlSFRNTCIsImlzSFRNTCIsIk5vZGVMaXN0Iiwic29tZSIsIm4iLCJub2RlVHlwZSIsImJhc2VFbGVtZW50IiwiaHRtbCIsImZyYWdtZW50IiwidGVtcGxhdGUiLCJjbG9uZU5vZGUiLCJlc2NhcGVIVE1MIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInNwYW5FbGVtZW50Iiwibm9kZVZhbHVlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiY2xhc3NuYW1lIiwiaW5kaWNhdG9yIiwiaGFzQ2xhc3MiLCJldmVyeSIsInJlcGxhY2VDbGFzcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiYXBwZW5kVG8iLCJ0aGlzTm9kZSIsInRoYXROb2RlIiwicHJlcGVuZFRvIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwidGFyZ2V0Tm9kZSIsImluc2VydEJlZm9yZSIsIm5leHRTaWJsaW5nIiwibmV3Tm9kZSIsIm5leHQiLCJuZXh0QWxsIiwibmV4dFVudGlsIiwicHJldmlvdXMiLCJwcmV2aW91c0FsbCIsInByZXZpb3VzVW50aWwiLCJpbmRleEluUGFyZW50IiwibnVtIiwiaW5kZXgiLCJwYXJlbnQiLCJmaW5kQ2hpbGQiLCJmaW5kQ2hpbGRyZW4iLCJwYXJlbnRzIiwiY2xvc2VzdCIsInBhcmVudHNVbnRpbCIsInNpYmxpbmdzIiwiYXR0cmlidXRlIiwiZ2xvYmFsIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImhlaWdodCIsInRleHRDb250ZW50Iiwib3V0ZXJXaWR0aCIsIm9mZnNldFdpZHRoIiwib3V0ZXJIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsaXN0ZW5lcnMiLCJfbGlzdGVuZXJzIiwiZXZlbnQiLCJkZWxlZ2F0ZSIsIm5hbWVzcGFjZSIsImhhc0RlbGVnYXRlIiwiZXZlbnRGdW5jIiwiY2FuY2VsIiwibmV3Q2FuY2VsIiwiZmluZEluZGV4IiwiX19vZmZBbGwiLCJtYXRjaEZpbHRlciIsImxpc3RlbmVyIiwiZGVmYXVsdEZpbHRlciIsIm9uTW91bnRDaGFuZ2UiLCJvbk1vdW50Iiwid3JhcHBlZENhbGxiYWNrIiwib2JzZXJ2ZXIiLCJub2RlcyIsInJlbW92ZWROb2RlcyIsImRpcmVjdE1hdGNoIiwicGFyZW50TWF0Y2giLCJvblVubW91bnQiLCJvbkFkZGVkIiwid3JhcCIsImRvbVdyYXBwZXIiLCJyZXNvbHZlRWxlbWVudCIsIkVtb2ppUmVnZXgiLCJDdXN0b21FbW9qaU1vZHVsZSIsIkN1c3RvbUVtb2ppIiwiRW1vamlNb2R1bGVBcGkiLCJnZXRDdXN0b21FbW9qaUJ5SWQiLCJBdXRvY29tcGxldGVNb2R1bGUiLCJBdXRvQ29tcGxldGlvblRlbXBsYXRlcyIsImdldEF1dG9jb21wbGV0ZU9wdGlvbnMiLCJFbW9qaU1vZHVsZVF1ZXJ5IiwicXVlcnlFbW9qaVJlc3VsdHMiLCJNZXNzYWdlcyIsIkVNT0pJX01BVENISU5HIiwiZ3VpbGRNb2R1bGUiLCJnZXRHdWlsZCIsImdldEd1aWxkcyIsImlzRmV0Y2hpbmciLCJlbW9qaVNlYXJjaCIsImdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQiLCJMSUdIVENPUkRfRU1PSklTIiwiYXJnMSIsImFyZzIiLCJjb25kaXRpb24iLCJzZXRFbW9qaVVzYWJsZSIsInF1ZXJ5UmVzdWx0cyIsInJlc3VsdHMiLCJyZW5kZXJSZXN1bHRzIiwiRCIsImVtb2ppcyIsIkVNT0pJIiwiRW1vamkiLCJlbW9qaSIsInVuaXF1ZU5hbWUiLCJzZW50aW5lbCIsImd1aWxkSWQiLCJnZXRQbGFpblRleHQiLCJpc0FuaW1hdGVkIiwiYW5pbWF0ZWQiLCJtYW5hZ2VkIiwib3JpZ2luYWxOYW1lIiwiZ2V0UmF3VGV4dCIsImNhbmNlbEVtb2ppUmVuZGVyIiwiY2FuY2VsRW1vdGVSZW5kZXIiLCJuZXdDb250ZW50IiwiaGFzUGFyc2VkIiwiZXhlYyIsInJhdyIsIndvcmRzIiwid29yZCIsImFyciIsImVtb2ppSWQiLCJqdW1ib2FibGUiLCJyZWR1Y2UiLCJjdXJyZW50Iiwic2hpZnQiLCJvIiwidSIsImQiLCJvbkhvdmVyIiwiUiIsInByZWZpeCIsIlRpdGxlIiwiRW1vamlGaWx0ZXJNb2R1bGUiLCJpc0Vtb2ppRGlzYWJsZWQiLCJpc1VzYWJsZSIsInVzYWJsZSIsInN1cnJvZ2F0ZXMiLCJkaXZlcnNpdHkiLCJjYWNoZTIiLCJwcm9jZXNzQXR0YWNobWVudCIsImlzVHJ1c3RlZCIsImNoZWNrVmlydXNlcyIsInJlc3VsdENhbGxiYWNrIiwicmVtb3ZlQ2FsbGJhY2siLCJpc0hhcm1mdWwiLCJrZXl3b3JkIiwib29mIiwibm9fY29tbWVudHMiLCJyZWdleHBzIiwicmVnZXgiLCJoYXNoVG9VcmwiLCJjaGVja0hhc2giLCJnZXRDdXJyZW50V2ViQ29udGVudHMiLCJ1c2VyQWdlbnQiLCJfX3BhdGgiLCJpc0Zyb21Mb2FkZXIiLCJjcnlwdG8iLCJCdWZmZXIiLCJhbGxvYyIsImNyZWF0ZVJlYWRTdHJlYW0iLCJjaHVuayIsImNvbmNhdCIsImhhc2hSZXN1bHQiLCJkaWdlc3QiLCJyZW5kZXJUb0VsZW1lbnRzIiwiZmxvd2VyU3Rhck1vZHVsZSIsImZsb3dlclN0YXJDb250YWluZXIiLCJjaGlsZE1vZHVsZSIsImNoaWxkQ29udGFpbmVyIiwiYm9yZGVyQ29sb3IiLCJuZXh0Tm9kZSIsImNvbmZpcm1UZXh0IiwiZGFuZ2VyIiwib25DYW5jZWwiLCJvbkNvbmZpcm0iLCJzaGVsbCIsIm9wZW5FeHRlcm5hbCIsInRvb2x0aXBXcmFwIiwidmlld0JveCIsIngiLCJ5IiwibWFzayIsImZpbGwiLCJwb2ludGVyRXZlbnRzIiwib2ZmaWNpYWwiLCJzcGFuIiwiZmxvYXQiLCJmbG93ZXJTdGFyIiwiZ2V0S2V5ZWRBcnJheSIsImJ1ZmZlciIsImluc3RhbGxQYXRoIiwiY3Vyc29yIiwic3Ryb2tlIiwic2F2ZSIsIk9iamVjdFN0b3JhZ2UiLCJsb2NhbFN0b3JhZ2VNb2R1bGUiLCJsb2NhbFN0b3JhZ2UiLCJpbXBsIiwiYnRvYSIsInNldEludGVydmFsIiwic2FmZUpTT05QYXJzZSIsImdlbmVyYXRlS2V5IiwiZGVjaXBoZXIiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsImNpcGhlciIsImVuY3J5cHRlZCIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImRlbGV0ZSIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsIlYyX1B1YmxpY1NlcnZlcnMiLCJfYXBwZW5kQnV0dG9uIiwiTGF5ZXIiLCJyb290SWQiLCJWMkNfUHVibGljU2VydmVycyIsInJvb3QiLCJfcm9vdCIsImluamVjdFJvb3QiLCJjbGFzc05hbWVMYXllcnMiLCJsYXllcnMiLCJidXR0b24iLCJidG4iLCJjaXJjbGVCdXR0b25NYXNrIiwiY2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXIiLCJkb3dubG9hZFByb2dyZXNzIiwidHV0b3JpYWxDb250YWluZXIiLCJhZGRCdXR0b24iLCJndWlsZFBhdGNoIiwiR3VpbGRMaXN0Iiwid2VicGFja01vZHVsZXMiLCJHdWlsZExpc3RPbGQiLCJyZW1vdmVCdXR0b24iLCJCRFNpZGViYXJIZWFkZXIiLCJQdXJlQ29tcG9uZW50Iiwic2lkZWJhckNvbXBvbmVudHMiLCJIZWFkZXIiLCJJdGVtIiwiY2hhbmdlbG9nQnV0dG9uIiwiSGlzdG9yeSIsInJlbmRlcmVkIiwiVjJfU2V0dGluZ3NQYW5lbCIsInVwZGF0ZVNldHRpbmdzIiwic2lkZWJhciIsIlYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciIsInJlZ2lzdGVyQ29tcG9uZW50cyIsInJlZ2lzdGVyIiwibWFrZUNvbXBvbmVudCIsImxpZ2h0Y29yZENvbXBvbmVudCIsIlByZXNlbmNlQ29tcG9uZW50IiwiQWNjb3VudEluZm9zQ29tcG9uZW50IiwiQXBpUHJldmlld0NvbXBvbmVudCIsImNvcmVDb21wb25lbnQiLCJjdXN0b21Dc3NDb21wb25lbnQiLCJyZW5kZXJBZGRvblBhbmUiLCJjbGFzc1NpZGViYXIiLCJjb250ZW50UmVnaW9uIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsImNvcmVTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiY2F0ZWdvcmllcyIsIlNldCIsInNlY3Rpb25zIiwibGlnaHRjb3JkU2V0dGluZ3MiLCJQcmVzZW5jZVNldHRpbmdzIiwiTXNnTG9nU2V0dGluZ3MiLCJjaGVja2VkIiwicHVibGljU2VydmVyc01vZHVsZSIsInZvaWNlTW9kZSIsInRmSG91ciIsImNvbG9yZWRUZXh0IiwiZE1vZGUiLCJTZXR0aW5ncyIsImRldk1vZGUiLCJmb3JjZVVwZGF0ZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwiYXBwU2V0dGluZ3MiLCJyZWxhdW5jaCIsImV4aXQiLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiaXNDaGVja2VkIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsImxvb2siLCJob3ZlckNvbG9yIiwiaXBjIiwic2VuZCIsImFyZ3YiLCJxdWl0IiwiVjJDX1ByZXNlbmNlU2V0dGluZ3MiLCJWMkNfQWNjb3VudEluZm9zIiwiQXBpUHJldmlldyIsIkNzc0VkaXRvciIsIkNvbnRlbnRMaXN0IiwiQ29tcG9uZW50Iiwib3JpZ2luYWxSZW5kZXIiLCJlbnVtZXJhYmxlIiwiQ2FyZExpc3QiLCJTZXR0aW5nQ29tcG9uZW50IiwicGFuZWxzIiwicGFuZWwiLCJnZXRDb21wb25lbnQiLCJMQ2l0ZW1zIiwiVGhlbWVNb2R1bGUiLCJsb2FkVGhlbWVEYXRhIiwidGhlbWUiLCJ1bmVzY2FwZSIsInNhdmVUaGVtZURhdGEiLCJlbmFibGVUaGVtZSIsImRpc2FibGVUaGVtZSIsInRvZ2dsZVRoZW1lIiwiYmR0aGVtZSIsInVwZGF0ZVRoZW1lTGlzdCIsIl93aW5kb3dDb25maWdGaWxlIiwidHJhbnNwYXJlbnQiLCJmcmFtZSIsImNoYXJDb2RlQXQiLCJnZXRUZXh0QXJlYSIsImNoYW5uZWxUZXh0QXJlYSIsInRpdGxlV3JhcHBlciIsImluc2VydFRleHQiLCJ0ZXh0YXJlYSIsImZvY3VzIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJleGVjQ29tbWFuZCIsIm1vZHVsZU5hbWUiLCJncm91cENvbGxhcHNlZCIsImdyb3VwRW5kIiwiZXNjYXBlIiwicGFyYW1zIiwiaW5zdGVhZCIsInNpbGVudCIsImZvcmNlIiwib3JpZ01ldGhvZCIsImNhbmNlbGVkIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInRlbXBSZXQiLCJfX21vbmtleVBhdGNoZWQiLCJkaXNjb25uZWN0IiwiaGFzTm90aWNlIiwibWVtYmVybGlzdCIsIm1lbWJlcnNXcmFwIiwiZm9ybSIsInJpZ2h0IiwiYm90dG9tIiwidG9hc3RXcmFwcGVyIiwiaWNvbiIsInRpbWVvdXQiLCJ0b2FzdEVsZW0iLCJpbm5lclRleHQiLCJtb2RhbE1vZHVsZSIsImhpZGVPbkZ1bGxzY3JlZW4iLCJoZWFkZXJNb2R1bGUiLCJoZWFkZXIiLCJmb290ZXIyTW9kdWxlIiwiZm9jdXNMb2NrIiwiYmFja2Ryb3AiLCJiYWNrZHJvcFdpdGhMYXllciIsImNsb3NpbmdMaXN0ZW5lcnMiLCJwbHVnaW5FcnJvcnMiLCJ0aGVtZUVycm9ycyIsImdlbmVyYXRlVGFiIiwidGFicyIsIkNoYW5nZWxvZ0NsYXNzZXMiLCJGbGV4Q2hpbGQiLCJUaXRsZXMiLCJDaGFuZ2Vsb2ciLCJkZWZhdWx0UHJvcHMiLCJzZWxlY3RhYmxlIiwiTWFya2Rvd25QYXJzZXIiLCJjZSIsImNoYW5nZWxvZ0l0ZW1zIiwibWFyZ2luIiwicmVuZGVySGVhZGVyIiwiQ2hpbGQiLCJncm93Iiwic2hyaW5rIiwidGFnIiwiVGFncyIsIkg0IiwiZGF0ZSIsInJlbmRlckZvb3RlciIsImpvaW5CRDIiLCJkZWZhdWx0Rm9vdGVyIiwib25TY3JvbGwiLCJNYXJrZG93biIsIkNvbmZpcm1hdGlvbk1vZGFsIiwiZW1wdHlGdW5jdGlvbiIsInJlZCIsIlYyIiwiZWRpdG9yRGV0YWNoZWQiLCJyZXEiLCJ3ZWJwYWNrSnNvbnAiLCJfX2V4dHJhX2lkX18iLCJzaG91bGRQcm90ZWN0IiwidGhlTW9kdWxlIiwiY2xlYXIiLCJzb3J0IiwiZ2V0VG9rZW4iLCJnZXRFbWFpbCIsInNob3dUb2tlbiIsInByb3RlY3QiLCJpc0RlZmF1bHQiLCJtb2QiLCJwcm94eSIsImZ1bmMiLCJfX3Byb3RvX18iLCJwcm9wTmFtZXMiLCJwcm90b05hbWVzIiwicHJvdG9Qcm9wIiwiaW50ZXJuYWwiLCJqb2luQkQxIiwiSW52aXRlQWN0aW9ucyIsImFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwiLCJsZWF2ZUJEMSIsIkd1aWxkQWN0aW9ucyIsImxlYXZlR3VpbGQiLCJsZWF2ZUJEMiIsImxlYXZlTEMiLCJyZWFjdENvbXBvbmVudCIsImFuY2hvckNsYXNzZXMiLCJzbGF0ZUVkaXRvckNsYXNzZXMiLCJtZXNzYWdlQ2xhc3NlcyIsInVucmVhZE1lbnRpb25zQmFyIiwiZ3VpbGRzRXJyb3IiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIlRvb2x0aXBXcmFwcGVyIiwiVG9vbHRpcHMiLCJoaWRlIiwic2hvdyIsInN1Ym1pdCIsImFjdGl2YXRlUmFnaW5nRGVtb24iLCJkaXNtaXNzIiwiS2V5R2VuZXJhdG9yIiwiTGF5ZXJTdGFjayIsIlVzZXJTdG9yZSIsIkNoYW5uZWxTdG9yZSIsIkNoYW5uZWxBY3Rpb25zIiwiUHJpdmF0ZUNoYW5uZWxBY3Rpb25zIiwib3BlbkRNIiwidXNlcklkIiwic2VsZklkIiwicHJpdmF0ZUNoYW5uZWxJZCIsImdldERNRnJvbVVzZXJJZCIsInNlbGVjdFByaXZhdGVDaGFubmVsIiwib3BlblByaXZhdGVDaGFubmVsIiwicGFyc2VTZXR0aW5ncyIsIlZvaWNlTW9kZSIsInByb2ZpbE1vZHVsZSIsImZldGNoTXV0dWFsRnJpZW5kcyIsIkxpZ2h0Y29yZFVzZXJCYWRnZSIsIm1hcmdpbk1vZHVsZTIiLCJkZWZhdWx0TWFyZ2luaDUiLCJjb2xvck1vZHVsZSIsImNvbG9yU3RhbmRhcmQiLCJzaXplTW9kdWxlIiwic2Nyb2xsYmFyTW9kdWxlMSIsInNjcm9sbGJhckdob3N0SGFpcmxpbmUiLCJHdWlsZE1vZHVsZSIsImdldFJlbGF0aW9uc2hpcHMiLCJzZXNzaW9uTW9kdWxlIiwiZ2V0U2Vzc2lvbnMiLCJzaXplMTQiLCJoNSIsImdldFByb2ZpbGVWYWx1ZSIsImdldFN0YXRpc3RpY3MiLCJnZXRTZXNzaW9uVmFsdWUiLCJtYXJnaW5Cb3R0b20yMCIsInNlc3Npb25zUmF3Iiwic2Vzc2lvbnMiLCJzZXNzaW9uSWQiLCJjbGllbnRJbmZvIiwib3MiLCJjbGllbnQiLCJhY3Rpdml0aWVzIiwicmVwZWF0IiwiY3JlYXRlZEF0IiwiYXZhdGFyVVJMIiwiYXZhdGFyIiwiZ2V0QXZhdGFyVVJMIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZmxhZ3MiLCJoYXNQcmVtaXVtU3Vic2NyaXB0aW9uIiwiZW1haWwiLCJtZmFFbmFibGVkIiwibW9iaWxlIiwicGhvbmUiLCJ2ZXJpZmllZCIsInJlbGF0aW9ucyIsImZyaWVuZHMiLCJpc0ZyaWVuZCIsImlzQmxvY2tlZCIsImhpZ2h0bGlnaHRKUyIsImhpZ2hsaWdodCIsIm1lc3NhZ2VNb2R1bGUxIiwibWVzc2FnZU1vZHVsZTIiLCJDb2RlQ29udGVudCIsIl9faHRtbCIsImxhbmd1YWdlIiwibWFyZ2luQm90dG9tOCIsInNldHRpbmdUaXRsZSIsImZvcm1Nb2R1bGUiLCJzdGF0ZXMiLCJGb3JtU2VjdGlvbiIsImFsbENvbXBvbmVudHMiLCJjb21wIiwiQWxsUHJldmlld3MiLCJ0YWIiLCJzZXRTdGF0ZSIsIm5ld1N0YXRlIiwiZ2V0UHJvcHMiLCJyZW5kZXJQcmV2aWV3IiwiYmFja2dyb3VuZENvbG9yIiwicGFkZGluZyIsImJvcmRlclJhZGl1cyIsInJlbmRlckNvZGUiLCJnZW5lcmF0ZUNvZGUiLCJnZXRTdHJGb3JQcm9wIiwiY29tcFBhdGgiLCJsYW5nIiwiU3RyaW5nIiwiJCR0eXBlb2YiLCJTeW1ib2wiLCJmb3IiLCJjb21wTmFtZSIsImNvbXBDYXRlZ29yeSIsInByb3BTdHJpbmdzIiwiY2hpbGRyZW5Qcm9wIiwic3RyIiwib3BlblRhZyIsImNsb3NlVGFnIiwidmlzaWJsZUtleSIsInByb3BPYmplY3QiLCJpc0xhc3QiLCJpc0ZpcnN0IiwiY2hpbGRyZW5EYXRhIiwibWFyZ2luQm90dG9tIiwicmVuZGVycyIsIlYyQ19QbHVnaW5DYXJkIiwic2hvd1NldHRpbmdzIiwic2V0SW5pdGlhbFN0YXRlIiwiaGFzU2V0dGluZ3MiLCJhZGRvbiIsImdldFNldHRpbmdzUGFuZWwiLCJyZWxvYWRzIiwidHJ1c3RlZCIsImNsb3NlU2V0dGluZ3MiLCJwYW5lbFJlZiIsInNldHRpbmdzT3BlbiIsImNvbXBvbmVudERpZFVwZGF0ZSIsInJlZnMiLCJzZXR0aW5nc3BhbmVsIiwic2V0SW1tZWRpYXRlIiwiaXNIaWRkZW4iLCJjVG9wIiwic2Nyb2xsVG9wIiwiY0JvdHRvbSIsImVUb3AiLCJvZmZzZXRUb3AiLCJlQm90dG9tIiwiY2FyZE5vZGUiLCJ0aGlzTm9kZU9mZnNldCIsImNvbnRhaW5lck9mZnNldCIsImVuZFBvaW50IiwiZ2V0U3RyaW5nIiwic2V0dGluZ3NDb21wb25lbnQiLCJyZWYiLCJYU3ZnIiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJidWlsZFRpdGxlIiwibmFtZUluZGV4IiwidmVyc2lvbkluZGV4IiwiYXV0aG9ySW5kZXgiLCJwb3BMYXllciIsIm1ha2VMaW5rIiwibWFrZUJ1dHRvbiIsImFjdGlvbiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib3BlbkZvbGRlciIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldEFkZG9ucyIsInNvcnRlZEFkZG9ucyIsImIiLCJjYXAiLCJmaXJzdCIsInNlY29uZCIsImxvY2FsZUNvbXBhcmUiLCJyZW5kZXJDaGVja1VwZGF0ZXMiLCJaZXJlc1BsdWdpbkxpYnJhcnkiLCJQbHVnaW5VcGRhdGVzIiwiY2hlY2tBbGwiLCJtYXJnaW5MZWZ0IiwicmVmcmVzaEljb24iLCJhZGRvbkNhcmRzIiwiZmlsbFJ1bGUiLCJjbGlwUnVsZSIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsIm9wYWNpdHkiLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJwbGFjZWhvbGRlciIsIlYyQ19Db250ZW50Q29sdW1uIiwiY29udGVudE1vZHVsZSIsImNvbnRlbnRDb2x1bW4iLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiY29tcG9uZW50RGlkTW91bnQiLCJlZGl0b3IiLCJhY2UiLCJzZXRUaGVtZSIsInNlc3Npb24iLCJzZXRNb2RlIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0Rm9udFNpemUiLCJkZXN0cm95IiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiZGV0YWNoZWRSb290IiwiY29kZU1pcnJvciIsImxpbmVOdW1iZXJzIiwibW9kZSIsImluZGVudFVuaXQiLCJzY3JvbGxiYXJTdHlsZSIsIl9jY3NzIiwiY2NzcyIsInVwZGF0ZUxpbmVDb3VudCIsImxpbmVDb3VudCIsIlNldHRpbmdzVGl0bGUiLCJDaGVja2JveCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyTGVmdCIsImZvbnRTaXplIiwiYXJnIiwiZ2V0VmFsdWUiLCJkcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwibWFyZ2luTW9kdWxlIiwibWFyZ2luVG9wNjAiLCJWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMiLCJwcmV2aWV3IiwiaXNmZXRjaGluZyIsImFzc2V0Q29tcG9uZW50cyIsInVwZGF0ZVdoZW5GZXRjaGVkIiwiZGVmYXVsdFNldHRpbmciLCJSUENQcm9wcyIsImFzc2V0IiwidXBkYXRlUHJldmlldyIsIm9wdGlvbnNDb21wb25lbnRzIiwib2hnb2RvaGZ1Y2siLCJfb3B0aW9uc0NvbXBvbmVudHMiLCJhcnJheSIsImlucHV0VGV4dE1vZHVsZXMiLCJJbnB1dFRleHQiLCJyZW1vdmVLZXliaW5kIiwiX2hvcml6b250YWwiLCJpbnB1dE1pbmkiLCJzaXplMTYiLCJzaXplMjAiLCJpbnB1dCIsImxhc3RFZGl0ZWQiLCJpc1RpbWluZyIsInJvd01vZHVsZSIsImZsZXhNb2R1bGUiLCJpbnB1dE1vZHVsZSIsInNpemVNb2R1bGUyIiwicm93IiwiZmxleENoaWxkIiwiSW5wdXROdW1iZXJNb2R1bGVzIiwiSW5wdXROdW1iZXIiLCJjb2xvclRyYW5zcGFyZW50Iiwic2V0VmFsdWUiLCJjbGlwYm9hcmQiLCJJbnB1dENob2ljZU1vZHVsZXMiLCJJbnB1dENob2ljZSIsIkRpdmlkZXJNb2R1bGVzIiwiRGl2aWRlciIsImRpdmlkZXIiLCJkaXZpZGVyRGVmYXVsdCIsIkRpc2NvcmRCdXR0b24iLCJScGNQcmV2aWV3IiwiYWN0aXZlIiwiY2hhbmdlVGFiIiwiYW5jaWVudFRhYiIsInNldEFjdGl2ZSIsInJwYyIsImZsZXgiLCJpc0FjdGl2ZSIsIlByb2ZpbGUiLCJQb3BvdXQiLCJUYWIiLCJwb3BvdXRNb2R1bGUiLCJ1c2VyUG9wb3V0IiwidmVydGljYWwiLCJhbGlnblN0cmV0Y2giLCJzdHJlYW1lck1vZGVFbmFibGVkQnRuIiwiYWN0aXZpdHlVc2VyUG9wb3V0IiwibXV0ZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmVDaGFubmVscyIsIm5vdGUiLCJwcm8iLCJpbmxpbmUiLCJyb290TW9kdWxlMSIsImZsZXhNb2R1bGUxIiwic3R5bGluZ01vZHVsZTEiLCJuYW1lVGFnTW9kdWxlMSIsImFjdGl2aXR5TW9kdWxlMSIsInRleHRNb2R1bGUxIiwic2l6ZU1vZHVsZTEiLCJzY3JvbGxlck1vZHVsZTEiLCJub3RlTW9kdWxlMSIsInByb3RpcE1vZHVsZTEiLCJjb2xvck1vZHVsZTEiLCJhdmF0YXJNb2R1bGUxIiwidXNlck1vZHVsZTEiLCJ0aW1lc3RhbXBDbGFzcyIsImltYWdlcyIsImFzc2V0c0xhcmdlSW1hZ2VVc2VyUG9wb3V0IiwiYXNzZXRzTGFyZ2VNYXNrVXNlclBvcG91dCIsImFzc2V0c1NtYWxsSW1hZ2VVc2VyUG9wb3V0IiwiaGVhZGVyUGxheWluZyIsImp1c3RpZnlDZW50ZXIiLCJhbGlnbkNlbnRlciIsIm5vV3JhcCIsImhlYWRlclRvcCIsImF2YXRhcldyYXBwZXJOb3JtYWwiLCJhdmF0YXJIaW50IiwiYXZhdGFySGludElubmVyIiwiVklFV19QUk9GSUxFIiwiaGVhZGVyVGV4dCIsImhvcml6b250YWwiLCJqdXN0aWZ5U3RhcnQiLCJoZWFkZXJUYWdOb05pY2tuYW1lIiwibmFtZVRhZyIsImhlYWRlclRhZ1VzZXJuYW1lTm9OaWNrbmFtZSIsImhlYWRlclRleHROb3JtYWwiLCJVU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HIiwiYm9keU5vcm1hbCIsImNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0IiwiY29udGVudE5vSW1hZ2VzVXNlclBvcG91dCIsIm5hbWVOb3JtYWwiLCJhY3Rpdml0eU5hbWUiLCJ0aW1lQ29tcG9uZW50IiwidGltZXN0YW1wUmVuZGVyIiwiVGltZXN0YW1wIiwiZW5kIiwic2Nyb2xsZXJGYWRlIiwiYm9keUlubmVyIiwiYm9keVRpdGxlIiwiTk9URSIsIk5PVEVfUExBQ0VIT0xERVIiLCJwcm90aXAiLCJQSU5ORURfTUVTU0FHRVNfUFJPX1RJUCIsInRpcCIsIkNPTlRFWFRfTUVOVV9ISU5UIiwiU3RhdHVzTW9kdWxlcyIsIlN0YXR1cyIsImdldFByZXNlbmNlIiwiUHJvZmlsZU1vZHVsZXMiLCJ0b3BTZWN0aW9uU3RyZWFtaW5nIiwiYWN0aXZpdHlQcm9maWxlIiwiYXNzZXRzTGFyZ2VJbWFnZVByb2ZpbGUiLCJhc3NldHNMYXJnZU1hc2tQcm9maWxlIiwiYXNzZXRzU21hbGxJbWFnZVByb2ZpbGUiLCJ0b3BTZWN0aW9uUGxheWluZyIsImhlYWRlckluZm8iLCJwcm9maWxlQmFkZ2VzIiwiaGVhZGVyRmlsbCIsImNvbnRlbnRJbWFnZXNQcm9maWxlIiwidXNlckluZm9TZWN0aW9uIiwidXNlckluZm9TZWN0aW9uSGVhZGVyIiwiQ29ubmVjdGVkQWNjb3VudHMiLCJhY2NvdW50cyIsIkFjY291bnRNb2R1bGUxIiwiZ2V0QWNjb3VudHMiLCJhY2NzIiwidmlzaWJpbGl0eSIsImFjYyIsImNvbm5lY3RlZEFjY291bnRzIiwiQ29ubmVjdGVkQWNjb3VudCIsImZsb3dlck1vZHVsZTEiLCJhbmNob3JNb2R1bGUxIiwiU29jaWFsQ29uc3RhbnRzIiwiY29uc3RhbnRzU29jaWFsIiwiY29ubmVjdGVkQWNjb3VudCIsImNvbm5lY3RlZEFjY291bnRJY29uIiwid2hpdGUiLCJncmV5IiwiY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lciIsImNvbm5lY3RlZEFjY291bnROYW1lIiwiY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbiIsImNvbm5lY3RlZEFjY291bnRPcGVuSWNvbiIsIkJhZGdlcyIsInJvb3RNb2R1bGUiLCJVc2VyRmxhZ3MiLCJzZXJpYWxpemVkIiwiZmxhZ05hbWUiLCJoYXNGbGFnIiwic2VhcmNoYWJsZSIsIkJhZGdlIiwicHJvZmlsZUJhZGdlV3JhcHBlciIsInByb2ZpbGVCYWRnZSIsIlYyQ19MYXllciIsImtleXVwTGlzdGVuZXIiLCJ0cmFuc2Zvcm0iLCJjb21wb25lbnRXaWxsTW91bnQiLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJmZXRjaCIsInNlcnZlciIsImpvaW5lZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNidiIsImNvbnRlbnRTY3JvbGxlciIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJzY3JlZW5YIiwic2NyZWVuWSIsImpvaW5XaW5kb3ciLCJCcm93c2VyV2luZG93Iiwid2ViQ29udGVudHMiLCJsb2FkVVJMIiwicmVzaXphYmxlIiwibWF4aW1pemFibGUiLCJtaW5pbWl6YWJsZSIsImFsd2F5c09uVG9wIiwiY2VudGVyIiwid2ViUHJlZmVyZW5jZXMiLCJub2RlSW50ZWdyYXRpb24iLCJiZFNlcnZlciIsIm9ubGluZSIsIm1lbWJlcnMiLCJpY29uVXJsIiwibmF0aXZlam9pbiIsInNlcnZlcjIiLCJndWlsZExpc3QiLCJnZXRGbGF0dGVuZWRHdWlsZElkcyIsImRlZmF1bHRMaXN0IiwiREVGQVVMVF9BVkFUQVJTIiwiU2VydmVyQ2FyZCIsImZhbGxiYWNrIiwiZmxvb3IiLCJjb25uZWN0RW5kUG9pbnQiLCJTaWRlYmFyVmlldyIsInRvb2xzIiwiVG9vbHMiLCJUYWJCYXJTZXBhcmF0b3IiLCJzZWFyY2hJbnB1dCIsIlRhYkJhckhlYWRlciIsIlRhYkJhckl0ZW0iLCJtYXhMZW5ndGgiLCJzZWFyY2hpbnB1dCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJkcmFnZ2FibGUiLCJWMkNfU2lkZWJhclZpZXciLCJTY3JvbGxlciIsImZhZGUiLCJkYXJrIiwiVjJDX1JlbG9hZEljb24iLCJ4bWxucyIsIlYyQ19TY3JvbGxlciIsInNjcm9sbGVySG9yaXpvbnRhbCIsInNjcm9sbGVyTW9kdWxlMiIsInNpZGViYXJSZWdpb25TY3JvbGxlciIsIndyYXBwZXJDbGFzcyIsInNjcm9sbGVyQ2xhc3MiLCJjb250ZW50UmVnaW9uU2Nyb2xsZXIiLCJjb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwIiwidGhlbWVHaG9zdCIsInNjcm9sbGVyVHJhY2siLCJWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCIsIlNldHRpbmdzR3JvdXAiLCJWMkNfU2V0dGluZ3NHcm91cCIsImJ1dHRvbkNvbXBvbmVudCIsIlYyQ19TZXR0aW5nc1RpdGxlIiwiU3dpdGNoSXRlbSIsIlYyQ19UYWJCYXJIZWFkZXIiLCJWMkNfVGFiQmFySXRlbSIsIlYyQ19UYWJCYXJTZXBhcmF0b3IiLCJpbnRlcnZhbE1vZHVsZTEiLCJJbnRlcnZhbCIsIlRpbWVSZW5kZXIiLCJfaW50ZXJ2YWwiLCJnZXRVcGRhdGVkVGltZSIsImdldERpZmYiLCJjaGVja1VuaXgiLCJob3VycyIsIm1pbnV0ZXMiLCJzZWNvbmRzIiwicmVuZGVyVGltZSIsIm51bWJlciIsInJlbW92ZVplcm8iLCJ1c2VkUHJvcHMiLCJVU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9FTkQiLCJVU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9TVEFSVCIsIlYyQ19Ub29scyIsInRvb2xzTW9kdWxlIiwidG9vbHNDb250YWluZXIiLCJjb250YWluZXJNb2R1bGUiLCJjbG9zZUJ1dHRvbiIsImNsb3NlQnV0dG9uQm9sZCIsImtleWJpbmQiLCJrZXliaW5kQm9sZCIsIlRvb2x0aXBDbGFzc2VzIiwiZ2V0VG9vbHRpcENsYXNzZXMiLCJUb29sdGlwTGF5ZXJzIiwiZ2V0VG9vbHRpcExheWVycyIsImdldENsYXNzIiwic2lkZU9yQ29sb3IiLCJ1cHBlckNhc2UiLCJ0b29sdGlwQ2xhc3MiLCJjbGFzc0V4aXN0cyIsInRvUHgiLCJFbXVsYXRlZFRvb2x0aXAiLCJwcmV2ZW50RmxpcCIsInRvb2x0aXBFbGVtZW50IiwidG9vbHRpcCIsImxhYmVsRWxlbWVudCIsInRvb2x0aXBDb250ZW50IiwicG9pbnRlckVsZW1lbnQiLCJ0b29sdGlwUG9pbnRlciIsInBvcG91dHMiLCJjYW5TaG93QWJvdmUiLCJjYW5TaG93QmVsb3ciLCJjYW5TaG93TGVmdCIsImNhblNob3dSaWdodCIsIl9jbGFzc05hbWUiLCJzaG93QWJvdmUiLCJzaG93QmVsb3ciLCJzaG93TGVmdCIsInNob3dSaWdodCIsImNlbnRlckhvcml6b250YWxseSIsImNlbnRlclZlcnRpY2FsbHkiLCJub2RlY2VudGVyIiwiZmluZERPTU5vZGUiLCJWMkNfWFN2ZyJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7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LFVBQU1BLEtBQU47QUFDSDs7QUFFRHliLFFBQU0sR0FBRztBQUNMLFdBQU96cEIsbURBQUksQ0FBQ2ttQixLQUFMLENBQVc5bEIsYUFBWCxDQUNILEtBREcsRUFFSDtBQUFDZ3lELFdBQUssRUFBRSw0QkFBUjtBQUFzQ3B4QixhQUFPLEVBQUUsV0FBL0M7QUFBNER2cUIsV0FBSyxFQUFFO0FBQUMwUyxhQUFLLEVBQUUsTUFBUjtBQUFnQitPLGNBQU0sRUFBRTtBQUF4QjtBQUFuRSxLQUZHLEVBR0hsNEIsbURBQUksQ0FBQ2ttQixLQUFMLENBQVc5bEIsYUFBWCxDQUNJLEdBREosRUFFSTtBQUFDRSxlQUFTLEVBQUUsWUFBWjtBQUEwQjhnQyxVQUFJLEVBQUUsTUFBaEM7QUFBd0NpZCxjQUFRLEVBQUU7QUFBbEQsS0FGSixFQUdJcitDLG1EQUFJLENBQUNrbUIsS0FBTCxDQUFXOWxCLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ3k5QixPQUFDLEVBQUU7QUFBSixLQUFqQyxDQUhKLEVBSUk3OUIsbURBQUksQ0FBQ2ttQixLQUFMLENBQVc5bEIsYUFBWCxDQUF5QixNQUF6QixFQUFpQztBQUFDRSxlQUFTLEVBQUUsTUFBWjtBQUFvQjhnQyxVQUFJLEVBQUUsU0FBMUI7QUFBcUN2RCxPQUFDLEVBQUU7QUFBeEMsS0FBakMsQ0FKSixDQUhHLENBQVA7QUFVSDs7QUFoQnFELEM7Ozs7Ozs7Ozs7O0FDRjFELG1DOzs7Ozs7Ozs7OztBQ0FBLHFDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLCtCOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLHVDOzs7Ozs7Ozs7OztBQ0FBLGlDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLGtDIiwiZmlsZSI6Im1haW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC5qc1wiKTtcbiIsImltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBtaW5pbXVtRGlzY29yZFZlcnNpb24gPSBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IGN1cnJlbnREaXNjb3JkVmVyc2lvbiA9ICh3aW5kb3cuRGlzY29yZE5hdGl2ZSAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24gJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24oKSkgfHwgXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBtaW5TdXBwb3J0ZWRWZXJzaW9uID0gXCIwLjMuMFwiO1xyXG5leHBvcnQgY29uc3QgYmJkVmVyc2lvbiA9IFwiMC4zLjRcIjtcclxuZXhwb3J0IGNvbnN0IExDQ2hhbmVsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJMaWdodGNvcmQncyBjaGFuZ2Vsb2dcIixcclxuICAgIGNoYW5nZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIldoYXQncyBOZXc/XCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCBpcyBub3cgYXZhaWxhYmxlICFcIixcclxuICAgICAgICAgICAgICAgIFwiV2UgcmVtb3ZlZCBlbW90ZXMuIFRoYXQncyBzYWQgZm9yIHBlb3BsZSB3aG8gd2VyZSBhY3R1YWxseSB1c2luZyBpdCwgYnV0IGl0IHdhcyBsZWFkaW5nIHRvIG1vcmUgbG9hZGluZyB0aW1lIGFuZCBzb21lIGJhc2ljIHdvcmRzIHdlcmUgZW1vdGUuXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBpbWFnZTogXCJodHRwczovL2kuaW1ndXIuY29tL3NmTmhxd1AucG5nXCIsXHJcbiAgICB0aXRsZTogXCJMaWdodGNvcmRcIixcclxuICAgIHN1YnRpdGxlOiBcInZcIityZW1vdGUuZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLnZlcnNpb24sXHJcbiAgICBmb290ZXI6IChmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGlmKCFUZXh0RWxlbWVudCB8fCAhTW9kYWxTdGFjaylyZXR1cm4gbnVsbFxyXG5cclxuICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xyXG4gICAgICAgIGNvbnN0IGpvaW5TdXBwb3J0U2VydmVyID0gKGNsaWNrKSA9PiB7XHJcbiAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBNb2RhbFN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICBCRFYyLmpvaW5MQygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7b25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0RWxlbWVudCwge3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XHJcbiAgICB9KSgpXHJcbn1cclxuZXhwb3J0IGNvbnN0IGJiZENoYW5nZWxvZyA9IHtcclxuICAgIGRlc2NyaXB0aW9uOiBcIkJCRCdzIGNoYW5nZWxvZy5cIixcclxuICAgIGNoYW5nZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIldoYXQncyBOZXc/XCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIioqTGlnaHRjb3JkKiogaXMgbm93IHVzaW5nIEJhbmRhZ2VkQkQuIFRoYXQgbWVhbnMgYWxsIHBsdWdpbnMgeW91IHdlcmUgdXNpbmcgY2FuIGJlIHVzZWQgdG9vICFcIixcclxuICAgICAgICAgICAgICAgIFwiKipXaW5kb3cgVHJhbnNwYXJlbmN5KiogY2hhbmdlcyB3ZXJlIG1hZGUgdG8gbW9yZSBjb21wYXRpYmxlIHdpdGggZXh0ZXJuYWwgd2luZG93IG1hbmFnZXJzIGFuZCBhZGRvbnMgbGlrZSBHbGFzc2NvcmQuXCIsXHJcbiAgICAgICAgICAgICAgICBcIkluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGhhcyBvbmNlIGFnYWluIGJlZW4gY2hhbmdlZCBzbGlnaHRseSB0byBob3BlZnVsbHkgaW1wcm92ZSBsb2FkaW5nIHRpbWVzLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiQnVnIEZpeGVzXCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiU29tZSBmaXhlcyByZWxhdGVkIHRvIHNob3dpbmcgbW9kYWxzIGluIHRoZSBgQmRBcGlgLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3MgPSB7XHJcbiAgICBcIkN1c3RvbSBjc3MgbGl2ZSB1cGRhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTBcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkN1c3RvbSBjc3MgYXV0byB1ZHBhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTFcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkJldHRlckRpc2NvcmQgQmx1ZVwiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtYlwiLCAgaW5mbzogXCJSZXBsYWNlIERpc2NvcmQgYmx1ZSB3aXRoIEJEIEJsdWVcIiwgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiBmYWxzZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCJ9LFxyXG5cclxuICAgIC8qIENvcmUgKi9cclxuICAgIC8qID09PT09PSAqL1xyXG4gICAgXCJQdWJsaWMgU2VydmVyc1wiOiAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTFcIiwgIGluZm86IFwiRGlzcGxheSBwdWJsaWMgc2VydmVycyBidXR0b25cIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk1pbmltYWwgTW9kZVwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMlwiLCAgaW5mbzogXCJIaWRlIGVsZW1lbnRzIGFuZCByZWR1Y2UgdGhlIHNpemUgb2YgZWxlbWVudHMuXCIsICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgTW9kZVwiOiAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy00XCIsICBpbmZvOiBcIk9ubHkgc2hvdyB2b2ljZSBjaGF0XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJIaWRlIENoYW5uZWxzXCI6ICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTNcIiwgIGluZm86IFwiSGlkZSBjaGFubmVscyBpbiBtaW5pbWFsIG1vZGVcIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkRhcmsgTW9kZVwiOiAgICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNVwiLCAgaW5mbzogXCJNYWtlIGNlcnRhaW4gZWxlbWVudHMgZGFyayBieSBkZWZhdWx0KHdpcClcIiwgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgRGlzY29ubmVjdFwiOiAgICAgICAgICAge2lkOiBcImJkYS1kYy0wXCIsICBpbmZvOiBcIkRpc2Nvbm5lY3QgZnJvbSB2b2ljZSBzZXJ2ZXIgd2hlbiBjbG9zaW5nIERpc2NvcmRcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCIyNCBIb3VyIFRpbWVzdGFtcHNcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLTZcIiwgIGluZm86IFwiUmVwbGFjZSAxMmhyIHRpbWVzdGFtcHMgd2l0aCBwcm9wZXIgb25lc1wiLCAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkNvbG9yZWQgVGV4dFwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtN1wiLCAgaW5mbzogXCJNYWtlIHRleHQgY29sb3IgdGhlIHNhbWUgYXMgcm9sZSBjb2xvclwiLCAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTm9ybWFsaXplIENsYXNzZXNcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNFwiLCBpbmZvOiBcIkFkZHMgc3RhYmxlIGNsYXNzZXMgdG8gZWxlbWVudHMgdG8gaGVscCB0aGVtZXMuIChlLmcuIGFkZHMgLmRhLWNoYW5uZWxzIHRvIC5jaGFubmVscy1JZTJsNkEpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuXHJcbiAgICAvKiBDb250ZW50ICovXHJcbiAgICBcIkNvbnRlbnQgRXJyb3IgTW9kYWxcIjogICAgICAgIHtpZDogXCJmb3JrLXBzLTFcIiwgaW5mbzogXCJTaG93cyBhIG1vZGFsIHdpdGggcGx1Z2luL3RoZW1lIGVycm9yc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2NhbiBQbHVnaW5zXCI6ICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtNlwiLCBpbmZvOiBcIlNjYW4gcGx1Z2lucyBmb3IgYW55IHRocmVhdCB0aGF0IGNhbiBiZSBoaWRkZW4gaW5zaWRlLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2hvdyBUb2FzdHNcIjogICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtMlwiLCBpbmZvOiBcIlNob3dzIGEgc21hbGwgbm90aWZpY2F0aW9uIGZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjcm9sbCBUbyBTZXR0aW5nc1wiOiAgICAgICAgIHtpZDogXCJmb3JrLXBzLTNcIiwgaW5mbzogXCJBdXRvLXNjcm9sbHMgdG8gYSBwbHVnaW4ncyBzZXR0aW5ncyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCAob25seSBpZiBvdXQgb2YgdmlldylcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkF1dG9tYXRpYyBMb2FkaW5nXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTVcIiwgaW5mbzogXCJBdXRvbWF0aWNhbGx5IGxvYWRzLCByZWxvYWRzLCBhbmQgdW5sb2FkcyBwbHVnaW5zIGFuZCB0aGVtZXNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcblxyXG4gICAgLyogRGV2ZWxvcGVyICovXHJcbiAgICBcIkRldmVsb3BlciBNb2RlXCI6ICAgICAgICAgXHQgIHtpZDogXCJiZGEtZ3MtOFwiLCBpbmZvOiBcIkRldmVsb3BlciBNb2RlIFRvZ2dsZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJDb3B5IFNlbGVjdG9yXCI6XHRcdFx0ICB7aWQ6IFwiZm9yay1kbS0xXCIsIGluZm86IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJSZWFjdCBEZXZUb29sc1wiOlx0XHRcdCAge2lkOiBcInJlYWN0RGV2VG9vbHNcIiwgaW5mbzogXCJBZGRzIHJlYWN0IGRldmVsb3BlciB0b29scyB0byB0aGUgZGV2dG9vbHMuIE11c3QgYmUgaW5zdGFsbGVkIGluIEdvb2dsZSBDaHJvbWUgb24geW91ciBwYy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICBcIkRpc2FibGUgQmV0dGVyRGlzY29yZFwiOiAgICAgIHtpZDogXCJiZC1kaXNhYmxlXCIsICBpbmZvOiBcIkRpc2FibGUgQmV0dGVyZGlzY29yZCAocGx1Z2lucywgdGhlbWVzLCBldGMpIChOb3QgaW1wbGVtZW50ZWQpLlwiLCBpbXBsZW1lbnRlZDogZmFsc2UsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJCbHVyIFBlcnNvbm5hbCBJbmZvcm1hdGlvbnNcIjp7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJDYWxsaW5nIFJpbmcgQmVhdFwiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTJcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIHNwZWNpYWwgY2FsbGluZyBiZWF0LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRldmVsb3BlciBPcHRpb25zXCI6ICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtMVwiLCBpbmZvOiBcIkVuYWJsZSBEaXNjb3JkJ3MgJiBMaWdodGNvcmQncyBJbnRlcm5hbCBEZXZlbG9wZXIgT3B0aW9ucy4gVGhpcyBhbGxvdyB0aGUgXFxcIkV4cGVyaW1lbnRzXFxcIiB0YWIsIHRoZSBcXFwiRGV2ZWxvcGVyIE9wdGlvbnNcXFwiIHRhYiBhbmQgdGhlIFxcXCJBcGkgQ29tcG9uZW50c1xcXCIgdGFiLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkFkIEJsb2NrXCI6ICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtNFwiLCBpbmZvOiBcIkJsb2NrIGFueSBCT1QgdGhhdCBkbXMgeW91IHdpdGggYW4gaW52aXRlIGxpbmsuIEV2ZW4gaW4gYW4gZW1iZWQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiRW5hYmxlIExpZ2h0Y29yZCBTZXJ2ZXJzXCI6ICAge2lkOiBcImxpZ2h0Y29yZC01XCIsIGluZm86IFwiRW5hYmxlIExpZ2h0Y29yZCdzIHNlcnZlcnMuIERpc2FibGluZyB0aGlzIHdpbGwgZGlzYWJsZSBjdXN0b20gYmFkZ2VzLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRpc2FibGUgdHlwaW5nXCI6ICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtN1wiLCBpbmZvOiBcIkRvbid0IGxldCBvdGhlciBzZWUgeW91J3JlIHR5cGluZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJMaWdodGNvcmQgVGFic1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLThcIiwgaW5mbzogXCJBbGxvd3MgeW91IHRvIGxhdW5jaCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTGlnaHRjb3JkIGluIHRoZSBzYW1lIHdpbmRvdyAoRVhQRVJJTUVOVEFMKS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXHJcbiAgICBcIkFsd2F5cy1vbi1Ub3BcIjogICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtM1wiLCBpbmZvOiBcIkVuYWJsZSB3aW5kb3cncyBBbHdheXMtb24tVG9wIG1vZGUsIHdoZXJlIExpZ2h0Y29yZCBzdGF5cyBvbiB0b3Agb2Ygb3RoZXIgYXBwbGljYXRpb25zLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJXaW5kb3dcIn0sXHJcbiAgICBcclxuICAgIC8qKiBSaWNoUHJlc2VuY2UgKi9cclxuICAgIFwiRW5hYmxlXCI6ICAgICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCIsIGluZm86IFwiRW5hYmxlIFJpY2hQcmVzZW5jZSBiZWxvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJzdGF0dXNcIn1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29va2llID0ge1xyXG4gICAgXCJiZGEtZ3MtMVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtMlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTNcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtNlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTdcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy04XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0wXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0yXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtN1wiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtYlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWRjLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWRtLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTJcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTVcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy02XCI6IHRydWUsXHJcbiAgICBcImZvcmstZXMtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1lcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstd3AtMVwiOiBmYWxzZSxcclxuICAgIFwiZm9yay13cC0yXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWJldGFcIjogdHJ1ZSxcclxuICAgIFwicmVhY3REZXZUb29sc1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTFcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0yXCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtM1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTRcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC01XCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC02XCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC03XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtOFwiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgLy8gdmFsdWUgPSB0eXBlb2YodmFsdWUpICE9PSBcIm9iamVjdFwiID8gdmFsdWUgOiBuZXcgUHJveHkodmFsdWUsIHtcclxuICAgIC8vICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgbW9kKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvYmpbbW9kXTtcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIHNldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgIC8vICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShtb2QpKSByZXR1cm4gVXRpbHMuZXJyKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgXCJUcnlpbmcgdG8gb3ZlcndyaXRlIGRlcHJlY2F0ZWQgQkQgZ2xvYmFsc1wiKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIGtleSwge1xyXG4gICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgVXRpbHMud2FybihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIGBcIiR7a2V5fVwiIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSBvbmx5IHVzZSBCZEFwaS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgXHJcbn07XHJcblxyXG5cclxuaW1wb3J0ICogYXMgR2xvYmFscyBmcm9tIFwiLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZ2xvYmFsS2V5cyA9IE9iamVjdC5rZXlzKEdsb2JhbHMpO1xyXG5mb3IgKGNvbnN0IGtleSBvZiBnbG9iYWxLZXlzKSBkZXByZWNhdGVHbG9iYWwoa2V5LCBHbG9iYWxzW2tleV0pO1xyXG5cclxuXHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL21vZHVsZXMvY2xhc3NOb3JtYWxpemVyXCI7XHJcblxyXG5kZXByZWNhdGVHbG9iYWwoXCJCRFYyXCIsIEJEVjIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJwbHVnaW5Nb2R1bGVcIiwgcGx1Z2luTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJVdGlsc1wiLCBVdGlscyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJERXZlbnRzXCIsIEJERXZlbnRzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiRGF0YVN0b3JlXCIsIERhdGFTdG9yZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNvbnRlbnRNYW5hZ2VyXCIsIENvbnRlbnRNYW5hZ2VyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XHJcblxyXG53aW5kb3cuQmRBcGkgPSBCZEFwaTtcclxuXHJcbmltcG9ydCBDb3JlIGZyb20gXCIuL21vZHVsZXMvY29yZVwiO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCBDb3JlKTtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICAvLyBkZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCB0aGlzLm1haW5Db3JlKTtcclxuICAgICAgICBDb3JlLmluaXQoKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gZnVuY3Rpb24gcGF0Y2hNb2R1bGVMb2FkKCkge1xyXG4vLyAgICAgY29uc3QgbmFtZXNwYWNlID0gXCJiZXR0ZXJkaXNjb3JkXCI7XHJcbi8vICAgICBjb25zdCBwcmVmaXggPSBgJHtuYW1lc3BhY2V9L2A7XHJcbi8vICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpO1xyXG4vLyAgICAgY29uc3QgbG9hZCA9IE1vZHVsZS5fbG9hZDtcclxuLy8gICAgIC8vIGNvbnN0IHJlc29sdmVGaWxlbmFtZSA9IE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lO1xyXG5cclxuLy8gICAgIE1vZHVsZS5fbG9hZCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcclxuLy8gICAgICAgICBpZiAocmVxdWVzdCA9PT0gbmFtZXNwYWNlIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IHJlcXVlc3Quc3Vic3RyKHByZWZpeC5sZW5ndGgpO1xyXG4vLyAgICAgICAgICAgICBpZiAocmVxdWVzdGVkID09IFwiYXBpXCIpIHJldHVybiBCZEFwaTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHJldHVybiBsb2FkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbi8vICAgICB9O1xyXG5cclxuLy8gICAgIC8vIE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lID0gZnVuY3Rpb24gKHJlcXVlc3QsIHBhcmVudCwgaXNNYWluKSB7XHJcbi8vICAgICAvLyAgICAgaWYgKHJlcXVlc3QgPT09IFwiYmV0dGVyZGlzY29yZFwiIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChcImJldHRlcmRpc2NvcmQvXCIpKSB7XHJcbi8vICAgICAvLyAgICAgICAgIGNvbnN0IGNvbnRlbnRQYXRoID0gUGx1Z2luTWFuYWdlci5nZXRQbHVnaW5QYXRoQnlNb2R1bGUocGFyZW50KTtcclxuLy8gICAgIC8vICAgICAgICAgaWYgKGNvbnRlbnRQYXRoKSByZXR1cm4gcmVxdWVzdDtcclxuLy8gICAgIC8vICAgICB9XHJcblxyXG4vLyAgICAgLy8gICAgIHJldHVybiByZXNvbHZlRmlsZW5hbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuLy8gICAgIC8vIH07XHJcblxyXG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4vLyAgICAgICAgIE1vZHVsZS5fbG9hZCA9IGxvYWQ7XHJcbi8vICAgICB9O1xyXG4vLyB9XHJcblxyXG4vLyBwYXRjaE1vZHVsZUxvYWQoKTtcclxuXHJcbi8vIHZhciBzZXR0aW5nc1BhbmVsLCB2b2ljZU1vZGUsLCBkTW9kZSwgcHVibGljU2VydmVyc01vZHVsZTtcclxuLy8gdmFyIGJkQ29uZmlnID0gbnVsbDsiLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoZW1iZWQuZmllbGRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuaW5jbHVkZXMoc2VhcmNoKSB8fCBlLm5hbWUuaW5jbHVkZXMoc2VhcmNoKVxyXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcclxufSIsImltcG9ydCB7c2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxyXG5jb25zdCBBY3Rpb25UeXBlcyA9IEJETW9kdWxlcy5nZXQobT0+bS5BY3Rpb25UeXBlcylbMF0uQWN0aW9uVHlwZXNcclxuXHJcbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcclxuY29uc3QgcGlkID0gcHJvY2Vzcy5waWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBzZXR0aW5nc1JQQ1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgZm9ybWF0ZWRHYW1lKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcclxuICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnYW1lXHJcbiAgICB9XHJcblxyXG4gICAgc2VuZEdhbWUoKXtcclxuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuTE9DQUxfQUNUSVZJVFlfVVBEQVRFLFxyXG4gICAgICAgICAgICBzb2NrZXRJZCxcclxuICAgICAgICAgICAgcGlkLFxyXG4gICAgICAgICAgICBhY3Rpdml0eTogdGhpcy5mb3JtYXRlZEdhbWVcclxuICAgICAgICB9KSAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRW5hYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNldChzZXR0aW5nc1JQQyB8fCBPYmplY3QuY3JlYXRlKGRlZmF1bHRSUEMpKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZldGNoQXNzZXRzKGFwcGxpY2F0aW9uSWQpe1xyXG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxyXG4gICAgICAgIGlmKGFzc2V0cy51bmRlZmluZWQgJiYgdHlwZW9mIGFzc2V0cy51bmRlZmluZWQgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEFwcGxpY2F0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NldHNcclxuICAgIH1cclxuXHJcbiAgICBzZXQoYWN0aXZpdHkpe1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGFjdGl2aXR5XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIHt9fSwgLy8gZGVwcmVjYXRlZCwgZGVsZXRlZCBhbGwgZW1vdGVzIGZyb20gYmV0dGVyZGlzY29yZC5cclxuICAgIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH0sXHJcbiAgICBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XHJcbn07XHJcblxyXG5CZEFwaS5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgIHJldHVybiBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmluamVjdENTUyA9IGZ1bmN0aW9uIChpZCwgY3NzKSB7XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSwgY3NzKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS5jbGVhckNTUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmxpbmtKUyA9IGZ1bmN0aW9uIChpZCwgdXJsKSB7XHJcbiAgICBET00uYWRkU2NyaXB0KERPTS5lc2NhcGVJRChpZCksIHVybCk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkudW5saW5rSlMgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0dldCBhbm90aGVyIHBsdWdpblxyXG4vL25hbWUgPSBuYW1lIG9mIHBsdWdpblxyXG5CZEFwaS5nZXRQbHVnaW4gPSBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgaWYgKGJkcGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBiZHBsdWdpbnNbbmFtZV0ucGx1Z2luO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG4vL0dldCBCZXR0ZXJEaXNjb3JkIENvcmVcclxuQmRBcGkuZ2V0Q29yZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGlvbiBOb3RpY2VcIiwgYEJkQXBpLmdldENvcmUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLmApO1xyXG4gICAgcmV0dXJuIG1haW5Db3JlO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgbW9kYWwuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIGEgc3RyaW5nIG9mIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbW9kYWxcclxuICovXHJcbkJkQXBpLmFsZXJ0ID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCB7Y2FuY2VsVGV4dDogbnVsbH0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vL1Nob3cgdG9hc3QgYWxlcnRcclxuQmRBcGkuc2hvd1RvYXN0ID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBVdGlscy5zaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZSA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRBbGxNb2R1bGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQWxsKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvcHMgPSBmdW5jdGlvbiguLi5wcm9wcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhwcm9wcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm90b3R5cGVzID0gZnVuY3Rpb24oLi4ucHJvdG9zKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlQcm90b3R5cGVzKHByb3Rvcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlEaXNwbGF5TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKG5hbWUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyByZWFjdCBpbnN0YW5jZVxyXG5CZEFwaS5nZXRJbnRlcm5hbEluc3RhbmNlID0gZnVuY3Rpb24obm9kZSkge1xyXG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5qUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpIG5vZGUgPSBub2RlWzBdO1xyXG4gICAgcmV0dXJuIEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShub2RlKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5sb2FkRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXREYXRhID0gQmRBcGkubG9hZERhdGE7XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2F2ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0RGF0YSA9IEJkQXBpLnNhdmVEYXRhO1xyXG5cclxuLy8gRGVsZXRlcyBkYXRhXHJcbkJkQXBpLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuLy8gUGF0Y2hlcyBvdGhlciBmdW5jdGlvbnNcclxuQmRBcGkubW9ua2V5UGF0Y2ggPSBmdW5jdGlvbih3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gVXRpbHMubW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBFdmVudCB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG5CZEFwaS5vblJlbW92ZWQgPSBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm9uUmVtb3ZlZChub2RlLCBjYWxsYmFjayk7XHJcbn07XHJcblxyXG4vLyBXcmFwcyBmdW5jdGlvbiBpbiB0cnkuLmNhdGNoXHJcbkJkQXBpLnN1cHByZXNzRXJyb3JzID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKTtcclxufTtcclxuXHJcbi8vIFRlc3RzIGZvciB2YWxpZCBKU09OXHJcbkJkQXBpLnRlc3RKU09OID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnRlc3RKU09OKGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuaXNQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhcGx1Z2luQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNUaGVtZUVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISF0aGVtZUNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzU2V0dGluZ0VuYWJsZWQgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuICEhc2V0dGluZ3NDb29raWVbaWRdO1xyXG59O1xyXG5cclxuQmRBcGkuZW5hYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgdHJ1ZSk7XHJcbn07XHJcblxyXG5CZEFwaS5kaXNhYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgZmFsc2UpO1xyXG59O1xyXG5cclxuQmRBcGkudG9nZ2xlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgIXNldHRpbmdzQ29va2llW2lkXSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkuZ2V0QkREYXRhID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldEJERGF0YShrZXkpO1xyXG59O1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNldEJERGF0YSA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRCRERhdGEoa2V5LCBkYXRhKTtcclxufTtcclxuXHJcblxyXG5cclxuY29uc3QgbWFrZUFkZG9uQVBJID0gKGNvb2tpZSwgbGlzdCwgbWFuYWdlcikgPT4gbmV3IGNsYXNzIEFkZG9uQVBJIHtcclxuXHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBtYW5hZ2VyLmZvbGRlcjt9XHJcblxyXG4gICAgaXNFbmFibGVkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gISFjb29raWVbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZGlzYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGUobmFtZSkge1xyXG4gICAgICAgIGlmIChjb29raWVbbmFtZV0pIHRoaXMuZGlzYWJsZShuYW1lKTtcclxuICAgICAgICBlbHNlIHRoaXMuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIucmVsb2FkKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldChuYW1lKSB7XHJcbiAgICAgICAgaWYgKGxpc3QuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxpc3RbbmFtZV0ucGx1Z2luKSByZXR1cm4gbGlzdFtuYW1lXS5wbHVnaW47XHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGwoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChrID0+IHRoaXMuZ2V0KGspKS5maWx0ZXIoYSA9PiBhKTtcclxuICAgIH1cclxufTtcclxuXHJcbkJkQXBpLlBsdWdpbnMgPSBtYWtlQWRkb25BUEkocGx1Z2luQ29va2llLCBiZHBsdWdpbnMsIHBsdWdpbk1vZHVsZSk7XHJcbkJkQXBpLlRoZW1lcyA9IG1ha2VBZGRvbkFQSSh0aGVtZUNvb2tpZSwgYmR0aGVtZXMsIHRoZW1lTW9kdWxlKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJkQXBpO1xyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJkQXBpID0gQmRBcGkiLCIvKiBCREV2ZW50cyAqL1xyXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJERXZlbnRzID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXS51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzWzBdfSwgJHtzZWxlY3RvcnNbMV19LCAke3NlbGVjdG9yc1syXX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzWzBdfTpob3ZlciwgJHtzZWxlY3RvcnNbMV19OmhvdmVyLCAke3NlbGVjdG9yc1syXX06aG92ZXIge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CREV2ZW50cyA9IHRoaXNcclxuICAgIH1cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIiNcIikgJiYgKHZhbHVlLmxlbmd0aCA9PSA3IHx8IHZhbHVlLmxlbmd0aCA9PSA0KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobW9kdWxlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLmxlbmd0aCB8fCBtYXRjaC5sZW5ndGggPCAyKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGV2ZXIgaGFwcGVuIHNpbmNlIHRoZXkgcGFzc2VkIHRoZSBtb2R1bGVGaWx0ZXIsIGJ1dCB5b3UgbmV2ZXIga25vd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHJpbmcgKz0gYCAke25vcm1hbENsYXNzfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IGNsYXNzZXMubGVuZ3RoOyBjIDwgY2xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBtYXRjaC5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHRoaXMubm9ybWFsaXplRWxlbWVudChjaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJ0RWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcclxuICAgICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi50b1JlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hET01NZXRob2RzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgdG9rZW5zID0gdG9rZW4uc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHJlbW92ZSwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29sb3JlZFRleHQge1xyXG4gICAgaW5qZWN0Q29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcclxuICAgICAgICBpZiAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgaWYgKCFwcm9wcyB8fCAhcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VDb250ZW50LnR5cGUgfHwgIW1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSB8fCBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuZGlzcGxheU5hbWUgIT0gXCJNZXNzYWdlQ29udGVudFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVHlwZS5fX29yaWdpbmFsTWV0aG9kKSByZXR1cm47IC8vIERvbid0IHBhdGNoIGFnYWluXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSA9IGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlQ29sb3IgPSBzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdID8gcHJvcHMubWVzc2FnZS5jb2xvclN0cmluZyB8fCBcIlwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLnN0eWxlID0ge2NvbG9yOiByb2xlQ29sb3J9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLCBvcmlnaW5hbFR5cGUpO1xyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK2NsYXNzTmFtZU1hcmt1cC5zcGxpdChcIiBcIilbMF0pLmZvckVhY2goZWxlbSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW0uc3R5bGUuc2V0UHJvcGVydHkoXCJjb2xvclwiLCBcIlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge2JkQ29uZmlnLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgcGx1Z2luQ2VydGlmaWVyLCB7IGVuY3J5cHRTZXR0aW5nc0NhY2hlLCBkZWNyeXB0U2V0dGluZ3NDYWNoZSwgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IHsgY2FwdHVyZVJlamVjdGlvblN5bWJvbCB9IGZyb20gXCJldmVudHNcIjtcclxuXHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIikuTW9kdWxlO1xyXG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUocmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHAuZ2V0QXBwUGF0aCgpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XHJcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xyXG5jb25zdCBvcmlnaW5hbENTU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID8gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA6ICgpID0+IHtyZXR1cm4gbnVsbDt9O1xyXG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xyXG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xyXG5cclxuZXhwb3J0IGxldCBhZGRvbkNhY2hlID0ge31cclxuXHJcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbnRlbnRNYW5hZ2VyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRpbWVDYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEV4dGVuc2lvbnMoKXtcclxuICAgICAgICBpZihoYXNQYXRjaGVkKXJldHVyblxyXG4gICAgICAgIGhhc1BhdGNoZWQgPSB0cnVlXHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInRoZW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwbHVnaW5zRm9sZGVyKCkge3JldHVybiB0aGlzLl9wbHVnaW5zRm9sZGVyIHx8ICh0aGlzLl9wbHVnaW5zRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwicGx1Z2lucy9cIikpKTt9XHJcbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XHJcblxyXG4gICAgbG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKXtcclxuICAgICAgICBpZih0eXBlb2YgZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSAhPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IEpTT04ucGFyc2UoZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSkpXHJcbiAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSB7fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKGFkZG9uQ2FjaGUpXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgIGlmKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9wcyA9IFt7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwidGltZXN0YW1wXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJyZXN1bHRcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcImhhc2hcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgZm9yKGxldCBwcm9wIG9mIHByb3BzKXtcclxuICAgICAgICAgICAgICAgIGlmKCEocHJvcC5rZXkgaW4gdmFsdWUpIHx8IHR5cGVvZiB2YWx1ZVtwcm9wLmtleV0gIT09IHByb3AudHlwZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZhbHVlLmhhc2ggIT09IGtleSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih2YWx1ZS5yZXN1bHQuc3VzcGVjdCl7IC8vIHJlZmV0Y2ggZnJvbSByZW1vdGUgdG8gYmUgc3VyZSB5b3UncmUgdXAgdG8gZGF0ZS5cclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQWRkb25DYWNoZSgpe1xyXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoSlNPTi5zdHJpbmdpZnkoYWRkb25DYWNoZSkpKVxyXG4gICAgfVxyXG5cclxuICAgIHdhdGNoQ29udGVudChjb250ZW50VHlwZSkge1xyXG4gICAgICAgIGlmICh0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gY29udGVudFR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSA9IGZzLndhdGNoKGJhc2VGb2xkZXIsIHtwZXJzaXN0ZW50OiBmYWxzZX0sIGFzeW5jIChldmVudFR5cGUsIGZpbGVuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnRUeXBlIHx8ICFmaWxlbmFtZSB8fCAhZmlsZW5hbWUuZW5kc1dpdGgoZmlsZUVuZGluZykpIHJldHVybjtcclxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgIHRyeSB7ZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09IFwiRU5PRU5UXCIpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHJldHVybiBwbHVnaW5Nb2R1bGUudW5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGVtZU1vZHVsZS51bmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKS5pc0ZpbGUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy5tdGltZSB8fCAhc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RhdHMubXRpbWUuZ2V0VGltZSgpKSAhPT0gXCJudW1iZXJcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID09IHN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPSBzdGF0cy5tdGltZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJyZW5hbWVcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcImNoYW5nZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5yZWxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5yZWxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1bndhdGNoQ29udGVudChjb250ZW50VHlwZSkge1xyXG4gICAgICAgIGlmICghdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXS5jbG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXTtcclxuICAgIH1cclxuXHJcbiAgICBleHRyYWN0TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCBoYXNPbGRNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLy9NRVRBXCIpO1xyXG4gICAgICAgIGlmIChoYXNPbGRNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU9sZE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgY29uc3QgaGFzTmV3TWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8qKlwiKTtcclxuICAgICAgICBpZiAoaGFzTmV3TWV0YSkgcmV0dXJuIHRoaXMucGFyc2VOZXdNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlT2xkTWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgbWV0YSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgcmF3TWV0YSA9IG1ldGEuc3Vic3RyaW5nKG1ldGEubGFzdEluZGV4T2YoXCIvL01FVEFcIikgKyA2LCBtZXRhLmxhc3RJbmRleE9mKFwiKi8vXCIpKTtcclxuICAgICAgICBpZiAobWV0YS5pbmRleE9mKFwiTUVUQVwiKSA8IDApIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFV0aWxzLnRlc3RKU09OKHJhd01ldGEpO1xyXG4gICAgICAgIGlmICghcGFyc2VkKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBjb3VsZCBub3QgYmUgcGFyc2VkLlwiKTtcclxuICAgICAgICBpZiAoIXBhcnNlZC5uYW1lKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBtaXNzaW5nIG5hbWUgZGF0YS5cIik7XHJcbiAgICAgICAgcGFyc2VkLmZvcm1hdCA9IFwianNvblwiO1xyXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VOZXdNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuc3BsaXQoXCIvKipcIiwgMilbMV0uc3BsaXQoXCIqL1wiLCAxKVswXTtcclxuICAgICAgICBjb25zdCBvdXQgPSB7fTtcclxuICAgICAgICBsZXQgZmllbGQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBhY2N1bSA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGJsb2NrLnNwbGl0KHNwbGl0UmVnZXgpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gXCJAXCIgJiYgbGluZS5jaGFyQXQoMSkgIT09IFwiIFwiKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRbZmllbGRdID0gYWNjdW07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gbGluZS5pbmRleE9mKFwiIFwiKTtcclxuICAgICAgICAgICAgICAgIGZpZWxkID0gbGluZS5zdWJzdHIoMSwgbCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gPSBsaW5lLnN1YnN0cihsICsgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSArPSBcIiBcIiArIGxpbmUucmVwbGFjZShcIlxcXFxuXCIsIFwiXFxuXCIpLnJlcGxhY2UoZXNjYXBlZEF0UmVnZXgsIFwiQFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBvdXRbZmllbGRdID0gYWNjdW0udHJpbSgpO1xyXG4gICAgICAgIGRlbGV0ZSBvdXRbXCJcIl07XHJcbiAgICAgICAgb3V0LmZvcm1hdCA9IFwianNkb2NcIjtcclxuICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbnRlbnRSZXF1aXJlKHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXF1aXJlID0gaXNQbHVnaW4gPyBvcmlnaW5hbEpTUmVxdWlyZSA6IG9yaWdpbmFsQ1NTUmVxdWlyZTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24obW9kdWxlLCBmaWxlbmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyBzZWxmLnBsdWdpbnNGb2xkZXIgOiBzZWxmLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICAgICAgY29uc3QgcG9zc2libGVQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIHBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBvc3NpYmxlUGF0aCkgfHwgZmlsZW5hbWUgIT09IGZzLnJlYWxwYXRoU3luYyhwb3NzaWJsZVBhdGgpKSByZXR1cm4gUmVmbGVjdC5hcHBseShvcmlnaW5hbFJlcXVpcmUsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCBcInV0ZjhcIik7XHJcbiAgICAgICAgICAgIGNvbnRlbnQgPSBVdGlscy5zdHJpcEJPTShjb250ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRhID0gc2VsZi5leHRyYWN0TWV0YShjb250ZW50KTtcclxuICAgICAgICAgICAgbWV0YS5maWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICBtZXRhLmFkZGVkID0gc3RhdHMuYXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5tb2RpZmllZCA9IHN0YXRzLm10aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEuc2l6ZSA9IHN0YXRzLnNpemU7XHJcbiAgICAgICAgICAgIGlmICghaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1ldGEuY3NzID0gY29udGVudDtcclxuICAgICAgICAgICAgICAgIGlmIChtZXRhLmZvcm1hdCA9PSBcImpzb25cIikgbWV0YS5jc3MgPSBtZXRhLmNzcy5zcGxpdChcIlxcblwiKS5zbGljZSgxKS5qb2luKFwiXFxuXCIpO1xyXG4gICAgICAgICAgICAgICAgY29udGVudCA9IGBtb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O2A7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgbW9kdWxlLmZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpZEV4cG9ydCA9ICFVdGlscy5pc0VtcHR5KG1vZHVsZS5leHBvcnRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaWRFeHBvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXRhLnR5cGUgPSBtb2R1bGUuZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG1ldGE7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVdGlscy53YXJuKFwiTW9kdWxlIE5vdCBFeHBvcnRlZFwiLCBgJHttZXRhLm5hbWV9LCBwbGVhc2Ugc3RhcnQgc2V0dGluZyBtb2R1bGUuZXhwb3J0c2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYFxcbm1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07XFxubW9kdWxlLmV4cG9ydHMudHlwZSA9ICR7bWV0YS5leHBvcnRzIHx8IG1ldGEubmFtZX07YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgZmlsZW5hbWUpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZVBsYWNlaG9sZGVyUGx1Z2luKGRhdGEpIHtcclxuICAgICAgICByZXR1cm4ge3BsdWdpbjoge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0TmFtZTogKCkgPT4ge3JldHVybiBkYXRhLm5hbWUgfHwgZGF0YS5maWxlbmFtZTt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0QXV0aG9yOiAoKSA9PiB7cmV0dXJuIFwiPz8/XCI7fSxcclxuICAgICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiAoKSA9PiB7cmV0dXJuIGRhdGEubWVzc2FnZSA/IGRhdGEubWVzc2FnZSA6IFwiVGhpcyBwbHVnaW4gd2FzIHVuYWJsZSB0byBiZSBsb2FkZWQuIENoZWNrIHRoZSBhdXRob3IncyBwYWdlIGZvciB1cGRhdGVzLlwiO30sXHJcbiAgICAgICAgICAgICAgICBnZXRWZXJzaW9uOiAoKSA9PiB7cmV0dXJuIFwiPz8/XCI7fVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUgfHwgZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgZmlsZW5hbWU6IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YS5zb3VyY2UgPyBkYXRhLnNvdXJjZSA6IFwiXCIsXHJcbiAgICAgICAgICAgIHdlYnNpdGU6IGRhdGEud2Vic2l0ZSA/IGRhdGEud2Vic2l0ZSA6IFwiXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG5cclxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSksIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICB9LCAoaGFzaCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZWN0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCB0cnVlKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZihyZXN1bHQpe1xyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZVtyZXN1bHQuaGFzaF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc2g6IHJlc3VsdC5oYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcclxuICAgICAgICAgICAgICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVGhpcyBwbHVnaW4gbWlnaHQgYmUgZGFuZ2Vyb3VzIChcIityZXN1bHQuaGFybStcIikuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJUaGlzIHBsdWdpbiBtaWdodCBiZSBkYW5nZXJvdXMgKFwiK3Jlc3VsdC5oYXJtK1wiKS5cIilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7d2luZG93LnJlcXVpcmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb21waWxlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IHdpbmRvdy5yZXF1aXJlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO1xyXG4gICAgICAgIGlmKCFjb250ZW50Lm5hbWUpcmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ2Fubm90IGVzY2FwZSB0aGUgSUQuXCIsIGVycm9yOiB7bWVzc2FnZTogXCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkXCIsIHN0YWNrOiBcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIn19XHJcbiAgICAgICAgY29udGVudC5pZCA9IFV0aWxzLmVzY2FwZUlEKGNvbnRlbnQubmFtZSk7XHJcbiAgICAgICAgaWYgKGlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgIGlmICghY29udGVudC50eXBlKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50LnBsdWdpbiA9IG5ldyBjb250ZW50LnR5cGUoKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXTtcclxuICAgICAgICAgICAgICAgIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldID0gY29udGVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29uc3RydWN0ZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGVsZXRlIGJkdGhlbWVzW2NvbnRlbnQubmFtZV07XHJcbiAgICAgICAgICAgIGJkdGhlbWVzW2NvbnRlbnQubmFtZV0gPSBjb250ZW50O1xyXG4gICAgICAgIH1cclxuICAgIH0gICBcclxuXHJcbiAgICB1bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSB1bmxvYWRlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319O31cclxuICAgIH1cclxuXHJcbiAgICBpc0xvYWRlZChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlLmNhY2hlW3dpbmRvdy5yZXF1aXJlLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO31cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIGZhbHNlO31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgY2FudFVubG9hZCA9IHRoaXMudW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgaWYgKGNhbnRVbmxvYWQpIHJldHVybiBjYW50VW5sb2FkO1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkTmV3Q29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuICAgICAgICBjb25zdCBjb250ZW50TGlzdCA9IE9iamVjdC52YWx1ZXMoaXNQbHVnaW4gPyBiZHBsdWdpbnMgOiBiZHRoZW1lcyk7XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGNvbnRlbnRMaXN0LmZpbHRlcih0ID0+ICFmaWxlcy5pbmNsdWRlcyh0LmZpbGVuYW1lKSkubWFwKGMgPT4gaXNQbHVnaW4gPyBjLnBsdWdpbi5nZXROYW1lKCkgOiBjLm5hbWUpO1xyXG4gICAgICAgIGNvbnN0IGFkZGVkID0gZmlsZXMuZmlsdGVyKGYgPT4gIWNvbnRlbnRMaXN0LmZpbmQodCA9PiB0LmZpbGVuYW1lID09IGYpICYmIGYuZW5kc1dpdGgoZmlsZUVuZGluZykgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGYpKS5pc0ZpbGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHthZGRlZCwgcmVtb3ZlZH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFsbENvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIHRoaXMucGF0Y2hFeHRlbnNpb25zKClcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cclxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XHJcbn07XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvbnRlbnRNYW5hZ2VyIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgTGlnaHRjb3JkTG9nbyBmcm9tIFwiLi4vc3ZnL2xpZ2h0Y29yZFwiO1xyXG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XHJcbmltcG9ydCBFbW9qaU1vZHVsZSBmcm9tIFwiLi9lbW9qaU1vZHVsZVwiXHJcbmltcG9ydCB7cmVtb3RlIGFzIGVsZWN0cm9ufSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuZnVuY3Rpb24gQ29yZSgpIHtcclxuICAgIC8vIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKERhdGFTdG9yZS5jb25maWdGaWxlKSk7XHJcbiAgICAvLyB0aGlzLmluaXQoKTtcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKCFBcnJheS5wcm90b3R5cGUuZmxhdCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmJkVmVyc2lvbiArIFwiIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvbGQgdmVyc2lvbiAoXCIgKyBjdXJyZW50RGlzY29yZFZlcnNpb24gKyBcIikgb2YgRGlzY29yZC4gUGxlYXNlIHVwZGF0ZSB5b3VyIERpc2NvcmQgaW5zdGFsbGF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuRUQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LldlYlNvY2tldCAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUgJiYgd2luZG93LldlYlNvY2tldC5uYW1lLmluY2x1ZGVzKFwiUGF0Y2hlZFwiKSkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIFBvd2VyY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIC8qXHJcbiAgICBjb25zdCBsYXRlc3RMb2NhbFZlcnNpb24gPSBiZENvbmZpZy51cGRhdGVyID8gYmRDb25maWcudXBkYXRlci5MYXRlc3RWZXJzaW9uIDogYmRDb25maWcubGF0ZXN0VmVyc2lvbjtcclxuICAgIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xyXG4gICAgICAgICAgICBjb25maXJtVGV4dDogXCJVcGRhdGUgTm93XCIsXHJcbiAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiTWF5YmUgTGF0ZXJcIixcclxuICAgICAgICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZhaWxlZCA9ICgpID0+IHtVdGlscy5hbGVydChcIkNvdWxkIE5vdCBVcGRhdGVcIiwgYFVuYWJsZSB0byB1cGRhdGUgYXV0b21hdGljYWxseSwgcGxlYXNlIGRvd25sb2FkIHRoZSBpbnN0YWxsZXIgYW5kIHJlaW5zdGFsbCBub3JtYWxseS48YnIgLz48YnIgLz48YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkRvd25sb2FkIEluc3RhbGxlcjwvYT5gKTt9O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWRVcGRhdGUgPSBhd2FpdCB0aGlzLnVwZGF0ZUluamVjdG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGUpIHJldHVybiBvblVwZGF0ZUZhaWxlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5yZWxhdW5jaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5leGl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIEFkZG9ucyBDYWNoZVwiKVxyXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIGF0b2IoRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpKSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBQbHVnaW5DZXJ0aWZpZXIuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpLmxlbmd0aCkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpWzBdLnJlbW92ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xyXG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcclxuXHJcbiAgICAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcclxuICAgICAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiQ29sbGVjdGluZyBTdGFydHVwIEVycm9yc1wiKTtcclxuICAgICAgICBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogYmRwbHVnaW5FcnJvcnMsIHRoZW1lczogYmR0aGVtZUVycm9yc30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xyXG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcclxuICAgICAgICBpZiAoYmJkQ2hhbmdlbG9nKSB0aGlzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJ2ZXJzaW9uXCIsIGJiZFZlcnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIEVtb2ppTW9kdWxlLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoU29jaWFsLmJpbmQodGhpcyksIFwiQkQgU29jaWFsIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRQaWxscy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFBpbGxzIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRTZXBhcmF0b3IuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBTZXBhcmF0b3IgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZXNzYWdlSGVhZGVyLmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgQ2hhdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dGFjaG1lbnQuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xyXG4gICAgICAgIGxldCBhbGVydCA9IFV0aWxzLmFsZXJ0KFwiRmlyc3QgSW5zdGFsbGF0aW9uXCIsIFwiQXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGluc3RhbGwgTGlnaHRjb3JkLCBXZSBhZGRlZCB0d28gZGVmYXVsdCB0aGVtZXMgYW5kIG9uZSBkZWZhdWx0IHBsdWdpbiBpbiB5b3VyIHBsdWdpbi90aGVtZSBmb2xkZXIuIENoZWNrIGl0IGluIHRoZSBQbHVnaW4vVGhlbWUgc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxyXG4gICAgaWYobG9nbyl7XHJcbiAgICAgICAgbG9nby5zdHlsZS50b3AgPSBcIjNweFwiXHJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cclxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ0LjgxLDkuNjdWNi4zM2MwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxQTMuNTMsMy41MywwLDAsMCw0Ni4yLDNjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNjdjMCwyLjIxLDEuODksMy4zMywzLjc3LDMuMzNhMy44NywzLjg3LDAsMCwwLDMuNDUtMi4xOGwtMi4xMi0xQzQ3LDExLjE3LDQ0LjgxLDEwLjg1LDQ0LjgxLDkuNjdaTTEwLjY4LDEyLjg5aDIuNDFWMy4xN0gxMC42OFpNNzEuNzYsMy4xNEg2OC4xOVY3LjIzTDcwLjU3LDkuNHYtNGgxLjI3Yy44MSwwLDEuMjEuNDEsMS4yMSwxdjNjMCwuNjMtLjM4LDEuMDUtMS4yMSwxLjA1SDY4LjE4djIuMzFoMy41N2MxLjkyLDAsMy43Mi0xLDMuNzItMy4yVjYuMzlDNzUuNDgsNC4xMyw3My42OCwzLjE0LDcxLjc2LDMuMTRaTTU0LjIyLDNjLTIsMC00LDEuMS00LDMuMzRWOS42NmMwLDIuMjMsMiwzLjM0LDQsMy4zNHMzLjk1LTEuMTEsMy45NS0zLjM0VjYuMzRDNTguMTksNC4xMSw1Ni4yLDMsNTQuMjIsM1ptMS41NSw2LjY2YzAsLjctLjc4LDEuMDYtMS41NCwxLjA2cy0xLjU1LS4zNS0xLjU1LTEuMDZWNi4zNGMwLS43Mi43NS0xLjEsMS41LTEuMXMxLjU5LjM1LDEuNTksMS4xWk02Ni44NCw2LjM0YzAtMi4yOS0xLjU4LTMuMi0zLjU1LTMuMkg1OS40NnY5LjczaDIuNDVWOS43N2guNDNsMi4yMiwzLjA5aDNMNjUsOS41MkM2Ni4xMyw5LjE1LDY2Ljg0LDguMTQsNjYuODQsNi4zNFpNNjMuMzMsNy42NUg2MS45MVY1LjQzaDEuNDJBMS4xMSwxLjExLDAsMSwxLDYzLjMzLDcuNjVaTTI5LjgzLDEzaDIuNDJWMy4wNkgyOS44M1Y2LjczbC0zLDBWMy4wOUgyNC43djkuNzhoMi4xNFY4LjY4bDMsMFpNMTcuMTYsOS43NlY2LjQyYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFhMy41NSwzLjU1LDAsMCwwLTMuMzYtMi4yNGMtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS43NmMwLDIuMjEsMiwzLjE1LDMuOSwzLjE1czMuNTgtMSwzLjU4LTNWNy41OEgxOC43OWwwLDEuMzZIMjAuM3YuNzdDMjAuMywxMC45MiwxNy4xNiwxMC45NCwxNy4xNiw5Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi45MyAtMylcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMzUuOTEgMC4wNiAzOC40MyAwLjA2IDM4LjQzIDEuODQgMzUuOTIgMS44MSAzNS45NyAxMCAzMy41NSAxMCAzMy40OSAxLjc1IDMwLjk4IDEuNzQgMzAuOTggMC4wNiAzMy40OSAwLjA2IDM1LjkxIDAuMDZcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XHJcbjwvc3ZnPmBcclxuICAgIH1cclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0cmlidXRlcyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxyXG4gICAgdGhpcy5jYW5jZWxQYXRjaEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBhdHRyaWJzUGF0Y2hzLmZvckVhY2goZSA9PiBlKCkpXHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUoIXYyLk1lc3NhZ2VDb21wb25lbnQpYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpXHJcbiAgICBcclxuICAgIC8vIFRPRE86IHRyeSB0byBwYXRjaCBjb3JyZWN0bHkgdGhlIHVzZXIgcG9wb3V0IG9uIGEgbmV4dCB1cGRhdGVcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkRpc2NvcmRUYWdcIilcclxuICAgIC50aGVuKERpc2NvcmRUYWcgPT4ge1xyXG4gICAgICAgIGxldCBEaXNjb3JkVGFnQ29tcCA9IERpc2NvcmRUYWcuZGVmYXVsdFxyXG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdCA9IGZ1bmN0aW9uKHByb3BzKXtcclxuICAgICAgICAgICAgbGV0IHJldHVyblZhbHVlID0gRGlzY29yZFRhZ0NvbXAocHJvcHMpXHJcblxyXG4gICAgICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxyXG5cclxuICAgICAgICAgICAgbGV0IGJhZGdlRGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIixcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IFwiNXB4XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImluaGVyaXRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSlcclxuXHJcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtyZXR1cm5WYWx1ZV1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9wcy51c2VyLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcHMudXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBwcm9wcy51c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGJhZGdlRGl2KVxyXG4gICAgICAgICAgICBsZXQgZGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGNoaWxkcmVuKVxyXG4gICAgICAgICAgICBhcHBseUJhZGdlcyhpZCwgcHJvcHMudXNlciwgZmFsc2UpXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGl2XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZihkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UpeyAvLyB0aGlzIGNhbiBiZSBhIGJsb2NrZWQgbWVzc2FnZSAobm90IG9wZW5lZClcclxuICAgICAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcImRhdGEtbWVzc2FnZS1pZFwiXSA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZS5pZFxyXG4gICAgICAgIH1cclxuICAgIH19KSlcclxuICAgICAgICAvKlxyXG4gICAgYXR0cmlic1BhdGNocy5wdXNoKFV0aWxzLm1vbmtleVBhdGNoKHYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcIm1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcclxuICAgIH19KSkqL1xyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5jaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHRpbWVzQ2hlY2tlZCA9IDA7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IEJEVjIuZ3VpbGRDbGFzc2VzLndyYXBwZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGQgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVzQ2hlY2tlZCA+PSA1MCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9IFwibG9hZGluZ1wiKSBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO30pO1xyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcclxuICAgIGlmICh3aW5kb3cucmVxdWlyZS5vcmlnaW5hbCkgd2luZG93LnJlcXVpcmUgPSB3aW5kb3cucmVxdWlyZS5vcmlnaW5hbDtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucHJvdG90eXBlICYmIGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMpXHJcbiAgICAudGhlbihzZXR0aW5nTW9kdWxlID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGdldFByZWRpY2F0ZVNlY3Rpb25zID0gc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9uc1xyXG4gICAgICAgIHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcblxyXG4gICAgICAgICAgICBpZihyZXN1bHRbMV0uc2VjdGlvbiA9PT0gXCJNeSBBY2NvdW50XCIpeyAvLyB1c2VyIHNldHRpbmdzLCBub3QgZ3VpbGQgc2V0dGluZ3NcclxuICAgICAgICAgICAgICAgIGxldCBwb3BlZCA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcih0aGlzKSlcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZShwb3BlZFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9wZWQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgIH1cclxuICAgIH0pXHJcbn07XHJcblxyXG5cclxubGV0IGNsYXNzTmFtZUxheWVyXHJcbmxldCBjbGFzc05hbWVTb2NpYWxMaW5rc1xyXG5sZXQgY2xhc3NOYW1lTW9kYWxcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IG1haW5PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBtbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSBwbHVnaW5Nb2R1bGUucmF3T2JzZXJ2ZXIobXV0YXRpb24pO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcclxuICAgICAgICAgICAgaWYgKCFtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCB8fCAhKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0gaW5zdGFuY2VvZiBFbGVtZW50KSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVMYXllciljbGFzc05hbWVMYXllciA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVTb2NpYWxMaW5rcyljbGFzc05hbWVTb2NpYWxMaW5rcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc29jaWFsTGlua3MgJiYgdHlwZW9mIGUuc29jaWFsTGlua3MgPT09IFwic3RyaW5nXCIpWzBdLnNvY2lhbExpbmtzXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVNb2RhbCljbGFzc05hbWVNb2RhbCA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubW9kYWwgJiYgdHlwZW9mIGUubW9kYWwgPT09IFwic3RyaW5nXCIgJiYgZS5pbm5lciAmJiB0eXBlb2YgZS5pbm5lciA9PT0gXCJzdHJpbmdcIiAmJiAhZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUpWzBdLm1vZGFsXHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpID09PSBcIkdVSUxEX1NFVFRJTkdTXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZVNvY2lhbExpbmtzKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50RWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ICYmIG5vZGUucXVlcnlTZWxlY3RvcihcIiNhY2Vfc2V0dGluZ3NtZW51XCIpKSBub2RlLmlkID0gXCJhY2Vfc2V0dGluZ3NtZW51X2NvbnRhaW5lclwiO1xyXG5cclxuICAgICAgICAgICAgLy8gRW1vamkgUGlja2VyXHJcbiAgICAgICAgICAgIC8vbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZW1vamlQaWNrZXItM20xUy1qXCIpLmxlbmd0aCAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLmVtb2ppUGlja2VyLTNtMVMtalwiKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFuaW1hdG9yTGVmdC0xRVF4VTBcIilcclxuICAgICAgICAgICAgLy9pZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIyKSAmJiBub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lRW1vamlQaWNrZXIpLmxlbmd0aCAgJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVFbW9qaVBpY2tlcikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lQW5pbWF0b3JMZWZ0KSkgcXVpY2tFbW90ZU1lbnUub2JzQ2FsbGJhY2sobm9kZSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIG1haW5PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7XHJcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgIHN1YnRyZWU6IHRydWVcclxuICAgIH0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuYWxlcnQgPSBmdW5jdGlvbih0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgVGFiQmFyID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJUYWJCYXJcIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghVGFiQmFyKSByZXR1cm47XHJcbiAgICB0aGlzLnNvY2lhbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goVGFiQmFyLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlbjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoIDwgMykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAzXS50eXBlLmRpc3BsYXlOYW1lICE9PSBcIlNlcGFyYXRvclwiKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJzb2NpYWxMaW5rc1wiKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChBbmNob3IpIHtcclxuICAgICAgICAgICAgbGV0IHNvY2lhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zb2NpYWxMaW5rcylbMF1cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1zb2NpYWwtbGluayBcIitzb2NpYWxNb2R1bGUxLmxpbmssIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVDb2xvck11dGVkLFxyXG4gICAgICAgICAgICBzaXplcyxcclxuICAgICAgICAgICAgY2xhc3NOYW1lVmVyc2lvbkhhc2hcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJzaW9uSGFzaClbMF0udmVyc2lvbkhhc2hcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIGNvbnN0IHZlcnNpb25IYXNoID0gYCgke2JkQ29uZmlnLmhhc2ggPyBiZENvbmZpZy5oYXNoLnN1YnN0cmluZygwLCA3KSA6IGJkQ29uZmlnLmJyYW5jaH0pYDtcclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBMaWdodGNvcmQgJHtlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikudmVyc2lvbn0gYCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWVWZXJzaW9uSGFzaCtcIiBkYS12ZXJzaW9uSGFzaFwifSwgYCgkeyhlbGVjdHJvbi5nZXRHbG9iYWwoXCJCdWlsZEluZm9cIikuY29tbWl0IHx8IFwiVW5rbm93blwiKS5zbGljZSgwLCA3KX0pYCkpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogYCR7Y2xhc3NOYW1lQ29sb3JNdXRlZH0gJHtzaXplcy5zaXplMTJ9YH0sIGBCQkQgJHtiYmRWZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCB2ZXJzaW9uSGFzaCkpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIFxyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcclxuICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IG9yaWdpbmFsVmVyc2lvbnMoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICB9O1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBndWlsZHNXcmFwcGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ3cmFwcGVyXCIsIFwidW5yZWFkTWVudGlvbnNCYXJcIik7XHJcbiAgICBjb25zdCBndWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImd1aWxkc0Vycm9yXCIsIFwic2VsZWN0ZWRcIik7XHJcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xyXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkTGlzdEl0ZW1zID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZExpc3RJdGVtc1BhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcclxuICAgIGNvbnN0IGxpc3RJdGVtQ2xhc3MgPSBHdWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgYmxvYkNsYXNzID0gR3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XHJcbiAgICBjb25zdCBHdWlsZENvbXBvbmVudCA9IHJlYWN0SW5zdGFuY2UucmV0dXJuLnR5cGU7XHJcbiAgICBpZiAoIUd1aWxkQ29tcG9uZW50KSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5yZXR1cm5WYWx1ZSAmJiBkYXRhLnRoaXNPYmplY3QpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XHJcbiAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWVcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSBjbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIGNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSBjbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIGNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIGNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XHJcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFBpbGxQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgZ3VpbGRQaWxsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiAhbS5kZWZhdWx0LmRpc3BsYXlOYW1lICYmIG0uZGVmYXVsdC50b1N0cmluZyAmJiBtLmRlZmF1bHQudG9TdHJpbmcoKS5pbmNsdWRlcyhcInRyYW5zbGF0ZTNkXCIpKTtcclxuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XHJcbiAgICB0aGlzLmd1aWxkUGlsbFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goZ3VpbGRQaWxsLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XHJcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLnNlbGVjdGVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgIGlmIChwcm9wcy5ob3ZlcmVkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ob3ZlcmVkXCI7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgIGNvbnN0IGd1aWxkQ29tcG9uZW50cyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicmVuZGVyTGlzdEl0ZW1cIik7XHJcbiAgICBpZiAoIWd1aWxkQ29tcG9uZW50cyB8fCAhR3VpbGRzKSByZXR1cm47XHJcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gZ3VpbGRDb21wb25lbnRzLlNlcGFyYXRvciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1ndWlsZC1zZXBhcmF0b3JcIjtcclxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5ndWlsZFNlcGFyYXRvclBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRzLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRhY2htZW50ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5BdHRhY2htZW50UGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhQXR0YWNobWVudCB8fCAhQXR0YWNobWVudC5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYoIXNldHRpbmdzQ29va2llW1wiZm9yay1wcy02XCJdKXJldHVyblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSB8fCBudWxsXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XHJcblxyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF0dGFjaG1lbnQgfHwgIWF0dGFjaG1lbnQudXJsKXJldHVyblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XHJcbiAgICAgICAgICAgIGlkOiBcImNlcnRpZmllZC1cIitpZFxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcclxuICAgIH19KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lc3NhZ2VIZWFkZXIgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lc3NhZ2VIZWFkZXIgfHwgIU1lc3NhZ2VIZWFkZXIuZGVmYXVsdCkgcmV0dXJuO1xyXG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dGhvciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwibWVzc2FnZS5hdXRob3JcIik7XHJcbiAgICAgICAgLy8gY29uc3QgaGVhZGVyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHNcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF1dGhvciB8fCAhYXV0aG9yLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAoYXV0aG9yLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIGF1dGhvciwgdHJ1ZSlcclxuICAgIH19KTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGFwcGx5QmFkZ2VzKGlkLCB1c2VyLCBjaGF0KXtcclxuICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmFkZ2VzLVwiK2lkKVxyXG4gICAgICAgIGlmKCFkaXYgfHwgZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMClyZXR1cm5cclxuICAgICAgICBpZihkaXYuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuXHJcbiAgICAgICAgbGV0IGJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgIGJsb2NrRGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChibG9ja0RpdilcclxuXHJcbiAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcblxyXG4gICAgICAgIGRpc3RhbnQuZ2V0QmFkZ2VzKHVzZXIuaWQpXHJcbiAgICAgICAgLnRoZW4oYmFkZ2VzID0+IHtcclxuICAgICAgICAgICAgYmFkZ2VzLmZvckVhY2goYmFkZ2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ZnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFwiMTZweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTZweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBiYWRnZS5zY29wZXMuZm9yRWFjaChzY29wZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUgPT09IFwidXNlclwiKXsvLyByZXF1aXJlIHVzZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudXNlciA9IHVzZXJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSBcclxuICAgICAgICAgICAgICAgIGlmKCFiYWRnZS5ocmVmKXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5BbmNob3IgPSBBbmNob3JcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5ocmVmID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBiYWRnZS5uYW1lfSxcclxuICAgICAgICAgICAgICAgICAgICBiYWRnZS5ocmVmID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBiYWRnZS5ocmVmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKSkgOiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcylcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihlbGVtZW50LCBkaXYyKVxyXG4gICAgICAgICAgICAgICAgZGl2Mi5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lbWJlckxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lbWJlckxpc3RQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVtYmVyTGlzdEl0ZW0gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1lbWJlckxpc3RJdGVtXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVtYmVyTGlzdEl0ZW0gfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLnJlbmRlckRlY29yYXRvcnMpIHJldHVybjtcclxuICAgIHRoaXMubWVtYmVyTGlzdFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLCBcInJlbmRlckRlY29yYXRvcnNcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEudGhpc09iamVjdCwgXCJwcm9wcy51c2VyXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIXVzZXIgfHwgIXVzZXIuaWQpcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh1c2VyLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCB1c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJhZGdlcy1cIitpZH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCB1c2VyLCBmYWxzZSlcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnVwZGF0ZUluamVjdG9yID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBpbmplY3Rpb25QYXRoID0gRGF0YVN0b3JlLmluamVjdGlvblBhdGg7XHJcbiAgICBpZiAoIWluamVjdGlvblBhdGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xyXG4gICAgY29uc3QgeWF1emwgPSByZXF1aXJlKFwieWF1emxcIik7XHJcbiAgICBjb25zdCBta2RpcnAgPSByZXF1aXJlKFwibWtkaXJwXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IC8qcmVxdWlyZShcInJlcXVlc3RcIik7Ki8gbnVsbFxyXG5cclxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoaW5qZWN0aW9uUGF0aCwgXCIuLlwiKTtcclxuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xyXG4gICAgY29uc3QgemlwTGluayA9IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9hcmNoaXZlL2luamVjdG9yLnppcFwiO1xyXG4gICAgY29uc3Qgc2F2ZWRaaXAgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJpbmplY3Rvci56aXBcIik7XHJcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xyXG5cclxuICAgIC8vIERvd25sb2FkIHRoZSBpbmplY3RvciB6aXAgZmlsZVxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xyXG4gICAgbGV0IHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICByZXF1ZXN0LmdldCh7dXJsOiB6aXBMaW5rLCBlbmNvZGluZzogbnVsbH0sIGFzeW5jIChlcnJvciwgcmVzcG9uc2UsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZW9uZSBoYXMgdGhlaXIgb3duIGNvcHlcclxuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoc2F2ZWRaaXAsIHJlcykpO1xyXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcblxyXG4gICAgICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIldyaXRpbmcgXCIgKyBzYXZlZFppcCk7XHJcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xyXG5cclxuICAgIC8vIENoZWNrIGFuZCBkZWxldGUgcmVuYW1lIGV4dHJhY3Rpb25cclxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XHJcbiAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGAke2V4dHJhY3RlZEZvbGRlcn0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gLCByZXMpKTtcclxuICAgIFxyXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcclxuICAgIGNvbnN0IHppcGZpbGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHlhdXpsLm9wZW4oc2F2ZWRaaXAsIHtsYXp5RW50cmllczogdHJ1ZX0sIChlcnIsIHppcCkgPT4gIHIoemlwKSkpO1xyXG4gICAgemlwZmlsZS5vbihcImVudHJ5XCIsIGZ1bmN0aW9uKGVudHJ5KSB7XHJcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxyXG4gICAgICAgIGlmIChlbnRyeS5maWxlTmFtZS5lbmRzV2l0aChcIi9cIikpIHJldHVybiB6aXBmaWxlLnJlYWRFbnRyeSgpO1xyXG5cclxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgLy8gTWFrZSBhbnkgbmVlZGVkIHBhcmVudCBkaXJlY3Rvcmllc1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGVudHJ5LmZpbGVOYW1lKTtcclxuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcclxuICAgICAgICB6aXBmaWxlLm9wZW5SZWFkU3RyZWFtKGVudHJ5LCBmdW5jdGlvbihlcnIsIHJlYWRTdHJlYW0pIHtcclxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xyXG4gICAgICAgICAgICByZWFkU3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oZnVsbFBhdGgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgemlwZmlsZS5yZWFkRW50cnkoKTsgLy8gU3RhcnQgcmVhZGluZ1xyXG5cclxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB6aXBmaWxlLm9uY2UoXCJlbmRcIiwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxyXG4gICAgY29uc3QgYmFja3VwRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGAke2ZvbGRlck5hbWV9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCk7XHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShpbmplY3Rpb25QYXRoLCBiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBmb2xkZXIgdG8gd2hhdCBpdCBzaG91bGQgYmVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIGBSZW5hbWluZyAke3BhdGguYmFzZW5hbWUoZXh0cmFjdGVkRm9sZGVyKX0gdG8gJHtmb2xkZXJOYW1lfWApO1xyXG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiRmFpbGVkIHRvIHJlbmFtZSB0aGUgZmluYWwgZGlyZWN0b3J5XCIpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIlNvbWV0aGluZyB3ZW50IHdyb25nLi4uIHJlc3RvcmluZyBiYWNrdXBzLlwiKTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoYmFja3VwRm9sZGVyLCBpbmplY3Rpb25QYXRoLCByZXNvbHZlKSk7XHJcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIGV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgZ29uZSBzbW9vdGhseS5cclxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy51bmxpbmsoc2F2ZWRaaXAsIHJlc29sdmUpKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkluamVjdG9yIFVwZGF0ZWQhXCIpO1xyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpO1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb3JlIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiY29uc3QgX19ub25fd2VicGFja19yZXF1aXJlX18gPSB3aW5kb3cucmVxdWlyZVxyXG5cclxuaW1wb3J0IHtiZENvbmZpZ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuXHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IHJlbGVhc2VDaGFubmVsID0gRGlzY29yZE5hdGl2ZS5nbG9iYWxzID8gRGlzY29yZE5hdGl2ZS5nbG9iYWxzLnJlbGVhc2VDaGFubmVsIDogRGlzY29yZE5hdGl2ZS5hcHAgPyBEaXNjb3JkTmF0aXZlLmFwcC5nZXRSZWxlYXNlQ2hhbm5lbCgpIDogXCJzdGFibGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge3NldHRpbmdzOiB7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX19O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EYXRhU3RvcmUgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcImJpbmFyeVwiKSlcclxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBsZXQgc2V0dGluZ3MgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwge1tyZWxlYXNlQ2hhbm5lbF06IHNldHRpbmdzfSk7XHJcbiAgICAgICAgICAgIGVsc2Ugc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwgc2V0dGluZ3MpO1xyXG4gICAgICAgICAgICB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIFV0aWxzLmFsZXJ0KFwiQ29ycnVwdCBTdG9yYWdlXCIsIFwiVGhlIGJkIHN0b3JhZ2UgaGFzIHNvbWVob3cgYmVjb21lIGNvcnJ1cHQuIFlvdSBtYXkgZWl0aGVyIHRyeSB0byBzYWx2YWdlIHRoZSBmaWxlIG9yIGRlbGV0ZSBpdCB0aGVuIHJlbG9hZC5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbmplY3Rpb25QYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5faW5qZWN0aW9uUGF0aCkgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGg7XHJcbiAgICAgICAgY29uc3QgZWxlY3Ryb24gPSByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcDtcclxuICAgICAgICBjb25zdCBiYXNlID0gZWxlY3Ryb24uZ2V0QXBwUGF0aCgpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdCYXNlID0gZWxlY3Ryb24uZ2V0UGF0aChcInVzZXJEYXRhXCIpO1xyXG4gICAgICAgIGNvbnN0IHJvYW1pbmdMb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShyb2FtaW5nQmFzZSwgZWxlY3Ryb24uZ2V0VmVyc2lvbigpLCBcIm1vZHVsZXNcIiwgXCJkaXNjb3JkX2Rlc2t0b3BfY29yZVwiLCBcImluamVjdG9yXCIpO1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGJhc2UsIFwiLi5cIiwgXCJhcHBcIik7XHJcbiAgICAgICAgY29uc3QgcmVhbExvY2F0aW9uID0gZnMuZXhpc3RzU3luYyhsb2NhdGlvbikgPyBsb2NhdGlvbiA6IGZzLmV4aXN0c1N5bmMocm9hbWluZ0xvY2F0aW9uKSA/IHJvYW1pbmdMb2NhdGlvbiA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFyZWFsTG9jYXRpb24pIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IHJlYWxMb2NhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uZmlnRmlsZSgpIHtyZXR1cm4gdGhpcy5fY29uZmlnRmlsZSB8fCAodGhpcy5fY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmluamVjdGlvblBhdGgsIFwiYmV0dGVyZGlzY29yZFwiLCBcImNvbmZpZy5qc29uXCIpKTt9XHJcbiAgICBnZXQgQkRGaWxlKCkge3JldHVybiB0aGlzLl9CREZpbGUgfHwgKHRoaXMuX0JERmlsZSA9IHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCwgXCJiZHN0b3JhZ2UuanNvblwiKSk7fVxyXG4gICAgZ2V0IHNldHRpbmdzRmlsZSgpIHtyZXR1cm4gdGhpcy5fc2V0dGluZ3NGaWxlIHx8ICh0aGlzLl9zZXR0aW5nc0ZpbGUgPSBwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGgsIFwiYmRzZXR0aW5ncy5qc29uXCIpKTt9XHJcbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XHJcblxyXG4gICAgZ2V0U2V0dGluZ0dyb3VwKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldID0gZGF0YTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCRERhdGEoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEZXZNb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGVidWdMaXN0ZW5lciA9IHRoaXMuZGVidWdMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIgPSB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIHRoaXMuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnREZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BEZWJ1Z0xpc3RlbmVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BDb3B5U2VsZWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAxMTkgfHwgZS53aGljaCA9PSAxMTgpIHsvL0Y4XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiJWNbJWNEZXZNb2RlJWNdICVjQnJlYWsvUmVzdW1lXCIsIFwiY29sb3I6IHJlZDtcIiwgXCJjb2xvcjogIzMwMzAzMDsgZm9udC13ZWlnaHQ6NzAwO1wiLCBcImNvbG9yOnJlZDtcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvcHlTZWxlY3Rvckxpc3RlbmVyKGUpIHtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5nZXRTZWxlY3RvcihlLnRhcmdldCk7XHJcbiAgICBcclxuICAgICAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgICAgIGNsYXNzTGF5ZXIsIFxyXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xyXG4gICAgICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmRpc2FibGVkUG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1lbnUpWzBdXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGFjaCgpIHtcclxuICAgICAgICAgICAgICAgIGlmKCFjbGFzc0l0ZW1zIHx8ICFjbGFzc0xheWVyLmxheWVyKXJldHVybiBjb25zb2xlLmxvZyhjbGFzc0l0ZW1zLCBjbGFzc0xheWVyLmxheWVyKVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbSA9IERPTS5xdWVyeShcIi5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLm1lbnUpKTtcclxuICAgICAgICAgICAgICAgIGlmICghY20pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00ucXVlcnkoXCIjYXBwLW1vdW50ID4gLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzTGF5ZXIubGF5ZXJDb250YWluZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NMYXllci5sYXllcn1cIj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLm1lbnV9ICR7Y2xhc3NJdGVtcy5zdHlsZUZsZXhpYmxlfSAke2NsYXNzSXRlbXMuYWNjb21tb2RhdGVTY3JvbGxiYXJ9IGJkLWNvbnRleHQtbWVudVwiIHN0eWxlPVwiXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmFwcGVuZChjbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChjbVdyYXApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSBlLmNsaWVudFkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtZW51XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIilcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuaWQgPSBcImJkLWNvcHktc2VsZWN0b3ItY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJDb3B5IFNlbGVjdG9yIEFjdGlvbnNcIilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJDbGFzc2VzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zY3JvbGxlcldyYXApWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJXcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyQ2xhc3Nlcy50aGVtZUdob3N0SGFpcmxpbmV9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlcilbMF0uc2Nyb2xsZXJ9ICR7Y2xhc3NJdGVtcy5zY3JvbGxlcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyV3JhcC5hcHBlbmQoc2Nyb2xsZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgY20uYXBwZW5kKHNjcm9sbGVyV3JhcClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ00gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbVdyYXAucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IGNtLnBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBjbS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtZyA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJncm91cFwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNtaSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW19ICR7Y2xhc3NJdGVtcy5sYWJlbENvbnRhaW5lcn0gJHtjbGFzc0l0ZW1zLmNvbG9yRGVmYXVsdH1cIiByb2xlPVwibWVudWl0ZW1cIiBpZD1cImJkLWNvcHktc2VsZWN0b3ItaXRlbS1jbVwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY21pLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5sYWJlbH1cIj5Db3B5IFNlbGVjdG9yPC9kaXY+YCkpO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5OYXRpdmVNb2R1bGUuY29weShzZWxlY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IERPTS5xdWVyeUFsbChcImRpdltyb2xlPW1lbnVpdGVtXS5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzICYmIGVsZW1lbnRzLmZvckVhY2goZWxlbSA9PiBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LmFkZChjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjbWcuYXBwZW5kKGNtaSk7XHJcbiAgICAgICAgICAgICAgICBpZihzY3JvbGxlci5jaGlsZE5vZGVzLmxlbmd0aCl7IC8vIGFwZW5kIGEgc2VwYXJhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cInNlcGFyYXRvclwiIGNsYXNzPVwiJHtjbGFzc0l0ZW1zLnNlcGFyYXRvcn1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZChzZXBhcmF0b3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoY21nKTtcclxuICAgICAgICAgICAgICAgIGlmKGNtV3JhcC5jbGllbnRIZWlnaHQgPCBjbVdyYXAuc2Nyb2xsSGVpZ2h0KXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nIFwiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IChjbVdyYXAuc3R5bGUudG9wIC0gY21nLmNsaWVudEhlaWdodCkgKyBcInB4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZ1wiK2NtV3JhcC5zdHlsZS50b3ApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGF0dGFjaCwgMSk7XHJcbiAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdG9yKGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogXHJcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZnVuY3Rpb24gZnVsbFBhdGgoZWwpe1xyXG4gICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcclxuICAgICAgICAgICAgd2hpbGUgKGVsLnBhcmVudE5vZGUpe1xyXG4gICAgICAgICAgICAgIGlmIChlbC5pZCl7XHJcbiAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KCcjJytlbC5pZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmIChlbD09ZWwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpK0FycmF5LmZyb20oZWwuY2xhc3NMaXN0LmVudHJpZXMoKSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTEsZT1lbDtlLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7ZT1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsYysrKTtcclxuICAgICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrKCh0eXBlb2YgZWwuY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsLmNsYXNzTmFtZSkgfHwgXCJcIikuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICEhZSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKStcIjpudGgtY2hpbGQoXCIrYytcIilcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbD1lbC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmFtZXMuam9pbihcIiA+IFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bGxQYXRoKGVsZW1lbnQpXHJcbiAgICAgICAgLypcclxuICAgICAgICBjb25zdCBydWxlcyA9IHRoaXMuZ2V0UnVsZXMoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0UnVsZSA9IHJ1bGVzW3J1bGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsYXRlc3RSdWxlKSByZXR1cm4gbGF0ZXN0UnVsZS5zZWxlY3RvclRleHQ7XHJcbiAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QubGVuZ3RoKSByZXR1cm4gYC4ke0FycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLmpvaW4oXCIuXCIpfWA7XHJcbiAgICAgICAgcmV0dXJuIGAuJHtBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QpLmpvaW4oXCIuXCIpfWA7Ki9cclxuICAgIH1cclxuXHJcbiAgICBnZXRSdWxlcyhlbGVtZW50LCBjc3MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMpIHtcclxuICAgICAgICAvL2lmICh3aW5kb3cuZ2V0TWF0Y2hlZENTU1J1bGVzKSByZXR1cm4gd2luZG93LmdldE1hdGNoZWRDU1NSdWxlcyhlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBzaGVldHMgPSBbLi4uY3NzXS5maWx0ZXIocyA9PiAhcy5ocmVmIHx8ICFzLmhyZWYuaW5jbHVkZXMoXCJCZXR0ZXJEaXNjb3JkQXBwXCIpKTtcclxuICAgICAgICBjb25zdCBydWxlcyA9IHNoZWV0cy5tYXAocyA9PiBbLi4uKHMuY3NzUnVsZXMgfHwgW10pXSkuZmxhdCgpO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSdWxlcyA9IHJ1bGVzLmZpbHRlcihyID0+IHIgJiYgci5zZWxlY3RvclRleHQgJiYgZWxlbWVudC5tYXRjaGVzKHIuc2VsZWN0b3JUZXh0KSAmJiByLnN0eWxlLmxlbmd0aCAmJiByLnNlbGVjdG9yVGV4dC5zcGxpdChcIiwgXCIpLmxlbmd0aCA8IDggJiYgIXIuc2VsZWN0b3JUZXh0LnNwbGl0KFwiLCBcIikuaW5jbHVkZXMoXCIqXCIpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudFJ1bGVzO1xyXG4gICAgfVxyXG59OyIsImV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXNhYmxlVHlwaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnN0YXJ0VHlwaW5nKVxyXG4gICAgICAgIC50aGVuKHR5cGluZ01vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3BUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RvcFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc2FibGVUeXBpbmcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IExpZ2h0Y29yZFVzZXJCYWRnZSBmcm9tIFwiLi4vc3ZnL0xpZ2h0Y29yZFVzZXJcIjtcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7IC8vIEdlbmVyYXRlIFVVSUQgKE5vIGNyeXB0byBybmcpXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59ICBcclxuXHJcbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxyXG5sZXQgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc3RhbnRTZXJ2ZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhY2hlKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhY2hlKGRhdGEpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jYWNoZSwgZGF0YSlcclxuICAgIH0vKlxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZSgpe1xyXG4gICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkRlbGV0aW5nIGFsbCBpbmZvcyBhYm91dCB5b3Ugb24gTGlnaHRjb3JkIFNlcnZlcnMuLi5cIiwge3R5cGU6IFwid2FyblwifSlcclxuICAgICAgICByZXR1cm4gaGFuZGxlUmVxdWVzdChSb3V0ZXMuZGVsZXRlLCBcImRlbGV0ZVwiKVxyXG4gICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZGVsZXRlIGFsbCBpbmZvcm1hdGlvbnM6ICR7KHJlcy5zdGF0dXMrXCIgXCIrcmVzLnN0YXR1c1RleHQrXCIgXCIrYXdhaXQgcmVzLnRleHQoKSl9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zLmApXHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIlN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zXCIsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pXHJcbiAgICAgICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gPSBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHtlcnIuc3RhY2t9YClcclxuICAgICAgICB9KVxyXG4gICAgfSovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgY3VzdG9tIGJhZGdlcyBmcm9tIHRoZSB1c2VyIElELlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgVGhlIHVzZXIgSUQgXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYWRnZXModXNlcil7XHJcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgaWYoYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSlyZXR1cm4gYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG5cclxuICAgICAgICBsZXQgcmVzb2x2ZVxyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiAocmVzb2x2ZSA9IHJlcykpXHJcbiAgICAgICAgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSA9IG5ld1Byb21pc2VcclxuXHJcbiAgICAgICAgY29uc3QgYmFkZ2VzID0gW11cclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIENvbnN0YW50cy5iYWRnZXMpe1xyXG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZldGNoZWRCYWRnZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSlyZXR1cm4gcmVzb2x2ZShbXSlcclxuICAgICAgICAgICAgYmFkZ2VzVG9GZXRjaC5wdXNoKFt1c2VyLCByZXNvbHZlXSlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXHJcbiAgICAgICAgICAgICAgICBpZih1c2Vycy5sZW5ndGggPT09IDApcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBiYWRnZXNUb0ZldGNoID0gW11cclxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IHNlcnZlciBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHVzZXJzLmZpbmQocHJvbWlzZSA9PiBwcm9taXNlWzBdID09PSB1c2VyLnVzZXJfaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VbMV0odXNlci5iYWRnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBpZighKGVyciBpbnN0YW5jZW9mIExpZ2h0Y29yZEVycm9yKSljb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoIUNvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBXZSBkbyBub3QgaGF2ZSB0aGUgQ29tcG9uZW50LCBza2lwIGl0LlxyXG4gICAgICAgICAgICBpZihiYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBBbHJlYWR5IGluc2VydGVkLlxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIH0sIDYwMDAwMCk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxyXG4gICAgICAgIGRlbGV0ZSBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XHJcbiAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSl7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBMaWdodGNvcmRFcnJvcihcIlRoZSBjdXJyZW50IHNldHRpbmdzIGJsb2NrZWQgdGhlIHJlcXVlc3QuXCIpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGVGZXRjaChgJHtDb25zdGFudHMuU0VSVkVSX1VSTH0vYXBpL3YxJHtyb3V0ZX1gLCB7XHJcbiAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDTElFTlRcIjogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gfHwgXCJOb25lOjpBbm9ueW1vdXNcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uKGRhdGEgPyB7XHJcbiAgICAgICAgICAgIGJvZHk6IGRhdGFcclxuICAgICAgICB9IDoge30pXHJcbiAgICB9KVxyXG59XHJcblxyXG5jbGFzcyBMaWdodGNvcmRFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTGlnaHRjb3JkRXJyb3JcIlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgU0VSVkVSX1VSTDogXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6XCIsXHJcbiAgICBiYWRnZXM6IFsgLy8gVE9ETzogXHJcbiAgICAgICAgLyp7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIFVzZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiMDFjZmE3YjAtN2NkYi00YjBlLTgyNTgtOWM2YTc4MjM1YzkzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW10sXHJcbiAgICAgICAgICAgIHNjb3BlczogW1xyXG4gICAgICAgICAgICAgICAgXCJ1c2VyXCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBMaWdodGNvcmRVc2VyQmFkZ2VcclxuICAgICAgICB9LCAqL3tcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmQgQnVnIEh1bnRlclwiLFxyXG4gICAgICAgICAgICBpZDogXCJmMDQ2OThmNS04MTZiLTQxZTMtYmQwMS05MjI5MTE5M2Q3YTVcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiLFxyXG4gICAgICAgICAgICAgICAgXCI2OTYwMDM0NTY2MTEzODUzOTZcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IEJ1Z0h1bnRlckJhZGdlLFxyXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9saWdodGNvcmQvbGlnaHRjb3JkL3dpa2kvYmFkZ2VzI2J1Z19odW50ZXJcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJCdWZmb29uXCIsXHJcbiAgICAgICAgICAgIGlkOiBcIjA2OTA0ZDMxLTY1YjQtNDFlYy1hNTBjLTg2NThiYmQxYWY5NlwiLFxyXG4gICAgICAgICAgICBkZWZhdWx0VXNlcnM6IFtcclxuICAgICAgICAgICAgICAgIFwiMzg5MDE2ODk1NTQzNzA1NjAyXCIsXHJcbiAgICAgICAgICAgICAgICBcIjY2NDYwMDEzNDUyODY2MzU2NVwiLFxyXG4gICAgICAgICAgICAgICAgXCI2MjUzNTA2NTc4Mjk4OTYyMjRcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IENpcmN1cyxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL3lvdXR1LmJlL0VKdGI2ei1kbFQ4P3Q9MTQ1XCJcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBSb3V0ZXMgPSB7XHJcbiAgICBiYWRnZXM6IGAvdXNlcnMvYmFkZ2VzYFxyXG59IiwiLyoqXHJcbiAqIENvcHlyaWdodCAyMDE4IFphY2hhcnkgUmF1ZW5cclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXHJcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLFxyXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxyXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkXHJcbiAqIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCxcclxuICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcclxuICogUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxyXG4gKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0ZcclxuICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFXHJcbiAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxyXG4gKiBcclxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQkRQbHVnaW5MaWJyYXJ5XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2VcclxuICogQG5hbWUgT2Zmc2V0XHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUb3Agb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIExlZnQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIE91dGVyIGhlaWdodCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIE91dGVyIHdpZHRoIG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICovXHJcblxyXG4gLyoqXHJcbiAqIEZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZW1vdmVzIGFkZGVkIGxpc3RlbmVyLlxyXG4gKiBAY2FsbGJhY2sgbW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyXHJcbiAqL1xyXG4gXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVRvb2xzIHtcclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcclxuICAgICAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBBZGRzIGEgc3R5bGUgdG8gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGFzIHRoZSBlbGVtZW50IGlkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNzcyAtIGNzcyB0byBhZGQgdG8gdGhlIGRvY3VtZW50XHJcblx0ICovXHJcblx0c3RhdGljIGFkZFN0eWxlKGlkLCBjc3MpIHtcclxuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKERPTVRvb2xzLmNyZWF0ZUVsZW1lbnQoYDxzdHlsZSBpZD1cIiR7aWR9XCI+JHtjc3N9PC9zdHlsZT5gKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgc3R5bGUgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVN0eWxlKGlkKSB7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzL3JlcXVpcmVzIGEgcmVtb3RlIHNjcmlwdCB0byBiZSBsb2FkZWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgdGhpcyBzY3JpcHRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gdXJsIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgc2NyaXB0XHJcblx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzY3JpcHQgaXMgbG9hZGVkXHJcblx0ICovXHJcblx0c3RhdGljIGFkZFNjcmlwdChpZCwgdXJsKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcblx0XHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcblx0XHRcdHNjcmlwdC5pZCA9IGlkO1xyXG5cdFx0XHRzY3JpcHQuc3JjID0gdXJsO1xyXG5cdFx0XHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XHJcblx0XHRcdHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xyXG5cdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgcmVtb3RlIHNjcmlwdCBmcm9tIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlU2NyaXB0KGlkKSB7XHJcbiAgICAgICAgaWQgPSB0aGlzLmVzY2FwZUlEKGlkKTtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gaHR0cHM6Ly9qYXZhc2NyaXB0LmluZm8vanMtYW5pbWF0aW9uXHJcbiAgICBzdGF0aWMgYW5pbWF0ZSh7dGltaW5nID0gXyA9PiBfLCB1cGRhdGUsIGR1cmF0aW9ufSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIFxyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBhbmltYXRlKHRpbWUpIHtcclxuICAgICAgICAgIC8vIHRpbWVGcmFjdGlvbiBnb2VzIGZyb20gMCB0byAxXHJcbiAgICAgICAgICBsZXQgdGltZUZyYWN0aW9uID0gKHRpbWUgLSBzdGFydCkgLyBkdXJhdGlvbjtcclxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPiAxKSB0aW1lRnJhY3Rpb24gPSAxO1xyXG4gICAgICBcclxuICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGVcclxuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGltaW5nKHRpbWVGcmFjdGlvbik7XHJcbiAgICAgIFxyXG4gICAgICAgICAgdXBkYXRlKHByb2dyZXNzKTsgLy8gZHJhdyBpdFxyXG4gICAgICBcclxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPCAxKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgbXkgc2hpdCB2ZXJzaW9uIG9mIG5vdCBoYXZpbmcgdG8gdXNlIGAkYCBmcm9tIGpRdWVyeS4gTWVhbmluZ1xyXG4gICAgICogdGhhdCB5b3UgY2FuIHBhc3MgYSBzZWxlY3RvciBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5fS5cclxuICAgICAqIEl0IGFsc28gbWVhbnMgdGhhdCB5b3UgY2FuIHBhc3MgYSBzdHJpbmcgb2YgaHRtbCBhbmQgaXQgd2lsbCBwZXJmb3JtIGFuZCByZXR1cm4gYHBhcnNlSFRNTGAuXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5wYXJzZUhUTUxcclxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeSBvciBIVE1MIHRvIHBhcnNlXHJcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIEVpdGhlciB0aGUgcmVzdWx0IG9mIGBwYXJzZUhUTUxgIG9yIGBxdWVyeWBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFEoc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUhUTUwoc2VsZWN0b3IpO1xyXG4gICAgICAgIGNvbnN0IGlzSFRNTCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IEFycmF5LmZyb20oZWxlbWVudCkuc29tZShuID0+IG4ubm9kZVR5cGUgPT09IDEpIDogZWxlbWVudC5ub2RlVHlwZSA9PT0gMTtcclxuICAgICAgICBpZiAoaXNIVE1MKSByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBmb3VuZCBlbGVtZW50IG9yIG51bGwgaWYgbm90IGZvdW5kXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeShzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSBiYXNlRWxlbWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbGAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxyXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gQXJyYXkgb2YgYWxsIGZvdW5kIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeUFsbChzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSBiYXNlRWxlbWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIHN0cmluZyBvZiBIVE1MIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLFxyXG4gICAgICogdGhlIHBhcnNlZCBIVE1MIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBkb2N1bWVudCBmcmFnbWVudCB7QHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnRGcmFnbWVudH0uXHJcbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgaWYgeW91IGhhdmUgYSBsaXN0IG9mIGVsZW1lbnRzIGF0IHRoZSB0b3AgbGV2ZWwsIHRoZXkgY2FuIHRoZW4gYmUgYXBwZW5kZWQgYWxsIGF0IG9uY2UgdG8gYW5vdGhlciBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIGxpc3Qgb2YgcGFyc2VkXHJcbiAgICAgKiBub2RlcyBhbmQgdGhlcmUgd2VyZSBtdWx0aXBsZSB0b3AgbGV2ZWwgbm9kZXMsIG90aGVyd2lzZSB0aGUgc2luZ2xlIG5vZGUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEhUTUwgdG8gYmUgcGFyc2VkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcmFnbWVudD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuIHNob3VsZCBiZSB0aGUgcmF3IGBEb2N1bWVudEZyYWdtZW50YFxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBUaGUgcmVzdWx0IG9mIEhUTUwgcGFyc2luZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcclxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgICBpZiAoZnJhZ21lbnQpIHJldHVybiBub2RlO1xyXG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IG5vZGUuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2Rlc1swXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWx0ZXJuYXRlIG5hbWUgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MfSAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZUVsZW1lbnQoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge3JldHVybiB0aGlzLnBhcnNlSFRNTChodG1sLCBmcmFnbWVudCk7fVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGVzY2FwZXMgaXQgdXNpbmcgdGhlIGJyb3dlcidzIG93biBlc2NhcGluZyBtZWNoYW5pc20uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbCAtIGh0bWwgdG8gYmUgZXNjYXBlZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZXNjYXBlSFRNTChodG1sKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgICAgICBjb25zdCBzcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgIHNwYW5FbGVtZW50LmFwcGVuZCh0ZXh0Tm9kZSk7XHJcbiAgICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gaHRtbDtcclxuICAgICAgICByZXR1cm4gc3BhbkVsZW1lbnQuaW5uZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3Qgb2YgY2xhc3NlcyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gYWRkXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhZGRDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIHJlbW92ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc2VzKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gb25seSBvbmUgYXJndW1lbnQgaXMgcHJlc2VudDogVG9nZ2xlIGNsYXNzIHZhbHVlO1xyXG4gICAgICogaS5lLiwgaWYgY2xhc3MgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0IGFuZCByZXR1cm4gZmFsc2UsIGlmIG5vdCwgdGhlbiBhZGQgaXQgYW5kIHJldHVybiB0cnVlLlxyXG4gICAgICogV2hlbiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50OlxyXG4gICAgICogSWYgdGhlIHNlY29uZCBhcmd1bWVudCBldmFsdWF0ZXMgdG8gdHJ1ZSwgYWRkIHNwZWNpZmllZCBjbGFzcyB2YWx1ZSwgYW5kIGlmIGl0IGV2YWx1YXRlcyB0byBmYWxzZSwgcmVtb3ZlIGl0LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHRvZ2dsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5kaWNhdG9yXSAtIE9wdGlvbmFsIGluZGljYXRvciBmb3IgaWYgdGhlIGNsYXNzIHNob3VsZCBiZSB0b2dnbGVkXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUsIGluZGljYXRvcikge1xyXG4gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBpZiAodHlwZW9mKGluZGljYXRvcikgIT09IFwidW5kZWZpbmVkXCIpIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMsIGluZGljYXRvcikpO1xyXG4gICAgICAgIGVsc2UgY2xhc3NuYW1lLmZvckVhY2goYyA9PiBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYykpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGEgc3BlY2lmaWMgY2xhc3NcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gYHRydWVgIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgY2xhc3MsIGBmYWxzZWAgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKS5ldmVyeShjID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIG9uZSBjbGFzcyB3aXRoIGFub3RoZXJcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkTmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gcmVwbGFjZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld05hbWUgLSBOZXcgbmFtZSBmb3IgdGhlIGNsYXNzXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXBsYWNlQ2xhc3MoZWxlbWVudCwgb2xkTmFtZSwgbmV3TmFtZSkge1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2Uob2xkTmFtZSwgbmV3TmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgYXBwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBhcHBlbmRlZCB0b1xyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFwcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhhdE5vZGUuYXBwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIHByZXBlbmRlZCB0byBhbm90aGVyIG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhhdE5vZGUgLSBOb2RlIGZvciBgdGhpc05vZGVgIHRvIGJlIHByZXBlbmRlZCB0b1xyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLnByZXBlbmQodGhpc05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50Lmluc2VydEFmdGVyKG90aGVyRWxlbWVudClgLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIFRoZSBub2RlIHRvIGluc2VydFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXROb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbnNlcnRBZnRlcih0aGlzTm9kZSwgdGFyZ2V0Tm9kZSkge1xyXG4gICAgICAgIHRhcmdldE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc05vZGUsIHRhcmdldE5vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50LmFmdGVyKG5ld0VsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWZ0ZXIodGhpc05vZGUsIG5ld05vZGUpIHtcclxuICAgICAgICB0aGlzTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCB0aGlzTm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0b3IgPyBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIrIFwiICsgc2VsZWN0b3IpIDogZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzdWJzZXF1ZW50IHNpYmxpbmdzLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgbmV4dCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0QWxsKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwifiAqXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc3Vic2VxdWVudCBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGZvbGxvd2luZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0VW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gW107IFxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIG5leHQucHVzaChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJldmlvdXMgc2libGluZyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIE9wdGlvbmFsIHNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHJldHVybiBwcmV2aW91cyAmJiBwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSA/IHByZXZpb3VzIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBwcmVjZWVkaW5nIHNpYmxpbmdzLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c0FsbChlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZWNlZWRpbmcgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCB3aGljaCBpbmRleCBpbiBjaGlsZHJlbiBhIGNlcnRhaW4gbm9kZSBpcy4gU2ltaWxhciB0byBqUXVlcnkncyBgJC5pbmRleCgpYFxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHRvIGZpbmQgaXRzIGluZGV4IGluIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gSW5kZXggb2YgdGhlIG5vZGVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGluZGV4SW5QYXJlbnQobm9kZSkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgbGV0IG51bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gbm9kZSkgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09IDEpIG51bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5pbmRleEluUGFyZW50fSAqL1xyXG4gICAgc3RhdGljIGluZGV4KG5vZGUpIHtyZXR1cm4gdGhpcy5pbmRleEluUGFyZW50KG5vZGUpO31cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudCBpZiBpdCBtYXRjaGVzIHRoZSBzZWxlY3RvcixcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwYXJlbnQgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBTZWxlY3RvciB0byBtYXRjaCBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgc2libGluZyBlbGVtZW50IG9yIG51bGxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdG9yIHx8IGVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSA/IGVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZENoaWxkKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGFuY2VzdG9ycyBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHBhcmVudHMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgcGFyZW50cyB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIGlmIChzZWxlY3Rvcikgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKTtcclxuICAgICAgICBlbHNlIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFuY2VzdG9ycyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGFuY2VzdG9ycyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudHNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmICFlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHNpYmxpbmdzIG9mIHRoZSBlbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiKlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBzaWJsaW5ncyB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaWJsaW5ncyhlbGVtZW50LCBzZWxlY3RvciA9IFwiKlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoZSA9PiBlICE9IGVsZW1lbnQgJiYgZS5tYXRjaGVzKHNlbGVjdG9yKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgY3NzIHN0eWxlcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHN0eWxlIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdHlsZS4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBnZXQgb3Igc2V0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFZhbHVlIHRvIHNldCBmb3IgYXR0cmlidXRlXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3NzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClbYXR0cmlidXRlXTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgd2lkdGggZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSB3aWR0aCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgd2lkdGguICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gV2lkdGggdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd2lkdGgoZWxlbWVudCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS53aWR0aCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSBoZWlnaHQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBoZWlnaHQgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIGhlaWdodC4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBIZWlnaHQgdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaGVpZ2h0KGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0KTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW5uZXIgdGV4dCBvZiBhbiBlbGVtZW50IGlmIGdpdmVuIGEgdmFsdWUsIG90aGVyd2lzZSByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIHRleHQgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGV4dF0gLSBDb250ZW50IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBFaXRoZXIgdGhlIHN0cmluZyBzZXQgYnkgdGhpcyBjYWxsIG9yIHRoZSBjdXJyZW50IHRleHQgY29udGVudCBvZiB0aGUgbm9kZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRleHQoZWxlbWVudCwgdGV4dCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGV4dCkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgd2lkdGggb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbm5lcldpZHRoKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciBoZWlnaHQgb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJIZWlnaHQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG91dGVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb3V0ZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHBhZ2UuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBvZmZzZXQgb2ZcclxuICAgICAqIEByZXR1cm4ge09mZnNldH0gLSBUaGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvZmZzZXQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbGlzdGVuZXJzKCkgeyByZXR1cm4gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb25gIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXHJcbiAgICAgKiBcclxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIHdoZW4gdGhlIHRhcmdldCBpcyBhIGAuYmxvY2tgIGVsZW1lbnQuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyBvbmNlLlxyXG4gICAgICogYGNvbnN0IGNhbmNlbCA9IERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiZmlyZWQhXCIpOyBjYW5jZWwoKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbmFsaXR5IGZvciB0aGlzIG1ldGhvZCBtYXRjaGVzIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub259IGJ1dCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmXHJcbiAgICAgKiBhbmQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgdXBvbiB0aGUgZmlyc3QgZmlyaW5nIG9mIHRoZSBkZXNpcmVkIGV2ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbmNlKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9IDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIF9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgbGV0IG1hdGNoRmlsdGVyID0gbGlzdGVuZXIgPT4gbGlzdGVuZXIuZXZlbnQgPT0gdHlwZSwgZGVmYXVsdEZpbHRlciA9IF8gPT4gXztcclxuICAgICAgICBpZiAoZWxlbWVudCkgbWF0Y2hGaWx0ZXIgPSBsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCwgZGVmYXVsdEZpbHRlciA9IGwgPT4gbC5lbGVtZW50ID09IGVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSB8fCBbXTtcclxuICAgICAgICBjb25zdCBsaXN0ID0gdHlwZSA/IGxpc3RlbmVycy5maWx0ZXIobWF0Y2hGaWx0ZXIpIDogbGlzdGVuZXJzLmZpbHRlcihkZWZhdWx0RmlsdGVyKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGxpc3QubGVuZ3RoOyBjKyspIGxpc3RbY10uY2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvZmZgIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXHJcbiAgICAgKiBcclxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVkIHdoZW4gdGhlIHRhcmdldCBpcyBhIGAuYmxvY2tgIGVsZW1lbnQuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGlja1wiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBjbGljayBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCJjbGljay5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihcIi5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KEVsZW1lbnR8c3RyaW5nKX0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmVtb3ZlIGxpc3RlbmVyIGZyb21cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRdIC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gW2RlbGVnYXRlXSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBvcmlnaW5hbCBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2ZmKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAodHlwZW9mKGVsZW1lbnQpID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHdoZW4gdGhlIG5vZGUgaXMgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCBib2R5LlxyXG4gICAgICogVGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB1cG9uIGZpcmluZy5cclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBub2RlIHRvIHdhaXQgZm9yXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBjYWxsYmFjayAtIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBldmVudFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbk1vdW50IC0gZGV0ZXJtaW5lcyBpZiBpdCBzaG91bGQgZmlyZSBvbiBNb3VudCBvciBvbiBVbm1vdW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBvbk1vdW50ID0gdHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci51bnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlci5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrLCBtdXRhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShvbk1vdW50ID8gbXV0YXRpb24uYWRkZWROb2RlcyA6IG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGB0cnVlYCAqL1xyXG4gICAgc3RhdGljIG9uTW91bnQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGBmYWxzZWAgKi9cclxuICAgIHN0YXRpYyBvblVubW91bnQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgZmFsc2UpOyB9XHJcblxyXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnR9ICovXHJcbiAgICBzdGF0aWMgb25BZGRlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50KG5vZGUsIGNhbGxiYWNrKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vblVubW91bnR9ICovXHJcbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uVW5tb3VudChub2RlLCBjYWxsYmFjaywgZmFsc2UpOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggY29tYmluZXMgbXVsdGlwbGUgZWxlbWVudHMgaW50byBvbmUgcGFyZW50IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIGFycmF5IG9mIGVsZW1lbnRzIHRvIHB1dCBpbnRvIGEgc2luZ2xlIHBhcmVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd3JhcChlbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGRvbVdyYXBwZXIgPSB0aGlzLnBhcnNlSFRNTChgPGRpdiBjbGFzcz1cImRvbS13cmFwcGVyXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgZG9tV3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50c1tlXSk7XHJcbiAgICAgICAgcmV0dXJuIGRvbVdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNvbHZlcyB0aGUgbm9kZSB0byBhbiBIVE1MRWxlbWVudC4gVGhpcyBpcyBtYWlubHkgdXNlZCBieSBsaWJyYXJ5IG1vZHVsZXMuXHJcbiAgICAgKiBAcGFyYW0geyhqUXVlcnl8RWxlbWVudCl9IG5vZGUgLSBub2RlIHRvIHJlc29sdmVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlc29sdmVFbGVtZW50KG5vZGUpIHtcclxuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgfVxyXG59XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRE9NID0gRE9NVG9vbHMiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNvbnN0IENvbnN0YW50cyA9IHtcclxuICAgIEVtb2ppUmVnZXg6IC88YT9cXC4oXFx3KylcXC4oXFxkKyk+L2dcclxufVxyXG5cclxubGV0IEN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbmxldCBFbW9qaU1vZHVsZUFwaSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZClbMF1cclxubGV0IEF1dG9jb21wbGV0ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVswXVxyXG5sZXQgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVswXVxyXG5sZXQgRW1vamlNb2R1bGVRdWVyeSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKVswXVxyXG5sZXQgTWVzc2FnZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpWzBdXHJcbmxldCBndWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMgJiYgIWUuZGVmYXVsdC5pc0ZldGNoaW5nKVswXVxyXG5sZXQgZW1vamlTZWFyY2ggPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0KVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEVtb2ppTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5pbml0KCkuY2F0Y2goZXJyID0+IFV0aWxzLmVycihcIkVtb2ppTW9kdWxlXCIsIFwiQW4gZXJyb3Igb2NjdXJlZFwiLCBlcnIpKSAvLyBiZXR0ZXIgbG9nZ2luZ1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICAvKiogRW1vamkgQXV0b0NvbXBsZXRlICovXHJcbiAgICAgICAgaWYoIUF1dG9jb21wbGV0ZU1vZHVsZSlBdXRvY29tcGxldGVNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXHJcbiAgICAgICAgaWYoIUVtb2ppTW9kdWxlUXVlcnkpRW1vamlNb2R1bGVRdWVyeSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylcclxuICAgICAgICBpZighTWVzc2FnZXMpTWVzc2FnZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVxyXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcclxuICAgICAgICBpZighZW1vamlTZWFyY2gpZW1vamlTZWFyY2ggPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbiAgICAgICAgaWYoQXV0b2NvbXBsZXRlTW9kdWxlICYmIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzICYmIEVtb2ppTW9kdWxlUXVlcnkgJiYgTWVzc2FnZXMgJiYgZ3VpbGRNb2R1bGUgJiYgZW1vamlTZWFyY2gpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGF0Y2hpbmcgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyBvZiBBdXRvQ29tcGxldGlvblRlbXBsYXRlc2AsIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKVxyXG4gICAgICAgICAgICBjb25zdCBnZXRBdXRvY29tcGxldGVPcHRpb25zID0gQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9uc1xyXG4gICAgICAgICAgICBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zID0gZnVuY3Rpb24oZSwgdCwgbiwgciwgYSl7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5MSUdIVENPUkRfRU1PSklTID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMoYXJnMSwgYXJnMil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBhcmcyLmxlbmd0aCA+IDEgJiYgXCIuXCIgPT09IGFyZzFcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW1vamlVc2FibGUoY29uZGl0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdHModCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gRW1vamlNb2R1bGVRdWVyeS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKHQsIGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHRzKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChlLCB0LCBhLmVtb2ppcywgbiwgciwgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORywgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSSwgQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuRW1vamksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5pZCB8fCBlLnVuaXF1ZU5hbWUgfHwgZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsOiBcIi5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlsZDogbnVsbCAhPSBlLmd1aWxkSWQgPyBndWlsZE1vZHVsZS5kZWZhdWx0LmdldEd1aWxkKGUuZ3VpbGRJZCkgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgZSArIFwiLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhaW5UZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFJhd1RleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3Qgc3RhcnQgYXV0b2NvbXBsZXRpb24gb2YgTGlnaHRjb3JkJ3MgZW1vamlzLlwiKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBFbW9qaSBkaXNwbGF5ICovXHJcbiAgICAgICAgd2hpbGUgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb2ppUmVuZGVyKXsgLy8gVE9ETzogUHJvcGVyIGVtb2ppIGZvcm1hdHRpbmcgLyByZW5kZXJpbmdcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2VcIilcclxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlKXJldHVyblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50XCIpXHJcbiAgICAgICAgICAgICAgICBpZighY29udGVudCB8fCAhY29udGVudC5sZW5ndGgpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge3tcclxuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgaWQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgICogfVtdfVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihub2RlKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJzZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IEVtb2ppTW9kdWxlQXBpLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKHBhcnNlZFsyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVtb2ppKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW1vamkubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBwYXJzZWRbMF0uc3RhcnRzV2l0aChcIjxhXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWRbMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihoYXNQYXJzZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmQpcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzLmZpbmQoZSA9PiBlLnJhdyA9PSB3b3JkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighQ3VzdG9tRW1vamlNb2R1bGUpQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUVtb2ppTW9kdWxlLkN1c3RvbUVtb2ppLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYC4ke2Vtb2ppLm5hbWV9LmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppSWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bWJvYWJsZTogYXJyLmxlbmd0aCA9PT0gMSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZXZpb3VzLmxlbmd0aCA9PT0gMClyZXR1cm4gW2N1cnJlbnRdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gKz0gYCAke2N1cnJlbnR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIitjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIiwgY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKC4uLndvcmRzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShuZXdDb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQucHVzaChuZXdDb250ZW50LnNoaWZ0KCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICB9LypcclxuICAgICAgICBsZXQgdXNlck1vZHVsZVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJFbW9qaVBpY2tlckxpc3RSb3dcIilcclxuICAgICAgICAudGhlbihFbW9qaVBpY2tlckxpc3RSb3cgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2xhc3NzID0gRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHRcclxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQgPSBjbGFzcyBFbW9qaVBpY2tlckxpc3RSb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSlyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIHRoaXMucHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlEZXNjcmlwdG9yczogdGhpcy5wcm9wcy5lbW9qaURlc2NyaXB0b3JzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaXNEaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IFwiRW1vamlQaWNrZXJMaXN0Um93XCJcclxuICAgICAgICB9KSovXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIoKTtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBEKGUsIHQsIG4sIHIsIG8sIGksIHMsIHUsIGwsIGMpIHtcclxuICAgIGlmIChudWxsID09IG4gfHwgMCA9PT0gbi5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgdmFyIGQgPSBuLm1hcCgoZnVuY3Rpb24oZSwgbikge1xyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHUsIE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBvbkNsaWNrOiBvLFxyXG4gICAgICAgICAgICBvbkhvdmVyOiByLFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogdCA9PT0gbixcclxuICAgICAgICAgICAgaW5kZXg6IG5cclxuICAgICAgICB9LCBsKGUsIG4pKSlcclxuICAgIH0pKTtcclxuICAgIHJldHVybiBbUihpLCBzLCBlLCBjKSwgZF1cclxufVxyXG5cclxuZnVuY3Rpb24gUihlLCB0LCBuLCByKSB7XHJcbiAgICB2YXIgYSA9IChuLmxlbmd0aCA+IDAgPyBlLmZvcm1hdCh7XHJcbiAgICAgICAgcHJlZml4OiByKG4pXHJcbiAgICB9KSA6IHQpXHJcbiAgICBpZihBcnJheS5pc0FycmF5KGEpKXtcclxuICAgICAgICBhLnVuc2hpZnQoUmVhY3QuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCB7fSwgXCJbTGlnaHRjb3JkXSBcIikpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBhID0gXCJbTElHSFRDT1JEXSBcIithXHJcbiAgICB9XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChBdXRvY29tcGxldGVNb2R1bGUuZGVmYXVsdC5UaXRsZSwge1xyXG4gICAgICAgIHRpdGxlOiBhXHJcbiAgICB9LCBhKVxyXG59XHJcblIuZGlzcGxheU5hbWUgPSBcInJlbmRlckhlYWRlclwiO1xyXG5cclxubGV0IEVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxyXG5sZXQgaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUgJiYgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxubGV0IGlzVXNhYmxlID0gZmFsc2VcclxubGV0IGhhc1BhdGNoZWQgPSBmYWxzZVxyXG5cclxuZnVuY3Rpb24gc2V0RW1vamlVc2FibGUodXNhYmxlKXtcclxuICAgIGlzVXNhYmxlID0gdXNhYmxlXHJcbiAgICBpZihoYXNQYXRjaGVkKXJldHVyblxyXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKUVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxyXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKXJldHVyblxyXG4gICAgaWYoIWlzRW1vamlEaXNhYmxlZClpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5cclxuICAgIGhhc1BhdGNoZWQgPSB0cnVlXHJcbiAgICBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZCA9IGZ1bmN0aW9uKGVtb2ppKXtcclxuICAgICAgICBpZihpc1VzYWJsZSl7XHJcbiAgICAgICAgICAgIGlmKGVtb2ppLnN1cnJvZ2F0ZXMgfHwgZW1vamkuZGl2ZXJzaXR5KXJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNFbW9qaURpc2FibGVkLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCAqIGFzIGVsZWN0cm9uIGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIlxyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCJcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIlxyXG5pbXBvcnQgY29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxyXG5pbXBvcnQgeyBhZGRvbkNhY2hlIH0gZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxyXG5cclxuY29uc3QgY2FjaGUgPSB7fVxyXG5jb25zdCBjYWNoZTIgPSB7fVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFBsdWdpbkNlcnRpZmllciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5DZXJ0aWZpZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2goYXR0YWNobWVudCwgaWQpe1xyXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlzVHJ1c3RlZChoYXNoKXtcclxuICAgICAgICByZXR1cm4gY2FjaGVbaGFzaF0gJiYgIWNhY2hlW2hhc2hdLnN1c3BlY3RcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKXtcclxuICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgbGV0IGlzSGFybWZ1bCA9IGZhbHNlXHJcbiAgICBmb3IobGV0IGtleXdvcmQgb2YgZGF0YS5zcGxpdCgvW15cXHdcXGRdKy9nKSl7XHJcbiAgICAgICAgZm9yKGxldCBvb2Ygb2YgW1xyXG4gICAgICAgICAgICBcInRva2VuXCIsXHJcbiAgICAgICAgICAgIFwiZW1haWxcIixcclxuICAgICAgICAgICAgXCJwaG9uZVwiLFxyXG4gICAgICAgICAgICBcIk1GQVwiLFxyXG4gICAgICAgICAgICBcIjJmYVwiLFxyXG4gICAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJldmFsXCIsXHJcbiAgICAgICAgICAgIFwiZ2V0R2xvYmFsXCIsXHJcbiAgICAgICAgICAgIFwiQnJvd3NlcldpbmRvd1wiXHJcbiAgICAgICAgXSl7XHJcbiAgICAgICAgICAgIGlmKGtleXdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhvb2YudG9Mb3dlckNhc2UoKSkgJiYgIWtleXdvcmQudG9Mb3dlckNhc2UoKSA9PT0gXCJkb210b2tlbmxpc3RcIil7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvb2YsIGtleXdvcmQpXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSBcInRva2VuIHN0ZWFsZXIvdmlydXNcIlxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBub19jb21tZW50cyA9IGRhdGEucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3woW15cXFxcOl18XilcXC9cXC8uKiQvZ20sIFwiXCIpLnRyaW0oKS8vIHJlbW92aW5nIHRoZSBNRVRBIGNvbW1lbnQgZnJvbSBwbHVnaW5zXHJcbiAgICAgICAgaWYoKC92YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2kpLnRlc3Qobm9fY29tbWVudHMpKXtcclxuICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJvYmZ1c2NhdGlvbi9oaWRkZW4gY29kZVwiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighaXNIYXJtZnVsKXtcclxuICAgICAgICAgICAgY29uc3QgcmVnZXhwcyA9IFtcclxuICAgICAgICAgICAgICAgIC8qKiBoZXhhZGVjaW1hbCAqL1xyXG4gICAgICAgICAgICAgICAgL18weFxcd3s0fVxcKCcweFtcXGRhYmNkZWZdKydcXCkvZyxcclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gXzB4OGRiNygnMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICAgICAgLyoqIG1hbmdsZWQgKi9cclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1xcKS9nLCAvLyBiKCcweDAnKVxyXG4gICAgICAgICAgICAgICAgL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnWywgXSsnW14nXXs0fSdcXCkvZywgLy8gYignMHgwJywgJ3gxXWYnKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIGZvcihsZXQgcmVnZXggb2YgcmVnZXhwcyl7XHJcbiAgICAgICAgICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgICAgICAgICAgICAgIGlmKHJlZ2V4LnRlc3Qobm9fY29tbWVudHMpKWlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKGhhc2gpXHJcbiAgICBjYWNoZVtoYXNoXSA9IHtcclxuICAgICAgICBzdXNwZWN0OiB0cnVlLFxyXG4gICAgICAgIG5hbWU6IGhhc2hUb1VybFtoYXNoXS5zcGxpdChcIi9cIikucG9wKCksXHJcbiAgICAgICAgdHlwZTogaGFzaFRvVXJsW2hhc2hdLmVuZHNXaXRoKFwiLmpzXCIpID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIixcclxuICAgICAgICBoYXJtOiBpc0hhcm1mdWwsXHJcbiAgICAgICAgaGFzaDogaGFzaCxcclxuICAgICAgICBmaWxlbmFtZVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXHJcblxyXG4gICAgcmVzdWx0Q2FsbGJhY2soY2FjaGVbaGFzaF0pXHJcbn1cclxuXHJcbmNvbnN0IGhhc2hUb1VybCA9IHt9XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tIYXNoKGhhc2gsIGRhdGEsIGZpbGVuYW1lLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spe1xyXG4gICAgY29uc29sZS5sb2coYEZpbGU6ICR7ZmlsZW5hbWV9IGhhc2g6ICR7aGFzaH1gKVxyXG4gICAgaWYoIWNhY2hlW2hhc2hdKXtcclxuICAgICAgICBub2RlRmV0Y2goXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvTGlnaHRjb3JkL2ZpbGVoYXNoZXNAbWFzdGVyL2hhc2hlcy9cIitoYXNoLCB7IC8vIFVzaW5nIG5vZGUtZmV0Y2ggdG8gYnlwYXNzIGNvcnNcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnQgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xyXG4gICAgICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgICAgICAgICAgICAgY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIHJlc3VsdC5oYXNoID0gaGFzaFxyXG4gICAgICAgICAgICByZXN1bHQuZmlsZW5hbWUgPSBmaWxlbmFtZVxyXG5cclxuICAgICAgICAgICAgY2FjaGVbaGFzaF0gPSByZXN1bHRcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHJlc3VsdClcclxuICAgICAgICB9KS5jYXRjaChjb25zb2xlLmVycm9yKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF1cclxuXHJcbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoX19wYXRoLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2sgPSAoaGFzaCkgPT4ge30sIGlzRnJvbUxvYWRlciA9IGZhbHNlKXsgICAgXHJcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXHJcblxyXG4gICAgY3JlYXRlUmVhZFN0cmVhbShfX3BhdGgpLm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcclxuICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgIH0pLm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gX19wYXRoXHJcblxyXG4gICAgICAgIGlmKGlzRnJvbUxvYWRlciAmJiBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdKXtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICAgICAgY29udGVudE1hbmFnZXIuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHZhbHVlLnJlc3VsdClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKXtcclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpcmV0dXJuXHJcbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICBpZighYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuXHJcbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxyXG4gICAgICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBhdHRhY2htZW50LnVybFxyXG5cclxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSlcclxuICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcclxuICAgICAgICAgICAgICAgIGlmKGVsZW0pZWxlbS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KS5jYXRjaCgoKT0+e30pXHJcbn1cclxuXHJcbmxldCBmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxubGV0IGNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXHJcbiAqIEBwYXJhbSB7e3R5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIG9mZmljaWFsPzogYm9vbGVhbn18e3N1c3BlY3Q6dHJ1ZSwgdHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgaGFybTogc3RyaW5nfX0gcmVzdWx0XHJcbiAqL1xyXG5mdW5jdGlvbiByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGZpbGVuYW1lKXtcclxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVybiAvLyBhbHJlYWR5IGNlcnRpZmllZC9kaXYgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cclxuXHJcbiAgICBpZighZmxvd2VyU3Rhck1vZHVsZSlmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxuICAgIGlmKCFjaGlsZE1vZHVsZSljaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXVxyXG4gICAgXHJcbiAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBcclxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09IFwiQVwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgKipcIitmaWxlbmFtZStcIioqIG1pZ2h0IGJlIGRhbmdlcm91cyAqKihcIityZXN1bHQuaGFybStcIikqKi4gXFxuXFxuKipXZSBkb24ndCByZWNvbW1hbmQgdG8gZG93bmxvYWQgaXQqKi4gSG93ZXZlciwgeW91IGNhbiBzdGlsbCBkbyBpdCBiZWxvdy5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBBbnl3YXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJEb24ndCAhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXh0Tm9kZShkaXYucGFyZW50Tm9kZSlcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLlwifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuc3ZnKVswXS5zdmcsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgNDAgMzJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC0zMilcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDpcIiNmMDQ3NDdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOkJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLnBvaW50ZXJFdmVudHNcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwiLCBmbG9hdDogXCJsZWZ0XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBhbmQgbGF1bmNoIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIi4gWW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8uXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGZXRjaChsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0dXMgd2FzIG5vdCAyMDBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCByZXMuYnVmZmVyKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbnN0YWxsUGF0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhpbnN0YWxsUGF0aCwgY29udGVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMjQgMjRcIixzdHlsZTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiZmlsbFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdKVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNwYW4sIGRpdilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcclxuICAgICAgICBsZXQgc3BhbiA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZGlzcGxheTogXCJpbmhlcml0XCJ9fSwgW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiB3YXMgbWFkZSBieSB0aGUgZGV2ZWxvcGVycyBvZiBMaWdodGNvcmQuXCIsIHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwiLHN0cm9rZTpcIiMzNjM5M2ZcIixzdHlsZTp7Y29sb3I6XCIjNDA4N2VkXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcImN1cnJlbnRDb2xvclwiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgbXVzdCBlbmFibGUgaXQgaW4gdGhlIHNldHRpbmdzLlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgYW5kIEluc3RhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGdldEtleWVkQXJyYXkoY2FjaGUyKS5maW5kKGUgPT4gZVsxXSA9PT0gcmVzdWx0Lmhhc2gpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRLZXllZEFycmF5KG9iail7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaywgb2JqW2tdXSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gYXJyXHJcbn1cclxuXHJcbmxldCBrZXkgPSBudWxsXHJcbmxldCBzYXZlID0gbnVsbFxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQobT0+bS5PYmplY3RTdG9yYWdlKVxyXG4udGhlbihsb2NhbFN0b3JhZ2VNb2R1bGUgPT4ge1xyXG4gICAgbGV0IGxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZU1vZHVsZS5pbXBsXHJcbiAgICBzYXZlID0gZnVuY3Rpb24oKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIsIGJ0b2EoSlNPTi5zdHJpbmdpZnkoa2V5KSkpXHJcbiAgICB9XHJcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9LCAxMDAwMDApO1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCB2YWwgPSBzYWZlSlNPTlBhcnNlKGF0b2IobG9jYWxTdG9yYWdlLmdldChcIlBsdWdpbkNlcnRpZmllcktleUVuY3J5cHRpb25fX1wiKSkpXHJcbiAgICAgICAgaWYodmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoICE9PSAyIHx8IHZhbC5maW5kKGUgPT4gdHlwZW9mIGUgIT09IFwic3RyaW5nXCIpIHx8IEJ1ZmZlci5mcm9tKHZhbFswXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAxNiB8fCBCdWZmZXIuZnJvbSh2YWxbMV0sIFwiYmFzZTY0XCIpLmxlbmd0aCAhPT0gMzIpe1xyXG4gICAgICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgICAgIHNhdmUoKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAga2V5ID0gdmFsXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgZ2VuZXJhdGVLZXkoKVxyXG4gICAgICAgIHNhdmUoKVxyXG4gICAgfVxyXG59KVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVLZXkoKXtcclxuICAgIGtleSA9IFtjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLCBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXVxyXG59XHJcblxyXG5mdW5jdGlvbiBzYWZlSlNPTlBhcnNlKGpzb24pe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IG5ldyBFcnJvcihlKSA6IGVcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGEpe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KFwiYWVzLTI1Ni1jYmNcIiwgQnVmZmVyLmZyb20oa2V5WzFdLCBcImJhc2U2NFwiKSwgQnVmZmVyLmZyb20oa2V5WzBdLCBcImJhc2U2NFwiKSlcclxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwiYmFzZTY0XCIpKTtcclxuICAgICAgICBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgfWNhdGNoKGUpe1xyXG4gICAgICAgIHJldHVybiBcInt9XCJcclxuICAgIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICBsZXQgYXJncyA9IFtCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpXVxyXG4gICAgXHJcbiAgICBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIC4uLmFyZ3MpO1xyXG4gICAgbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJ1dGY4XCIpKTtcclxuICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRlZCwgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoXCJiYXNlNjRcIilcclxufSIsImltcG9ydCB7YmRwbHVnaW5FcnJvcnMsIHBsdWdpbkNvb2tpZSwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jbGFzcyBQbHVnaW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luTW9kdWxlID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlcjt9XHJcbn1cclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbnMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmxvYWRQbHVnaW5EYXRhKCk7XHJcbiAgICBiZHBsdWdpbkVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRQbHVnaW5zKCkpKTtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBsdWdpbiwgbmFtZTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgIGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBsb2FkZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJsb2FkKCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW25hbWVdKSBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHBsdWdpbkNvb2tpZVtuYW1lXSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcInN0YXJ0KCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcblxyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5vbihcImRpZC1uYXZpZ2F0ZS1pbi1wYWdlXCIsIHRoaXMuY2hhbm5lbFN3aXRjaC5iaW5kKHRoaXMpKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdGFydFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdGFydGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIHBsdWdpbiArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdG9wUGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RvcCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0b3BwZWQuYCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RvcHBlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpICsgXCIgY291bGQgbm90IGJlIHN0b3BwZWQuXCIsIGVycik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcclxuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XHJcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikge1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luKTtcclxuICAgIGVsc2UgdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IChjb25zb2xlLmxvZyhwLmZpbGVuYW1lLCBmaWxlbmFtZSkpIHx8IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpLnBsdWdpbjtcclxuICAgIHRyeSB7IGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTt9XHJcbiAgICBjYXRjaCAoZXJyKSB7aWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycl19KTt9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLWxvYWRlZFwiLCBwbHVnaW4uZ2V0TmFtZSgpKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudW5sb2FkUGx1Z2luID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xyXG4gICAgZGVsZXRlIGJkcGx1Z2luc1twbHVnaW5dO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXVubG9hZGVkXCIsIHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkUGx1Z2luKGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybiB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcclxuICAgIGNvbnN0IGVuYWJsZWQgPSBwbHVnaW5Db29raWVbcGx1Z2luXTtcclxuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBpZiAoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQgJiYgdHlwZW9mKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKCk7XHJcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXJlbG9hZGVkXCIsIHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFBsdWdpbihuYW1lKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmdWxsUGF0aCk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZVBsdWdpbkxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkUGx1Z2luKG5hbWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbkNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIsIHBsdWdpbkNvb2tpZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLm5ld01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vbk1lc3NhZ2UoKTsgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvbk1lc3NhZ2UgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5jaGFubmVsU3dpdGNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vblN3aXRjaCgpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uU3dpdGNoIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmF3T2JzZXJ2ZXIgPSBmdW5jdGlvbihlKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9ic2VydmVyKGUpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9ic2VydmVyIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBQbHVnaW5Nb2R1bGUoKTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgVjJDX1B1YmxpY1NlcnZlcnMgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgTGF5ZXIgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjJfUHVibGljU2VydmVycyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwiLCBpZDogXCJwdWJzbGF5ZXJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHVibGljU2VydmVycywge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCJ9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInB1YnNsYXllcnJvb3RcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXJzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpWzBdLmxheWVycy5zcGxpdChcIiBcIilbMF1cclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gRE9NLnF1ZXJ5KFwiLmxheWVycywgLlwiK2NsYXNzTmFtZUxheWVycyk7XHJcbiAgICAgICAgaWYgKCFsYXllcnMpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBsYXllcnMuYXBwZW5kKERPTS5jcmVhdGVFbGVtZW50KFwiPGRpdiBpZD0ncHVic2xheWVycm9vdCc+XCIpKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IC5sYXllcnNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBidXR0b24oKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItbGlcIiBjbGFzcz1cIiR7QkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW19XCI+YCk7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBidG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xyXG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7dGhpcy5yZW5kZXIoKTt9KTtcclxuICAgICAgICBidG4uYXBwZW5kKGxhYmVsKTtcclxuICAgICAgICByZXR1cm4gYnRuO1xyXG4gICAgfVxyXG5cclxuICAgIF9hcHBlbmRCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kb3dubG9hZFByb2dyZXNzICYmIGUudHV0b3JpYWxDb250YWluZXIpWzBdLnR1dG9yaWFsQ29udGFpbmVyKVxyXG4gICAgICAgIF1cclxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IERPTS5xdWVyeShgZGl2LiR7Y2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXJ9ID4gZGl2YCk7XHJcbiAgICAgICAgRE9NLmFmdGVyKGd1aWxkcywgdGhpcy5idXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEJ1dHRvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0ID0gd2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJOYXZpZ2FibGVHdWlsZHNcIik7XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0T2xkID0gd2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZExpc3QgPyBHdWlsZExpc3QgOiBHdWlsZExpc3RPbGQucHJvdG90eXBlLCBHdWlsZExpc3QgPyBcImRlZmF1bHRcIiA6IFwicmVuZGVyXCIsIHthZnRlcjogdGhpcy5fYXBwZW5kQnV0dG9ufSk7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmd1aWxkUGF0Y2g7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKS5yZW1vdmUoKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge3NldHRpbmdzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIGZyb20gXCIuL3NldHRpbmdzUGFuZWxTaWRlYmFyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IGNvbG9yZWRUZXh0IGZyb20gXCIuL2NvbG9yZWRUZXh0XCI7XHJcbmltcG9ydCB0ZkhvdXIgZnJvbSBcIi4vMjRob3VyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBwdWJsaWNTZXJ2ZXJzTW9kdWxlIGZyb20gXCIuL3B1YmxpY1NlcnZlcnNcIjtcclxuaW1wb3J0IHZvaWNlTW9kZSBmcm9tIFwiLi92b2ljZU1vZGVcIjtcclxuaW1wb3J0IENsYXNzTm9ybWFsaXplciBmcm9tIFwiLi9jbGFzc05vcm1hbGl6ZXJcIjtcclxuaW1wb3J0IGRNb2RlIGZyb20gXCIuL2Rldk1vZGVcIjtcclxuXHJcbmltcG9ydCBTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIGZyb20gXCIuLi91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBDc3NFZGl0b3IgZnJvbSBcIi4uL3VpL2Nzc0VkaXRvclwiO1xyXG5pbXBvcnQgQ2FyZExpc3QgZnJvbSBcIi4uL3VpL2FkZG9ubGlzdFwiO1xyXG5pbXBvcnQgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZnJvbSBcIi4uL3VpL3ByZXNlbmNlU2V0dGluZ3NcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi9DdXN0b21SaWNoUHJlc2VuY2VcIjtcclxuaW1wb3J0IFYyQ19BY2NvdW50SW5mb3MgZnJvbSBcIi4uL3VpL0FjY291bnRJbmZvc1wiO1xyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcclxuaW1wb3J0IEFudGlBZERNIGZyb20gXCIuL0FudGlBZERNXCI7XHJcbmltcG9ydCBibHVyUHJpdmF0ZSBmcm9tIFwiLi9ibHVyUHJpdmF0ZVwiO1xyXG5pbXBvcnQgZGlzYWJsZVR5cGluZyBmcm9tIFwiLi9kaXNhYmxlVHlwaW5nXCI7XHJcbmltcG9ydCBBcGlQcmV2aWV3IGZyb20gXCIuLi91aS9BcGlQcmV2aWV3XCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4uL3VpL3N3aXRjaFwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuLi91aS9tYXJnaW50b3BcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL3VpL2ljb25zL2hpc3RvcnlcIjtcclxuXHJcbmNsYXNzIEJEU2lkZWJhckhlYWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNpZGViYXJDb21wb25lbnRzID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuU2VwYXJhdG9yICYmIGUuSGVhZGVyICYmIGUuSXRlbSlcclxuXHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nQnV0dG9uID0gUmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZmxvYXQ6IFwicmlnaHRcIiwgY3Vyc29yOiBcInBvaW50ZXJcIn0sIGNsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcclxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlbmRlcmVkID0gbmV3IHNpZGViYXJDb21wb25lbnRzLkhlYWRlcih7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBcIkJhbmRhZ2VkIEJEXCIsIGNoYW5nZWxvZ0J1dHRvbiksXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1NldHRpbmdzUGFuZWwge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyA9IHRoaXMudXBkYXRlU2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNpZGViYXIgPSBuZXcgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnRzKClcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlckNvbXBvbmVudHMoKXtcclxuICAgICAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGlnaHRjb3JkXCIsIG1ha2VDb21wb25lbnQodGhpcy5saWdodGNvcmRDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwic3RhdHVzXCIsIG1ha2VDb21wb25lbnQodGhpcy5QcmVzZW5jZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJhY2NvdW50aW5mb1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQWNjb3VudEluZm9zQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImxjYXBpcHJldmlld1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQXBpUHJldmlld0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuXHJcbiAgICAgICAgLyogQmFuZGFnZWQgQkQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJCRENoYW5nZWxvZ1RpdGxlXCIsIG1ha2VDb21wb25lbnQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEJEU2lkZWJhckhlYWRlcigpLnJlbmRlcigpXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiY29yZVwiLCBtYWtlQ29tcG9uZW50KHRoaXMuY29yZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjdXN0b21jc3NcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmN1c3RvbUNzc0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJwbHVnaW5zXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJwbHVnaW5zXCIpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJ0aGVtZXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInRoZW1lc1wiKSkpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtc2V0dGluZ3NwYW5lLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVMYXllcixcclxuICAgICAgICAgICAgY2xhc3NTaWRlYmFyXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLnNwbGl0KFwiIFwiKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc3RhbmRhcmRTaWRlYmFyVmlldylbMF1cclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3Qgc2lkZWJhciA9IERPTS5xdWVyeShcIi5cIitjbGFzc05hbWVMYXllcitcIiAuXCIrY2xhc3NTaWRlYmFyLnN0YW5kYXJkU2lkZWJhclZpZXcuc3BsaXQoXCIgXCIpWzBdK1wiLCAuXCIrY2xhc3NOYW1lTGF5ZXIrXCIgLnVpLXN0YW5kYXJkLXNpZGViYXItdmlld1wiKTtcclxuICAgICAgICBpZiAoIXNpZGViYXIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCByb290ID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1zZXR0aW5nc3BhbmUtY29udGFpbmVyXCIgY2xhc3M9XCIke2NsYXNzU2lkZWJhci5jb250ZW50UmVnaW9ufSBjb250ZW50LXJlZ2lvblwiPmApO1xyXG4gICAgICAgIHNpZGViYXIuYXBwZW5kKHJvb3QpO1xyXG5cclxuICAgICAgICBVdGlscy5vblJlbW92ZWQocm9vdCwgKCkgPT4ge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUocm9vdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvcmVTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJjb3JlXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlnaHRjb3JkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwibGlnaHRjb3JkXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgUHJlc2VuY2VTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhcInN0YXR1c1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBNc2dMb2dTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhcIm1zZ2xvZ1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNldHRpbmdzKGNhdGVnb3J5KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdGVnb3J5ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge31cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoaWQsIGNoZWNrZWQsIHNpZGViYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVNldHRpbmdzKGlkLCBlbmFibGVkLCBzaWRlYmFyKSB7XHJcbiAgICAgICAgaWYoIVtcImxpZ2h0Y29yZC04XCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKmlmIChpZCA9PT0gXCJyZWFjdERldlRvb2xzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSByZWFjdERldlRvb2xzLnN0b3AoKTtcclxuICAgICAgICB9Ki9cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXHJcbiAgICAgICAgICAgIHNpZGViYXIuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxyXG4gICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NTdG9yZSAmJiAhc2V0dGluZ3NTdG9yZS5kZWZhdWx0LnNob3dDdXJyZW50R2FtZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgQ3VzdG9tUmljaFByZXNlbmNlLmRpc2FibGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVR5cGluZy5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLThcIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJpc1RhYnNcIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgLy9pZiAoc2V0dGluZ3NDb29raWUucmVhY3REZXZUb29scykgcmVhY3REZXZUb29scy5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0yXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0zXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTRcIl0pIHZvaWNlTW9kZS5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy01XCJdKSBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgdGZIb3VyLmluamVjdDI0SG91cigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdKSBjb2xvcmVkVGV4dC5pbmplY3RDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNFwiXSkgQ2xhc3NOb3JtYWxpemVyLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTFcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMlwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLXByZXNlbmNlLTFcIl0pIEN1c3RvbVJpY2hQcmVzZW5jZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0zXCJdKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTRcIl0pIEFudGlBZERNLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTZcIl0pIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTdcIl0pIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSB7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVTZXR0aW5ncygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIiwgc2V0dGluZ3NDb29raWUpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRTZXR0aW5ncygpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNpZGViYXIoc2lkZWJhcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXIucmVuZGVyKHNpZGViYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcmVDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXHJcbiAgICB9XHJcblxyXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIpIHtcclxuICAgICAgICBsZXQgYXBwU2V0dGluZ3MgPSByZW1vdGUuZ2V0R2xvYmFsKFwiYXBwU2V0dGluZ3NcIilcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB0aGlzLmxpZ2h0Y29yZFNldHRpbmdzLm1hcCgoc2VjdGlvbiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICAoaSA9PT0gMCA/IG51bGwgOiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wKSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LCBzZWN0aW9uLnRpdGxlKSxcclxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLnNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tlZCA9IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibGlnaHRjb3JkLThcIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJpc1RhYnNcIiwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogaXNDaGVja2VkLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgIT09IFwibGlnaHRjb3JkLThcIiB8fCAhaXNDaGVja2VkKXJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiZ3JlZW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYnJhbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuaXBjLnNlbmQoXCJORVdfVEFCXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFwiT3BlbiBhIG5ldyBUYWJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNob3VsZCByZWxhdW5jaFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiByZW1vdGUucHJvY2Vzcy5hcmd2LnNsaWNlKDEpLmNvbmNhdChbXCItLWRpc2FibGUtYmV0dGVyZGlzY29yZFwiXSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucXVpdCgpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZVxyXG4gICAgICAgICAgICB9LCBcIlJlbGF1bmNoIHdpdGhvdXQgQmV0dGVyRGlzY29yZFwiKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QcmVzZW5jZVNldHRpbmdzLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJscHBhbm5lbFwiLFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLlByZXNlbmNlU2V0dGluZ3NcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFjY291bnRJbmZvc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFwaVByZXZpZXdDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBpcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUNzc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZX0pKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsIG9uIHdpbmRvd1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQoY2hpbGRyZW4pe1xyXG4gICAgY2xhc3MgU2V0dGluZ0NvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihzaWRlYmFyKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBzaWRlYmFyXHJcbiAgICByZXR1cm4gKHMpID0+IHtcclxuICAgICAgICBzaWRlYmFyID0gc1xyXG4gICAgICAgIHJldHVybiBTZXR0aW5nQ29tcG9uZW50XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxzID0ge31cclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlcihwYW5lbCwgY29tcG9uZW50KXtcclxuICAgICAgICB0aGlzLnBhbmVsc1twYW5lbF0gPSBjb21wb25lbnRcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb21wb25lbnQocGFuZWwsIHNpZGViYXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhbmVsc1twYW5lbF0oc2lkZWJhcilcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXRlbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQmV0dGVyRGlzY29yZCBTZXR0aW5nc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY29yZVwiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlBsdWdpbnNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInBsdWdpbnNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJUaGVtZXNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInRoZW1lc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkN1c3RvbSBDU1NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImN1c3RvbWNzc1wiXHJcbiAgICAgICAgfV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IExDaXRlbXMoKXtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiTGlnaHRjb3JkIFNldHRpbmdzXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJsaWdodGNvcmRcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIlJpY2hQcmVzZW5jZVwiLCBcclxuICAgICAgICAgICAgICAgIGlkOiBcInN0YXR1c1wiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiQWNjb3VudCBJbmZvXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJhY2NvdW50aW5mb1wiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICAgICAgaWYod2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlKWl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkFwaSBDb21wb25lbnRzIFByZXZpZXdcIixcclxuICAgICAgICAgICAgaWQ6IFwibGNhcGlwcmV2aWV3XCJcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBpdGVtc1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcihzaWRlYmFyKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnRoaXMuTENpdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KFwiQkRDaGFuZ2Vsb2dUaXRsZVwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XHJcbiAqLyIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNsYXNzIFRoZW1lTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlRoZW1lTW9kdWxlID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyO31cclxufVxyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZXMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmxvYWRUaGVtZURhdGEoKTtcclxuICAgIGJkdGhlbWVFcnJvcnMuc3BsaWNlKDAsIDAsIC4uLihhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkVGhlbWVzKCkpKTtcclxuICAgIGNvbnN0IHRoZW1lcyA9IE9iamVjdC5rZXlzKGJkdGhlbWVzKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoZW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbdGhlbWVzW2ldXTtcclxuICAgICAgICBpZiAoIXRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSB0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG5cclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHRoZW1lIGluIHRoZW1lQ29va2llKSB7XHJcbiAgICAgICAgaWYgKCFiZHRoZW1lc1t0aGVtZV0pIGRlbGV0ZSB0aGVtZUNvb2tpZVt0aGVtZV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBhcHBsaWVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUpO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC4gSXQgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtbG9hZGVkXCIsIHRoZW1lLm5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVubG9hZFRoZW1lID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBkZWxldGUgYmR0aGVtZXNbdGhlbWVdO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgdGhpcy51bmxvYWRUaGVtZShiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm4gdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLnJlbG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpLCB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXJlbG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS51cGRhdGVUaGVtZUxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInRoZW1lXCIpO1xyXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVzdWx0cy5yZW1vdmVkKSB0aGlzLnVubG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZURhdGEgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInRoZW1lc1wiKTtcclxuICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhlbWVDb29raWUsIHNhdmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5zYXZlVGhlbWVEYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInRoZW1lc1wiLCB0aGVtZUNvb2tpZSk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgVGhlbWVNb2R1bGUoKTsiLCJpbXBvcnQge2JiZFZlcnNpb24sIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcclxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cclxuICAgIHN0YXRpYyBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9XHJcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xyXG4gICAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd0NvbmZpZ0ZpbGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIHNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN0cmlwQk9NKGNvbnRlbnQpIHtcclxuICAgICAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcclxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRUZXh0QXJlYSgpIHtcclxuICAgICAgICByZXR1cm4gRE9NLnF1ZXJ5KFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoYW5uZWxUZXh0QXJlYSAmJiBlLnRpdGxlV3JhcHBlcilbMF0uY2hhbm5lbFRleHRBcmVhLnNwbGl0KFwiIFwiKVswXStcIiB0ZXh0YXJlYVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xyXG4gICAgICAgIHRleHRhcmVhLmZvY3VzKCk7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xyXG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydFRleHRcIiwgZmFsc2UsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xyXG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgd2Fybihtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjRThBNDAwOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjRThBNDAwO1wiLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXJyKG1vZHVsZU5hbWUsIG1lc3NhZ2UsIGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogcmVkO1wiLCBcIlwiKTtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcIiVjRXJyb3I6IFwiICsgZXJyb3IubWVzc2FnZSwgXCJjb2xvcjogcmVkO1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZShzKSB7XHJcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHRlc3RKU09OKGRhdGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgdGhpcy5lcnIoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwicGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xyXG4gICAgICAgICAgICBlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKG1ldGhvZE5hbWUsIFwiZG9lcyBub3QgZXhpc3QgZm9yXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xyXG4gICAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlXHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgLy93aGF0W21ldGhvZE5hbWVdID0gb3JpZ01ldGhvZDtcclxuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlIC8vIHRoaXMgYWxsb3cgdG8gbW9ua2V5cGF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lLlxyXG4gICAgICAgIH07XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZihjYW5jZWxlZCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ01ldGhvZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKGluc3RlYWQsIFwiYGluc3RlYWRgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcFJldCAhPT0gdW5kZWZpbmVkKSBkYXRhLnJldHVyblZhbHVlID0gdGVtcFJldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcclxuICAgICAgICAgICAgICAgIGlmIChhZnRlcikgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHdoYXRbbWV0aG9kTmFtZV0sIG9yaWdNZXRob2QpO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19tb25rZXlQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kID0gb3JpZ01ldGhvZDtcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge3JldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbXV0YXRpb25zLmxlbmd0aDsgbSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1ttXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3Byb3BdO1xyXG4gICAgICAgIH0sIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHNob3dzIGEgdG9hc3Qgc2ltaWxhciB0byBhbmRyb2lkIHRvd2FyZHMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IFRoZSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9hc3QuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC4gT3B0aW9uYWwgcGFyYW1ldGVyLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBDaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZSB0b2FzdCBzdHlsaXN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkuIENob2ljZXM6IFwiXCIsIFwiaW5mb1wiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIi9cImVycm9yXCIsIFwid2FybmluZ1wiL1wid2FyblwiLiBEZWZhdWx0OiBcIlwiXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuaWNvbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIHNob3cgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZS4gQSB0b2FzdCB3aXRob3V0IHR5cGUgd2lsbCBhbHdheXMgaGF2ZSBubyBpY29uLiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aW1lb3V0IEFkanVzdHMgdGhlIHRpbWUgKGluIG1zKSB0aGUgdG9hc3Qgc2hvdWxkIGJlIHNob3duIGZvciBiZWZvcmUgZGlzYXBwZWFyaW5nIGF1dG9tYXRpY2FsbHkuIERlZmF1bHQ6IDMwMDBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNob3dUb2FzdChjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhciAmJiBlLmhhc05vdGljZSlbMF0uc2lkZWJhci5zcGxpdChcIiBcIilbOV0rXCIgKyBkaXZcIikgfHwgbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbWVtYmVybGlzdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLm1lbWJlcnNXcmFwKVswXS5tZW1iZXJzV3JhcCkgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJmb3JtXCIpIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogMzEwO1xyXG4gICAgICAgICAgICBjb25zdCByaWdodCA9IG1lbWJlcmxpc3QgPyBtZW1iZXJsaXN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHJpZ2h0ID8gcmlnaHQgLSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IFV0aWxzLnNjcmVlbldpZHRoIC0gbGVmdCAtIDI0MDtcclxuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gZm9ybSA/IGZvcm0ub2Zmc2V0SGVpZ2h0IDogODA7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RzXCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIGxlZnQgKyBcInB4XCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImJvdHRvbVwiLCBib3R0b20gKyBcInB4XCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKS5hcHBlbmRDaGlsZCh0b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7dHlwZSA9IFwiXCIsIGljb24gPSB0cnVlLCB0aW1lb3V0ID0gMzAwMH0gPSBvcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IHRvYXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdFwiKTtcclxuICAgICAgICBpZiAodHlwZSkgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJ0b2FzdC1cIiArIHR5cGUpO1xyXG4gICAgICAgIGlmICh0eXBlICYmIGljb24pIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiaWNvblwiKTtcclxuICAgICAgICB0b2FzdEVsZW0uaW5uZXJUZXh0ID0gY29udGVudDtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5hcHBlbmRDaGlsZCh0b2FzdEVsZW0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJkLXRvYXN0cyAuYmQtdG9hc3RcIikubGVuZ3RoKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICB9LCB0aW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWxlcnQodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcclxuICAgICAgICBjb25zdCBjbG9zaW5nTGlzdGVuZXJzID0gW11cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbG9zZTogKGxpc3RlbmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBwbHVnaW5FcnJvcnMgPSBbXSwgdGhlbWVzOiB0aGVtZUVycm9ycyA9IFtdfSkge1xyXG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzIHx8ICF0aGVtZUVycm9ycykgcmV0dXJuO1xyXG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzLmxlbmd0aCAmJiAhdGhlbWVFcnJvcnMubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCBiZC1jb250ZW50LW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj48ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250ZW50IEVycm9yczwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgVE9QXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlBsdWdpbnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+VGhlbWVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj5OYW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+TWVzc2FnZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj5FcnJvcjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgXHJcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVUYWIoZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JzXCI+YCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj4ke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPiR7ZXJyLm1lc3NhZ2V9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+PGEgY2xhc3M9XCJlcnJvci1saW5rXCIgaHJlZj1cIlwiPiR7ZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBcIlwifTwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYEVycm9yIGRldGFpbHMgZm9yICR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfS5gLCBlcnIuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBbZ2VuZXJhdGVUYWIocGx1Z2luRXJyb3JzKSwgZ2VuZXJhdGVUYWIodGhlbWVFcnJvcnMpXTtcclxuICAgIFxyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbS5zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSBET00ucmVtb3ZlQ2xhc3Moc2VsZWN0ZWQsIFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhlLnRhcmdldCwgXCJzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnNjcm9sbGVyXCIpO1xyXG4gICAgICAgICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQodGFic1tET00uaW5kZXgoZS50YXJnZXQpXSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgXHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcclxuICAgICAgICBpZiAocGx1Z2luRXJyb3JzLmxlbmd0aCkgbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW1cIikuY2xpY2soKTtcclxuICAgICAgICBlbHNlIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpWzFdLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBjb25zdCBDaGFuZ2Vsb2dDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJmaXhlZFwiLCBcImltcHJvdmVkXCIpO1xyXG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xyXG4gICAgICAgIGNvbnN0IEZsZXhDaGlsZCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiQ2hpbGRcIik7XHJcbiAgICAgICAgY29uc3QgVGl0bGVzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJUYWdzXCIsIFwiZGVmYXVsdFwiKTtcclxuICAgICAgICBjb25zdCBDaGFuZ2Vsb2cgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuc2VsZWN0YWJsZSA9PSBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgTWFya2Rvd25QYXJzZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImRlZmF1bHRSdWxlc1wiLCBcInBhcnNlXCIpO1xyXG4gICAgICAgIGlmICghQ2hhbmdlbG9nIHx8ICFNb2RhbFN0YWNrIHx8ICFDaGFuZ2Vsb2dDbGFzc2VzIHx8ICFUZXh0RWxlbWVudCB8fCAhRmxleENoaWxkIHx8ICFUaXRsZXMgfHwgIU1hcmtkb3duUGFyc2VyKSByZXR1cm47XHJcbiAgICBcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGltYWdlID0gXCJodHRwczovL3JlcG9zaXRvcnktaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMDU0NzM1MzcvOTU3YjU0ODAtN2MyNi0xMWU5LTg0MDEtNTBmYTgyMGNiYWU1XCIsIFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCIsIFxyXG4gICAgICAgICAgICBjaGFuZ2VzID0gW10sIFxyXG4gICAgICAgICAgICB0aXRsZSA9IFwiQmFuZGFnZWRCRFwiLCBcclxuICAgICAgICAgICAgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLCBcclxuICAgICAgICAgICAgZm9vdGVyXHJcbiAgICAgICAgfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgY2UgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nSXRlbXMgPSBbY2UoXCJpbWdcIiwge3NyYzogaW1hZ2V9KV07XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwicFwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShkZXNjcmlwdGlvbikpKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5nZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjaGFuZ2VzW2NdO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA/IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gOiBDaGFuZ2Vsb2dDbGFzc2VzLmFkZGVkO1xyXG4gICAgICAgICAgICBjb25zdCBtYXJnaW4gPSBjID09IDAgPyBDaGFuZ2Vsb2dDbGFzc2VzLm1hcmdpblRvcCA6IFwiXCI7XHJcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJoMVwiLCB7Y2xhc3NOYW1lOiBgJHt0eXBlfSAke21hcmdpbn1gLH0sIGVudHJ5LnRpdGxlKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBjZShcInVsXCIsIG51bGwsIGVudHJ5Lml0ZW1zLm1hcChpID0+IGNlKFwibGlcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoaSkpKSk7XHJcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2gobGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlbmRlckhlYWRlciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSxcclxuICAgICAgICAgICAgICAgIGNlKFRpdGxlcy5kZWZhdWx0LCB7dGFnOiBUaXRsZXMuVGFncy5INH0sIHRpdGxlKSxcclxuICAgICAgICAgICAgICAgIGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRCwgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmRhdGV9LCBzdWJ0aXRsZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgY29uc3QgcmVuZGVyRm9vdGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgICAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcclxuICAgICAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcclxuICAgICAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLmpvaW5CRDIoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBjZShBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogY2UoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm9vdGVyID0gY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LCBmb290ZXIgPyBmb290ZXIgOiBkZWZhdWx0Rm9vdGVyKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShDaGFuZ2Vsb2csIE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBvblNjcm9sbDogXyA9PiBfLFxyXG4gICAgICAgICAgICAgICAgb25DbG9zZTogXyA9PiBfLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVySGVhZGVyOiByZW5kZXJIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGFuZ2Vsb2dJdGVtc1xyXG4gICAgICAgICAgICB9LCBwcm9wcykpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IE1hcmtkb3duID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNYXJrZG93blwiKTtcclxuICAgICAgICBjb25zdCBDb25maXJtYXRpb25Nb2RhbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmtleSAmJiBtLmtleSgpID09IFwiY29uZmlybS1tb2RhbFwiKTtcclxuICAgICAgICBpZiAoIU1vZGFsU3RhY2sgfHwgIUNvbmZpcm1hdGlvbk1vZGFsIHx8ICFNYXJrZG93bikgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZW1wdHlGdW5jdGlvbiA9ICgpID0+IHt9O1xyXG4gICAgICAgIGNvbnN0IHtvbkNvbmZpcm0gPSBlbXB0eUZ1bmN0aW9uLCBvbkNhbmNlbCA9IGVtcHR5RnVuY3Rpb24sIGNvbmZpcm1UZXh0ID0gXCJPa2F5XCIsIGNhbmNlbFRleHQgPSBcIkNhbmNlbFwiLCBkYW5nZXIgPSBmYWxzZSwga2V5ID0gdW5kZWZpbmVkfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGVudCA9IFtjb250ZW50XTtcclxuICAgICAgICBjb250ZW50ID0gY29udGVudC5tYXAoYyA9PiB0eXBlb2YoYykgPT09IFwic3RyaW5nXCIgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2Rvd24sIG51bGwsIGMpIDogYyk7XHJcbiAgICAgICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChDb25maXJtYXRpb25Nb2RhbCwge1xyXG4gICAgICAgICAgICBoZWFkZXI6IHRpdGxlLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogY29udGVudCxcclxuICAgICAgICAgICAgcmVkOiBkYW5nZXIsXHJcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBjb25maXJtVGV4dCxcclxuICAgICAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcclxuICAgICAgICAgICAgb25Db25maXJtOiBvbkNvbmZpcm0sXHJcbiAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxyXG4gICAgICAgIH0sIGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZURhKGNsYXNzTmFtZSl7XHJcbiAgICAgICAgaWYoIWNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXHJcbiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuZmlsdGVyKGUgPT4gIWUuc3RhcnRzV2l0aChcImRhLVwiKSkuam9pbihcIiBcIilcclxuICAgIH1cclxufVxyXG5cclxuVXRpbHMuc2hvd1RvYXN0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoVXRpbHMuc2hvd1RvYXN0LCBcIkNvdWxkIG5vdCBzaG93IHRvYXN0LlwiKTtcclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5VdGlscyA9IFV0aWxzIiwiaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5XZWJwYWNrTW9kdWxlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRQcm90ZWN0ID0gdGhlTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUuZ2V0VG9rZW4gfHwgdGhlTW9kdWxlLmdldEVtYWlsIHx8IHRoZU1vZHVsZS5zaG93VG9rZW4pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcHJvdGVjdCA9ICh0aGVNb2R1bGUsIGlzRGVmYXVsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vZCA9ICFpc0RlZmF1bHQgPyB0aGVNb2R1bGUuZGVmYXVsdCA6IHRoZU1vZHVsZVxyXG4gICAgICAgICAgICAgICAgaWYoIW1vZClyZXR1cm4gdGhlTW9kdWxlXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kLnJlbW92ZSAmJiBtb2Quc2V0ICYmIG1vZC5jbGVhciAmJiBtb2QuZ2V0ICYmICFtb2Quc29ydCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1vZC5nZXRUb2tlbiAmJiAhbW9kLmdldEVtYWlsICYmICFtb2Quc2hvd1Rva2VuKXJldHVybiB0aGVNb2R1bGVcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShtb2QsIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJnZXRUb2tlblwiIHx8IHByb3AgPT09IFwiZ2V0RW1haWxcIiB8fCBwcm9wID09PSBcInNob3dUb2tlblwiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIGZ1bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRUb2tlblwiICYmIG9iai5nZXRUb2tlbikgcmV0dXJuICgpID0+IFwibWZhLlhDbmJLem8wQ0xJcWRKekJuTDBEOFBmRHJ1cWtKTkhqd0hYdHIzOVVVM0Y4aEh4NDNqb2pJU3lpNWpkak81MmU5X2U5TWptYWZaRkZwYy1zZU9NYVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldEVtYWlsXCIgJiYgb2JqLmdldEVtYWlsKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJzaG93VG9rZW5cIiAmJiBvYmouc2hvd1Rva2VuKSByZXR1cm4gKCkgPT4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJfX3Byb3RvX19cIiAmJiBvYmouX19wcm90b19fKSByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2Z1bmNdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCFpc0RlZmF1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGVNb2R1bGUsIHtkZWZhdWx0OiBwcm94eX0pXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgcmV0dXJuIHByb3RlY3QobS5kZWZhdWx0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIHByb3RlY3QobSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSwgZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKHByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbCA9IHtcclxuICAgICAgICAgICAgcmVhY3Q6IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJDb21wb25lbnRcIiwgXCJQdXJlQ29tcG9uZW50XCIsIFwiQ2hpbGRyZW5cIiwgXCJjcmVhdGVFbGVtZW50XCIsIFwiY2xvbmVFbGVtZW50XCJdKSxcclxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGUgPT4gZVtPYmplY3Qua2V5cyhlKS5maW5kKGsgPT4gay5zdGFydHNXaXRoKFwiX19yZWFjdEludGVybmFsSW5zdGFuY2VcIikpXTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgam9pbkJEMSgpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjBUbWZvNVpiT1JDUnFiQWRcIik7fVxyXG4gICAgbGVhdmVCRDEoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIpO31cclxuXHJcbiAgICBqb2luQkQyKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMkhTY204alwiKTt9XHJcbiAgICBsZWF2ZUJEMigpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiMjgwODA2NDcyOTI4MTk4NjU2XCIpO31cclxuXHJcbiAgICBqb2luTEMoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCI3ZUZmZjJBXCIpO31cclxuICAgIGxlYXZlTEMoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjcwNTkwODM1MDIxODY2NjExN1wiKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG5cclxuICAgIGdldCBhbmNob3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiXSkgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07fVxyXG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cclxuICAgIGdldCBtZXNzYWdlQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm1lc3NhZ2VcIiwgXCJjb250YWluZXJDb3p5XCJdKTt9XHJcbiAgICBnZXQgZ3VpbGRDbGFzc2VzKCkge1xyXG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ3VpbGRzRXJyb3IgJiYgZS5zZWxlY3RlZClbMF1cclxuICAgICAgICBjb25zdCBwaWxsID0gQkRNb2R1bGVzLmdldChlID0+IGUuYmxvYkNvbnRhaW5lcilbMF1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxuXHR9XHJcblxyXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XHJcbiAgICBnZXQgTWVzc2FnZUNvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJNZXNzYWdlXCIpO31cclxuICAgIGdldCBUaW1lRm9ybWF0dGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZGF0ZUZvcm1hdFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XHJcbiAgICBnZXQgTmF0aXZlTW9kdWxlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2V0QmFkZ2VcIl0pO31cclxuICAgIGdldCBJbnZpdGVBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTt9XHJcbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmhpZGUgJiYgbS5zaG93ICYmICFtLnNlYXJjaCAmJiAhbS5zdWJtaXQgJiYgIW0uc2VhcmNoICYmICFtLmFjdGl2YXRlUmFnaW5nRGVtb24gJiYgIW0uZGlzbWlzcyk7fVxyXG4gICAgZ2V0IEtleUdlbmVyYXRvcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS50b1N0cmluZyAmJiAvXCJiaW5hcnlcIi8udGVzdChtLnRvU3RyaW5nKCkpKTt9XHJcbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XHJcbiAgICBnZXQgVXNlclN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q3VycmVudFVzZXJcIl0pO31cclxuICAgIGdldCBDaGFubmVsU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuICAgIGdldCBQcml2YXRlQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZWxlY3RQcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG5cclxuICAgIG9wZW5ETSh1c2VySWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmSWQgPSB0aGlzLlVzZXJTdG9yZS5nZXRDdXJyZW50VXNlcigpLmlkO1xyXG4gICAgICAgIGlmIChzZWxmSWQgPT0gdXNlcklkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xyXG4gICAgICAgIGlmIChwcml2YXRlQ2hhbm5lbElkKSByZXR1cm4gdGhpcy5Qcml2YXRlQ2hhbm5lbEFjdGlvbnMuc2VsZWN0UHJpdmF0ZUNoYW5uZWwocHJpdmF0ZUNoYW5uZWxJZCk7XHJcbiAgICAgICAgdGhpcy5DaGFubmVsQWN0aW9ucy5vcGVuUHJpdmF0ZUNoYW5uZWwoc2VsZklkLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlU2V0dGluZ3MoY2F0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdCAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0gcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IHN0eWxlID0gYFxyXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGF0LTNiUnh4dSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNpZGViYXItMks4cEZoIHtcclxuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFZvaWNlTW9kZSB7XHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiVm9pY2VNb2RlXCIpO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbmRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbmRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBtLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKC4uLnByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxubGV0IG1vZCA9ICB7ZmluZCwgZmluZEFsbCwgZmluZEJ5UHJvcHMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuZXhwb3J0IGRlZmF1bHQgbW9kXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuV2VicGFja01vZHVsZXMgPSBtb2QiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiXHJcblxyXG5sZXQgcHJvZmlsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQub3BlbiAmJiBlLmRlZmF1bHQuZmV0Y2hNdXR1YWxGcmllbmRzKVswXVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkVXNlckJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG5cclxuICAgICAgICBkZWxldGUgcHJvcHMuaHJlZi50YXJnZXRcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2cocHJvcHMpXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxwcm9wcy5BbmNob3IgaHJlZj17XCIvdXNlcnMvXCIrcHJvcHMudXNlci5pZH0gey4uLnByb3BzLmhyZWZ9IG9uQ2xpY2s9eyhldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgaWYoIXByb2ZpbE1vZHVsZSlwcm9maWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5vcGVuICYmIGUuZGVmYXVsdC5mZXRjaE11dHVhbEZyaWVuZHMpWzBdXHJcbiAgICAgICAgICAgICAgICBwcm9maWxNb2R1bGUuZGVmYXVsdC5vcGVuKHByb3BzLnVzZXIuaWQpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9wcm9wcy5BbmNob3I+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1Z0h1bnRlckJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMzEuMyAyOS41XCIgey4uLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi44IDFzMTIgOC4yIDcuNCAxOS43UzE2LjYgMjkgMjAgMjUuNnMtNC01LjYtOC43LTEwTDIyLjggMVwiIGZpbGw9XCJyZ2JhKDIyNyw2LDE5LC42KVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBDaXJjdXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgcmV0dXJuICg8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgIHsuLi50aGlzLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0REMkU0NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zMyAzM2EyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJsMS0xMmgyOGwxIDEyelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0VBNTk2RVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xMyAzNWMtLjc5Mi0xLjg3NS0xLjc1LTMuMjkxLTMuNDE3LTQuNjY2IDEuNzUtMS40NTkgNC41NDItNS41IDUuMjUtOC4yOTJzMi43NSA4LjEyNSAyLjA0MiAxMC42MjVTMTMgMzUgMTMgMzV6bTEwLjMwMyAwYy43OTEtMS44NzUgMS43NS0zLjI5MSAzLjQxNi00LjY2Ni0xLjc1LTEuNDU5LTQuNTQxLTUuNS01LjI1LTguMjkyLS43MDctMi43OTItMi43NSA4LjEyNS0yLjA0IDEwLjYyNS43MDggMi41IDMuODc0IDIuMzMzIDMuODc0IDIuMzMzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0JFMTkzMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjcyOCAyNC4yNjNBMi41IDIuNSAwIDAwOCAyMi41YzAtLjU2NS0uMTk1LTEuMDgxLS41MTEtMS41SDRsLS4yNzIgMy4yNjN6bTI4LjU0NCAwTDMyIDIxaC0zLjQ4OUEyLjQ4MiAyLjQ4MiAwIDAwMjggMjIuNWEyLjUgMi41IDAgMDA0LjI3MiAxLjc2M3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxNFwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjJcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyNlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIzIDM1SDEzczItNiAyLTEzaDZjMCA3IDIgMTMgMiAxM3pNMTcgMmgydjdoLTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzU1QUNFRVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOC44MzguMjA2QzE3LjY2Ny4wNDIgMTcgLjMxOCAxNyAxLjQxOHYxYzAgMS4xLjg2NSAxLjc1MyAxLjkyMyAxLjQ1MWw1LjE1NC0uOTAxYzEuNzE1LS4zNDMgMS41NDgtMS41OTMuMDg1LTEuODg0TDE4LjgzOC4yMDZ6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjQ0NENkREXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZsLS4wODEuMTIzQzEwLjkzOCAxNi45ODEgMyAxNS4wMTUgMyAxOXYyLjVhMi41IDIuNSAwIDAwNC45NS41SDEyYTIgMiAwIDAwNCAwaDRhMiAyIDAgMDA0IDBoNC4wNWEyLjUgMi41IDAgMDA0Ljk1LS41VjE5YzAtNC04LTItMTUtMTN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8ZyBmaWxsPVwiI0Y1RjhGQVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTQ4IDYuMDc4bC0uMDMuMDQ1QzE3LjEzMiAxMS42MTkgMTAuODExIDE2LjEyNiA4IDE4djRhMiAyIDAgMDA0IDB2LTRjLjk4Mi0uOTgyIDUuODEzLTYuNzg3IDUuOTg0LTExLjczMi0uMDEtLjA2NC0uMDI3LS4xMjYtLjAzNi0uMTl6bS4wOC4zOThDMTguMzI0IDExLjM3NCAyMy4wMzEgMTcuMDMxIDI0IDE4djRhMiAyIDAgMDA0IDB2LTRjLTIuNzUtMS44MzMtOC45NTMtNi4xOS05Ljk3Mi0xMS41MjR6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTg0IDYuMjdDMTcuOTIyIDguMzQ2IDE3LjYwNiAxNi4zOTQgMTYgMTh2NGEyIDIgMCAwMDQgMHYtNGMtMS41NjQtMS41NjQtMS45MDUtOS4yNDEtMS45NzktMTEuNTU5LS4wMTEtLjA1Ny0uMDI3LS4xMTMtLjAzNy0uMTcxelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0Y29yZExvZ28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2OCAxNjguNjlcIiB7Li4ucHJvcHN9IGhlaWdodD1cIjEwMCVcIiB3aWR0aD17cHJvcHMuc2l6ZX0+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2FcIiB4MT17NjYuN30geTE9ey00ODcuN30geDI9ezY2Ljd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExNFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2JcIiB4MT17MTAxLjd9IHkxPXstNDg3Ljd9IHgyPXsxMDEuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTIwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fY1wiIHgxPXs4NH0geTE9ey00MDh9IHgyPXs4NH0geTI9ey01NzYuNjl9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE0LjkgMzUuM2gxMzkuMlYxMzNIMTQuOXpcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02Ni43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2EpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAxLjcgNzkuN2MtNS40IDAtOS44IDQuNy05LjggMTAuNXM0LjQgMTAuNSA5LjggMTAuNSA5LjgtNC43IDkuOC0xMC41LTQuNC0xMC41LTkuOC0xMC41elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDB2MTY4bDE2OCAuNjlWMHptMTExLjMgMTI0LjFzLTMuNC00LjEtNi4zLTcuN2MxMi42LTMuNSAxNy40LTExLjMgMTcuNC0xMS4zYTUyLjUyIDUyLjUyIDAgMDEtMTEuMSA1LjYgNjguNjMgNjguNjMgMCAwMS0zOC45IDQgNzAuMTIgNzAuMTIgMCAwMS0xNC4xLTQuMSA0OC44OCA0OC44OCAwIDAxLTcuMS0zLjNjLS4zLS4yLS42LS4zLS45LS41YS43Ni43NiAwIDAwLS40LS4yYy0xLjctMS0yLjYtMS42LTIuNi0xLjZzNC42IDcuNiAxNi44IDExLjJjLTIuOSAzLjYtNi40IDcuOS02LjQgNy45LTIxLjItLjYtMjkuMy0xNC41LTI5LjMtMTQuNSAwLTMwLjYgMTMuOC01NS40IDEzLjgtNTUuNCAxMy44LTEwLjMgMjYuOS0xMCAyNi45LTEwbDEgMS4xQzUyLjggNTAuMyA0NSA1Ny45IDQ1IDU3LjlhNTYuMiA1Ni4yIDAgMDE1LjctMi43IDcyLjE5IDcyLjE5IDAgMDEyMS44LTYgOC43NSA4Ljc1IDAgMDExLjYtLjIgODkuMSA4OS4xIDAgMDExOS40LS4yIDc4LjQ1IDc4LjQ1IDAgMDEyOC45IDkuMXMtNy41LTcuMi0yMy45LTEyLjFsMS4zLTEuNXMxMy4xLS4zIDI2LjkgMTBjMCAwIDEzLjggMjQuOCAxMy44IDU1LjQuMS0uMS04IDEzLjgtMjkuMiAxNC40elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYylcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XHJcbiAqL1xyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxubGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxubGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbmxldCBzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuY29uc3QgR3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMpWzBdLmRlZmF1bHRcclxuY29uc3QgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UmVsYXRpb25zaGlwcylbMF0uZGVmYXVsdFxyXG5jb25zdCBzZXNzaW9uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0U2Vzc2lvbnMpWzBdLmRlZmF1bHRcclxuY29uc3QgdXNlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQWNjb3VudEluZm9zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZighbWFyZ2luTW9kdWxlMiltYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG4gICAgICAgIGlmKCFjb2xvck1vZHVsZSljb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbiAgICAgICAgaWYoIXNpemVNb2R1bGUpc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIkFjY291bnQgSW5mb3NcIi8+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBQcm9maWxlXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0UHJvZmlsZVZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3NcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTdGF0aXN0aWNzKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3RlZCBTZXNzaW9uc1xyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFNlc3Npb25WYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0ubWFyZ2luQm90dG9tMjB9PjwvZGl2PlxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXNzaW9uVmFsdWUoKXtcclxuICAgICAgICBjb25zdCBzZXNzaW9uc1JhdyA9IHNlc3Npb25Nb2R1bGUuZ2V0U2Vzc2lvbnMoKVxyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zID0gT2JqZWN0LmtleXMoc2Vzc2lvbnNSYXcpLmZpbHRlcihlID0+IGUgIT09IFwiYWxsXCIpLm1hcChlID0+IHNlc3Npb25zUmF3W2VdKVxyXG5cclxuICAgICAgICBpZihzZXNzaW9ucy5sZW5ndGggPT09IDApcmV0dXJuIFwiLSBObyBzZXNzaW9uIGRldGVjdGVkLiBQbGVhc2UgdHJ5IGluIGEgZmV3IHNlY29uZHNcIlxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBzZXNzaW9ucy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBgKyBpZDogJHtlLnNlc3Npb25JZH1cclxuKyBvczogJHtlLmNsaWVudEluZm8ub3NbMF0udG9VcHBlckNhc2UoKStlLmNsaWVudEluZm8ub3Muc2xpY2UoMSl9XHJcbisgY2xpZW50OiAke2UuY2xpZW50SW5mby5jbGllbnR9XHJcbisgc3RhdHVzOiAke2Uuc3RhdHVzfVxyXG4rIEFjdGl2aXRpZXM6ICR7ZS5hY3Rpdml0aWVzLmxlbmd0aH1gXHJcbiAgICAgICAgfSkuam9pbihcIlxcblwiK1wiLVwiLnJlcGVhdCgzOCkrXCJcXG5cIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9maWxlVmFsdWUoKXtcclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlck1vZHVsZS5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQHR5cGUge0RhdGV9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gdXNlci5jcmVhdGVkQXRcclxuXHJcbiAgICAgICAgbGV0IGF2YXRhclVSTCA9IHVzZXIuYXZhdGFyVVJMXHJcbiAgICAgICAgaWYodXNlci5hdmF0YXIgJiYgdXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwoXCJnaWZcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKGF2YXRhclVSTC5zdGFydHNXaXRoKFwiL1wiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IFwiaHR0cHM6Ly9kaXNjb3JkLmNvbVwiK2F2YXRhclVSTFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihhdmF0YXJVUkwuZW5kc1dpdGgoXCI/c2l6ZT0xMjhcIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSBhdmF0YXJVUkwucmVwbGFjZShcIj9zaXplPTEyOFwiLCBcIj9zaXplPTQwOTZcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBgKyBVc2VybmFtZTogJHt1c2VyLnVzZXJuYW1lfVxyXG4rIERpc2NyaW1pbmF0b3I6ICR7dXNlci5kaXNjcmltaW5hdG9yfVxyXG4rIFRhZzogJHt1c2VyLnRhZ31cclxuKyBJRDogJHt1c2VyLmlkfVxyXG4rIEF2YXRhcjogJHt1c2VyLmF2YXRhcn1cclxuKyBBdmF0YXIgVVJMOiAke2F2YXRhclVSTH1cclxuKyBDcmVhdGlvbiBEYXRlOiAkeyhjcmVhdGVkQXQuZ2V0RGF0ZSgpKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldE1vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRGdWxsWWVhcigpKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtjcmVhdGVkQXQuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1oICR7Y3JlYXRlZEF0LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1taW4gJHtjcmVhdGVkQXQuZ2V0U2Vjb25kcygpfXNcclxuKyBGbGFnczogJHt1c2VyLmZsYWdzfVxyXG4rIEhhcyBOaXRybzogJHt1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24gPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIEVtYWlsOiAke3VzZXIuZW1haWx9XHJcbi0gMkZBOiAke3VzZXIubWZhRW5hYmxlZCA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gSGFzIEJlZW4gT24gTW9iaWxlOiAke3VzZXIubW9iaWxlID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBQaG9uZTogJHt1c2VyLnBob25lIHx8IFwiTm9uZVwifVxyXG4tIFZlcmlmaWVkOiAke3VzZXIudmVyaWZpZWR9YFxyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YXRpc3RpY3MoKXtcclxuXHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gT2JqZWN0LnZhbHVlcyhHdWlsZE1vZHVsZS5nZXRHdWlsZHMoKSlcclxuICAgICAgICBjb25zdCByZWxhdGlvbnMgPSBPYmplY3Qua2V5cyhyZWxhdGlvblNoaXBNb2R1bGUuZ2V0UmVsYXRpb25zaGlwcygpKVxyXG4gICAgICAgIGNvbnN0IGZyaWVuZHMgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzRnJpZW5kKGUpKVxyXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzQmxvY2tlZChlKSlcclxuXHJcbiAgICAgICAgcmV0dXJuIGArIFNlcnZlciBDb3VudDogJHtndWlsZHMubGVuZ3RofSBzZXJ2ZXJzXHJcbisgUmVsYXRpb25zOiAke3JlbGF0aW9ucy5sZW5ndGh9IHJlbGF0aW9uc1xyXG4rIEZyaWVuZHMgQ291bnQ6ICR7ZnJpZW5kcy5sZW5ndGh9IGZyaWVuZHNcclxuLSBCbG9ja2VkIFVzZXJzIENvdW50OiAke2Jsb2NrZWQubGVuZ3RofSBibG9ja2VkIHVzZXJzYFxyXG4gICAgfVxyXG59XHJcblxyXG5cclxubGV0IGhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuXHJcbmNsYXNzIENvZGVDb250ZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMSltZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTIpbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cclxuICAgICAgICBpZighc2Nyb2xsYmFyTW9kdWxlMSlzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuICAgICAgICBpZighaGlnaHRsaWdodEpTKWhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2Ake21lc3NhZ2VNb2R1bGUxLm1hcmt1cH0gJHttZXNzYWdlTW9kdWxlMi5tZXNzYWdlQ29udGVudH1gfT5cclxuICAgICAgICAgICAgPHByZT5cclxuICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPXtgJHtzY3JvbGxiYXJNb2R1bGUxLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IGhsanNgfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogaGlnaHRsaWdodEpTLmhpZ2hsaWdodCh0aGlzLnByb3BzLmxhbmd1YWdlLCB0aGlzLnByb3BzLmNvbnRlbnQpLnZhbHVlfX0+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9jb2RlPlxyXG4gICAgICAgICAgICA8L3ByZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufSIsIi8vIEdvb2QgbHVjayB0byByZWFkIG15IGNvZGUsIEV2ZW4gbWUgY2FuJ3QgcmVhZCBpdCBwcm9wZXJseS5cclxuXHJcbmltcG9ydCB7IHN0YXQgfSBmcm9tIFwiZnNcIlxyXG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi4vbW9kdWxlcy9kaXN0YW50XCJcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIlxyXG5cclxuY29uc3Qga2V5cyA9IHtcclxuICAgIHNldHRpbmdUaXRsZTogdXVpZHY0KClcclxufVxyXG5sZXQgZm9ybU1vZHVsZVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlQcmV2aWV3IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzdGF0ZXM6IFtdXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFmb3JtTW9kdWxlKWZvcm1Nb2R1bGUgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5Gb3JtU2VjdGlvbilcclxuICAgICAgICAvKiogXHJcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9uW119XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgYWxsQ29tcG9uZW50cyA9IFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV0pLm1hcChrID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1ba10pXHJcbiAgICAgICAgfSkuZmxhdCgpKV1cclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtU2VjdGlvbiB0YWc9XCJoMlwiIHRpdGxlPVwiTGlnaHRjb3JkJ3MgQXBpIEF2YWlsbGFibGUgY29tcG9uZW50c1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm1Nb2R1bGUuRm9ybVRleHQgdHlwZT1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwiXCIgc2VsZWN0YWJsZT17ZmFsc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgIFRoZXNlIGNvbXBvbmVudHMgYXJlIGhlcmUgZm9yIHRoZSBwbHVnaW4gZGV2cy4gVGhleSBjYW4gcXVpY2tseSBlbWJlZCBhbnkgY29tcG9uZW50IGJlbG93IHdpdGggdGhpcyBwYW5lbC5cclxuICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vZ2l0aHViLmNvbS9saWdodGNvcmQvbGlnaHRjb3JkL3dpa2kvQXBpc1wiKVxyXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb25cclxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtU2VjdGlvbj4sXHJcbiAgICAgICAgICAgIGFsbENvbXBvbmVudHMubWFwKGNvbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IEFsbFByZXZpZXdzID0gW11cclxuICAgICAgICAgICAgICAgIGlmKGNvbXAuQWxsUHJldmlld3MpQWxsUHJldmlld3MgPSBjb21wLkFsbFByZXZpZXdzXHJcbiAgICAgICAgICAgICAgICBsZXQgb25DaGFuZ2UgPSAodGFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHNldFN0YXRlID0gKG5ld1N0YXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlczogW09iamVjdC5hc3NpZ24oc3RhdGUsIG5ld1N0YXRlKV0uY29uY2F0KHRoaXMuc3RhdGUuc3RhdGVzLmZpbHRlcihlID0+IGUuZWxlbSAhPT0gY29tcCkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGUuc3RhdGVzLmZpbmQoZSA9PiBlLmVsZW0gPT09IGNvbXApXHJcbiAgICAgICAgICAgICAgICBpZighc3RhdGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWI6IFwicHJldmlld1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtOiBjb21wLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN0YXRlcy5wdXNoKHN0YXRlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGdldFByb3BzID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbCA9IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgQWxsUHJldmlld3MuZm9yRWFjaChjYXRlZ29yeSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV0gPSBjYXRlZ29yeVswXVtPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1dXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzdGF0ZS5vcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsW2tleV0gPSBBbGxQcmV2aWV3cy5maW5kKGUgPT4gZS5maW5kKGUgPT4gZVtrZXldKSlbc3RhdGUub3B0aW9uc1trZXldXVtrZXldXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCByZW5kZXJQcmV2aWV3ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT1cImxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVuZGVyQ29kZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNYXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzeFwiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcImpzeFwiKX0vPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUuJCR0eXBlb2YgJiYgKHZhbHVlLiQkdHlwZW9mID09PSBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSB8fCB2YWx1ZS4kJHR5cGVvZiA9PT0gMHhlYWM3KSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcclxuICAgIG1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcclxufX0sXHJcbiAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsXHJcbiAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIixcclxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgIH0sIGNsYXNzTmFtZTogXCJsYy10YWItYm94LXNoYWRvd1wiIH0sXHJcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZSwgbnVsbCwgXCJQcmV2aWV3IHRhYnNcIilcclxuICAgIClcclxuKWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcImpzeFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgbWFyZ2luVG9wOiBcIjIwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjIwcHhcIlxyXG4gICAgfX0+XHJcbiAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgIH19IGNsYXNzTmFtZT1cImxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZT5QcmV2aWV3IHRhYnM8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIllvdXIgY29tcG9uZW50cyBoZXJlLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCBcIiAgICBcIilcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRlQ29kZSA9IGZ1bmN0aW9uKGxhbmcpeyAvLyBjb2RlIGZvcm1hdHRpbmcgaXMgaGFyZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBOYW1lID0gY29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcENhdGVnb3J5ID0gY2F0ZWdvcmllcy5maW5kKGUgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtjb21wTmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcFBhdGggPSBgTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLiR7Y29tcENhdGVnb3J5fS4ke2NvbXBOYW1lfWBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IGdldFByb3BzKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJqc3hcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlblByb3AgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjaGlsZHJlblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblByb3AgPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGtleStcIj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBgeyR7Z2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZyl9fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGVuVGFnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuUHJvcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuVGFnID0gYDwke2NvbXBQYXRofSAke3Byb3BTdHJpbmdzLmpvaW4oXCIgXCIpfT5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VUYWcgPSBgPC8ke2NvbXBQYXRofT5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7b3BlblRhZ31cXG4gICAgJHtjaGlsZHJlblByb3B9XFxuJHtjbG9zZVRhZ31gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0vPmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVGFnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcInJlYWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiB8fCBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjaGlsZHJlbiAmJiBjaGlsZHJlbi4kJHR5cGVvZiAmJiAoY2hpbGRyZW4uJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IGNoaWxkcmVuLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZ2V0U3RyRm9yUHJvcChjaGlsZHJlbiwgY29tcFBhdGgsIGxhbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2aXNpYmxlS2V5ID0gL1teXFx3XFxkX10vZy50ZXN0KGtleSkgPyBKU09OLnN0cmluZ2lmeShrZXkpIDoga2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gdmlzaWJsZUtleStcIjogXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gSlNPTi5zdHJpbmdpZnkocHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKS5zcGxpdChcIlxcblwiKS5tYXAoKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpID09PSAwKXJldHVybiBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiICAgIFwiICsgc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIlxcblwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wT2JqZWN0ID0gXCJ7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJvcFN0cmluZ3MubGVuZ3RoKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLmZvckVhY2goKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0xhc3QgPSBpID09PSBwcm9wU3RyaW5ncy5sZW5ndGggLSAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBpID09PSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzRmlyc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwiLFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJcXG4gICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IHN0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTGFzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz1cIlxcbn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbkRhdGEgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwic3RyaW5nXCIgJiYgY2hpbGRyZW4uc3RhcnRzV2l0aChcIlJlYWN0LmNyZWF0ZUVsZW1lbnRcIikgPyBjaGlsZHJlbiA6IEpTT04uc3RyaW5naWZ5KGNoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFJlYWN0LmNyZWF0ZUVsZW1lbnQoJHtjb21wUGF0aH0sICR7cHJvcE9iamVjdH0sICR7Y2hpbGRyZW5EYXRhfSlgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICg8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAge0FsbFByZXZpZXdzLm1hcChjYXRlZ29yeSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLm9uQ2xpY2spcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0udGV4dClyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5jaGlsZHJlbilyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeS5sZW5ndGggPT09IDEpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtrZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkRyb3Bkb3duIG9wdGlvbnM9e2NhdGVnb3J5Lm1hcCgoZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJvcHQtXCIraW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBKU09OLnN0cmluZ2lmeShlW09iamVjdC5rZXlzKGUpWzBdXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX0gdmFsdWU9e1wib3B0LVwiKyhzdGF0ZS5vcHRpb25zW2tleV0gfHwgXCIwXCIpfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5vcHRpb25zLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2V5XTogKHZhbHVlLnZhbHVlIHx8IFwiMFwiKS5yZXBsYWNlKFwib3B0LVwiLCBcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSBzZWFyY2hhYmxlPXt0cnVlfS8+LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZT17c3RhdGUudGFifSBjaGlsZHJlbj17c3RhdGUudGFiID09PSBcInByZXZpZXdcIiA/IHJlbmRlclByZXZpZXcoKSA6IHJlbmRlckNvZGUoKX0gb25DaGFuZ2U9e29uQ2hhbmdlfS8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZW5kZXJzKCl7XHJcblxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcclxuaW1wb3J0IERlbGV0ZUljb24gZnJvbSBcIi4vaWNvbnMvZGVsZXRlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCB7IHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QbHVnaW5DYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5kZWxldGUgPSB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXHJcbiAgICAgICAgICAgIHRydXN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IChjb250YWluZXIsIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY0JvdHRvbSA9IGNUb3AgKyBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZVRvcCA9IGVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgIHJldHVybiAgKGVUb3AgPCBjVG9wIHx8IGVCb3R0b20gPiBjQm90dG9tKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5yZWZzLmNhcmROb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzTm9kZS5jbG9zZXN0KFwiZGl2W2NsYXNzKj1cXFwic2Nyb2xsZXItXFxcIl1cIilcclxuICAgICAgICAgICAgaWYgKCFpc0hpZGRlbihjb250YWluZXIsIHRoaXNOb2RlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZU9mZnNldCA9IERPTS5vZmZzZXQodGhpc05vZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzTm9kZU9mZnNldC50b3AgLSBjb250YWluZXJPZmZzZXQudG9wICsgY29udGFpbmVyLnNjcm9sbFRvcCAtIDMwO1xyXG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsIC0gKHByb2dyZXNzICogKG9yaWdpbmFsIC0gZW5kUG9pbnQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5zZXR0aW5nc1BhbmVsID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCgpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLW9wZW4gdWktc3dpdGNoLWl0ZW1cIiwgcmVmOiBcImNhcmROb2RlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsICE9PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDoge19faHRtbDogdGhpcy5zZXR0aW5nc1BhbmVsfX0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcikge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcclxuICAgICAgICBjb25zdCBuYW1lSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3tuYW1lfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbbmFtZUluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwibmFtZSBiZGEtbmFtZVwifSwgbmFtZSk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW3ZlcnNpb25JbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcInZlcnNpb24gYmRhLXZlcnNpb25cIn0sIHZlcnNpb24pO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvckluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7YXV0aG9yfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYXV0aG9yIGJkYS1hdXRob3JcIn07XHJcbiAgICAgICAgICAgIGlmIChhdXRob3IubGluayB8fCBhdXRob3IuaWQpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5pZCkgcHJvcHMub25DbGljayA9ICgpID0+IHtCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTsgQkRWMi5vcGVuRE0oYXV0aG9yLmlkKTt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpdGxlLmZsYXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlTGluayh0aXRsZSwgdXJsKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJzdHJpbmdcIikgcHJvcHMuaHJlZiA9IHVybDtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJmdW5jdGlvblwiKSBwcm9wcy5vbkNsaWNrID0gKGV2ZW50KSA9PiB7ZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHVybCgpO307XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCBjb2xvcj1cImJsYWNrXCIgc2lkZT1cInRvcFwiIHRleHQ9e3RpdGxlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1idXR0b25cIiBvbkNsaWNrPXthY3Rpb259PntjaGlsZHJlbn08L2Rpdj5cclxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaW5rcygpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBpZiAoYWRkb24ud2Vic2l0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiV2Vic2l0ZVwiLCBhZGRvbi53ZWJzaXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnNvdXJjZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU291cmNlXCIsIGFkZG9uLnNvdXJjZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcclxuICAgICAgICAgICAgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU3VwcG9ydCBTZXJ2ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdGVyID0gL1xcLmdnXFwvKC4qKSQvO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyLnRlc3QoY29kZSkpIGNvZGUgPSBjb2RlLm1hdGNoKHRlc3RlcilbMV07XHJcbiAgICAgICAgICAgICAgICBCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24ucGF0cmVvbikgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiUGF0cmVvblwiLCBhZGRvbi5wYXRyZW9uKSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xyXG4gICAgICAgIHJldHVybiAobGlua3MubGVuZ3RoIHx8IHRoaXMuaGFzU2V0dGluZ3MpICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtZm9vdGVyIGJkYS1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1saW5rcyBiZGEtbGlua3NcIn0sXHJcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmhhc1NldHRpbmdzICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7b25DbGljazogdGhpcy5zaG93U2V0dGluZ3MsIGNsYXNzTmFtZTogXCJiZC1idXR0b24gYmRhLXNldHRpbmdzLWJ1dHRvblwiLCBkaXNhYmxlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0sIFwiU2V0dGluZ3NcIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMudG9nZ2xlICYmIHRoaXMucHJvcHMudG9nZ2xlKHRoaXMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQoKSB7dGhpcy5wcm9wcy5lZGl0KHRoaXMubmFtZSk7fVxyXG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxyXG4gICAgcmVsb2FkKCkge3RoaXMucHJvcHMucmVsb2FkKHRoaXMubmFtZSk7fVxyXG5cclxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0IGF1dGhvcigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IHRoaXMucHJvcHMuYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IHRoaXMucHJvcHMuYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3Qge2F1dGhvcklkLCBhdXRob3JMaW5rfSA9IHRoaXMucHJvcHMuYWRkb247XHJcblxyXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cclxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzU2Nhbm5pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocmVzb2x2ZSh0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSA/IGNvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy51bm1vdW50ZWQpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiByZXN1bHQuc3VzcGVjdCA/IFwic3VzcGVjdFwiIDogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7fSlcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IFwic3VzcGVjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1oZWFkZXIgYmRhLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLXRpdGxlIGJkYS1oZWFkZXItdGl0bGVcIn0sIHRoaXMuYnVpbGRUaXRsZSh0aGlzLm5hbWUsIHRoaXMudmVyc2lvbiwge25hbWU6IHRoaXMuYXV0aG9yLCBpZDogYXV0aG9ySWQsIGxpbms6IGF1dGhvckxpbmt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmVkaXQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRWRpdFwiLCA8RWRpdEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmVkaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSAmJiB0aGlzLm1ha2VCdXR0b24oXCJEZWxldGVcIiwgPERlbGV0ZUljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmRlbGV0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkfSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyLXdyYXAgYmRhLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXIgYmQtYWRkb24tZGVzY3JpcHRpb24gYmRhLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCB0aGlzLmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmZvb3RlclxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xyXG5pbXBvcnQgQ29udGVudENvbHVtbiBmcm9tIFwiLi9jb250ZW50Q29sdW1uXCI7XHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi90b29sc1wiO1xyXG5pbXBvcnQgUmVsb2FkSWNvbiBmcm9tIFwiLi9yZWxvYWRJY29uXCI7XHJcbmltcG9ydCBBZGRvbkNhcmQgZnJvbSBcIi4vYWRkb25jYXJkXCI7XHJcbmltcG9ydCBTY3JvbGxlciBmcm9tIFwiLi9zY3JvbGxlclwiO1xyXG5pbXBvcnQgRHJvcGRvd24gZnJvbSBcIi4vY29tcG9uZW50cy9kcm9wZG93blwiO1xyXG5pbXBvcnQgU2VhcmNoIGZyb20gXCIuL2NvbXBvbmVudHMvc2VhcmNoXCI7XHJcblxyXG5pbXBvcnQge3NldHRpbmdzQ29va2llLCBwbHVnaW5Db29raWUsIHRoZW1lQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4vdG9vbHRpcFdyYXBcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuRm9sZGVyKCkge1xyXG4gICAgICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbSh0aGlzLmlzUGx1Z2lucyA/IENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQobmFtZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5lZGl0KG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgY29uc3Qgc2hvdWxkRGVsZXRlID0gYXdhaXQgdGhpcy5jb25maXJtRGVsZXRlKG5hbWUpO1xyXG4gICAgICAgIGlmICghc2hvdWxkRGVsZXRlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmRlbGV0ZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25maXJtRGVsZXRlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbChcIkFyZSBZb3UgU3VyZT9cIiwgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJHtuYW1lfT9gLCB7XHJcbiAgICAgICAgICAgICAgICBkYW5nZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEZWxldGVcIixcclxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge3Jlc29sdmUodHJ1ZSk7fSxcclxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7cmVzb2x2ZShmYWxzZSk7fVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc29ydE9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge2xhYmVsOiBcIk5hbWVcIiwgdmFsdWU6IFwibmFtZVwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkF1dGhvclwiLCB2YWx1ZTogXCJhdXRob3JcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJWZXJzaW9uXCIsIHZhbHVlOiBcInZlcnNpb25cIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJSZWNlbnRseSBBZGRlZFwiLCB2YWx1ZTogXCJhZGRlZFwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkxhc3QgTW9kaWZpZWRcIiwgdmFsdWU6IFwibW9kaWZpZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJGaWxlIFNpemVcIiwgdmFsdWU6IFwic2l6ZVwifSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXJlY3Rpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBc2NlbmRpbmdcIiwgdmFsdWU6IHRydWV9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRGVzY2VuZGluZ1wiLCB2YWx1ZTogZmFsc2V9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnNlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YXNjZW5kaW5nOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNvcnQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzb3J0OiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3F1ZXJ5OiBldmVudC50YXJnZXQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByb3BzKGFkZG9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAga2V5OiB0aGlzLmdldE5hbWUoYWRkb24pLFxyXG4gICAgICAgICAgICBlbmFibGVkOiB0aGlzLmNvb2tpZVt0aGlzLmdldE5hbWUoYWRkb24pXSxcclxuICAgICAgICAgICAgdG9nZ2xlOiB0aGlzLm1hbmFnZXIudG9nZ2xlLmJpbmQodGhpcy5tYW5hZ2VyKSxcclxuICAgICAgICAgICAgLy9lZGl0OiB0aGlzLmVkaXQuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBhZGRvbjogYWRkb24sXHJcbiAgICAgICAgICAgIGhhc2g6IGFkZG9uLmhhc2hcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlzdCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnR5cGUgPT09IFwicGx1Z2luc1wiID8gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpIDogT2JqZWN0LnZhbHVlcyhiZHRoZW1lcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWRkb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZEFkZG9ucyA9IHRoaXMubGlzdC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IHRoaXMuc3RhdGUuc29ydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3RhdGUuc29ydC5zbGljZSgxKTtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhLnBsdWdpbiAmJiBhLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhhLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgOiBhW3RoaXMuc3RhdGUuc29ydF07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiBiW3RoaXMuc3RhdGUuc29ydF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdC50b0xvY2FsZUxvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoc2Vjb25kLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICBpZiAoZmlyc3QgPiBzZWNvbmQpIHJldHVybiAxO1xyXG4gICAgICAgICAgICBpZiAoc2Vjb25kID4gZmlyc3QpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmFzY2VuZGluZykgc29ydGVkQWRkb25zLnJldmVyc2UoKTtcclxuICAgICAgICBjb25zdCByZW5kZXJlZCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgc29ydGVkQWRkb25zLmxlbmd0aDsgYSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uID0gc29ydGVkQWRkb25zW2FdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5xdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZShhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldEF1dGhvcihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuZ2V0RGVzY3JpcHRpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuZ2V0VmVyc2lvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkgbWF0Y2hlcyA9IG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IpIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGF1dGhvci50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBkZXNjcmlwdGlvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IHZlcnNpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcykgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKGFkZG9uKTtcclxuICAgICAgICAgICAgcmVuZGVyZWQucHVzaCg8RXJyb3JCb3VuZGFyeT48QWRkb25DYXJkIHsuLi5wcm9wc30gcmVsb2FkPXshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgdGhpcy5tYW5hZ2VyLnJlbG9hZC5iaW5kKHRoaXMubWFuYWdlcil9IC8+PC9FcnJvckJvdW5kYXJ5Pik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZW5kZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXROYW1lKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXROYW1lKCkgOiBhZGRvbi5uYW1lKTt9XHJcbiAgICBnZXRBdXRob3IoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXREZXNjcmlwdGlvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IGFkZG9uLmRlc2NyaXB0aW9uKTt9XHJcbiAgICBnZXRWZXJzaW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRWZXJzaW9uKCkgOiBhZGRvbi52ZXJzaW9uKTt9XHJcblxyXG4gICAgcmVuZGVyQ2hlY2tVcGRhdGVzKCl7XHJcbiAgICAgICAgaWYoIXdpbmRvdy5aZXJlc1BsdWdpbkxpYnJhcnkpcmV0dXJuIG51bGxcclxuICAgICAgICBpZighd2luZG93LlBsdWdpblVwZGF0ZXMpcmV0dXJuIG51bGxcclxuICAgICAgICBpZih0eXBlb2Ygd2luZG93LlBsdWdpblVwZGF0ZXMuY2hlY2tBbGwgIT09IFwiZnVuY3Rpb25cIilyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKCF0aGlzLmlzUGx1Z2lucylyZXR1cm4gbnVsbFxyXG5cclxuICAgICAgICByZXR1cm4gPHRvb2x0aXBXcmFwIHRleHQ9XCJDaGVja3MgZm9yIHVwZGF0ZXMgb2YgcGx1Z2lucyB0aGF0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBSaWdodC1jbGljayBmb3IgYSBsaXN0LlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT17e21hcmdpbkxlZnQ6IFwiMTBweFwifX0+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJmaWxsZWRcIiBzaXplPVwibWluXCIgaG92ZXJDb2xvcj1cImRlZmF1bHRcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJQbHVnaW4gdXBkYXRlIGNoZWNrIGluIHByb2dyZXNzLlwiLCB7dHlwZTogXCJpbmZvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuUGx1Z2luVXBkYXRlcy5jaGVja0FsbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIlBsdWdpbiB1cGRhdGUgY2hlY2sgY29tcGxldGUuXCIsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgY2hlY2tpbmcgdXBkYXRlLlwiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBjaGVja2luZyB1cGRhdGUuXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH19IHdyYXBwZXI9e2ZhbHNlfSBkaXNhYmxlZD17ZmFsc2V9PlxyXG4gICAgICAgICAgICAgICAgICAgIENoZWNrIGZvciBVcGRhdGVzXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC90b29sdGlwV3JhcD5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cclxuICAgICAgICAgICAgeyhwcm9wcykgPT4gXHJcbiAgICAgICAgICAgIDxSZWxvYWRJY29uIHsuLi5wcm9wc30gY2xhc3NOYW1lPVwiYmQtaWNvbiBiZC1yZWxvYWQgYmQtcmVsb2FkLWhlYWRlclwiIHNpemU9XCIxOHB4XCIgb25DbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGVtZU1vZHVsZS51cGRhdGVUaGVtZUxpc3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcclxuICAgICAgICAgICAgfX0gLz5cclxuICAgICAgICAgICAgfTwvVG9vbHRpcD47XHJcbiAgICAgICAgY29uc3QgYWRkb25DYXJkcyA9IHRoaXMuZ2V0QWRkb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiA8Q29udGVudENvbHVtbiB0aXRsZT17YCR7dGhpcy5wcm9wcy50eXBlLnRvVXBwZXJDYXNlKCl94oCUJHthZGRvbkNhcmRzLmxlbmd0aH1gfT5cclxuICAgICAgICAgICAgPGJ1dHRvbiBrZXk9XCJmb2xkZXItYnV0dG9uXCIgY2xhc3NOYW1lPVwiYmQtYnV0dG9uIGJkLXBmYnRuXCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9Pk9wZW4ge3RoaXMuaXNQbHVnaW5zID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIn0gRm9sZGVyPC9idXR0b24+XHJcbiAgICAgICAgICAgIHt0aGlzLnJlbmRlckNoZWNrVXBkYXRlcygpfVxyXG4gICAgICAgICAgICB7IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHJlZnJlc2hJY29ufVxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWNvbnRyb2xzIGJkLWFkZG9uLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgICAgICA8U2VhcmNoIG9uQ2hhbmdlPXt0aGlzLnNlYXJjaH0gcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHt0aGlzLnByb3BzLnR5cGV9Li4uYH0gLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tZHJvcGRvd25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5Tb3J0IGJ5OjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLnNvcnRPcHRpb25zfSBvbkNoYW5nZT17dGhpcy5zb3J0fSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPk9yZGVyOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLmRpcmVjdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnJldmVyc2V9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkYS1zbGlzdCBiZC1hZGRvbi1saXN0XCI+e2FkZG9uQ2FyZHN9PC9kaXY+XHJcbiAgICAgICAgPC9Db250ZW50Q29sdW1uPlxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IENhcmRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYXJkTGlzdC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRMb2dvIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwibWV0YWRhdGFcIiwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxNVwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzNcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjEwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzMpXCJ9LCBkOiBcIk0xMTk1LjQ0KzEzNS40NDJMMTE5NS40NCsxMzUuNDQyTDk5Ny42KzEzNi40NDJDMTAyNC4yKzE0OS43NDIrMTE3MC4zNCsxNjMuNTQyKzExOTMuNjQrMTc5Ljc0MkMxMjY0LjM0KzIyOC44NDIrMTMxOS43NCsyOTEuMjQyKzEzNTguMjQrMzY1LjA0MkMxMzk4LjE0KzQ0MS42NDIrMTQxOS43NCs1MzAuNjQyKzE0MjIuNTQrNjI5LjY0MkwxNDIyLjU0KzYzMC44NDJMMTQyMi41NCs2MzIuMDQyQzE0MjIuNTQrNzczLjE0MisxNDIyLjU0KzEyMjguMTQrMTQyMi41NCsxMzY5LjE0TDE0MjIuNTQrMTM3MC4zNEwxNDIyLjU0KzEzNzEuNTRDMTQxOS44NCsxNDcwLjU0KzEzOTguMjQrMTU1OS41NCsxMzU4LjI0KzE2MzYuMTRDMTMxOS43NCsxNzA5Ljk0KzEyNjQuNDQrMTc3Mi4zNCsxMTkzLjY0KzE4MjEuNDRDMTE3MS4wNCsxODM3LjE0KzEwMjUuNysxODUwLjU0KzEwMDArMTg2My41NEwxMTkzLjU0KzE4NjQuNTRDMTUzOS43NCsxODY2LjQ0KzE4NjQuNTQrMTY5My4zNCsxODY0LjU0KzEyOTYuNjRMMTg2NC41NCs3MTYuOTQyQzE4NjYuNDQrMzEyLjQ0MisxNTQxLjY0KzEzNS40NDIrMTE5NS40NCsxMzUuNDQyWlwiLCBmaWxsOiBcIiMxNzE3MTdcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzEpXCJ9LCBkOiBcIk0xNDY5LjI1KzYzMS40NDJDMTQ1OS41NSsyNzguMDQyKzExODMuMDUrMTM1LjQ0Mis4MjYuNjUrMTM1LjQ0MkwxMzUuNDUrMTM1LjQ0MkwxMzUuNDUrMTAwNEMxMzUuNDUrMTAwNCsxMzUuNDI3KzEyNTUuMjErMzU1LjYyNisxMjU1LjIxQzU3NS44MjUrMTI1NS4yMSs1NzUuODQ4KzEwMDQrNTc1Ljg0OCsxMDA0TDU3Ny40NSs0OTAuNDQyTDgzNC40NSs0OTAuNDQyQzExMDguOTUrNDkwLjQ0MisxMTA4Ljk1KzgzNS4zNDIrODM0LjQ1KzgzNS4zNDJMNjY0LjY1KzgzNS4zNDJMNjY0LjY1KzExNjQuODRMODM0LjQ1KzExNjQuODRDOTIzLjkzMisxMTY0Ljg0Kzk4NC4yNDQrMTIwMS40OCsxMDE1LjM5KzEyNTAuODdDMTA3OS43OCsxMzUzKzEwMTkuNDcrMTUwOS42NCs4MzQuNDUrMTUwOS42NEwxMzUuNDUrMTUwOS42NEwxMzUuNDUrMTg2NC41NEw4MjYuNjUrMTg2NC41NEMxMTgyLjk1KzE4NjQuNTQrMTQ1OS40NSsxNzIxLjk0KzE0NjkuMjUrMTM2OC41NEMxNDY5LjI1KzEyMDUuOTQrMTQyNC43NSsxMDg0LjQ0KzEzNDYuMzUrOTk5Ljk0MkMxNDI0Ljc1KzkxNS41NDIrMTQ2OS4yNSs3OTQuMDQyKzE0NjkuMjUrNjMxLjQ0MlpcIiwgZmlsbDogXCIjRkZGRkZGXCIsIG9wYWNpdHk6IFwiMVwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NoZWNrYm94IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImxpXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94IFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3gsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWlubmVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94SW5uZXIpWzBdLmNoZWNrYm94SW5uZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi4vaWNvbnMvZG93bmFycm93XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XHJcbiAgICAgICAgdGhpcy5kcm9wZG93biA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZGVNZW51ID0gdGhpcy5oaWRlTWVudS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dNZW51KGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZU1lbnUoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3RlZCgpIHtyZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09IHRoaXMuc3RhdGUudmFsdWUpO31cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LW9wdGlvbnNcIj5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qtb3B0aW9uJHtzZWxlY3RlZC52YWx1ZSA9PSBvcHQudmFsdWUgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gfSBvbkNsaWNrPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcywgb3B0LnZhbHVlKX0+e29wdC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZSA9PSBcInRyYW5zcGFyZW50XCIgPyBcIiBiZC1zZWxlY3QtdHJhbnNwYXJlbnRcIiA6IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5zdGF0ZS5vcGVuID8gXCIgbWVudS1vcGVuXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuLy8gcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBcIj5cclxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cclxuLy8gPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbi8vICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbi8vICAgICA8L2Rpdj5cclxuLy8gPC9kaXY+XHJcbi8vIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4vLyA8L2Rpdj47IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWFyY2gtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0gb25LZXlEb3duPXt0aGlzLnByb3BzLm9uS2V5RG93bn0gdHlwZT1cInRleHRcIiBjbGFzc05hbWU9XCJiZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gbWF4TGVuZ3RoPVwiNTBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTZWFyY2hJY29uIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7Y2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkfTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuU3dpdGNoIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB2YWx1ZT17dGhpcy5zdGF0ZS5jaGVja2VkfSAvPlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMucHJvcHMudGl0bGUgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHRoaXMucHJvcHMudGl0bGUpIDogbnVsbFxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGNvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbiArIFwiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLCBzdHlsZToge3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0sXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5wcm9wcy5saW5lcyA9IDA7XHJcbiAgICAgICAgc2VsZi5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2hlZEVkaXRvciA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQ3NzRWRpdG9yRGV0YWNoZWQsIHthdHRhY2g6IHNlbGYuYXR0YWNofSk7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoID0gc2VsZi5kZXRhY2guYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRoaXMucHJvcHMuZGV0YWNoZWQgfHwgQkRWMi5lZGl0b3JEZXRhY2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9tb25va2FpXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChwcmV2U3RhdGUuZGV0YWNoZWQgJiYgIXNlbGYuc3RhdGUuZGV0YWNoZWQpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYuZGV0YWNoZWRSb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29kZU1pcnJvcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gYXRvYihfY2Nzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHtkZXRhY2hlZH0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiZWRpdG9yLWRldGFjaGVkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImgzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAhZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBkZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlByZXNzIFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcIixcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhhcmcpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGFyZykge1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGV0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgYnRvYSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZHJvb3QgPSBzZWxmLmRldGFjaGVkUm9vdDtcclxuICAgICAgICBpZiAoIWRyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcC5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvbW9ub2thaVwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IGF0b2IoX2Njc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2NzcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcC5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJiZC1kZXRhY2hlZC1jc3MtZWRpdG9yXCIsIGlkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtZWRpdG9yXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1pbm5lcnBhbmVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogc2VsZi5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImF0dGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soaWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhdHRhY2hcIjpcclxuICAgICAgICAgICAgICAgIGlmIChET00ucXVlcnkoXCIjZWRpdG9yLWRldGFjaGVkXCIpKSBzZWxmLnByb3BzLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYucm9vdCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJvb3QucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBidG9hKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSkpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJERXJyb3JCb3VuZGFyeSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICB0aGlzLnN0YXRlID0ge2hhc0Vycm9yOiBmYWxzZX07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goKSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2hhc0Vycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInJlYWN0LWVycm9yXCJ9LCBcIkNvbXBvbmVudCBFcnJvclwiKTsgIFxyXG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjsgXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCREVycm9yQm91bmRhcnkucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsgIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25BcnJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xMiA5LjI5TDEyIDEzLjE3bDMuODgtMy44OGMuMzktLjM5IDEuMDItLjM5IDEuNDEgMCAuMzkuMzkuMzkgMS4wMiAwIDEuNDFsLTQuNTkgNC41OWMtLjM5LjM5LTEuMDIuMzktMS40MSAwTDYuNyAxMC43Yy0uMzktLjM5LS4zOS0xLjAyIDAtMS40MS4zOS0uMzggMS4wMy0uMzkgMS40MiAwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjRkZGRkZGXCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIgLz5cclxuICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59Iiwiey8qIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIiB3aWR0aD1cIjE4cHhcIiBoZWlnaHQ9XCIxOHB4XCI+XHJcbiAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxyXG48L3N2Zz4gKi99XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGlzdG9yeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE4cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIiNGRkZGRkZcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cIiNGRkZGRkZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZSltYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiXHJcbmltcG9ydCB0aW1lc3RhbXBSZW5kZXIgZnJvbSBcIi4vdGltZXN0YW1wUmVuZGVyXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcblxyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHJlc2VuY2VTZXR0aW5ncyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxyXG4gICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpZXcgPSBudWxsXHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzID0gbmV3IFNldCgpXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlV2hlbkZldGNoZWQoY29tcCl7XHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuYWRkKGNvbXApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SW5wdXRUZXh0fSBzZXR0aW5nIFxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRTZXR0aW5nID0gUlBDUHJvcHMuZmluZChlID0+IGUuaWQgPT09IHNldHRpbmcucHJvcHMuaWQpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCB0aGlzLnN0YXRlLmRhdGEsIHtcclxuICAgICAgICAgICAgICAgIFtkZWZhdWx0U2V0dGluZy5pZF06ICEhdmFsdWUgPyB2YWx1ZSA6IG51bGxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5zdGF0ZS5hc3NldHNcclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKClcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxyXG4gICAgfVxyXG5cclxuICAgIGZldGNoQXNzZXRzKCl7XHJcbiAgICAgICAgaWYodGhpcy5pc2ZldGNoaW5nID09PSB0cnVlKXtcclxuICAgICAgICAgICAgbGV0IGFwcCA9IHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCAhPT0gYXBwKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IHRydWVcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZmV0Y2hBc3NldHModGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKVxyXG4gICAgICAgIC50aGVuKGFzc2V0cyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBPYmplY3Qua2V5cyhhc3NldHMpLm1hcChrID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXNzZXQgPSBhc3NldHNba11cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogYXNzZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVByZXZpZXcoZGF0YSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGFcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyB8fCAoVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc0dyb3VwIHRpdGxlPVwiUmljaFByZXNlbmNlIFNldHRpbmdzXCIgc2V0dGluZ3M9e3RoaXMucHJvcHMuc2V0dGluZ3N9IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfS8+LFxyXG4gICAgICAgICAgICA8TWFyZ2luVG9wIC8+LFxyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlJpY2hQcmVzZW5jZVwiLz4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7LyoqIG9wdGlvbnMgKi99XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29tcG9uZW50c31cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcCAvPlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJQcmV2aWV3XCIvPlxyXG4gICAgICAgICAgICAgICAgey8qKiBwcmV2aWV3ICovfVxyXG4gICAgICAgICAgICAgICAgPFJwY1ByZXZpZXcgc2V0dGluZ3M9e3RoaXN9Lz5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj4sXHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17d2luZG93Lm9oZ29kb2hmdWNrfT5cclxuICAgICAgICAgICAgICAgIE9oIGdvZCBPaCBmdWNrXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZW1vdGUuc2hlbGwub3BlbkV4dGVybmFsKFwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1Ma1lhN3Jwc19nNFwiKVxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIFNlZSA/IEkgcHVsbGVkIGEgbGl0bGUgc25lYWt5IG9uIHlhXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9uc0NvbXBvbmVudHMoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgfHwgKHRoaXMuX29wdGlvbnNDb21wb25lbnRzID0gUlBDUHJvcHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICBpZihlLnR5cGUgPT09IFwidGV4dFwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRUZXh0IHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBbPElucHV0TnVtYmVyIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XS8qXHJcbiAgICAgICAgICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH19IC8+KVxyXG4gICAgICAgICAgICAgICAgfSovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcImNob2ljZVwiKXtcclxuICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dENob2ljZSBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0gY2hvaWNlcz17W3t2YWx1ZTogXCJub25lXCIsIGxhYmVsOiBcIk5vIGFzc2V0c1wifV0uY29uY2F0KHRoaXMuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVua25vd24gY2hvaWNlLlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxufVxyXG5jb25zdCBSUENQcm9wcyA9IFtcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJBcHBsaWNhdGlvbiBJRFwiLFxyXG4gICAgICAgIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJOYW1lXCIsXHJcbiAgICAgICAgaWQ6IFwibmFtZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkRldGFpbHNcIixcclxuICAgICAgICBpZDogXCJkZXRhaWxzXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiQnJvd3NpbmcgRGlzY29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlN0YXRlXCIsXHJcbiAgICAgICAgaWQ6IFwic3RhdGVcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmQgQ2xpZW50XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiVGltZXN0YW1wIFN0YXJ0XCIsXHJcbiAgICAgICAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXHJcbiAgICAgICAgZ2V0IHBsYWNlaG9sZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMYXJnZUFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLmxhcmdlXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTbWFsbEFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLnNtYWxsXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuXVxyXG5cclxubGV0IGlucHV0VGV4dE1vZHVsZXNcclxuY2xhc3MgSW5wdXRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIGlmKGlucHV0VGV4dE1vZHVsZXMgJiYgaW5wdXRUZXh0TW9kdWxlc1swXSlyZXR1cm4gaW5wdXRUZXh0TW9kdWxlc1xyXG4gICAgICAgIHJldHVybiBpbnB1dFRleHRNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgICAgIGlucHV0TW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMixcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dE51bWJlck1vZHVsZXNcclxuY2xhc3MgSW5wdXROdW1iZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0TnVtYmVyTW9kdWxlcyB8fCAoSW5wdXROdW1iZXJNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXSxcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gdHlwZT1cIm51bWJlclwiIG9uQ2hhbmdlPXsodmFsdWUsIG5hbWUsIGlucHV0KSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdKy9nLCBcIlwiKVxyXG4gICAgICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLnN0YXRlLmRhdGEpe1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICAgICAge3NldHRpbmcuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiID8gXHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgfX0gY29sb3I9XCJicmFuZFwiPkNvcHkgY3VycmVudCB0aW1lc3RhbXA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPiA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgSW5wdXRDaG9pY2VNb2R1bGVzXHJcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA/IFwiYXNzZXQtXCIrdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gOiBcIm5vbmVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIudXBkYXRlV2hlbkZldGNoZWQodGhpcylcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShkYXRhKXtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRhLnZhbHVlXHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSA9PT0gXCJub25lXCIgPyBudWxsIDogdmFsdWUucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSA9PT0gXCJub25lXCIgPyBudWxsIDogdGhpcy5zdGF0ZS5kYXRhLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBJbnB1dENob2ljZU1vZHVsZXMgfHwgKElucHV0Q2hvaWNlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgb3B0aW9ucy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICBsYWJlbDogXCJObyBhc3NldHNcIlxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb3B0aW9ucz17b3B0aW9uc30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gLz5cclxuICAgICAgICAgICAgICAgIHsvKjxTZWxlY3QgdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gb3B0aW9ucz17b3B0aW9uc30vPiovfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IERpdmlkZXJNb2R1bGVzID0gW11cclxuY2xhc3MgRGl2aWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gRGl2aWRlck1vZHVsZXMmJkRpdmlkZXJNb2R1bGVzWzBdID8gRGl2aWRlck1vZHVsZXMgOiAoRGl2aWRlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlckRlZmF1bHQpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBkaXZpZGVyLFxyXG4gICAgICAgICAgICBkaXZpZGVyRGVmYXVsdFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2Ake2RpdmlkZXIuZGl2aWRlcn0gJHtkaXZpZGVyRGVmYXVsdC5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfSBjb2xvcj1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMgPSB7fSl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBcInByb2ZpbGVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRhYnMgPSBbXVxyXG5cclxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGFiKHRhYil7XHJcbiAgICAgICAgbGV0IGFuY2llbnRUYWIgPSB0aGlzLnN0YXRlLmFjdGl2ZVxyXG4gICAgICAgIGlmKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZClyZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc2V0QWN0aXZlKGZhbHNlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGFiLnNldEFjdGl2ZSh0cnVlKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHByZXZpZXcgPSBuZXcgdGhpcy5wcmV2aWV3KHtcclxuICAgICAgICAgICAgcHJldmlldzogdGhpc1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnN0YXRlLnJwYylcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYm5hdlwiIHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiRnVsbCBQcm9maWxlXCIgaWQ9XCJwcm9maWxlXCIvPlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7cHJldmlldy5yZW5kZXIoKX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9ICAgXHJcblxyXG4gICAgaXNBY3RpdmUodGFiKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYlxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcmV2aWV3KCl7XHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUgPT09IFwicHJvZmlsZVwiKXJldHVybiBQcm9maWxlXHJcbiAgICAgICAgcmV0dXJuIFBvcG91dFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IHByb3BzLnByZXZpZXcuaXNBY3RpdmUocHJvcHMuaWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BzLnByZXZpZXcudGFicy5wdXNoKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0QWN0aXZlKGlzQWN0aXZlKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiAhIWlzQWN0aXZlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gYGxjLW5hdkl0ZW1gXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUpe1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtQWN0aXZlYFxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wcmV2aWV3LmNoYW5nZVRhYih0aGlzKVxyXG4gICAgICAgIH19PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBwb3BvdXRNb2R1bGVcclxuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHsgLy8gVE9ETzogUHJvYmFibHkgdXNlIGludGVybmFsIENvbXBvbmVudHMgaW5zdGVhZCBvZiBtYWtpbmcgaXQgZnJvbSBzY3JhdGNoLlxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gcG9wb3V0TW9kdWxlIHx8IChwb3BvdXRNb2R1bGUgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJQb3BvdXQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ib3QpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hY3Rpdml0eVVzZXJQb3BvdXQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tdXRlZCAmJiBlLndyYXBwZXIgJiYgZS5iYXNlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudGhlbWVHaG9zdEhhaXJsaW5lQ2hhbm5lbHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub3RlICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBybyAmJiBlLmlubGluZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcylbMF0uZGVmYXVsdC5NZXNzYWdlcyxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0XHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICBuYW1lVGFnTW9kdWxlMSxcclxuICAgICAgICAgICAgYWN0aXZpdHlNb2R1bGUxLFxyXG4gICAgICAgICAgICB0ZXh0TW9kdWxlMSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNjcm9sbGVyTW9kdWxlMSxcclxuICAgICAgICAgICAgbm90ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHByb3RpcE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlMSxcclxuICAgICAgICAgICAgTWVzc2FnZXMsXHJcbiAgICAgICAgICAgIGF2YXRhck1vZHVsZTEsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGUxXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIGxldCB1c2VyID0gdXNlck1vZHVsZTEuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmF2YXRhclVSTFxyXG4gICAgICAgIGlmKHVzZXIuYXZhdGFyICYmIHVzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IHVzZXIuZ2V0QXZhdGFyVVJMKFwiZ2lmXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIHRpbWVzdGFtcENsYXNzID0gdGltZXN0YW1wQ2xhc3MgfHwgYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcFxyXG5cclxuICAgICAgICBsZXQgaW1hZ2VzID0gKCgpID0+IHtcclxuICAgICAgICAgICAgaWYoIWRhdGFbXCJhc3NldHMubGFyZ2VcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdXHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgfSBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlSW1hZ2VVc2VyUG9wb3V0fSAke2RhdGFbXCJhc3NldHMuc21hbGxcIl0gPyBhY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VNYXNrVXNlclBvcG91dCA6IFwiXCJ9YH0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2B9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzU21hbGxJbWFnZVVzZXJQb3BvdXR9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCFpbWFnZXMubGVuZ3RoKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzfT5cclxuICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0pKClcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdXNlclBvcG91dCBsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VyUG9wb3V0fSByb2xlPVwiZGlhbG9nXCIgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyUGxheWluZ30+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS52ZXJ0aWNhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5Q2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLmFsaWduQ2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5oZWFkZXJUb3B9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYXZhdGFyV3JhcHBlck5vcm1hbH0gcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YXZhdGFyTW9kdWxlMX0gcm9sZT1cImltZ1wiIHN0eWxlPXt7d2lkdGg6IFwiODBweFwiLCBoZWlnaHQ6IFwiODBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjkyXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDkyIDgwXCIgY2xhc3M9e2Ake2F2YXRhck1vZHVsZTEubWFza30gJHthdmF0YXJNb2R1bGUxLnN2Z31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17YXZhdGFyVVJMfSBhbHQ9XCIgXCIgY2xhc3M9e2F2YXRhck1vZHVsZTEuYXZhdGFyfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdGF0dXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBjbGFzcz17cm9vdE1vZHVsZTEuYXZhdGFySGludH0gdmlld0JveD1cIjAgMCA4MCA4MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJIaW50SW5uZXJ9PntNZXNzYWdlcy5WSUVXX1BST0ZJTEV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJUZXh0fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEuaGVhZGVyVGFnTm9OaWNrbmFtZX0gJHtuYW1lVGFnTW9kdWxlMS5uYW1lVGFnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YCR7bmFtZVRhZ01vZHVsZTEudXNlcm5hbWV9ICR7cm9vdE1vZHVsZTEuaGVhZGVyVGFnVXNlcm5hbWVOb05pY2tuYW1lfWB9Pnt1c2VyLnVzZXJuYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+I3t1c2VyLmRpc2NyaW1pbmF0b3J9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eVVzZXJQb3BvdXR9ICR7cm9vdE1vZHVsZTEuYWN0aXZpdHl9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmhlYWRlclRleHROb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0+e01lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkd9PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2ltYWdlcyA/IGFjdGl2aXR5TW9kdWxlMS5jb250ZW50SW1hZ2VzVXNlclBvcG91dCA6IGFjdGl2aXR5TW9kdWxlMS5jb250ZW50Tm9JbWFnZXNVc2VyUG9wb3V0fSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5uYW1lKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5uYW1lTm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fWB9IHRpdGxlPXtkYXRhLm5hbWV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eU5hbWV9PntkYXRhLm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLmRldGFpbHMpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgdGl0bGU9e2RhdGEudGl0bGV9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuZGV0YWlsc30+e2RhdGEuZGV0YWlsc308L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5zdGF0ZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnN0YXRlfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPXtkYXRhLnN0YXRlfT57ZGF0YS5zdGF0ZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZUNvbXBvbmVudCA9IHRpbWVzdGFtcFJlbmRlcihUaW1lc3RhbXAsIE1lc3NhZ2VzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Jvb3RNb2R1bGUxLmJvZHl9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJ9ICR7cm9vdE1vZHVsZTEuYm9keUlubmVyfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5ib2R5VGl0bGV9PntNZXNzYWdlcy5OT1RFfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtub3RlTW9kdWxlMS5ub3RlfSAke3Jvb3RNb2R1bGUxLm5vdGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcGxhY2Vob2xkZXI9e01lc3NhZ2VzLk5PVEVfUExBQ0VIT0xERVJ9IG1heGxlbmd0aD1cIjI1NlwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgY2xhc3M9e0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IHN0eWxlPXt7aGVpZ2h0OiBcIjM2cHhcIn19IGRpc2FibGVkPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5mb290ZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLnByb3RpcH0gJHtwcm90aXBNb2R1bGUxLmlubGluZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHtwcm90aXBNb2R1bGUxLnByb30gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfSBzdHlsZT17e2NvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCJ9fT57TWVzc2FnZXMuUElOTkVEX01FU1NBR0VTX1BST19USVB9PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7Y29sb3JNb2R1bGUxLmNvbG9yU3RhbmRhcmR9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fSAke3Byb3RpcE1vZHVsZTEudGlwfWB9PntNZXNzYWdlcy5DT05URVhUX01FTlVfSElOVH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBTdGF0dXNNb2R1bGVzXHJcbmNsYXNzIFN0YXR1cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBTdGF0dXNNb2R1bGVzIHx8IChTdGF0dXNNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRQcmVzZW5jZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLnBvaW50ZXJFdmVudHNcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGdldFByZXNlbmNlLFxyXG4gICAgICAgICAgICBwb2ludGVyRXZlbnRzXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIGxldCBzdGF0dXMgPSBnZXRQcmVzZW5jZS5kZWZhdWx0LmdldFByZXNlbmNlKCkuc3RhdHVzXHJcbiAgICAgICAgaWYoc3RhdHVzID09PSBcImludmlzaWJsZVwiKXN0YXR1cyA9IFwib2ZmbGluZVwiXHJcbiAgICAgICAgcmV0dXJuIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHg9XCI2MFwiIHk9XCI2MFwiIGZpbGw9XCIjZmZmZmZmXCIgbWFzaz17YHVybCgjc3ZnLW1hc2stc3RhdHVzLSR7c3RhdHVzfSlgfSBjbGFzc05hbWU9e3BvaW50ZXJFdmVudHN9PjwvcmVjdD5cclxuICAgIH1cclxufVxyXG5cclxubGV0IHRpbWVzdGFtcENsYXNzID0gXCJcIlxyXG5cclxubGV0IFByb2ZpbGVNb2R1bGVzXHJcbmNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgeyAvLyBUT0RPOiBQcm9iYWJseSB1c2UgaW50ZXJuYWwgQ29tcG9uZW50cyBpbnN0ZWFkIG9mIG1ha2luZyBpdCBmcm9tIHNjcmF0Y2guXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBQcm9maWxlTW9kdWxlcyB8fCAoUHJvZmlsZU1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXggJiYgZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmJvdClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFjdGl2aXR5UHJvZmlsZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm11dGVkICYmIGUud3JhcHBlciAmJiBlLmJhc2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlckZhZGUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub3RlICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzKVswXS5kZWZhdWx0Lk1lc3NhZ2VzXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5hdmF0YXJVUkxcclxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTChcImdpZlwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBuYW1lVGFnTW9kdWxlMSxcclxuICAgICAgICAgICAgYWN0aXZpdHlNb2R1bGUxLFxyXG4gICAgICAgICAgICB0ZXh0TW9kdWxlMSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNjcm9sbGVyTW9kdWxlMSxcclxuICAgICAgICAgICAgbm90ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIHRpbWVzdGFtcENsYXNzID0gdGltZXN0YW1wQ2xhc3MgfHwgYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcFxyXG5cclxuICAgICAgICBsZXQgaW1hZ2VzID0gKCgpID0+IHtcclxuICAgICAgICAgICAgaWYoIWRhdGFbXCJhc3NldHMubGFyZ2VcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdXHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgfSBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlSW1hZ2VQcm9maWxlfSAke2RhdGFbXCJhc3NldHMuc21hbGxcIl0gPyBhY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VNYXNrUHJvZmlsZSA6IFwiXCJ9YH0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2B9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzU21hbGxJbWFnZVByb2ZpbGV9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCFpbWFnZXMubGVuZ3RoKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzfT5cclxuICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0pKClcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWIgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEudmVydGljYWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduU3RyZXRjaH0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEucm9vdH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnRvcFNlY3Rpb25QbGF5aW5nfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmF2YXRhcn0gJHthdmF0YXJNb2R1bGUxLndyYXBwZXJ9YH0gcm9sZT1cImltZ1wiIHN0eWxlPXt7d2lkdGg6IFwiODBweFwiLCBoZWlnaHQ6IFwiODBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjkyXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDkyIDgwXCIgY2xhc3M9e2Ake2F2YXRhck1vZHVsZTEubWFza30gJHthdmF0YXJNb2R1bGUxLnN2Z31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17YXZhdGFyVVJMfSBhbHQ9XCIgXCIgY2xhc3M9e2F2YXRhck1vZHVsZTEuYXZhdGFyfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdGF0dXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEuaGVhZGVySW5mb31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5uYW1lVGFnfSAke25hbWVUYWdNb2R1bGUxLm5hbWVUYWd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtgJHtyb290TW9kdWxlMS51c2VybmFtZX0gJHtyb290TW9kdWxlMS51c2VybmFtZX1gfT57dXNlci51c2VybmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtyb290TW9kdWxlMS5kaXNjcmltaW5hdG9yfT4je3VzZXIuZGlzY3JpbWluYXRvcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtmbGV4TW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnblN0cmV0Y2h9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZXN9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlcyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJGaWxsfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eVByb2ZpbGV9ICR7cm9vdE1vZHVsZTEuYWN0aXZpdHl9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYm9keU5vcm1hbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2ltYWdlcyA/IGFjdGl2aXR5TW9kdWxlMS5jb250ZW50SW1hZ2VzUHJvZmlsZSA6IGFjdGl2aXR5TW9kdWxlMS5jb250ZW50Tm9JbWFnZXNVc2VyUG9wb3V0fSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEubmFtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5uYW1lTm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fWB9IHRpdGxlPXtkYXRhLm5hbWV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZX0+e2RhdGEubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5kZXRhaWxzKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgdGl0bGU9e2RhdGEudGl0bGV9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuZGV0YWlsc30+e2RhdGEuZGV0YWlsc308L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5zdGF0ZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuc3RhdGV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT17ZGF0YS5zdGF0ZX0+e2RhdGEuc3RhdGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5ib2R5fT5cclxuXHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YH0+XHJcblx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJ9PlxyXG5cdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb259PlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJJbmZvU2VjdGlvbkhlYWRlcn0+e01lc3NhZ2VzLk5PVEV9PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEubm90ZX0gJHtub3RlTW9kdWxlMS5ub3RlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPXtNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSfSBtYXhsZW5ndGg9XCIyNTZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9e0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IHN0eWxlPXt7aGVpZ2h0OiBcIjQwcHhcIn19IGRpc2FibGVkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0ICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25uZWN0ZWRBY2NvdW50cyAvPlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbm5lY3RlZEFjY291bnRzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBhY2NvdW50cyA9IFtdXHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuICAgICAgICBsZXQgQWNjb3VudE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRBY2NvdW50cylbMF0uZGVmYXVsdFxyXG5cclxuICAgICAgICBsZXQgYWNjcyA9IEFjY291bnRNb2R1bGUxLmdldEFjY291bnRzKCkuZmlsdGVyKGUgPT4gZS52aXNpYmlsaXR5ID09PSAxKVxyXG4gICAgICAgIGZvcihsZXQgYWNjIG9mIGFjY3Mpe1xyXG4gICAgICAgICAgICBhY2NvdW50cy5wdXNoKDxDb25uZWN0ZWRBY2NvdW50IGFjYz17YWNjfSAvPilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKGFjY291bnRzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJJbmZvU2VjdGlvbn0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50c30+XHJcbiAgICAgICAgICAgICAgICAgICAge2FjY291bnRzfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBmbG93ZXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBhbmNob3JNb2R1bGUxLFxyXG4gICAgICAgICAgICBTb2NpYWxDb25zdGFudHNcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbGV4ICYmIGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hbmNob3IpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXQgJiYgZS5kZWZhdWx0Lm1hcClbMF0uZGVmYXVsdFxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgYWNjID0gdGhpcy5wcm9wcy5hY2NcclxuICAgICAgICBsZXQgY29uc3RhbnRzU29jaWFsID0gU29jaWFsQ29uc3RhbnRzLmdldChhY2MudHlwZSlcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnR9YH0gc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgPGltZyBhbHQ9e2BMb2dvICR7Y29uc3RhbnRzU29jaWFsLm5hbWV9YH0gY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRJY29ufSBzcmM9e2NvbnN0YW50c1NvY2lhbC5pY29uLmNvbG9yIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLndoaXRlIHx8IGNvbnN0YW50c1NvY2lhbC5pY29uLmdyZXl9IC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnROYW1lSW5uZXJ9PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWV9PnthY2MubmFtZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIHthY2MudmVyaWZpZWQgPyAoPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7Zmxvd2VyTW9kdWxlMS5mbG93ZXJTdGFyQ29udGFpbmVyfSAke3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRWZXJpZmllZEljb259YH0gc3R5bGU9e3t3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz17Zmxvd2VyTW9kdWxlMS5mbG93ZXJTdGFyfSB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE1LjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjNGY1NDVjXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17Zmxvd2VyTW9kdWxlMS5jaGlsZENvbnRhaW5lcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTUuMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwiIGZpbGw9XCIjZmZmZmZmXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPikgOiBudWxsfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9e2Ake2FuY2hvck1vZHVsZTEuYW5jaG9yfSAke2FuY2hvck1vZHVsZTEuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gfSByZWw9XCJub3JlZmVycmVyIG5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE9wZW5JY29ufSB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTAgNVYzSDUuMzc1QzQuMDY1MTkgMyAzIDQuMDY1MTkgMyA1LjM3NVYxOC42MjVDMyAxOS45MzYgNC4wNjUxOSAyMSA1LjM3NSAyMUgxOC42MjVDMTkuOTM2IDIxIDIxIDE5LjkzNiAyMSAxOC42MjVWMTRIMTlWMTlINVY1SDEwWlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0yMSAyLjk5OTAySDE0VjQuOTk5MDJIMTcuNTg2TDkuMjkyOTcgMTMuMjkyTDEwLjcwNyAxNC43MDZMMTkgNi40MTMwMlY5Ljk5OTAySDIxVjIuOTk5MDJaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEJhZGdlcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgcm9vdE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdXHJcbiAgICAgICAgbGV0IFVzZXJGbGFncyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLlVzZXJGbGFncylbMF0uVXNlckZsYWdzXHJcbiAgICAgICAgbGV0IGJhZGdlcyA9IFtdXHJcbiAgICAgICAgbGV0IHNlcmlhbGl6ZWQgPSBbXVxyXG5cclxuICAgICAgICBmb3IobGV0IGZsYWdOYW1lIGluIFVzZXJGbGFncyl7XHJcbiAgICAgICAgICAgIGlmKHVzZXIuaGFzRmxhZyhVc2VyRmxhZ3NbZmxhZ05hbWVdKSlzZXJpYWxpemVkLnB1c2goZmxhZ05hbWUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGZsYWdOYW1lIG9mIHNlcmlhbGl6ZWQpe1xyXG4gICAgICAgICAgICBsZXQgc2VhcmNoYWJsZSA9IGBwcm9maWxlQmFkZ2Uke2ZsYWdOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIiBcIikuc3BsaXQoXCIgXCIpLm1hcChlID0+IGVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKS5qb2luKFwiXCIpfWBcclxuICAgICAgICAgICAgc2VhcmNoYWJsZSA9IHNlYXJjaGFibGUucmVwbGFjZShcIkh5cGVzcXVhZE9ubGluZVwiLCBcIkh5cGVTcXVhZE9ubGluZVwiKVxyXG4gICAgICAgICAgICBpZighcm9vdE1vZHVsZVtzZWFyY2hhYmxlXSljb250aW51ZVxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaCg8QmFkZ2UgbmFtZT17c2VhcmNoYWJsZX0vPilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHVzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbil7XHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKDxCYWRnZSBuYW1lPVwicHJvZmlsZUJhZGdlUHJlbWl1bVwiIC8+KVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYmFkZ2VzXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIEJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCByb290TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlV3JhcHBlcn0+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZX0gJHtyb290TW9kdWxlMVt0aGlzLnByb3BzLm5hbWVdfWB9PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFRpbWVzdGFtcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RpbWVzdGFtcENsYXNzfT5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMubWVzc2FnZX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uLy4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19MYXllciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMua2V5dXBMaXN0ZW5lciA9IHRoaXMua2V5dXBMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGtleXVwTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIGlmIChlLndoaWNoID09PSAyNykge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5yZWZzLnJvb3QucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy5rZXl1cExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhpc05vZGUgPSBET00ucXVlcnkoYCMke3RoaXMucHJvcHMuaWR9YCk7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxLjEgLSAwLjEgKiBwcm9ncmVzc30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqICgxIC0gcHJvZ3Jlc3MpfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSAxIC0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNOb2RlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiLnB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIGxheWVyLmNsYXNzTGlzdC5yZW1vdmUoXCJwdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezAuMDcgKiBwcm9ncmVzcyArIDAuOTN9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsYXllciA9IERPTS5xdWVyeShcIltjbGFzcyo9XFxcImxheWVyLVxcXCJdXCIpO1xyXG4gICAgICAgIGxheWVyLmNsYXNzTGlzdC5hZGQoXCJwdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezAuMDcgKiAoMSAtIHByb2dyZXNzKSArIDAuOTN9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImxheWVyIGJkLWxheWVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyICYmIGUuYW5pbWF0aW5nKVswXS5sYXllciwgaWQ6IHRoaXMucHJvcHMuaWQsIHJlZjogXCJyb290XCIsIHN0eWxlOiB7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiBcInNjYWxlKDEuMSkgdHJhbnNsYXRlWigwcHgpXCJ9fSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuLi90b29sc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuLi90YWJCYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IFRhYkJhckhlYWRlciBmcm9tIFwiLi4vdGFiQmFySGVhZGVyXCI7XHJcbmltcG9ydCBUYWJCYXJJdGVtIGZyb20gXCIuLi90YWJCYXJJdGVtXCI7XHJcblxyXG5pbXBvcnQgU2VydmVyQ2FyZCBmcm9tIFwiLi9zZXJ2ZXJDYXJkXCI7XHJcbmltcG9ydCBTaWRlYmFyVmlldyBmcm9tIFwiLi9zaWRlYmFyVmlld1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1B1YmxpY1NlcnZlcnMgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VDYXRlZ29yeSA9IHRoaXMuY2hhbmdlQ2F0ZWdvcnkuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hLZXlEb3duID0gdGhpcy5zZWFyY2hLZXlEb3duLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24gPSB0aGlzLmNoZWNrQ29ubmVjdGlvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuam9pbiA9IHRoaXMuam9pbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCA9IHRoaXMuY29ubmVjdC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLkd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0R3VpbGRzXCJdKTtcclxuICAgICAgICB0aGlzLkF2YXRhckRlZmF1bHRzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFVzZXJBdmF0YXJVUkxcIiwgXCJERUZBVUxUX0FWQVRBUlNcIl0pO1xyXG4gICAgICAgIHRoaXMuSW52aXRlQWN0aW9ucyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO1xyXG4gICAgICAgIHRoaXMuU29ydGVkR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRTb3J0ZWRHdWlsZHNcIl0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XHJcbiAgICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZXJ2ZXJzOiBbXSxcclxuICAgICAgICAgICAgbmV4dDogbnVsbCxcclxuICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgc3RhdGU6IDAsXHJcbiAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCkge1xyXG4gICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnByb3BzLnJvb3RJZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChxdWVyeSwgY2xlYXIpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBmZXRjaChgJHtzZWxmLmVuZFBvaW50fSR7cXVlcnl9JHtxdWVyeSA/IFwiJnNjaGVtYT1uZXdcIiA6IFwiP3NjaGVtYT1uZXdcIn1gLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIlxyXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IGF3YWl0IHJlcy50ZXh0KClcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgc2VydmVycyA9IGRhdGEucmVzdWx0cy5yZWR1Y2UoKGFyciwgc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXJ2ZXIpO1xyXG4gICAgICAgICAgICAgICAgLy8gYXJyLnB1c2goPFNlcnZlckNhcmQgc2VydmVyPXtzZXJ2ZXJ9IGpvaW49e3NlbGYuam9pbn0vPik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNsZWFyKSB7XHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzID0gc2VsZi5zdGF0ZS5zZXJ2ZXJzLmNvbmNhdChzZXJ2ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vc2VydmVycy51bnNoaWZ0KHNlbGYuYmRTZXJ2ZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0YS5zaXplICsgZGF0YS5mcm9tO1xyXG4gICAgICAgICAgICBkYXRhLm5leHQgPSBgP2Zyb209JHtlbmR9YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgZGF0YS5uZXh0ICs9IGAmdGVybT0ke3NlbGYuc3RhdGUudGVybX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5KSBkYXRhLm5leHQgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICAgICAgaWYgKGVuZCA+PSBkYXRhLnRvdGFsKSB7XHJcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLnRvdGFsO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHRpdGxlID0gYFNob3dpbmcgMS0ke2VuZH0gb2YgJHtkYXRhLnRvdGFsfSByZXN1bHRzIGluICR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSB0aXRsZSArPSBgIGZvciAke3NlbGYuc3RhdGUudGVybX1gO1xyXG5cclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgICAgIHNlcnZlcnM6IHNlcnZlcnMsXHJcbiAgICAgICAgICAgICAgICBuZXh0OiBkYXRhLm5leHRcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coc2VsZik7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlZnMuc2J2LnJlZnMuY29udGVudFNjcm9sbGVyLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkZhaWxlZCB0byBsb2FkIHNlcnZlcnMuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHNcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGpvaW4oc2VydmVyQ2FyZCkge1xyXG4gICAgICAgIGlmIChzZXJ2ZXJDYXJkLnByb3BzLnBpbm5lZCkgcmV0dXJuIHRoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGUoc2VydmVyQ2FyZC5wcm9wcy5pbnZpdGVfY29kZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IGZldGNoKGAke3RoaXMuam9pbkVuZFBvaW50fS8ke3NlcnZlckNhcmQucHJvcHMuc2VydmVyLmlkZW50aWZpZXJ9YCx7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNlcnZlckNhcmQuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGYud2luZG93T3B0aW9ucztcclxuICAgICAgICBvcHRpb25zLnggPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5YICsgd2luZG93LmlubmVyV2lkdGggLyAyIC0gb3B0aW9ucy53aWR0aCAvIDIpO1xyXG4gICAgICAgIG9wdGlvbnMueSA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblkgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyIC0gb3B0aW9ucy5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93ID0gbmV3ICh3aW5kb3cucmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5Ccm93c2VyV2luZG93KShvcHRpb25zKTtcclxuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93LndlYkNvbnRlbnRzLm9uKFwiZGlkLW5hdmlnYXRlXCIsIChldmVudCwgdXJsKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1cmwgIT0gXCJodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBzZWxmLmpvaW5XaW5kb3cuY2xvc2UoKTtcclxuICAgICAgICAgICAgc2VsZi5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cubG9hZFVSTCh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB3aW5kb3dPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogNTUwLFxyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxyXG4gICAgICAgICAgICBzaG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgYWx3YXlzT25Ub3A6IHRydWUsXHJcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZSxcclxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgd2ViUHJlZmVyZW5jZXM6IHtcclxuICAgICAgICAgICAgICAgIG5vZGVJbnRlZ3JhdGlvbjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJkU2VydmVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCI3NTAwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjIwMDAwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIEJldHRlckRpc2NvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vaWNvbnMvODYwMDQ3NDQ5NjY5MTQwNDgvMjkyZTdmNmJmZmYyYjcxZGZkMTNlNTA4YTg1OWFlZGQud2VicFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjMwK1wiLFxyXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjUwK1wiLFxyXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk9mZmljaWFsIExpZ2h0Y29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2F2YXRhcnMzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY1NjkwMDU4P3M9MjAwJnY9NFwiLFxyXG4gICAgICAgICAgICBuYXRpdmVqb2luOiB0cnVlLFxyXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXHJcbiAgICAgICAgICAgIHBpbm5lZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vai5kaXNjb3Jkc2VydmVycy5jb21cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdEVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vam9pbi5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrQ29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9gLHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcclxuICAgICAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IDAsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGViYXJWaWV3LCB7cmVmOiBcInNidlwifSwgdGhpcy5jb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2lkZWJhcjoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLnNpZGViYXJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLmNvbnRlbnRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdG9vbHM6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInB0XCIsIHJlZjogXCJ0b29sc1wiLCBvbkNsaWNrOiB0aGlzLmNsb3NlfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZGViYXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyXCIsIGtleTogXCJwc1wifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhciBTSURFXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiLCBzdHlsZToge2ZvbnRTaXplOiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIFwiUHVibGljIFNlcnZlcnNcIlxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckhlYWRlciwge3RleHQ6IFwiQ2F0ZWdvcmllc1wifSksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5QnV0dG9ucy5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySXRlbSwge2lkOiBpbmRleCwgb25DbGljazogdGhpcy5jaGFuZ2VDYXRlZ29yeSwga2V5OiBpbmRleCwgdGV4dDogdmFsdWUsIHNlbGVjdGVkOiB0aGlzLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgPT09IGluZGV4fSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5mb290ZXIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlYXJjaElucHV0KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10ZXh0LWlucHV0IGZsZXgtdmVydGljYWxcIiwgc3R5bGU6IHt3aWR0aDogXCIxNzJweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwge3JlZjogXCJzZWFyY2hpbnB1dFwiLCBvbktleURvd246IHRoaXMuc2VhcmNoS2V5RG93biwgb25DaGFuZ2U6ICgpID0+IHt9LCB0eXBlOiBcInRleHRcIiwgY2xhc3NOYW1lOiBcImlucHV0IGRlZmF1bHRcIiwgcGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsIG1heExlbmd0aDogXCI1MFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoS2V5RG93bihlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZyB8fCBlLndoaWNoICE9PSAxMykgcmV0dXJuO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIHRlcm06IGUudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYD90ZXJtPSR7ZS50YXJnZXQudmFsdWV9YDtcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKHF1ZXJ5LCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2F0ZWdvcnlCdXR0b25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXCJBbGxcIiwgXCJGUFMgR2FtZXNcIiwgXCJNTU8gR2FtZXNcIiwgXCJTdHJhdGVneSBHYW1lc1wiLCBcIk1PQkEgR2FtZXNcIiwgXCJSUEcgR2FtZXNcIiwgXCJUYWJsZXRvcCBHYW1lc1wiLCBcIlNhbmRib3ggR2FtZXNcIiwgXCJTaW11bGF0aW9uIEdhbWVzXCIsIFwiTXVzaWNcIiwgXCJDb21tdW5pdHlcIiwgXCJMYW5ndWFnZVwiLCBcIlByb2dyYW1taW5nXCIsIFwiT3RoZXJcIl07XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ2F0ZWdvcnkoaWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5yZWZzLnNlYXJjaGlucHV0LnZhbHVlID0gXCJcIjtcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogaWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogbnVsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpZCA9PT0gMCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlYXJjaChgP2NhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbaWRdfWAsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkTGlzdCA9IHRoaXMuU29ydGVkR3VpbGRTdG9yZS5nZXRGbGF0dGVuZWRHdWlsZElkcygpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuY29ubmVjdGlvbi5zdGF0ZSA9PT0gMSkgcmV0dXJuIHNlbGYubm90Q29ubmVjdGVkO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge3JlZjogXCJjb250ZW50XCIsIGtleTogXCJwY1wiLCBjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pLFxyXG4gICAgICAgICAgICBzZWxmLmJkU2VydmVyLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlcnZlcnMubWFwKChzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge2tleTogc2VydmVyLmlkZW50aWZpZXIsIHNlcnZlcjogc2VydmVyLCBqb2luOiBzZWxmLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLm5leHQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtzZWxmLnNldFN0YXRlKHtsb2FkaW5nOiB0cnVlfSk7IHNlbGYuc2VhcmNoKHNlbGYuc3RhdGUubmV4dCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIiwgc3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUubG9hZGluZyA/IFwiTG9hZGluZ1wiIDogXCJMb2FkIE1vcmVcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlcnZlcnMubGVuZ3RoID4gMCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHNlbGYuc3RhdGUudGl0bGV9KVxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBub3RDb25uZWN0ZWQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgLy9yZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHsgdGV4dDogc2VsZi5zdGF0ZS50aXRsZSB9KTtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwibmNjXCIsIHJlZjogXCJjb250ZW50XCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogc2VsZi5jb25uZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBcIjE4cHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiMTBweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb25uZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksIHNlbGYuYmRTZXJ2ZXJcclxuICAgICAgICApXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiYVwiLFxyXG4gICAgICAgICAgICAgICAge2hyZWY6IFwiaHR0cHM6Ly9kaXNjb3Jkc2VydmVycy5jb21cIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgIFwiRGlzY29yZHNlcnZlcnMuY29tXCJcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2Nvbm5lY3Rpb259ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gMikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtjb2xvcjogXCIjYjliYmJlXCIsIGZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIFwiQ29ubmVjdGVkIGFzOiBcIixcclxuICAgICAgICAgICAgICAgIGAke2Nvbm5lY3Rpb24udXNlci51c2VybmFtZX0jJHtjb25uZWN0aW9uLnVzZXIuZGlzY3JpbWluYXRvcn1gXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtwYWRkaW5nOiBcIjVweCAxMHB4IDAgMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1pbkhlaWdodDogXCIyMHB4XCJ9LCB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIiwgb25DbGljazogc2VsZi5jb25uZWN0fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJSZWNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbn1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VydmVyQ2FyZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsKSB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBpbWFnZUVycm9yOiBmYWxzZSxcclxuICAgICAgICAgICAgam9pbmVkOiB0aGlzLnByb3BzLmd1aWxkTGlzdC5pbmNsdWRlcyh0aGlzLnByb3BzLnNlcnZlci5pZGVudGlmaWVyKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzZXJ2ZXJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBsZXQgY2FyZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNhcmQgJiYgZS5jYXJkUHJpbWFyeSlbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXhDaGlsZCAmJiBlLl9ob3Jpem9udGFsUmV2ZXJzZSlbMF1cclxuICAgICAgICBsZXQgd3JhcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vV3JhcCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkKVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsIC8vIGNhcmRQcmltYXJ5LTFIdi10b1xyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgJHtjYXJkTW9kdWxlLmNhcmR9ICR7Y2FyZE1vZHVsZS5jYXJkUHJpbWFyeX0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fSBiZC1zZXJ2ZXItY2FyZCR7c2VydmVyLnBpbm5lZCA/IFwiIGJkLXNlcnZlci1jYXJkLXBpbm5lZFwiIDogXCJcIn1gfSxcclxuICAgICAgICAgICAgLy8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgLy8gXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIC8vIHsgY2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGZsZXgtMU8xR0tZIGRpcmVjdGlvblJvdy0zdjN0ZkcganVzdGlmeVN0YXJ0LTJ5SVpvMCBhbGlnblN0cmV0Y2gtMWh3eE1hIG5vV3JhcC0zanludjZcIiB9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHtyZWY6IFwiaW1nXCIsIGNsYXNzTmFtZTogXCJiZC1zZXJ2ZXItaW1hZ2VcIiwgc3JjOiBzZXJ2ZXIuaWNvblVybCwgb25FcnJvcjogdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpLCBkcmFnZ2FibGU6IGZhbHNlfSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmZsZXhDaGlsZCtcIiBiZC1zZXJ2ZXItY29udGVudFwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcCtcIiBiZC1zZXJ2ZXItaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImg1LTE4XzFuZCBkZWZhdWx0Q29sb3ItMV9halgwIG1hcmdpbi1yZXNldCBiZC1zZXJ2ZXItbmFtZVwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1tZW1iZXItY291bnRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubWVtYmVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIE1lbWJlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuaG9yaXpvbnRhbCtcIiBcIit3cmFwTW9kdWxlLm5vV3JhcH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2Qgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3RIYWlybGluZS1EQkQtMmQgc2Nyb2xsZXJGYWRlLTFJanc1eSBiZC1zZXJ2ZXItZGVzY3JpcHRpb24tY29udGFpbmVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgc2Nyb2xsZXIgYmQtc2VydmVyLWRlc2NyaXB0aW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZGVzY3JpcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGRpcmVjdGlvblJvdy0zdjN0Zkcgbm9XcmFwLTNqeW52NiBiZC1zZXJ2ZXItZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJmbGV4Q2hpbGQtZmFvVlczIGJkLXNlcnZlci10YWdzXCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY2F0ZWdvcmllcy5qb2luKFwiLCBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5qb2luZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBjb2xvckdyZWVuLTI5aUFLWVwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiMzYWMxNWNcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJKb2luZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZXJyb3IgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTiBkaXNhYmxlZC05YUYydWdcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjYzEzYTNhXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAhc2VydmVyLmVycm9yICYmICF0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwifSwgb25DbGljazogKCkgPT4ge3RoaXMuam9pbigpO319LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJKb2luXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLy8gKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW1hZ2VFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGpvaW4oKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5qb2luKHRoaXMpO1xyXG4gICAgICAgIC8vdGhpcy5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuLi9zY3JvbGxlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NpZGViYXJWaWV3IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzaWRlYmFyLCBjb250ZW50LCB0b29sc30gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2kgdWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzaWRlYmFyUmVnaW9uLVZGVFVrTiBzaWRlYmFyLXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxlciwge2tleTogXCJzaWRlYmFyU2Nyb2xsZXJcIiwgcmVmOiBcInNpZGViYXJTY3JvbGxlclwiLCBzaWRlYmFyOiB0cnVlLCBmYWRlOiBzaWRlYmFyLmZhZGUgfHwgdHJ1ZSwgZGFyazogc2lkZWJhci5kYXJrIHx8IHRydWV9LCBzaWRlYmFyLmNvbXBvbmVudClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFJlZ2lvbi0zbkR1WXkgY29udGVudC1yZWdpb25cIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50VHJhbnNpdGlvbldyYXAtM2hxT0VXIGNvbnRlbnQtdHJhbnNpdGlvbi13cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyV3JhcC0ybEpFa2QgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAtM1laWGRtIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3QtMjhNU24wIHNjcm9sbGVyVHJhY2stMVpJcHN2XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJzY3JvbGxlci0yRktGUEcgZmlyZWZveEZpeFNjcm9sbEZsZXgtY25JMml4IGNvbnRlbnRSZWdpb25TY3JvbGxlci0yNm5jMWUgY29udGVudC1yZWdpb24tc2Nyb2xsZXIgc2Nyb2xsZXJcIiwgcmVmOiBcImNvbnRlbnRTY3JvbGxlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRDb2x1bW4tMmhySVlIIGNvbnRlbnRDb2x1bW5EZWZhdWx0LTFWUWtHTSBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LCBjb250ZW50LmNvbXBvbmVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29scy5jb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1JlbG9hZEljb24gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcclxuICAgICAgICAgICAgICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxyXG4gICAgICAgICAgICAgICAgZmlsbDogXCIjZGNkZGRlXCIsXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtcmVsb2FkIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLnByb3BzLm9uQ2xpY2ssXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge3dpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCIsIGhlaWdodDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwifVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXpcIn0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOiBcIm5vbmVcIiwgZDogXCJNMCAwaDI0djI0SDB6XCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Njcm9sbGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vc2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5XHJcbiAgICAgICAgbGV0IHNjcm9sbGVyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVySG9yaXpvbnRhbClbMF1cclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhclJlZ2lvblNjcm9sbGVyKVswXVxyXG4gICAgICAgIGxldCB3cmFwcGVyQ2xhc3MgPSBgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdEhhaXJsaW5lfSR7dGhpcy5wcm9wcy5mYWRlID8gXCIgXCIrc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyRmFkZSA6IFwiXCJ9YDtcclxuICAgICAgICBsZXQgc2Nyb2xsZXJDbGFzcyA9IHNjcm9sbGVyTW9kdWxlMS5zY3JvbGxlcitcIiBzY3JvbGxlclwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1Y2sgKi9cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaWRlYmFyKSBzY3JvbGxlckNsYXNzICs9IGAgJHtzY3JvbGxlck1vZHVsZTIuc2lkZWJhclJlZ2lvblNjcm9sbGVyfSBzaWRlYmFyLXJlZ2lvbi1zY3JvbGxlcmBcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5jb250ZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyQ2xhc3MgKz0gXCIgXCIrc2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcitcIiBjb250ZW50LXJlZ2lvbi1zY3JvbGxlclwiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3MgPSBgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMi5jb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwfSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlci13cmFwICAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlck1vZHVsZTEudGhlbWVHaG9zdH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUcmFja31gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7Y2hpbGRyZW59ID0gdGhpcy5wcm9wcztcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7a2V5OiBcInNjcm9sbGVyd3JhcFwiLCBjbGFzc05hbWU6IHdyYXBwZXJDbGFzc30sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7a2V5OiBcInNjcm9sbGVyXCIsIHJlZjogXCJzY3JvbGxlclwiLCBjbGFzc05hbWU6IHNjcm9sbGVyQ2xhc3N9LFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICBpICE9PSAwID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCwge30pIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSlcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc0dyb3VwIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHt0aXRsZSwgc2V0dGluZ3MsIGJ1dHRvbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbXBvbmVudCA9IGJ1dHRvbiA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7a2V5OiBcInRpdGxlLWJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYmQtcGZidG5cIiwgb25DbGljazogYnV0dG9uLm9uQ2xpY2t9LCBidXR0b24udGl0bGUpIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgICAgIH0pXTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcbi8vaDItMmdXRS1vIHRpdGxlLTNzWldZUSBzaXplMTYtMTRjR3o1IGhlaWdodDIwLW1PMmVJTiB3ZWlnaHRTZW1pQm9sZC1OSmV4emkgZGEtaDIgZGEtdGl0bGUgZGEtc2l6ZTE2IGRhLWhlaWdodDIwIGRhLXdlaWdodFNlbWlCb2xkIGRlZmF1bHRDb2xvci0xX2FqWDAgZGEtZGVmYXVsdENvbG9yIG1hcmdpblRvcDYwLTNQR2J0SyBkYS1tYXJnaW5Ub3A2MCBtYXJnaW5Cb3R0b20yMC0zMnFJRDcgZGEtbWFyZ2luQm90dG9tMjBcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgzIG1hcmdpbi1yZXNldCBtYXJnaW4tcmVzZXQgdWktZmxleC1jaGlsZFwifSwgdGV4dCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJIZWFkZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSwgdGhpcy5wcm9wcy50ZXh0LCB0aGlzLnByb3BzLmJ1dHRvbik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5wcm9wcy5zZWxlY3RlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGB1aS10YWItYmFyLWl0ZW0ke3RoaXMucHJvcHMuc2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2sodGhpcy5wcm9wcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJTZXBhcmF0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1zZXBhcmF0b3IgbWFyZ2luLXRvcC04IG1hcmdpbi1ib3R0b20tOFwifSk7XHJcbiAgICB9XHJcbn0iLCJcInVzZSBzdHJpY3RcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3RcclxuXHJcbmNvbnN0IGludGVydmFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkludGVydmFsKVswXVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBvbmVudCwgTWVzc2FnZXMpIHtcclxuICAgIGNsYXNzIFRpbWVSZW5kZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IG5ldyBpbnRlcnZhbE1vZHVsZTEuSW50ZXJ2YWwoKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudERpZE1vdW50KCl7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RhcnQoMWUzLCAoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZShzZWxmLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RvcCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnREaWRVcGRhdGUoYWN0aXZpdHkpe1xyXG4gICAgICAgICAgICBpZihhY3Rpdml0eS50aW1lc3RhbXBzLmVuZCA9PT0gdGhpcy5wcm9wcy50aW1lc3RhbXBzLmVuZCAmJiBhY3Rpdml0eS50aW1lc3RhbXBzLnN0YXJ0ID09PSB0aGlzLnByb3BzLnRpbWVzdGFtcHMuc3RhcnQpcmV0dXJuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0VXBkYXRlZFRpbWUoKXtcclxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB0aGlzLnByb3BzLnRpbWVzdGFtcHNcclxuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCkgLyAxZTM7XHJcbiAgICAgICAgICAgIGlmKG51bGwgIT0gdGltZXN0YW1wcy5lbmQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlmZihub3csIGNoZWNrVW5peCh0aW1lc3RhbXBzLmVuZCkgLyAxZTMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYobnVsbCAhPSB0aW1lc3RhbXBzLnN0YXJ0KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERpZmYoY2hlY2tVbml4KHRpbWVzdGFtcHMuc3RhcnQpIC8gMWUzLCBub3cpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiAwLFxyXG4gICAgICAgICAgICAgICAgbWludXRlczogMCxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyVGltZShudW1iZXIsIHJlbW92ZVplcm8pe1xyXG4gICAgICAgICAgICBpZihyZW1vdmVaZXJvID09PSB1bmRlZmluZWQpcmVtb3ZlWmVybyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGlmKHJlbW92ZVplcm8gJiYgbnVtYmVyIDw9IDApcmV0dXJuIC0xXHJcbiAgICAgICAgICAgIGlmKG51bWJlciA8IDEwKXJldHVybiBcIjBcIitudW1iZXJcclxuICAgICAgICAgICAgcmV0dXJuIG51bWJlclxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0RGlmZih0aW1lc3RhbXAsIG5vdyl7XHJcbiAgICAgICAgICAgIGxldCBob3VycyA9IE1hdGgubWF4KG5vdyAtIHRpbWVzdGFtcCwgMClcclxuICAgICAgICAgICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKGhvdXJzKSAlIDYwXHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAvIDYwKSAlIDYwXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogTWF0aC5mbG9vcihob3VycyAvIDM2MDApICUgMjQsXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgbGV0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHByb3BzLnRpbWVzdGFtcHNcclxuXHJcbiAgICAgICAgICAgIGxldCB1c2VkUHJvcHMgPSBmdW5jdGlvbihwcm9wcywgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChudWxsID09IHByb3BzKSByZXR1cm4ge307XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB7fVxyXG4gICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtcy5pbmRleE9mKGtleSkgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNba2V5XSA9IHByb3BzW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHNcclxuICAgICAgICAgICAgfShwcm9wcywgW1widGltZXN0YW1wc1wiXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gc3RhdGUuaG91cnNcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBzdGF0ZS5taW51dGVzXHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzID0gc3RhdGUuc2Vjb25kc1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiB0aGlzLnJlbmRlclRpbWUoaG91cnMsICEwKSxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXM6IHRoaXMucmVuZGVyVGltZShtaW51dGVzKSxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IHRoaXMucmVuZGVyVGltZShzZWNvbmRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZih0aW1lc3RhbXBzLmVuZCAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHVzZWRQcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX0VORC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRpbWVzdGFtcHMuc3RhcnQgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB1c2VkUHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9TVEFSVC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFRpbWVSZW5kZXJcclxufTtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrVW5peChlKSB7XHJcbiAgICByZXR1cm4gKFwiXCIgKyBlKS5sZW5ndGggPCAxMyA/IDFlMyAqIGUgOiBlXHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Rvb2xzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB0b29sc01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvb2xzQ29udGFpbmVyKVswXVxyXG4gICAgICAgIGxldCBjb250YWluZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250YWluZXIgJiYgZS5jbG9zZUJ1dHRvbiAmJiBlLmNsb3NlQnV0dG9uQm9sZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMtY29udGFpbmVyIFwiK3Rvb2xzTW9kdWxlLnRvb2xzQ29udGFpbmVyfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMgXCIrdG9vbHNNb2R1bGUudG9vbHN9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNvbnRhaW5lck1vZHVsZS5jb250YWluZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0bi1jbG9zZSBcIitjb250YWluZXJNb2R1bGUuY2xvc2VCdXR0b24sIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImVzYy10ZXh0IFwiK2NvbnRhaW5lck1vZHVsZS5rZXliaW5kfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFU0NcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2xvc2VCdXR0b24gJiYgZS5rZXliaW5kQm9sZClbMF0uY2xvc2VCdXR0b24uc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoY2xvc2VCdXR0b24pIGNsb3NlQnV0dG9uLmNsaWNrKCk7XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogVG9vbHRpcCB0aGF0IGF1dG9tYXRpY2FsbHkgc2hvdyBhbmQgaGlkZSB0aGVtc2VsdmVzIG9uIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG4gKiBXaWxsIGFsc28gcmVtb3ZlIHRoZW1zZWx2ZXMgaWYgdGhlIG5vZGUgdG8gd2F0Y2ggaXMgcmVtb3ZlZCBmcm9tIERPTSB0aHJvdWdoXHJcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cclxuICpcclxuICogTm90ZSB0aGlzIGlzIG5vdCB1c2luZyBEaXNjb3JkJ3MgaW50ZXJuYWxzIGJ1dCBub3JtYWwgRE9NIG1hbmlwdWxhdGlvbiBhbmQgZW11bGF0ZXNcclxuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIEVtdWxhdGVkVG9vbHRpcFxyXG4gKiBAdmVyc2lvbiAwLjAuMVxyXG4gKi9cclxuXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuXHJcbi8vPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZYyBkaXNhYmxlZFBvaW50ZXJFdmVudHMtMXB0Z1RCXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDIzN3B4OyBib3R0b206IDUxcHg7XCI+XHJcbi8vXHQ8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgdG9vbHRpcFRvcC1YRERTeHggdG9vbHRpcEJsYWNrLVBQRzQ3eiB0b29sdGlwRGlzYWJsZVBvaW50ZXJFdmVudHMtM2VhQkdOXCIgc3R5bGU9XCJvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7XCI+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcktcIj48L2Rpdj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBDb250ZW50LWJxVkxXS1wiPlVzZXIgU2V0dGluZ3M8L2Rpdj5cclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5cclxuLy88ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljXCIgc3R5bGU9XCJ0b3A6IDg2MHB4OyBsZWZ0OiA2MzIuNXB4O1wiPlxyXG4vL1x0PGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIHRvb2x0aXBCbGFjay1QUEc0N3ogdG9vbHRpcFRvcC1YRERTeHhcIj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlyS1wiPjwvZGl2PlxyXG4vL1x0XHRDaGFuZ2Vsb2dcclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5sZXQgVG9vbHRpcENsYXNzZXNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcENsYXNzZXMoKXtcclxuXHRpZihUb29sdGlwQ2xhc3NlcylyZXR1cm4gVG9vbHRpcENsYXNzZXNcclxuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XHJcbn1cclxubGV0IFRvb2x0aXBMYXllcnNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xyXG5cdGlmKFRvb2x0aXBMYXllcnMpcmV0dXJuIFRvb2x0aXBMYXllcnNcclxuXHRyZXR1cm4gVG9vbHRpcExheWVycyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwibGF5ZXJcIiwgXCJsYXllckNvbnRhaW5lclwiKTtcclxufVxyXG5cclxuY29uc3QgZ2V0Q2xhc3MgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xyXG4gICAgY29uc3QgdG9vbHRpcENsYXNzID0gZ2V0VG9vbHRpcENsYXNzZXMoKVtgdG9vbHRpcCR7dXBwZXJDYXNlfWBdO1xyXG4gICAgaWYgKHRvb2x0aXBDbGFzcykgcmV0dXJuIHRvb2x0aXBDbGFzcztcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgcmV0dXJuIGdldENsYXNzKHNpZGVPckNvbG9yKSA/IHRydWUgOiBmYWxzZTtcclxufTtcclxuXHJcbmNvbnN0IHRvUHggPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxufTtcclxuXHJcbi8qIDxkaXYgY2xhc3M9XCJsYXllci12OUh5WWMgZGEtbGF5ZXJcIiBzdHlsZT1cImxlZnQ6IDIzNC41cHg7IGJvdHRvbTogNTFweDtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyBkYS10b29sdGlwIHRvb2x0aXBUb3AtWEREU3h4IHRvb2x0aXBCbGFjay1QUEc0N3pcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLIGRhLXRvb2x0aXBQb2ludGVyXCI+PC9kaXY+XHJcbiAgICAgICAgVXNlciBTZXR0aW5nc1xyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcclxuXHQvKipcclxuXHQgKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fGpRdWVyeSl9IG5vZGUgLSBET00gbm9kZSB0byBtb25pdG9yIGFuZCBzaG93IHRoZSB0b29sdGlwIG9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpcCAtIHN0cmluZyB0byBzaG93IGluIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0eWxlPWJsYWNrXSAtIGNvcnJlbGF0ZXMgdG8gdGhlIGRpc2NvcmQgc3R5bGluZy9jb2xvcnMgKGJsYWNrLCBicmFuZCwgZ3JlZW4sIGdyZXksIHJlZCwgeWVsbG93KVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zaWRlPXRvcF0gLSBjYW4gYmUgYW55IG9mIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSBzaG93aW5nIG9uIGhvdmVyXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XHJcblx0XHRjb25zdCB7c3R5bGUgPSBcImJsYWNrXCIsIHNpZGUgPSBcInRvcFwiLCBwcmV2ZW50RmxpcCA9IGZhbHNlLCBkaXNhYmxlZCA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcblx0XHR0aGlzLm5vZGUgPSBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7XHJcblx0XHR0aGlzLnNpZGUgPSBzaWRlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdGlmICghY2xhc3NFeGlzdHModGhpcy5zdHlsZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFN0eWxlICR7dGhpcy5zdHlsZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRcclxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcExheWVycygpLmxheWVyICsgXCIgXCIgKyBnZXRUb29sdGlwTGF5ZXJzKCkuZGlzYWJsZWRQb2ludGVyRXZlbnRzO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBDb250ZW50XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0cG9pbnRlckVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwUG9pbnRlcjtcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZCh0aGlzLmxhYmVsRWxlbWVudCk7XHJcblx0XHR0aGlzLmVsZW1lbnQuYXBwZW5kKHRoaXMudG9vbHRpcEVsZW1lbnQpO1xyXG5cclxuXHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdFx0bXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZih0aGlzLm5vZGUpID4gLTE7XHJcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyh0aGlzLm5vZGUpKTtcclxuXHRcdFx0XHRcdGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuXHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHR9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXHJcbiAgICBnZXQgY29udGFpbmVyKCkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb3BvdXRzKVswXS5wb3BvdXRzLnNwbGl0KFwiIFwiKVswXStcIiB+IC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllckNvbnRhaW5lcilbMF0ubGF5ZXJDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdKTsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dBYm92ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYmVsb3cgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSBsZWZ0IG9mIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0xlZnQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xyXG5cdGdldCBjYW5TaG93UmlnaHQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA8PSBVdGlscy5zY3JlZW5XaWR0aDsgfVxyXG5cclxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cclxuXHRoaWRlKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcclxuXHR9XHJcblxyXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXHJcblx0c2hvdygpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kKHRoaXMuZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dBYm92ZSB8fCAoIXRoaXMuY2FuU2hvd0Fib3ZlICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImJvdHRvbVwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImxlZnRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93TGVmdCB8fCAoIXRoaXMuY2FuU2hvd0xlZnQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dSaWdodCB8fCAoIXRoaXMuY2FuU2hvd1JpZ2h0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXHJcblx0c2hvd0Fib3ZlKCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwidG9wXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGJlbG93IHRoZSBub2RlLiAqL1xyXG5cdHNob3dCZWxvdygpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgbGVmdCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93TGVmdCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImxlZnRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd1JpZ2h0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwicmlnaHRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVySG9yaXpvbnRhbGx5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICh0aGlzLm5vZGUub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVyVmVydGljYWxseSgpIHtcclxuXHRcdGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgLyAyKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAvIDIpKSk7XHJcblx0fVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgdGV4dCA9IFwiXCJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLm5vZGUgPSBCRFYyLnJlYWN0RG9tLmZpbmRET01Ob2RlKHRoaXMpO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy50b29sdGlwO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfWFN2ZyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3ZnXCIsXHJcbiAgICAgICAgICAgIHt4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAxMiAxMlwiLCBzdHlsZToge3dpZHRoOiBcIjE4cHhcIiwgaGVpZ2h0OiBcIjE4cHhcIn19LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImdcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmFja2dyb3VuZFwiLCBmaWxsOiBcIm5vbmVcIiwgZmlsbFJ1bGU6IFwiZXZlbm9kZFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTAgMGgxMnYxMkgwXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2NsYXNzTmFtZTogXCJmaWxsXCIsIGZpbGw6IFwiI2RjZGRkZVwiLCBkOiBcIk05LjUgMy4yMDVMOC43OTUgMi41IDYgNS4yOTUgMy4yMDUgMi41bC0uNzA1LjcwNUw1LjI5NSA2IDIuNSA4Ljc5NWwuNzA1LjcwNUw2IDYuNzA1IDguNzk1IDkuNWwuNzA1LS43MDVMNi43MDUgNlwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG9cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlY3Ryb25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXZlbnRzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1rZGlycFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb2R1bGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZS1mZXRjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJpbXJhZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ5YXV6bFwiKTsiXSwic291cmNlUm9vdCI6IiJ9