From 298cbe6630d5f8c10a898c28b78b8648bfade1c1 Mon Sep 17 00:00:00 2001 From: hormelcookies <70467971+hormelcookies@users.noreply.github.com> Date: Mon, 19 Oct 2020 19:33:55 -0700 Subject: [PATCH] Remove generated js files --- .gitignore | 6 +- BetterDiscordApp/dist/index.js | 12272 ---------- BetterDiscordApp/dist/index.min.js | 2 - BetterDiscordApp/dist/index.min.js.map | 1 - BetterDiscordApp/dist/main.js.map | 1 - BetterDiscordApp/dist/style.css | 2285 -- BetterDiscordApp/dist/style.min.css | 2 - BetterDiscordApp/dist/style.min.css.map | 1 - DiscordJS/js/main.js | 1753 -- LightcordApi/js/main.js | 28362 ---------------------- LightcordApi/js/main.min.js | 3 - LightcordApi/js/main.min.js.LICENSE.txt | 5 - LightcordApi/js/main.min.js.map | 1 - compile.js | 4 + scripts/clean.js | 16 +- 15 files changed, 21 insertions(+), 44693 deletions(-) delete mode 100644 BetterDiscordApp/dist/index.js delete mode 100644 BetterDiscordApp/dist/index.min.js delete mode 100644 BetterDiscordApp/dist/index.min.js.map delete mode 100644 BetterDiscordApp/dist/main.js.map delete mode 100644 BetterDiscordApp/dist/style.css delete mode 100644 BetterDiscordApp/dist/style.min.css delete mode 100644 BetterDiscordApp/dist/style.min.css.map delete mode 100644 DiscordJS/js/main.js delete mode 100644 LightcordApi/js/main.js delete mode 100644 LightcordApi/js/main.min.js delete mode 100644 LightcordApi/js/main.min.js.LICENSE.txt delete mode 100644 LightcordApi/js/main.min.js.map diff --git a/.gitignore b/.gitignore index caee9d9..a8e7bb3 100644 --- a/.gitignore +++ b/.gitignore @@ -108,7 +108,6 @@ builds # must build typescript itself dist -!BetterDiscordApp/dist distApp @@ -121,3 +120,8 @@ discord-webrtc_0 # VS Code stuff .vscode + +# Compiled JS files +LightcordApi/js +DiscordJS/js +BetterDiscordApp/dist diff --git a/BetterDiscordApp/dist/index.js b/BetterDiscordApp/dist/index.js deleted file mode 100644 index d157cf5..0000000 --- a/BetterDiscordApp/dist/index.js +++ /dev/null @@ -1,12272 +0,0 @@ -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, bbdChangelog, settings, defaultCookie, settingsCookie, settingsRPC, defaultRPC, lightcordSettings, defaultLightcordSettings, 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__, "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__, "lightcordSettings", function() { return lightcordSettings; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultLightcordSettings", function() { return defaultLightcordSettings; }); -/* 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; }); -const minimumDiscordVersion = "0.0.308"; -const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.308"; -const minSupportedVersion = "0.3.0"; -const bbdVersion = "0.3.5"; -const bbdChangelog = { - description: "Big things are coming.", - changes: [{ - title: "Bug Fixes", - type: "fixed", - items: ["Some fixes related to showing modals in the `BdApi`.", "Fixed the open folder buttons for plugins and themes"] - }] -}; -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" - }, - "Enable Edit Button": { - id: "fork-ps-7", - info: "Enable an Edit Button on the plugin and theme panel.", - implemented: true, - hidden: false, - cat: "core", - category: "content manager" - }, - "Themes in Popout Window": { - id: "lightcord-9", - info: "Enable themes in Popout Window. (For example, when detaching screenshare.)", - implemented: true, - hidden: false, - cat: "core", - category: "content manager", - experimental: true - }, - - /* 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" - }, - - /** Lightcord */ - "Disable BetterDiscord": { - id: "bd-disable", - info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).", - implemented: false, - hidden: false, - cat: "lightcord", - category: "Lightcord" - }, - "Blur Personal Information": { - 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 \"Lightcord Api\" section.", - 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.", - implemented: true, - hidden: false, - cat: "lightcord", - category: "Lightcord", - experimental: true - }, - "Use Notification Shim": { - id: "lightcord-10", - info: "Basically don't use Windows's Notifications.", - implemented: true, - hidden: process.platform !== "win32", - cat: "lightcord", - category: "Lightcord" - }, - "Emoji Prefix": { - id: "lightcord-11", - info: "Change the prefix used for free nitros emojis. Please put only one character. Default: .", - implemented: true, - hidden: false, - cat: "lightcord", - category: "Lightcord", - default: "." - }, - - /** Lightcord Window */ - "Always-on-Top": { - id: "lightcord-3", - info: "Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.", - implemented: true, - hidden: false, - cat: "lightcord", - category: "Window" - }, - "No Window Bounds": { - id: "no_window_bound", - info: "Disable Window Bounds. Can be useful if you use a window manager.", - implemented: true, - hidden: process.platform !== "linux", - cat: "lightcord", - category: "Window" - }, - "Enable Glasstron": { - id: "enable_glasstron", - info: "Enable Glasstron. If you're not using transparent themes, this can reduce lag.", - 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": false, - "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-ps-7": false, - "fork-es-2": false, - "fork-es-3": true, - "fork-wp-1": false, - "fork-wp-2": false, - "fork-beta": true, - "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, - "lightcord-9": false, - "lightcord-10": false, - "no_window_bound": 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 lightcordSettings = {}; -const defaultLightcordSettings = {}; -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) => { - 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"]); // TODO: Change Init mode and stop using CoreWrapper. - -class CoreWrapper { - constructor(bdConfig, methods) { - _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig); - _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setMethods(methods); - } - - init() { - // deprecateGlobal("mainCore", this.mainCore); - _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init(); - } - -} - -/***/ }), - -/***/ "./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/Layers.jsx": -/*!********************************!*\ - !*** ./src/modules/Layers.jsx ***! - \********************************/ -/*! exports provided: default, Layer */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Layer", function() { return Layer; }); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); -/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); -/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js"); -/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! crypto */ "crypto"); -/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_3__); -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); } - - - - - -/* harmony default export */ __webpack_exports__["default"] = (new class Layers { - constructor() { - this.layers = []; - window.Lightcord.BetterDiscord.Layers = this; - } - - get isInjected() { - return !!document.querySelector("div.Layers.injected"); - } - - inject() { - if (this.isInjected) return; - let [classNameLayers] = [_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.layers && e.layer).layers)]; - const layers = document.querySelector("." + classNameLayers); - if (!layers) return false; - const ReactInstance = Lightcord.Api.Utils.FindReact(layers, 1); - if (!ReactInstance) return layers; - this.ReactInstance = ReactInstance; - let render = ReactInstance.render; - - ReactInstance.render = () => { - let returnValue = render.call(ReactInstance); - let classList = returnValue.props.children[1].props.className.split(" "); - classList.push("Layers"); - classList.push("injected"); - returnValue.props.children[1].props.className = classList.join(" "); - this.layers.forEach(layer => { - returnValue.props.children[1].props.children.push(layer[1]); - }); - return returnValue; - }; - - ReactInstance.forceUpdate(); - } - - createLayer(children, props = {}) { - let id = Object(_distant__WEBPACK_IMPORTED_MODULE_2__["uuidv4"])(); - let layer = null; - this.layers.push([id, /*#__PURE__*/React.createElement(Layer, _extends({}, props, { - getLayer: lay => { - layer = lay; - }, - key: id, - id: id, - remove: () => { - let index = this.layers.findIndex(e => e[0] === id); - if (index === -1) return; - this.layers.splice(index, 1); - layer = null; - if (this.ReactInstance) this.ReactInstance.forceUpdate(); - this.inject(); - } - }), children)]); - if (this.ReactInstance) this.ReactInstance.forceUpdate(); - this.inject(); - return { - remove: () => { - if (!layer) { - let index = this.layers.findIndex(e => e[0] === id); - if (index === -1) return; - this.layers.splice(index, 1); - layer = null; - if (this.ReactInstance) this.ReactInstance.forceUpdate(); - this.inject(); - } else { - layer.remove(); - } - } - }; - } - -}()); -let LayerModules; -class Layer extends React.Component { - constructor() { - super(...arguments); - this.state = { - animation: new this.modules[0].default.Value(0) - }; - this.props.getLayer(this); - this.keydown = this.keydown.bind(this); - } - - keydown(e) { - if (e.which === 27) { - this.remove(); - } - } - - get modules() { - return LayerModules || (LayerModules = [_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.default && e.default.Value && e.default.div)]); - } - - componentWillUnmount() { - window.removeEventListener("keydown", this.keydown); - } - - componentDidMount(ev) { - window.addEventListener("keydown", this.keydown); - } - - remove() { - this.props.remove(); - } - - componentWillEnter(ev) { - this.modules[0].default.timing(this.state.animation, { - toValue: 1, - duration: 100 - }).start(ev); - } - - componentWillLeave(ev) { - this.modules[0].default.timing(this.state.animation, { - toValue: 0, - duration: 100 - }).start(ev); - } - - render() { - let interpolation = this.state.animation.interpolate({ - inputRange: [0, 1], - outputRange: [1.07, 1] - }); - let style = { - opacity: this.state.animation, - transform: [{ - scale: interpolation - }] - }; - let Div = this.modules[0].default.div; - return /*#__PURE__*/React.createElement(Div, { - className: [__SECRET_EMOTION__.css({ - backgroundColor: "var(--background-primary)", - position: "absolute", - top: 0, - right: 0, - bottom: 0, - left: 0, - display: "flex", - overflow: "hidden", - WebkitBoxOrient: "vertical", - WebkitBoxDirection: "normal", - msFlexDirection: "column", - flexDirection: "column", - zIndex: 101 - }), process.platform === "win32" ? __SECRET_EMOTION__.css({ - top: "-22px", - paddingTop: "22px" - }) : null, ...(this.props.className ? this.props.className.split(" ") : [])].filter(e => e).join(" ") || null, - style: style - }, this.props.children(() => { - this.remove(); - })); - } - -} -Layer.defaultProps = { - id: null, - children: null -}; - -/***/ }), - -/***/ "./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 null; - }, - - // 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 = []; - let userSettingsAccount = BDModules.get(e => e.userSettingsAccount)[0]; - const children = BDModules.get(e => typeof e.children === "string")[0]; - 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)}`); - - if (userSettingsAccount) { - selects.push(`#app-mount .${defaultClassName} .${removeDa(userSettingsAccount.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`); - selects.push(`.${removeDa(userSettingsAccount.userSettingsSecurity)} .${removeDa(children.children)} > div:nth-child(2)`); - } - - 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.join(", ")} { - transition: all 150ms cubic-bezier(.55,.085,.68,.53); - filter: blur(4px); - opacity: .8; -} - -${selectors.map(e => e + ":hover").join(", ")} { - 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.ClassNormalizer = 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 _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js"); -/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js"); -/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! electron */ "electron"); -/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_6__); - - - - - - - - -const path = __webpack_require__(/*! path */ "path"); - -const fs = __webpack_require__(/*! fs */ "fs"); - -const Module = __webpack_require__(/*! module */ "module").Module; - -Module.globalPaths.push(path.resolve(electron__WEBPACK_IMPORTED_MODULE_6__["ipcRenderer"].sendSync("LIGHTCORD_GET_APP_PATH"), "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_4__["default"].getSettingGroup("PluginCertifierHashes") !== "string") { - _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])("{}")); - } else { - try { - addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getSettingGroup("PluginCertifierHashes"))); - } catch (e) { - _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["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_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["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__WEBPACK_IMPORTED_MODULE_3__["default"].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_5__["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 { - 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 = require(path.resolve(baseFolder, filename)); - - if (!content.name) return { - name: filename, - file: filename, - message: "Cannot escape the ID.", - error: new Error("Cannot read property 'replace' of undefined") - }; - content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name); //if(!id)return {name: filename, file: filename, message: "Invalid ID", error: new Error("Please fix the name of "+filename+". BetterDiscord can't escape an ID.")} - - 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 require.cache[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 { - require.cache[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"); - - - - - - - - - - - - - - - - - - -let methods; - -function Core() {} - -Core.prototype.setConfig = function (config) { - if (this.hasStarted) return; - Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config); -}; - -Object.defineProperty(Core.prototype, "methods", { - get() { - return methods; - } - -}); - -Core.prototype.setMethods = function (m) { - if (this.hasStarted) return; - methods = m; -}; - -Core.prototype.init = async function () { - if (this.hasStarted) return; - this.hasStarted = true; - - 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")(); - _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", Buffer.from(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss"), "base64").toString("utf8")); - 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"); - window.Lightcord.Api.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; - }; - - DiscordTag.default.displayName = DiscordTagComp.displayName; - }); - 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 () {// No externals -}; - -Core.prototype.initSettings = function () { - _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize(); - - if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) { - Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]); - } - - if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) { - Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]); - _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]) return result; - - 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()); - } - } - - console.log(result); - 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 buildInfo = electron__WEBPACK_IMPORTED_MODULE_15__["ipcRenderer"].sendSync("LIGHTCORD_GET_BUILD_INFOS"); - const additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", { - className: `${classNameColorMuted} ${sizes.size12}` - }, `Lightcord ${buildInfo.version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", { - className: classNameVersionHash + " da-versionHash" - }, `(${(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 () { - // There will never be an injection path, so we do not need the code below. - // Insert comments so it will be erased when production. - const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath; - if (!injectionPath) return false; - /* - const fs = require("fs"); - const path = require("path"); - const rmrf = require("rimraf"); - const yauzl = require("yauzl"); - const mkdirp = require("mkdirp"); - const request = require("request"); - 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.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.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.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.log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`); - success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err))); - if (!success) { - Utils.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.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.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 _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js"); -/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js"); - - - -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"; -let dataPath = ""; -if (process.platform === "win32") dataPath = process.env.APPDATA;else if (process.platform === "darwin") dataPath = path.join(process.env.HOME, "Library", "Preferences");else dataPath = process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, ".config"); -dataPath = path.join(dataPath, "BetterDiscord"); -/* 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), "utf-8"); - const data = JSON.parse(fs.readFileSync(this.BDFile, "utf-8")); - if (data.hasOwnProperty("settings")) this.data = data; - if (!fs.existsSync(this.settingsFile)) return; - - let settings = 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_0__["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; - } - - get configFile() { - return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json")); - } - - get BDFile() { - return this._BDFile || (this._BDFile = path.resolve(dataPath, "bdstorage.json")); - } - - get settingsFile() { - return this._settingsFile || (this._settingsFile = path.resolve(dataPath, "bdsettings.json")); - } - - getPluginFile(pluginName) { - return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["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), "utf-8"); - } - - getBDData(key) { - return this.data[key] || ""; - } - - setBDData(key, value) { - this.data[key] = value; - fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "utf-8"); - } - - 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), "utf-8"); - } - - 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), "utf-8"); - } - -}()); - -/***/ }), - -/***/ "./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); - } - -}()); - -/***/ }), - -/***/ "./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 node_fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! node-fetch */ "node-fetch"); -/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); -/* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_3__ = __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); - } - /** - * 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_2__["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_2__["settingsCookie"]["lightcord-5"]) { - return Promise.reject(new LightcordError("The current settings blocked the request.")); - } - - return node_fetch__WEBPACK_IMPORTED_MODULE_1___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.org", - badges: [// TODO: Add more badges + server side svg - { - 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_3__["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 = 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 = 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"); -/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../0globals */ "./src/0globals.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); -const appSettings = Lightcord.Api.settings; -/* 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); - const setting = _0globals__WEBPACK_IMPORTED_MODULE_2__["settings"]["Emoji Prefix"]; - - const getValue = () => { - const value = appSettings.get("BD_" + setting.id, setting.default); - if (typeof value !== "string") return setting.default; - return value; - }; - - 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 && getValue() === 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: getValue(), - guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null - }; - }, function (e) { - return getValue() + e + getValue(); - }); - }, - - 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: `${getValue()}${emoji.name}${getValue()}`, - 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/hooks.js": -/*!******************************!*\ - !*** ./src/modules/hooks.js ***! - \******************************/ -/*! exports provided: useForceUpdate */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useForceUpdate", function() { return useForceUpdate; }); -/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js"); - -const { - useState -} = _v2__WEBPACK_IMPORTED_MODULE_0__["default"].react; -function useForceUpdate() { - const [, setValue] = useState(0); - return function forceUpdate() { - setValue(e => e + 1); - }; -} - -/***/ }), - -/***/ "./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; - } - -}()); -const tests = [[/token/gi, 0, 0], [/email/gi, 0, 0], [/mfa\./gi, 0, 0], [/2fa/gi, 0, 0], [/phone/gi, 0, 0], [/child_process/gi, 0, 0], [/localStorage/gi, 0, 0], [/getGlobal/gi, 0, 0], [/BrowserWindow/gi, 0, 0], [/system32/gi, 0, 0], [/password/gi, 0, 0], [/eval/gi, 0, 0], [/WebAssembly/gi, 0, 0], [/XMLHttpRequest(\.|\[["'`])prototype/gi, 0, 0], [/window\.fetch( +)?=/gi, 0, 0], -/** Obfuscation / hidden / workarounds */ -[/(["'`]\+)["'`]\w["'`]/gi, 1, 1], [/["'`]\w["'`](\+["'`])/gi, 1, 1], [/\${["'`]\w+["'`]}/gi, 1, 1], -/** hexadecimal */ -[/_0x\w{4}\('0x[\dabcdef]+'\)/g, 1, 1], [/_0x\w{4}\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g, 1, 1], // _0x8db7('0x0', 'x1]f') - -/** mangled */ -[/\w+\('0x[\dabcdef]+'\)/g, 1, 1], // b('0x0') -[/\w+\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g, 1, 1], // b('0x0', 'x1]f') - -/** string array at start */ -[/^var [\w\d_$]+=\["/gi, 1, 1]]; -const threats = ["Account Stealer/Virus", "Obfuscation/Hidden code"]; -function checkViruses(hash, data, resultCallback, removeCallback, filename) { - data = data.toString("utf8"); - let isHarmful = false; - /** - * @type {string} - */ - - const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing all comments from plugins (remove meta and other.) - - for (const [test, type, removeComment] of tests) { - const scrpt = removeComment === 1 ? no_comments : data; - - if (test.exec(scrpt)) { - isHarmful = threats[type]; - console.log(`${hashToUrl[hash].split("/").pop()} failed at test`, test, ". Marked as", threats[type]); - break; - } - } - - 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__["ipcRenderer"].sendSync("LIGHTCORD_GET_USER_AGENT") // have to set user-agent - - } - }).then(async res => { - if (res.status !== 200) { - if (filename.endsWith(".theme.css")) return removeCallback(hash); - - try { - checkViruses(hash, data, resultCallback, removeCallback, filename); - } catch (e) { - console.error(e); - removeCallback(); - } - - return; - } - - const result = await res.json(); - result.hash = hash; - result.filename = filename; - cache[hash] = result; - resultCallback(result); - }).catch(err => { - console.error(`Could not read from github. ${err}`); - if (filename.endsWith(".theme.css")) return removeCallback(hash); - checkViruses(hash, data, resultCallback, removeCallback, filename); - }); - } 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__["ipcRenderer"].sendSync("LIGHTCORD_GET_USER_AGENT") - } - }).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__["ipcRenderer"].sendSync("LIGHTCORD_OPEN_EXTERNAL", 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" - } - }, /*#__PURE__*/React.createElement("g", { - fill: "none", - "fill-rule": "evenodd" - }, /*#__PURE__*/React.createElement("path", { - d: "M0 0h24v24H0z" - }), /*#__PURE__*/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" - } - }, /*#__PURE__*/React.createElement("g", { - fill: "none", - "fill-rule": "evenodd" - }, /*#__PURE__*/React.createElement("path", { - d: "M0 0h24v24H0z" - }), /*#__PURE__*/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) { - 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); - - __webpack_require__(/*! electron */ "electron").shell.openExternal(`${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/popoutWindow.js": -/*!*************************************!*\ - !*** ./src/modules/popoutWindow.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 _bdEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js"); -/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js"); - - - -/* harmony default export */ __webpack_exports__["default"] = (new class popoutWindow { - constructor() { - /** - * @type {Map} - */ - this.windows = new Map(); - this.enabled = false; - this.init(); - } - - async init() { - let popoutModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getWindow); - window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN", ev => { - setImmediate(() => { - /** - * @type {Window} - */ - const window = popoutModule.default.getWindow(ev.key); - this.windows.set(ev.key, window); - let classList = window.document.body.classList; - classList.add("window-popout"); - classList.add("lightcord"); - classList.add("lightcord"); - this.update(ev.key); - }); - }); - window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE", ev => { - setImmediate(() => { - this.windows.delete(ev.key); - }); - }); - _bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-enabled", () => { - this.update(); - }); - _bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-disabled", () => { - this.update(); - }); - _bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-reloaded", () => { - this.update(); - }); - _bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-unloaded", () => { - this.update(); - }); - _bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-loaded", () => { - this.update(); - }); - } - - enable() { - this.enabled = true; - this.update(); - } - - disable() { - this.enabled = false; - this.update(); - } - - update(key) { - if (!this.windows.size) return; - - if (!this.enabled) { - return this.removeThemes(key); - } else { - return this.applyThemes(key); - } - } - - removeThemes(key) { - if (this.enabled) return; - - if (key) { - let window = this.windows.get(key); - if (!window) return; - let document = window.document; - - for (let style of document.querySelectorAll("style[data-lightcord-theme=true]")) { - style.remove(); - } - } else { - for (let key of this.windows.keys()) { - this.removeThemes(key); - } - } - } - - applyThemes(key) { - if (!this.enabled) return; - - if (key) { - let window = this.windows.get(key); - if (!window) return; - let document = window.document; - - for (let style of document.querySelectorAll("style[data-lightcord-theme=true]")) { - style.setAttribute("will-remove", "true"); - } - - Object.keys(bdthemes).forEach(themeName => { - if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][themeName]) return; // theme disabled - - const theme = bdthemes[themeName]; - if (!theme) return; //:shrug: - - let existing = document.querySelector("style[data-lightcord-theme=true]#" + _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].escapeID(theme.id)); - - if (existing) { - existing.innerHTML = unescape(theme.css); - existing.removeAttribute("will-remove"); - } else { - const style = document.createElement("style"); - style.id = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].escapeID(theme.id); - style.innerHTML = unescape(theme.css); - style.setAttribute("data-lightcord-theme", "true"); - document.head.append(style); - } - }); - - for (let style of document.querySelectorAll("style[will-remove=true]")) { - style.remove(); - } - } else { - for (let key of this.windows.keys()) { - this.applyThemes(key); - } - } - } - -}()); - -/***/ }), - -/***/ "./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 _Layers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Layers */ "./src/modules/Layers.jsx"); - - - - - - - -/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers { - constructor() { - this._appendButton = this._appendButton.bind(this); - window.Lightcord.BetterDiscord.V2_PublicServers = this; - } - - render() { - _Layers__WEBPACK_IMPORTED_MODULE_6__["default"].createLayer(close => { - return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], { - rootId: "pubslayerroot", - close - }); - }); - } - - 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; - const button = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li"); - if (button) button.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"); -/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./core */ "./src/modules/core.js"); -/* harmony import */ var _popoutWindow__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./popoutWindow */ "./src/modules/popoutWindow.js"); -/* harmony import */ var _ui_TextInputSetting__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../ui/TextInputSetting */ "./src/ui/TextInputSetting.jsx"); -/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./hooks */ "./src/modules/hooks.js"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -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; - } - -} - -let isClearingCache = false; -/* 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 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"); - } - - 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; - }, []); - } - - onChange(id, checked, sidebar) { - this.updateSettings(id, checked, sidebar); - } - - updateSettings(id, enabled, sidebar) { - if (!["lightcord-8", "no_window_bound", "enable_glasstron", "lightcord-10", "lightcord-11"].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 === "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") { - electron__WEBPACK_IMPORTED_MODULE_19__["ipcRenderer"].sendSync("LIGHTCORD_SET_ALWAYS_ON_TOP", enabled); - } - - 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 = window.Lightcord.Api.settings; - appSettings.set("isTabs", enabled); - appSettings.save(); - DiscordNative.app.relaunch(); - } - - if (id === "lightcord-9") { - _popoutWindow__WEBPACK_IMPORTED_MODULE_30__["default"][enabled ? "enable" : "disable"](); - } - - if (id === "lightcord-10") { - _core__WEBPACK_IMPORTED_MODULE_29__["default"].methods.NotificationsUseShim(enabled); - return; - } - - if (id === "no_window_bound") { - let appSettings = window.Lightcord.Api.settings; - appSettings.set("NO_WINDOWS_BOUND", enabled); - appSettings.delete("IS_MAXIMIZED"); - appSettings.delete("IS_MINIMIZED"); - appSettings.delete("WINDOW_BOUNDS"); - appSettings.save(); - DiscordNative.app.relaunch(); - } - - if (id === "enable_glasstron") { - let appSettings = window.Lightcord.Api.settings; - appSettings.set("GLASSTRON", enabled); - appSettings.save(); - DiscordNative.app.relaunch(); - } - - if (id === "lightcord-11") { - let appSettings = window.Lightcord.Api.settings; - - if (!enabled) { - appSettings.delete("BD_" + id); - appSettings.save(); - return; - } - - appSettings.set("BD_" + id, enabled); - appSettings.save(); - return; - } - - this.saveSettings(); - } - - async initializeSettings() { - 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__["ipcRenderer"].sendSync("LIGHTCORD_SET_ALWAYS_ON_TOP", 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"]["lightcord-9"]) _popoutWindow__WEBPACK_IMPORTED_MODULE_30__["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, forceUpdate) { - let appSettings = window.Lightcord.Api.settings; - 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 => { - return React.createElement(() => { - const forceUpdate = Object(_hooks__WEBPACK_IMPORTED_MODULE_32__["useForceUpdate"])(); - let isChecked = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id]; - if (setting.id === "lightcord-8") isChecked = appSettings.get("isTabs", false); - if (setting.id === "no_window_bound") isChecked = appSettings.get("NO_WINDOWS_BOUND", false); - if (setting.id === "enable_glasstron") isChecked = appSettings.get("GLASSTRON", true); - if (setting.id === "lightcord-10") isChecked = !appSettings.get("DEFAULT_NOTIFICATIONS", true); - let returnValue; - - if (["lightcord-11"].includes(setting.id)) { - let value = appSettings.get("BD_" + setting.id, setting.default || ""); - returnValue = _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_TextInputSetting__WEBPACK_IMPORTED_MODULE_31__["default"], { - id: setting.id, - key: setting.id, - data: setting, - value, - placeholder: setting.default || null, - onChange: (id, value) => { - this.onChange(id, value, sidebar); - } - }); - } else { - 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); - forceUpdate(); - } - }); - } - - if (setting.id == "lightcord-8" && isChecked) { - 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")]; - } - - if (setting.id === "enable_glasstron" && isChecked) { - if (process.platform !== "linux") { - let choices = []; - let actual = null; - - if (process.platform === "win32") { - choices.push("blurbehind", "acrylic", "transparent"); - actual = appSettings.get("GLASSTRON_BLUR", "blurbehind"); - } else if (process.platform === "darwin") { - choices.push("titlebar", "selection", "menu", "popover", "sidebar", "header", "sheet", "window", "hud", "fullscreen-ui", "tooltip", "content", "under-window", "under-page", "none"); - actual = appSettings.get("GLASSTRON_VIBRANCY", "fullscreen-ui"); - } - - return [returnValue, React.createElement(Lightcord.Api.Components.general.SettingSubTitle, {}, "Glasstron Blur"), React.createElement(Lightcord.Api.Components.inputs.Dropdown, { - options: choices.map(e => { - return { - value: e, - label: e - }; - }), - value: actual, - disabled: false, - searchable: true, - clearable: false, - onChange: value => { - if (process.platform === "win32") { - electron__WEBPACK_IMPORTED_MODULE_19__["ipcRenderer"].invoke("LIGHTCORD_SET_BLUR_TYPE", value); - } else { - electron__WEBPACK_IMPORTED_MODULE_19__["ipcRenderer"].invoke("LIGHTCORD_SET_VIBRANCY", value); - } - } - }, null)]; - } - } - - return returnValue; - }); - })]; - }), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(window.Lightcord.Api.Components.inputs.Button, { - color: "yellow", - look: "ghost", - size: "medium", - hoverColor: "red", - - onClick() { - electron__WEBPACK_IMPORTED_MODULE_19__["ipcRenderer"].sendSync("LIGHTCORD_RELAUNCH_APP", { - args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"]) - }); - }, - - wrapper: true - }, "Relaunch without BetterDiscord"), React.createElement(Lightcord.Api.Components.inputs.Button, { - color: "yellow", - look: "ghost", - size: "medium", - hoverColor: "red", - onClick: () => { - if (isClearingCache) return; - isClearingCache = true; - _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Clearing cache...", { - type: "info" - }); - forceUpdate(); - electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWebContents().session.clearCache().then(() => { - _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Cache is cleared !", { - type: "success" - }); - isClearingCache = false; - forceUpdate(); - }).catch(err => { - console.error(err); - _utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("An error occured. Check console for more informations.", { - type: "error" - }); - isClearingCache = false; - forceUpdate(); - }); - }, - wrapper: true, - disabled: isClearingCache - }, "Clear cache")]; - } - - 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, () => this.forceUpdate()); - } - - } - - 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" - }]; - return items; - } - - get LCDevItems() { - let items = []; - if (!window.Lightcord.Settings.devMode) return items; - items.push(...[{ - section: "DIVIDER" - }, { - section: "HEADER", - label: "Lightcord Api" - }, { - text: "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) - }; - }), ...this.LCDevItems.map(e => { - if (e.section) return 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)); - _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-enabled"); - 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)); - _bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-disabled"); - 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) { - return this.toggleTheme(name); -}; - -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 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.unloadTheme(bdtheme.filename); - - const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdtheme.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.openExternal(`${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("." + removeDa(BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea) + " 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(); - } - } - /** - * Format strings with placeholders (`{{placeholder}}`) into full strings. - * Quick example: `PluginUtilities.formatString("Hello, {{user}}", {user: "Zerebos"})` - * would return "Hello, Zerebos". - * @param {string} string - string to format - * @param {object} values - object literal of placeholders to replacements - * @returns {string} the properly formatted string - */ - - - static formatString(string, values) { - for (const val in values) { - let replacement = values[val]; - if (Array.isArray(replacement)) replacement = JSON.stringify(replacement); - if (typeof replacement === "object" && replacement !== null) replacement = replacement.toString(); - string = string.replace(new RegExp(`{{${val}}}`, "g"), replacement); - } - - return string; - } - - 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("." + removeDa(BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar) + " + div") || null; - const form = container ? container.querySelector("form") : null; - const bottom = form ? form.offsetHeight : 80; - const toastWrapper = document.createElement("div"); - toastWrapper.classList.add("bd-toasts"); - toastWrapper.style.setProperty("bottom", bottom + "px"); - document.querySelector("#app-mount").appendChild(toastWrapper); - } - - const toastWrapper = document.querySelector(".bd-toasts"); - 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; - toastWrapper.appendChild(toastElem); - toastWrapper.style.setProperty("left", `calc(50% - ${toastWrapper.offsetWidth / 2}px)`); - 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 ModalActions = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("openModal", "updateModal"); - const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown"); - const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("ConfirmModal"); - if (!ModalActions || !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 ModalActions.openModal(props => { - return _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(ConfirmationModal, Object.assign({ - header: title, - red: danger, - confirmText: confirmText, - cancelText: cancelText, - onConfirm: onConfirm, - onCancel: onCancel - }, props), content); - }, { - modalKey: key - }); - } - - static get removeDa() { - return removeDa; - } - -} - -function 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/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 /*#__PURE__*/React.createElement("svg", _extends({ - viewBox: "0 0 168 168.69" - }, props, { - height: "100%", - width: props.size - }), /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/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" - }, /*#__PURE__*/React.createElement("stop", { - offset: 0, - stopColor: "#e30613" - }), /*#__PURE__*/React.createElement("stop", { - offset: 1, - stopColor: "#731a14" - })), /*#__PURE__*/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" - }, /*#__PURE__*/React.createElement("stop", { - offset: 0, - stopColor: "#e20613" - }), /*#__PURE__*/React.createElement("stop", { - offset: 1, - stopColor: "#731a13" - })), /*#__PURE__*/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" - }, /*#__PURE__*/React.createElement("stop", { - offset: 0, - stopColor: "#e30613" - }), /*#__PURE__*/React.createElement("stop", { - offset: 1, - stopColor: "#731a13" - }))), /*#__PURE__*/React.createElement("path", { - fill: "#fff", - d: "M14.9 35.3h139.2V133H14.9z" - }), /*#__PURE__*/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)" - }), /*#__PURE__*/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)" - }), /*#__PURE__*/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/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 /*#__PURE__*/React.createElement("svg", _extends({ - viewBox: "0 0 31.3 29.5" - }, props.svg, { - height: "100%" - }), /*#__PURE__*/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)" - }), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", _extends({ - xmlns: "http://www.w3.org/2000/svg", - viewBox: "0 0 36 36" - }, this.props.svg, { - height: "100%" - }), /*#__PURE__*/React.createElement("path", { - fill: "#DD2E44", - d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z" - }), /*#__PURE__*/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" - }), /*#__PURE__*/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" - }), /*#__PURE__*/React.createElement("circle", { - cx: "14", - cy: "23", - r: "2", - fill: "#BE1931" - }), /*#__PURE__*/React.createElement("circle", { - cx: "22", - cy: "23", - r: "2", - fill: "#BE1931" - }), /*#__PURE__*/React.createElement("circle", { - cx: "10", - cy: "23", - r: "2", - fill: "#BE1931" - }), /*#__PURE__*/React.createElement("circle", { - cx: "26", - cy: "23", - r: "2", - fill: "#BE1931" - }), /*#__PURE__*/React.createElement("path", { - d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z" - }), /*#__PURE__*/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" - }), /*#__PURE__*/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" - }), /*#__PURE__*/React.createElement("g", { - fill: "#F5F8FA" - }, /*#__PURE__*/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" - }), /*#__PURE__*/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/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 [/*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { - text: "Account Infos" - }), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h5", { - className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 - }, "Profile"), /*#__PURE__*/React.createElement(CodeContent, { - content: this.getProfileValue(), - language: "diff" - }), /*#__PURE__*/React.createElement("h5", { - className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 - }, "Statistics"), /*#__PURE__*/React.createElement(CodeContent, { - content: this.getStatistics(), - language: "diff" - }), /*#__PURE__*/React.createElement("h5", { - className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 - }, "Connected Sessions"), /*#__PURE__*/React.createElement(CodeContent, { - content: this.getSessionValue(), - language: "diff" - })), /*#__PURE__*/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} -- Can See NSFW Channels: ${user.nsfwAllowed}`; - } - - 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.listLanguages)[0]; - return /*#__PURE__*/React.createElement("div", { - class: `${messageModule1.markup} ${messageModule2.messageContent}` - }, /*#__PURE__*/React.createElement("pre", null, /*#__PURE__*/React.createElement("code", { - class: `${scrollbarModule1.scrollbarGhostHairline} hljs`, - dangerouslySetInnerHTML: { - __html: hightlightJS.highlight(this.props.language, this.props.content).value - } - })), /*#__PURE__*/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. - - - - - -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 [/*#__PURE__*/React.createElement(formModule.FormSection, { - tag: "h2", - title: "Lightcord's Api Availlable components" - }, /*#__PURE__*/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.", /*#__PURE__*/React.createElement("div", { - style: { - marginTop: "20px" - } - }), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, { - type: "info" - }, "All these components have error handling. If you want none, add `.original` after the component path."), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, { - type: "warn" - }, "We do not recommend modifying these component with plugins. Only do this if you know what you are doing.")), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/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://lightcord.org/LightcordApi/"); - }, - wrapper: false - }, "Documentation")), allComponents.map(comp => { - const compName = comp.displayName || comp.name; - const compPath = `Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e => window.Lightcord.Api.Components[e][compName])}.${compName}`; - return /*#__PURE__*/React.createElement(ComponentPreview, { - key: compPath, - comp: comp - }); - })]; - } - - get renders() {} - -} - -class ComponentPreview extends React.Component { - constructor(props) { - super(props); - this.state = { - tab: "preview", - elem: props.comp, - options: {} - }; - } - - render() { - const comp = this.props.comp; - let AllPreviews = []; - if (comp.AllPreviews) AllPreviews = comp.AllPreviews; - let state = this.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 /*#__PURE__*/React.createElement("div", { - style: { - margin: "20px" - } - }, /*#__PURE__*/React.createElement("div", { - style: { - backgroundColor: "var(--background-secondary)", - padding: "30px 30px", - borderRadius: "8px" - }, - className: "lc-tab-box-shadow" - }, React.createElement(comp, getProps()))); - }; - - let renderCode = () => { - return /*#__PURE__*/React.createElement("div", { - style: { - margin: "20px" - } - }, /*#__PURE__*/React.createElement("div", { - style: { - backgroundColor: "var(--background-secondary)", - padding: "30px 30px", - borderRadius: "8px" - }, - className: "lc-tab-box-shadow" - }, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher, null, React.createElement(() => { - return /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, { - language: "jsx", - content: generateCode("jsx") - }); - })), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher, null, React.createElement(() => { - return /*#__PURE__*/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-secondary)", -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})`; - } - }; - - let help = comp.help || {}; - let info = help.info ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { - type: "info" - }, help.info) : null; - let warn = help.warn ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { - type: "warn" - }, help.warn) : null; - let danger = help.danger ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { - type: "danger" - }, help.danger) : null; - let error = help.error ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { - type: "error" - }, help.error) : null; - let success = help.success ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, { - type: "success" - }, help.success) : null; - return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingsTitle, null, comp.displayName || comp.name), info, success, warn, error, danger, 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 [/*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), /*#__PURE__*/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 => { - this.setState({ - options: Object.assign({}, state.options, { - [key]: (value.value || "0").replace("opt-", "") - }) - }); - }, - searchable: true - }), /*#__PURE__*/React.createElement("div", { - style: { - marginBottom: "8px" - } - })]; - }), /*#__PURE__*/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: tab => { - this.setState({ - tab - }); - } - })); - } - -} - -/***/ }), - -/***/ "./src/ui/TextInputSetting.jsx": -/*!*************************************!*\ - !*** ./src/ui/TextInputSetting.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 TextInputSetting; }); -/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); -/* harmony import */ var _components_textinput__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/textinput */ "./src/ui/components/textinput.jsx"); - - -let classnames = []; - -function getClassName(name) { - let className = classnames.find(e => e.startsWith(name + "-")); - if (className) return className; - className = BDModules.get(e => e[name])[0][name]; - classnames.push(className); - return className; -} - -class TextInputSetting extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent { - constructor(props) { - super(props); - this.onChange = this.onChange.bind(this); - } - - onChange(value) { - this.props.onChange(this.props.id, value); - } - - render() { - let { - text, - info - } = this.props.data; - - if (this.props.data.experimental) { - if (!classnames.find(e => e.startsWith("beta-"))) { - classnames.push(BDModules.get(e => e.beta && !e.container && !e.userSettingsVoice)[0].beta); - } - - info = [info, /*#__PURE__*/React.createElement("sup", { - className: getClassName("beta") - }, "(EXPERIMENTAL)")]; - } - - return /*#__PURE__*/React.createElement("div", { - className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item" - }, /*#__PURE__*/React.createElement("div", { - className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap" - }, /*#__PURE__*/React.createElement("h3", { - key: "title", - className: "ui-form-title h3 margin-reset margin-reset ui-flex-child" - }, text), /*#__PURE__*/React.createElement(_components_textinput__WEBPACK_IMPORTED_MODULE_1__["default"], { - key: "input", - onChange: this.onChange, - value: this.props.value, - placeholder: this.props.placeholder || null - })), /*#__PURE__*/React.createElement("div", { - className: "ui-form-text style-description margin-top-4", - style: { - flex: "1 1 auto" - } - }, info)); - } - -} - -/***/ }), - -/***/ "./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) => { - if (!container) { - console.error(new Error(`Container is undefined.`)); - return false; - } - - 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*=\"contentRegionScroller-\"]"); - 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 /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], { - color: "black", - side: "top", - text: title - }, /*#__PURE__*/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", /*#__PURE__*/React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], { - className: "bd-icon" - }), this.edit), this.props.remove && this.makeButton("Delete", /*#__PURE__*/React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], { - className: "bd-icon" - }), this.delete), this.props.reload && this.makeButton("Reload", /*#__PURE__*/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 _reloadIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js"); -/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx"); -/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx"); -/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx"); -/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js"); -/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js"); -/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js"); -/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js"); -/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js"); -/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js"); -/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js"); -/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); -/* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js"); -/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../modules/bdEvents */ "./src/modules/bdEvents.js"); -/* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.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_11__["default"].findByDisplayName("Tooltip"); -const React = _modules_v2__WEBPACK_IMPORTED_MODULE_8__["default"].react; -class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_8__["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_6__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_6__["themeCookie"]; - this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"]; - this.sort = this.sort.bind(this); - this.reverse = this.reverse.bind(this); - this.search = this.search.bind(this); - - this.onAddonChanges = function () { - this.forceUpdate(); - }; - - this.onAddonChanges = this.onAddonChanges.bind(this); - } - - componentDidMount() { - const type = (this.isPlugins ? "plugin" : "theme") + "-"; - _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}loaded`, this.onAddonChanges); - _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}unloaded`, this.onAddonChanges); - _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}reloaded`, this.onAddonChanges); - } - - componentWillUnmount() { - const type = (this.isPlugins ? "plugin" : "theme") + "-"; - _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}loaded`, this.onAddonChanges); - _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}unloaded`, this.onAddonChanges); - _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}reloaded`, this.onAddonChanges); - } - - openFolder() { - const shell = __webpack_require__(/*! electron */ "electron").shell; - - const open = shell.openPath || shell.openItem; - open(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["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_12__["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: _0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-7"] ? this.edit.bind(this) : null, - 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(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["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}`]()) : this.getString(a[this.state.sort]); - const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(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( /*#__PURE__*/React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, /*#__PURE__*/React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, { - reload: !_0globals__WEBPACK_IMPORTED_MODULE_6__["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; - let tooltipIsShowing = false; - let tooltip; - return /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_14__["default"], { - text: "Checks for updates of plugins that support this feature. Right-click for a list." - }, /*#__PURE__*/React.createElement("span", { - style: { - marginLeft: "10px" - }, - onMouseLeave: () => { - tooltipIsShowing = false; - tooltip.hide(); - } - }, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { - ref: "checkUpdateButton", - color: "brand", - look: "filled", - size: "min", - hoverColor: "default", - onClick: () => { - try { - _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check in progress.", { - type: "info" - }); - window.PluginUpdates.checkAll().then(() => { - _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check complete.", { - type: "success" - }); - }).catch(err => { - console.error(err); - _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", { - type: "error" - }); - }); - } catch (e) { - console.error(e); - _modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", { - type: "error" - }); - } - }, - wrapper: false, - disabled: false, - onRightClick: () => { - if (!this.refs.checkUpdateButton) return; - if (!window.PluginUpdates || !window.PluginUpdates.plugins) return; - if (tooltipIsShowing) return; - tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_16__["default"](this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(", "), { - side: "bottom", - attachEvents: false - }); - tooltip.show(); - tooltipIsShowing = true; - } - }, "Check for Updates"))); - } - - render() { - const refreshIcon = /*#__PURE__*/React.createElement(Tooltip, { - color: "black", - position: "top", - text: "Reload List" - }, props => /*#__PURE__*/React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_2__["default"], _extends({}, props, { - className: "bd-icon bd-reload bd-reload-header", - size: "18px", - onClick: async () => { - if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"].updateThemeList(); - this.forceUpdate(); - } - }))); - const addonCards = this.getAddons(); - return /*#__PURE__*/React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], { - title: `${this.props.type.toUpperCase()}—${addonCards.length}` - }, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { - key: "folder-button", - color: "brand", - look: "filled", - size: "min", - hoverColor: "default", - onClick: this.openFolder.bind(this), - wrapper: false, - style: { - marginLeft: "10px" - } - }, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), this.renderCheckUpdates(), !_0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-5"] && refreshIcon, /*#__PURE__*/React.createElement("div", { - className: "bd-controls bd-addon-controls" - }, /*#__PURE__*/React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_5__["default"], { - onChange: this.search, - placeholder: `Search ${this.props.type}...` - }), /*#__PURE__*/React.createElement("div", { - className: "bd-addon-dropdowns" - }, /*#__PURE__*/React.createElement("div", { - className: "bd-select-wrapper" - }, /*#__PURE__*/React.createElement("label", { - className: "bd-label" - }, "Sort by:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], { - options: this.sortOptions, - onChange: this.sort, - style: "transparent" - })), /*#__PURE__*/React.createElement("div", { - className: "bd-select-wrapper" - }, /*#__PURE__*/React.createElement("label", { - className: "bd-label" - }, "Order:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], { - options: this.directions, - onChange: this.reverse, - style: "transparent" - })))), /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", { - className: "bd-select-options" - }, this.props.options.map(opt => /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", { - className: `bd-select${style}${isOpen}`, - onClick: this.showMenu, - ref: this.dropdown - }, /*#__PURE__*/React.createElement("div", { - className: "bd-select-value" - }, this.selected.label), /*#__PURE__*/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 { - constructor(props) { - super(props); - this.state = { - focused: false - }; - } - - render() { - const className = ["bd-search-wrapper"]; - if (this.state.focused) className.push("focused"); - return /*#__PURE__*/React.createElement("div", { - className: className.join(" ") - }, /*#__PURE__*/React.createElement("input", { - onChange: this.props.onChange, - onKeyDown: this.props.onKeyDown, - type: "text", - className: "bd-search", - placeholder: this.props.placeholder, - maxLength: "50", - onFocus: () => { - this.setState({ - focused: true - }); - }, - onBlur: () => { - this.setState({ - focused: false - }); - } - }), /*#__PURE__*/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 /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Switch, { - onChange: this.onChange, - value: this.state.checked - }); - } - -} - -/***/ }), - -/***/ "./src/ui/components/textinput.jsx": -/*!*****************************************!*\ - !*** ./src/ui/components/textinput.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 TextInput; }); -/* 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 TextInput extends React.Component { - constructor(props) { - super(props); - this.state = { - value: this.props.value - }; - this.onChange = this.onChange.bind(this); - this.emitChange = this.emitChange.bind(this); - this.input = /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.TextInput.original, { - ref: console.log, - onChange: this.onChange, - value: this.state.value, - placeholder: this.props.placeholder, - onBlur: this.emitChange - }); - } - - onChange(value) { - console.log(value, this.props); - if (this.props.disabled) return; - this.props.onChange(value); - this.setState({ - value: value - }); - } - - emitChange() { - console.log(`Should emit changes.`); - } - - render() { - return this.input; - } - -} - -/***/ }), - -/***/ "./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 _modules_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); -/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js"); -/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js"); -/* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_8__ = __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_8__["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/discord"); - 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 = Buffer.from(_ccss, "base64").toString("utf8"); - } - - 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_6__["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_6__["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_7__["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", Buffer.from(this.editor.session.getValue(), "utf-8").toString("base64")); - } - - 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, ." + _modules_utils__WEBPACK_IMPORTED_MODULE_5__["default"].removeDa(BDModules.get(e => e.app && e.layers)[0].app)); - 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 _modules_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); -/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __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/discord"); - 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 = Buffer.from(_ccss, "base64").toString("utf8"); - } - - 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, ." + _modules_utils__WEBPACK_IMPORTED_MODULE_5__["default"].removeDa(BDModules.get(e => e.app && e.layers)[0].app)); - 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_6__["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", Buffer.from(this.editor.session.getValue(), "utf-8").toString("base64")); - } - -} - -/***/ }), - -/***/ "./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 /*#__PURE__*/React.createElement("svg", { - className: this.props.className || "", - fill: "var(--text-normal)", - viewBox: "0 0 24 24", - style: { - width: size, - height: size - }, - onClick: this.props.onClick - }, /*#__PURE__*/React.createElement("path", { - fill: "none", - d: "M0 0h24v24H0V0z" - }), /*#__PURE__*/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" - }), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", { - className: this.props.className || "", - fill: "var(--text-normal)", - viewBox: "0 0 24 24", - style: { - width: size, - height: size - } - }, /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", { - className: this.props.className || "", - viewBox: "0 0 24 24", - fill: "var(--text-normal)", - style: { - width: size, - height: size - }, - onClick: this.props.onClick - }, /*#__PURE__*/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" - }), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", { - viewBox: "0 0 24 24", - fill: "var(--text-normal)", - className: this.props.className || "", - style: { - width: size, - height: size - }, - onClick: this.props.onClick - }, /*#__PURE__*/React.createElement("path", { - d: "M0 0h24v24H0z", - fill: "none" - }), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", { - className: this.props.className || "", - fill: "var(--text-normal)", - viewBox: "0 0 24 24", - style: { - width: size, - height: size - } - }, /*#__PURE__*/React.createElement("path", { - fill: "none", - d: "M0 0h24v24H0V0z" - }), /*#__PURE__*/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 /*#__PURE__*/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.jsx"); -/* 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 electron__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! electron */ "electron"); -/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); -/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js"); - - - - - - - - - -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 [/*#__PURE__*/React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], { - title: "RichPresence Settings", - settings: this.props.settings, - onChange: this.props.onChange - }), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_7__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { - text: "RichPresence" - }), /*#__PURE__*/React.createElement("div", null, this.optionsComponents), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_7__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], { - text: "Preview" - }), /*#__PURE__*/React.createElement(RpcPreview, { - settings: this - })), /*#__PURE__*/React.createElement("div", { - className: marginModule.marginBottom20 - }), /*#__PURE__*/React.createElement("button", { - style: { - opacity: 0.01 - }, - onClick: window.ohgodohfuck - }, "Oh god Oh fuck"), /*#__PURE__*/React.createElement("button", { - style: { - opacity: 0.01 - }, - onClick: () => { - electron__WEBPACK_IMPORTED_MODULE_6__["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 /*#__PURE__*/React.createElement(InputText, { - setting: e, - manager: this, - id: e.id - }); - } else if (e.type === "number") { - let array = [/*#__PURE__*/React.createElement(InputNumber, { - setting: e, - manager: this, - id: e.id - })]; - /* - if(e.id === "timestamps.start"){ - array.unshift( { - DiscordNative.clipboard.copy(Date.now()+"") - }} />) - }*/ - - return array[0]; - } else if (e.type === "choice") { - if (["assets.small", "assets.large"].includes(e.id)) { - return /*#__PURE__*/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 = /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", { - className: rowModule.row + " " + marginModule.marginBottom20 - }, /*#__PURE__*/React.createElement("div", { - className: `${rowModule.item} ${flexModule.flexChild}` - }, /*#__PURE__*/React.createElement("h5", { - className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 - }, setting.title), this.input), /*#__PURE__*/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 = /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", { - className: rowModule.row + " " + marginModule.marginBottom20 - }, /*#__PURE__*/React.createElement("div", { - className: `${rowModule.item} ${flexModule.flexChild}` - }, /*#__PURE__*/React.createElement("h5", { - className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 - }, setting.title), this.input, setting.id === "timestamps.start" ? /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, { - onClick: () => { - DiscordNative.clipboard.copy(Date.now() + ""); - }, - color: "brand" - }, "Copy current timestamp") : null), /*#__PURE__*/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(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 /*#__PURE__*/React.createElement("div", { - className: rowModule.row + " " + marginModule.marginBottom20 - }, /*#__PURE__*/React.createElement("div", { - className: `${rowModule.item} ${flexModule.flexChild}` - }, /*#__PURE__*/React.createElement("h5", { - className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5 - }, setting.title), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, { - value: this.state.data, - options: options, - onChange: this.onChange.bind(this) - })), /*#__PURE__*/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 /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", { - className: rowModule.row + " " + marginModule.marginBottom20 - }, /*#__PURE__*/React.createElement("div", { - className: `${rowModule.item} ${flexModule.flexChild}` - }, /*#__PURE__*/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() { - return /*#__PURE__*/React.createElement("div", { - className: "lc-tabWrapper" - }, /*#__PURE__*/React.createElement("div", { - className: "lc-tabnav", - style: { - flex: "0 1 auto" - } - }, /*#__PURE__*/React.createElement(Tab, { - preview: this, - title: "Full Profile", - id: "profile" - }), /*#__PURE__*/React.createElement(Tab, { - preview: this, - title: "User Popout", - id: "popout" - })), /*#__PURE__*/React.createElement(PresenceErrorCatcher, { - preview: this.preview, - state: this.state.rpc, - props: { - preview: this - }, - key: this.state.active - })); - } - - 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 /*#__PURE__*/React.createElement("div", { - className: className, - onClick: () => { - this.props.preview.changeTab(this); - } - }, this.props.title); - } - -} - -let emptyClasses; - -class PresenceErrorCatcher extends React.Component { - componentDidCatch(err, errInfo) { - console.error(err, errInfo); - this.setState({ - error: true - }); - } - - render() { - if (!this.state) { - this.state = { - error: false - }; - } - - if (!this.state.error) { - try { - const preview = new this.props.preview(this.props.props); - preview.setState(this.props.state); - return preview.render(); - } catch (err) { - console.error(err); - this.state.error = true; - return this.render(); - } - } else { - emptyClasses = emptyClasses || _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.emptyStateImage && e.emptyState); - - if (!emptyClasses) { - _modules_utils__WEBPACK_IMPORTED_MODULE_8__["default"].showToast("An error occured. Please check the console for more informations."); - return null; - } - - return /*#__PURE__*/React.createElement("div", { - style: { - margin: "20px" - } - }, /*#__PURE__*/React.createElement("div", { - style: { - backgroundColor: "var(--background-primary)", - padding: "30px 30px", - borderRadius: "8px" - }, - className: `lc-tab-box-shadow ${emptyClasses.emptyState}` - }, /*#__PURE__*/React.createElement("div", { - className: emptyClasses.emptyStateImage, - style: { - marginTop: "20px" - } - }), /*#__PURE__*/React.createElement("div", { - className: emptyClasses.emptyStateHeader - }, "An error occured"), /*#__PURE__*/React.createElement("p", { - className: emptyClasses.emptyStateSubtext - }, "Please check the console for more informations. Join our \xAD", /*#__PURE__*/React.createElement("a", { - className: `${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchor} ${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchorUnderlineOnHover}`, - role: "button", - tabindex: 0, - onClick: () => { - _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].joinLC(); - } - }, "support server"), "\xAD for help."))); - } - } - -} - -let popoutModules; -let UserPopoutComponent; -let PopoutProps; - -class Popout extends React.Component { - get modules() { - return popoutModules || (popoutModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "UserPopout"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]); - } - - getComponent() { - let [UserPopout, userModule] = this.modules; - const user = userModule.default.getCurrentUser(); - return React.createElement(() => { - let render1 = UserPopout.default({ - userId: user.id, - guildId: null, - channelId: null, - disableUserProfileLink: true - }); - UserPopoutComponent = render1.type; - PopoutProps = render1.props; - return this.render(); - }, null); - } - - render() { - if (!UserPopoutComponent) return this.getComponent(); - let [_UserPopout, userModule] = this.modules; - const user = userModule.default.getCurrentUser(); - let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data); - - const activity = function () { - if (!this.game) return null; - let game = { - name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name, - application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["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, - type: 0 - }; - return game; - }.call({ - game: data - }); - - const popout = new UserPopoutComponent(Object.assign({}, PopoutProps, { - activity: activity, - userId: user.id - })).render().props.children; // bypass tracking - // remove the stop propagation shit. - - const container = /*#__PURE__*/React.createElement("div", window.Lightcord.Api._.excludeProperties(popout.props, ["onClick", "onContextMenu"])); - return /*#__PURE__*/React.createElement("div", { - className: "lc-userPopout lc-tab-box-shadow" - }, container); - } - -} - -let profileModules; -let UserProfileComponent; -let ProfileProps; -let connectedProfileStore; - -class Profile extends React.Component { - get modules() { - return profileModules || (profileModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "UserProfile"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]); - } - - render() { - let [UserProfile, userModule] = this.modules; - const user = userModule.default.getCurrentUser(); - - if (!UserProfileComponent) { - const render1 = new UserProfile.default({ - user: user - }).render(); - connectedProfileStore = render1.type; - const render2 = new render1.type(render1.props).render(); - const render3 = render2.type.render(render2.props, null); - const render4 = new render3.type(render3.props).render(); - UserProfileComponent = render4.type; - } - - if (!UserProfileComponent) throw new Error(`Couldn't find the UserProfileComponent component.`); - let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data); - - const activity = function () { - if (!this.game) return null; - let game = { - name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name, - application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["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, - type: 0 - }; - return game; - }.call({ - game: data - }); - - ProfileProps = new connectedProfileStore({ - user: user, - close: () => {} - }).render().props; - const profile = new UserProfileComponent(Object.assign({}, ProfileProps, { - activity: activity - })).render().props.children; // bypass tracking - - profile.props.style = { - width: "auto" - }; - return /*#__PURE__*/React.createElement("div", { - className: "lc-tab lc-tab-box-shadow" - }, profile); - } - -} - -/***/ }), - -/***/ "./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 _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js"); -/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js"); -/* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js"); -/* harmony import */ var _modules_hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../modules/hooks */ "./src/modules/hooks.js"); - - - - - -let SettingsView; -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"]); - this.hooks = []; - } - - componentDidMount() { - this.checkConnection(); - } - - setInitialState() { - this.state = { - selectedCategory: -1, - title: "Loading...", - loading: true, - servers: [], - next: null, - connection: { - state: 0, - user: null - }, - section: this.categorySlugs[0], - theme: "dark" - }; - } - - close() { - this.props.close(); - } - - search(query, clear) { - const self = this; - fetch(`${self.searchEndPoint}${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 - }); - }).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); - const win = self.joinWindow = new (__webpack_require__(/*! electron */ "electron").remote.BrowserWindow)(options); - const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info"; - win.webContents.on("did-navigate", (event, url) => { - if (url != "https://auth.discordservers.com/info") return; - win.close(); - self.checkConnection(); - }); - win.loadURL(url); - win.setMenuBarVisibility(false); - } - - get windowOptions() { - return { - width: 500, - height: 550, - backgroundColor: "#282b30", - show: true, - resizable: false, - maximizable: false, - minimizable: false, - alwaysOnTop: true, - frame: true, - center: false, - webPreferences: { - nodeIntegration: false - } - }; - } - - get bdServer() { - const server = { - name: "BetterDiscord", - online: "30000+", - members: "70000+", - 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: "100+", - members: "300+", - categories: ["community", "programming", "support"], - description: "Official Lightcord server for support etc", - identifier: "705908350218666117", - iconUrl: "https://github.com/lightcord.png", - 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_3__["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_3__["default"], { - server: server, - pinned: true, - join: this.join, - guildList: guildList, - fallback: defaultList[Math.floor(Math.random() * 5)] - })]; - } - - get searchEndPoint() { - 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 text = await response.text(); - - if (!text) { - self.setState({ - title: "Not connected to discordservers.com!", - loading: true, - selectedCategory: -1, - connection: { - state: 1, - user: null - } - }); - return; - } - - const data = JSON.parse(text); - 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() { - this.hooks.forEach(e => e()); - SettingsView = SettingsView || _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByDisplayName("SettingsView"); - return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { - id: "pubslayerroot" - }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { - id: "pubslayer" - }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(SettingsView, { - onSetSection: section => { - this.changeCategory(this.categorySlugs.indexOf(section)); - }, - sections: this.sections, - onClose: this.close, - section: this.state.section - }))); - } - - get sections() { - let sections = []; - sections.push({ - section: "HEADER", - label: "Public Servers" - }, { - section: "DIVIDER" - }, { - section: "CUSTOM", - element: this.searchInput.bind(null, () => this, this.searchKeyDown) - }, { - section: "DIVIDER" - }, { - section: "HEADER", - label: "Categories" - }, ...this.categoryButtons.map((value, index) => { - return { - section: this.categorySlugs[index], - label: value, - element: this.content.bind(null, () => this) - }; - }), { - section: "DIVIDER" - }, { - section: "CUSTOM", - element: this.footer - }, { - section: "CUSTOM", - element: this.connection.bind(null, () => this) - }); - return sections; - } - - searchInput(getThis, searchKeyDown) { - const [value, setValue] = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.useState(""); - 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: serchinput => getThis().refs.searchinput = serchinput, - onKeyDown: searchKeyDown, - onChange: e => { - setValue(e.target.value); - }, - type: "text", - className: "input default", - placeholder: "Search...", - maxLength: "50", - value: value - }))); - } - - 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 categorySlugs() { - return this.categoryButtons.map(e => e.toLowerCase().replace(/[^\w\d]+/g, "_")); - } - - 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.setState({ - loading: true, - selectedCategory: id, - title: "Loading...", - term: null, - section: self.categorySlugs[id] - }); - - if (id === 0) { - self.search("", true); - return; - } - - self.search(`?category=${self.categoryButtons[id]}`, true); - } - - content(getThis) { - const self = getThis(); - self.useState(); - const guildList = self.SortedGuildStore.getFlattenedGuildIds(); - const defaultList = self.AvatarDefaults.DEFAULT_AVATARS; - if (self.state.connection.state === 1) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(self.notConnected.bind(null, getThis)); - let columnModule = BDModules.get(e => e.contentColumnDefault)[0]; - return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", { - ref: ref => { - self.refs.content = ref; - }, - key: "pc", - className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default" - }, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["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_3__["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_1__["default"], { - text: self.state.title - }))]; - } - - notConnected(getThis) { - const self = getThis(); //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: ref => self.refs.content = ref, - 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)]; - } - - 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")); - } - - useState() { - const forceUpdate = Object(_modules_hooks__WEBPACK_IMPORTED_MODULE_4__["useForceUpdate"])(); - _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React.useEffect(() => { - const listener = () => { - forceUpdate(); - }; - - this.hooks.push(listener); - return () => { - const index = this.hooks.findIndex(e => e === listener); - if (index < 0) return; - this.hooks.splice(index, 1); - }; - }, []); - } - - connection(getThis) { - const self = getThis(); - self.useState(); - 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_2__["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/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/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.jsx"); -/* 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.jsx": -/*!**********************************!*\ - !*** ./src/ui/settingsGroup.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_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"); -/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx"); -/* harmony import */ var _modules_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/hooks */ "./src/modules/hooks.js"); - - - - - - -let formModule; -let switchItem; -let betaClassNames; -class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent { - constructor(props) { - super(props); - this.state = { - error: false - }; - } - - renderOldSettings() { - 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); - this.forceUpdate(); - } - }); - })]; - } - - componentDidCatch(err, errInfo) { - console.log(err, errInfo); - this.setState({ - error: true - }); - } - - render() { - if (this.state.error) { - try { - return this.renderOldSettings(); - } catch (e) { - console.error(e); - return null; - } - } else { - try { - if (!formModule) formModule = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.FormSection); - if (!switchItem) switchItem = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.default && e.default.displayName === "SwitchItem"); - if (!betaClassNames) betaClassNames = _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].WebpackModules.find(e => e.beta && !e.container && !e.userSettingsVoice); - let children = []; - - if (this.props.description) { - children.push( /*#__PURE__*/React.createElement(formModule.FormText, { - type: "description", - selectable: false - }, this.props.description), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null)); - } - - children.push(...this.props.settings.map(setting => { - let info = [setting.text]; - - if (setting.experimental) { - info.push( /*#__PURE__*/React.createElement("sup", { - className: betaClassNames.beta - }, "(EXPERIMENTAL)")); - } - - return React.createElement(() => { - const forceUpdate = Object(_modules_hooks__WEBPACK_IMPORTED_MODULE_5__["useForceUpdate"])(); - return /*#__PURE__*/React.createElement(switchItem.default, { - onChange: val => { - this.props.onChange(setting.id, val); - forceUpdate(); - }, - key: setting.id, - value: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id], - className: __SECRET_EMOTION__.css({ - marginBottom: "20px" - }), - disabled: false, - hideBorder: false, - note: setting.info, - tooltipNote: null - }, info); - }); - })); - return /*#__PURE__*/React.createElement(formModule.FormSection, { - tag: "h2", - title: this.props.title - }, children); - } catch (e) { - console.error(e); - setImmediate(() => { - this.setState({ - error: true - }); - }); - return null; - } - } - } - -} - -/***/ }), - -/***/ "./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"); - - -let classnames = []; - -function getClassName(name) { - let className = classnames.find(e => e.startsWith(name + "-")); - if (className) return className; - className = BDModules.get(e => e[name])[0][name]; - classnames.push(className); - return className; -} - -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() { - let { - text, - info - } = this.props.data; - - if (this.props.data.experimental) { - if (!classnames.find(e => e.startsWith("beta-"))) { - classnames.push(BDModules.get(e => e.beta && !e.container && !e.userSettingsVoice)[0].beta); - } - - info = [info, React.createElement("sup", { - className: getClassName("beta") - }, "(EXPERIMENTAL)")]; - } - - 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", { - key: "title", - 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"], { - key: "switch", - 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/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/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 - */ - - -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`; -}; - -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 - * @param {boolean} [options.attachEvents=true] - whether the tooltip should listen to mouseenter and mouseleave events. - */ - constructor(node, text, options = {}) { - const { - style = "black", - side = "top", - preventFlip = false, - disabled = false, - attachEvents = true - } = 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); - - if (attachEvents) { - 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("." + _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(BDModules.get(e => e.popouts)[0].popouts) + " ~ ." + _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(BDModules.get(e => e.layerContainer)[0].layerContainer)); - } - /** 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"); - -/***/ }), - -/***/ "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"); - -/***/ }) - -/******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0xheWVycy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvaG9va3MuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3BsdWdpbkNlcnRpZmllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luTW9kdWxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wb3BvdXRXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvYnVnX2h1bnRlci5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvY2lyY3VzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL1RleHRJbnB1dFNldHRpbmcuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy90ZXh0aW5wdXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9tYXJnaW50b3AuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHJlc2VuY2VTZXR0aW5ncy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NlcnZlckNhcmQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzR3JvdXAuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NUaXRsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3N3aXRjaC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhclNlcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwV3JhcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3hTdmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImNyeXB0b1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJlbGVjdHJvblwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJldmVudHNcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibW9kdWxlXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm5vZGUtZmV0Y2hcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicGF0aFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJiYmRDaGFuZ2Vsb2ciLCJkZXNjcmlwdGlvbiIsImNoYW5nZXMiLCJ0aXRsZSIsInR5cGUiLCJpdGVtcyIsInNldHRpbmdzIiwiaWQiLCJpbmZvIiwiaW1wbGVtZW50ZWQiLCJoaWRkZW4iLCJjYXQiLCJjYXRlZ29yeSIsImV4cGVyaW1lbnRhbCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImRlZmF1bHQiLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwibGlnaHRjb3JkU2V0dGluZ3MiLCJkZWZhdWx0TGlnaHRjb3JkU2V0dGluZ3MiLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwiQkRWMiIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwibWV0aG9kcyIsInNldENvbmZpZyIsInNldE1ldGhvZHMiLCJpbml0IiwidjJMb2FkZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZ2V0Q2hhbm5lbCIsImhhc0NoYW5uZWwiLCJyZWxhdGlvblNoaXBNb2R1bGUiLCJhZGRSZWxhdGlvbnNoaXAiLCJETU1vZHVsZSIsImNsb3NlUHJpdmF0ZUNoYW5uZWwiLCJibG9ja2VkIiwidXNlck1vZHVsZSIsImdldEN1cnJlbnRVc2VyIiwiQW50aUJvdERNIiwiYW50aURNIiwiZW5hYmxlZCIsImVuYWJsZSIsInN1YnNjcmliZSIsImRpc2FibGUiLCJ1bnN1YnNjcmliZSIsImV2IiwibWVzc2FnZSIsImF1dGhvciIsImJvdCIsImd1aWxkX2lkIiwiY2hhbm5lbCIsImNoYW5uZWxfaWQiLCJzY2FuTWVzc2FnZSIsInNob3dUb2FzdCIsInVzZXJuYW1lIiwiZGlzY3JpbWluYXRvciIsImxvY2F0aW9uIiwidGVzdCIsImNvbnRlbnQiLCJFbWJlZHNDb250YWlucyIsInNlYXJjaCIsImVtYmVkcyIsIm1hcCIsImVtYmVkIiwiZm9vdGVyIiwidGV4dCIsImZpZWxkcyIsIm5hbWUiLCJtIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsIkN1c3RvbVJpY2hQcmVzZW5jZSIsImdhbWUiLCJmb3JtYXRlZEdhbWUiLCJhcHBsaWNhdGlvbl9pZCIsImRldGFpbHMiLCJzdGF0ZSIsInRpbWVzdGFtcHMiLCJzdGFydCIsImFzc2V0cyIsImxhcmdlX2ltYWdlIiwic21hbGxfaW1hZ2UiLCJzZW5kR2FtZSIsIkxPQ0FMX0FDVElWSVRZX1VQREFURSIsImFjdGl2aXR5IiwiY29uc29sZSIsImxvZyIsInNldCIsImZldGNoQXNzZXRzIiwiYXBwbGljYXRpb25JZCIsImdldEFzc2V0cyIsIkVycm9yIiwiTGF5ZXJzIiwibGF5ZXJzIiwiQmV0dGVyRGlzY29yZCIsImlzSW5qZWN0ZWQiLCJxdWVyeVNlbGVjdG9yIiwiaW5qZWN0IiwiY2xhc3NOYW1lTGF5ZXJzIiwicmVtb3ZlRGEiLCJ2MiIsIldlYnBhY2tNb2R1bGVzIiwiZmluZCIsImxheWVyIiwiUmVhY3RJbnN0YW5jZSIsIkFwaSIsIkZpbmRSZWFjdCIsInJlbmRlciIsImNhbGwiLCJjbGFzc0xpc3QiLCJwcm9wcyIsImNoaWxkcmVuIiwic3BsaXQiLCJwdXNoIiwiam9pbiIsImZvckVhY2giLCJmb3JjZVVwZGF0ZSIsImNyZWF0ZUxheWVyIiwidXVpZHY0IiwibGF5IiwiaW5kZXgiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJyZW1vdmUiLCJMYXllck1vZHVsZXMiLCJMYXllciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiYW5pbWF0aW9uIiwibW9kdWxlcyIsIlZhbHVlIiwiZ2V0TGF5ZXIiLCJrZXlkb3duIiwid2hpY2giLCJkaXYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnREaWRNb3VudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJjb21wb25lbnRXaWxsRW50ZXIiLCJ0aW1pbmciLCJ0b1ZhbHVlIiwiZHVyYXRpb24iLCJjb21wb25lbnRXaWxsTGVhdmUiLCJpbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGUiLCJpbnB1dFJhbmdlIiwib3V0cHV0UmFuZ2UiLCJzdHlsZSIsIm9wYWNpdHkiLCJ0cmFuc2Zvcm0iLCJzY2FsZSIsIkRpdiIsIl9fU0VDUkVUX0VNT1RJT05fXyIsImNzcyIsImJhY2tncm91bmRDb2xvciIsInBvc2l0aW9uIiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwiZGlzcGxheSIsIm92ZXJmbG93IiwiV2Via2l0Qm94T3JpZW50IiwiV2Via2l0Qm94RGlyZWN0aW9uIiwibXNGbGV4RGlyZWN0aW9uIiwiZmxleERpcmVjdGlvbiIsInpJbmRleCIsInBhZGRpbmdUb3AiLCJmaWx0ZXIiLCJkZWZhdWx0UHJvcHMiLCJSZWFjdERPTSIsIlJlYWN0RG9tIiwiUmVhY3RDb21wb25lbnQiLCJXaW5kb3dDb25maWdGaWxlIiwiZW1vdGVzIiwic2NyZWVuV2lkdGgiLCJNYXRoIiwibWF4IiwiZG9jdW1lbnRFbGVtZW50IiwiY2xpZW50V2lkdGgiLCJpbm5lcldpZHRoIiwic2NyZWVuSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyIsImdldFdpbmRvd1ByZWZlcmVuY2UiLCJzZXRXaW5kb3dQcmVmZXJlbmNlIiwiaW5qZWN0Q1NTIiwiRE9NIiwiYWRkU3R5bGUiLCJlc2NhcGVJRCIsImNsZWFyQ1NTIiwicmVtb3ZlU3R5bGUiLCJsaW5rSlMiLCJhZGRTY3JpcHQiLCJ1bmxpbmtKUyIsInJlbW92ZVNjcmlwdCIsImdldFBsdWdpbiIsImhhc093blByb3BlcnR5IiwicGx1Z2luIiwiZ2V0Q29yZSIsIm1haW5Db3JlIiwiYWxlcnQiLCJzaG93Q29uZmlybWF0aW9uTW9kYWwiLCJjYW5jZWxUZXh0Iiwib3B0aW9ucyIsImZpbmRNb2R1bGUiLCJmaW5kQWxsTW9kdWxlcyIsImZpbmRBbGwiLCJmaW5kTW9kdWxlQnlQcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkV2ZW50RW1pdHRlciIsInJlcXVpcmUiLCJldmVudE5hbWUiLCJhcmdzIiwiZW1pdCIsIm9mZiIsImV2ZW50QWN0aW9uIiwicmVtb3ZlTGlzdGVuZXIiLCJzZWxlY3RvcnMiLCJnZXRTZWxlY3RvcnMiLCJzdGFuZGFyZFNpZGViYXJWaWV3IiwiZGVmYXVsdENsYXNzTmFtZSIsInNlbGVjdHMiLCJ1c2VyU2V0dGluZ3NBY2NvdW50IiwicGF5bWVudFNvdXJjZVJvdyIsInN1YlRleHQiLCJkZXNjcmlwdGlvbldyYXBwZXIiLCJ2aWV3Qm9keSIsInVzZXJTZXR0aW5nc1NlY3VyaXR5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJwYXRjaENsYXNzTW9kdWxlcyIsIm5vcm1hbGl6ZUVsZW1lbnQiLCJwYXRjaERPTU1ldGhvZHMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsImNvbXBvbmVudE5hbWUiLCJjbGFzc05hbWVzIiwibm9ybWFsQ2xhc3MiLCJjYW1lbENhc2UiLCJzIiwiaSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJuZXdTdHJpbmciLCJ0cmltIiwiZWxlbWVudCIsImNsYXNzZXMiLCJjIiwiY2xlbiIsIm5ld0NsYXNzIiwiYWRkIiwiY2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ0b1JlbW92ZSIsImNvbnRhaW5zIiwiRE9NVG9rZW5MaXN0IiwidG9rZW4iLCJ0b2tlbnMiLCJ0IiwiQ29sb3JlZFRleHQiLCJpbmplY3RDb2xvcmVkVGV4dCIsImNhbmNlbENvbG9yZWRUZXh0IiwiTWVzc2FnZUNvbXBvbmVudCIsImJlZm9yZSIsIm1ldGhvZEFyZ3VtZW50cyIsImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlQ29udGVudCIsImRpc3BsYXlOYW1lIiwib3JpZ2luYWxUeXBlIiwiX19vcmlnaW5hbE1ldGhvZCIsInJvbGVDb2xvciIsImNvbG9yU3RyaW5nIiwiY29sb3IiLCJhc3NpZ24iLCJyZW1vdmVDb2xvcmVkVGV4dCIsImNsYXNzTmFtZU1hcmt1cCIsIm1hcmt1cCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJlbGVtIiwic2V0UHJvcGVydHkiLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJlbGVjdHJvbiIsInNlbmRTeW5jIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsImFkZG9uQ2FjaGUiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsInBhdGNoRXh0ZW5zaW9ucyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwibG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUiLCJkYXRhU3RvcmUiLCJnZXRTZXR0aW5nR3JvdXAiLCJzZXRTZXR0aW5nR3JvdXAiLCJlbmNyeXB0U2V0dGluZ3NDYWNoZSIsIkpTT04iLCJwYXJzZSIsImRlY3J5cHRTZXR0aW5nc0NhY2hlIiwiaGFzaCIsInJlc3VsdCIsInN1c3BlY3QiLCJzYXZlQWRkb25DYWNoZSIsInN0cmluZ2lmeSIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsInNpemUiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwicHJvY2Vzc0ZpbGUiLCJ0aW1lc3RhbXAiLCJmaWxlIiwiaGFybSIsIl9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImNvbmZpZyIsImhhc1N0YXJ0ZWQiLCJmbGF0IiwidmVyc2lvbiIsIkVEIiwiV2ViU29ja2V0IiwicGF0Y2hBdHRyaWJ1dGVzIiwiaW5pdFNldHRpbmdzIiwiY2hlY2tGb3JHdWlsZHMiLCJpbml0aWFsaXplIiwiaW5pdGlhbGl6ZVNldHRpbmdzIiwiY29udGVudE1hbmFnZXIiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJjbGljayIsIlBsdWdpbkNlcnRpZmllciIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJpbml0T2JzZXJ2ZXIiLCJzaG93Q29udGVudEVycm9ycyIsInBsdWdpbnMiLCJ0aGVtZXMiLCJwcmV2aW91c1ZlcnNpb24iLCJzaG93Q2hhbmdlbG9nTW9kYWwiLCJFbW9qaU1vZHVsZSIsInBhdGNoU29jaWFsIiwicGF0Y2hHdWlsZFBpbGxzIiwicGF0Y2hHdWlsZExpc3RJdGVtcyIsInBhdGNoR3VpbGRTZXBhcmF0b3IiLCJwYXRjaE1lc3NhZ2VIZWFkZXIiLCJwYXRjaE1lbWJlckxpc3QiLCJwYXRjaEF0dGFjaG1lbnQiLCJoYXZlSW5zdGFsbGVkRGVmYXVsdCIsIm9uQ2xvc2UiLCJsb2dvIiwiaW5uZXJIVE1MIiwiYXR0cmlic1BhdGNocyIsImNhbmNlbFBhdGNoQXR0cmlidXRlcyIsIkFuY2hvciIsImVuc3VyZUV4cG9ydGVkIiwidGhlbiIsIkRpc2NvcmRUYWciLCJEaXNjb3JkVGFnQ29tcCIsImJhZGdlRGl2IiwibWFyZ2luVG9wIiwidXNlciIsIlRvb2x0aXBXcmFwIiwic2lkZSIsImhyZWYiLCJ0YXJnZXQiLCJCRExvZ28iLCJMaWdodGNvcmRMb2dvIiwiYXBwbHlCYWRnZXMiLCJ0aW1lc0NoZWNrZWQiLCJ3cmFwcGVyIiwiZ3VpbGRDbGFzc2VzIiwiZ3VpbGQiLCJsaXN0SXRlbSIsImJsb2IiLCJibG9iQ29udGFpbmVyIiwiZGVmZXJMb2FkZWQiLCJyZWFkeVN0YXRlIiwiaW5qZWN0RXh0ZXJuYWxzIiwic2F2ZVNldHRpbmdzIiwibG9hZFNldHRpbmdzIiwic2V0dGluZyIsImdldFByZWRpY2F0ZVNlY3Rpb25zIiwic2V0dGluZ01vZHVsZSIsInNlY3Rpb24iLCJwb3BlZCIsInBvcCIsInJlbmRlclNpZGViYXIiLCJjbGFzc05hbWVMYXllciIsImNsYXNzTmFtZVNvY2lhbExpbmtzIiwiY2xhc3NOYW1lTW9kYWwiLCJtYWluT2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwibWxlbiIsIm11dGF0aW9uIiwicmF3T2JzZXJ2ZXIiLCJhZGRlZE5vZGVzIiwiYW5pbWF0aW5nIiwic29jaWFsTGlua3MiLCJtb2RhbCIsImlubmVyIiwicmVzcG9uc2l2ZVdpZHRoTW9iaWxlIiwiZ2V0QXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwicGFyZW50RWxlbWVudCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic29jaWFsUGF0Y2giLCJUYWJCYXIiLCJzb2NpYWxNb2R1bGUxIiwib3JpZ2luYWwiLCJuZXdPbmUiLCJyZXR1cm5WYWwiLCJsaW5rIiwiY2xhc3NOYW1lQ29sb3JNdXRlZCIsInNpemVzIiwiY2xhc3NOYW1lVmVyc2lvbkhhc2giLCJjb2xvck11dGVkIiwic2l6ZTMyIiwidmVyc2lvbkhhc2giLCJicmFuY2giLCJidWlsZEluZm8iLCJhZGRpdGlvbmFsIiwicmVhY3QiLCJzaXplMTIiLCJjb21taXQiLCJvcmlnaW5hbFZlcnNpb25zIiwiZ2V0R3VpbGRDbGFzc2VzIiwiZ3VpbGRzV3JhcHBlciIsImZpbmRCeVByb3BzIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImNoYXQiLCJuZXh0VGljayIsImdldEVsZW1lbnRCeUlkIiwiY2hpbGROb2RlcyIsImJsb2NrRGl2IiwiZGlzdGFudCIsImdldEJhZGdlcyIsImJhZGdlcyIsInN2ZyIsIndpZHRoIiwic2NvcGVzIiwic2NvcGUiLCJjb21wb25lbnQiLCJkaXYyIiwicmVhY3REb20iLCJtZW1iZXJMaXN0UGF0Y2giLCJNZW1iZXJMaXN0SXRlbSIsInJlbmRlckRlY29yYXRvcnMiLCJ1cGRhdGVJbmplY3RvciIsImluamVjdGlvblBhdGgiLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJhcHAiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsImVudiIsIkFQUERBVEEiLCJIT01FIiwiWERHX0NPTkZJR19IT01FIiwic3RhYmxlIiwiY2FuYXJ5IiwicHRiIiwicGx1Z2luRGF0YSIsIkJERmlsZSIsIndyaXRlRmlsZVN5bmMiLCJzZXR0aW5nc0ZpbGUiLCJ1bmxpbmtTeW5jIiwiX2luamVjdGlvblBhdGgiLCJjb25maWdGaWxlIiwiX2NvbmZpZ0ZpbGUiLCJfQkRGaWxlIiwiX3NldHRpbmdzRmlsZSIsImdldFBsdWdpbkZpbGUiLCJEZXZNb2RlIiwiZGVidWdMaXN0ZW5lciIsImNvcHlTZWxlY3Rvckxpc3RlbmVyIiwic3RhcnREZWJ1Z0xpc3RlbmVyIiwic3RhcnRDb3B5U2VsZWN0b3IiLCJzdG9wRGVidWdMaXN0ZW5lciIsInN0b3BDb3B5U2VsZWN0b3IiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInN0b3BQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwiY2xpZW50WCIsInNjcm9sbGVyQ2xhc3NlcyIsInNjcm9sbGVyV3JhcCIsInNjcm9sbGVyVGhlbWVkIiwidGhlbWVHaG9zdEhhaXJsaW5lIiwic2Nyb2xsZXIiLCJyZW1vdmVDTSIsImtleUNvZGUiLCJjbWciLCJjbWkiLCJpdGVtIiwibGFiZWxDb250YWluZXIiLCJjb2xvckRlZmF1bHQiLCJsYWJlbCIsIk5hdGl2ZU1vZHVsZSIsImNvcHkiLCJlbGVtZW50cyIsInF1ZXJ5QWxsIiwiZm9jdXNlZCIsInNlcGFyYXRvciIsInNjcm9sbEhlaWdodCIsImZ1bGxQYXRoIiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJlbnRyaWVzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIkRpc2FibGVUeXBpbmciLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwic3RvcFR5cGluZyIsInJhbmRvbSIsInYiLCJhd2FpdGluZ0JhZGdlc1Byb21pc2VzIiwiYmFkZ2VzVG9GZXRjaCIsIkRpc3RhbnRTZXJ2ZXIiLCJfY2FjaGUiLCJuZXdQcm9taXNlIiwicmVzIiwiQ29uc3RhbnRzIiwiZGVmYXVsdFVzZXJzIiwiZmV0Y2hlZEJhZGdlcyIsInVzZXJzIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInJlc3BvbnNlQm9keSIsImpzb24iLCJwcm9taXNlIiwidXNlcl9pZCIsImNhdGNoIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIkJ1Z0h1bnRlckJhZGdlIiwiQ2lyY3VzIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJfIiwidXBkYXRlIiwicGVyZm9ybWFuY2UiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJtYXRjaGVzIiwicHJldmlvdXMiLCJwcmV2aW91c0FsbCIsInByZXZpb3VzVW50aWwiLCJpbmRleEluUGFyZW50IiwibnVtIiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsIm9uIiwiZXZlbnQiLCJkZWxlZ2F0ZSIsIm5hbWVzcGFjZSIsImhhc0RlbGVnYXRlIiwiZXZlbnRGdW5jIiwiY2FuY2VsIiwibmV3Q2FuY2VsIiwib25jZSIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJkb21XcmFwcGVyIiwicmVzb2x2ZUVsZW1lbnQiLCJFbW9qaVJlZ2V4IiwiQ3VzdG9tRW1vamlNb2R1bGUiLCJDdXN0b21FbW9qaSIsIkVtb2ppTW9kdWxlQXBpIiwiZ2V0Q3VzdG9tRW1vamlCeUlkIiwiQXV0b2NvbXBsZXRlTW9kdWxlIiwiQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMiLCJnZXRBdXRvY29tcGxldGVPcHRpb25zIiwiRW1vamlNb2R1bGVRdWVyeSIsInF1ZXJ5RW1vamlSZXN1bHRzIiwiTWVzc2FnZXMiLCJFTU9KSV9NQVRDSElORyIsImd1aWxkTW9kdWxlIiwiZ2V0R3VpbGQiLCJnZXRHdWlsZHMiLCJpc0ZldGNoaW5nIiwiZW1vamlTZWFyY2giLCJnZXREaXNhbWJpZ3VhdGVkRW1vamlDb250ZXh0IiwiYXBwU2V0dGluZ3MiLCJnZXRWYWx1ZSIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uQ2xpY2siLCJvbkhvdmVyIiwiUiIsInByZWZpeCIsIlRpdGxlIiwiRW1vamlGaWx0ZXJNb2R1bGUiLCJpc0Vtb2ppRGlzYWJsZWQiLCJpc1VzYWJsZSIsInVzYWJsZSIsInN1cnJvZ2F0ZXMiLCJkaXZlcnNpdHkiLCJ1c2VTdGF0ZSIsInVzZUZvcmNlVXBkYXRlIiwic2V0VmFsdWUiLCJjYWNoZTIiLCJwcm9jZXNzQXR0YWNobWVudCIsImlzVHJ1c3RlZCIsInRlc3RzIiwidGhyZWF0cyIsImNoZWNrVmlydXNlcyIsInJlc3VsdENhbGxiYWNrIiwicmVtb3ZlQ2FsbGJhY2siLCJpc0hhcm1mdWwiLCJub19jb21tZW50cyIsInJlbW92ZUNvbW1lbnQiLCJzY3JwdCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInRvb2x0aXBXcmFwIiwidmlld0JveCIsIngiLCJ5IiwibWFzayIsImZpbGwiLCJwb2ludGVyRXZlbnRzIiwib2ZmaWNpYWwiLCJzcGFuIiwiZmxvYXQiLCJmbG93ZXJTdGFyIiwiZ2V0S2V5ZWRBcnJheSIsImJ1ZmZlciIsImluc3RhbGxQYXRoIiwiY3Vyc29yIiwic3Ryb2tlIiwic2F2ZSIsIk9iamVjdFN0b3JhZ2UiLCJsb2NhbFN0b3JhZ2VNb2R1bGUiLCJsb2NhbFN0b3JhZ2UiLCJpbXBsIiwiYnRvYSIsInNldEludGVydmFsIiwic2FmZUpTT05QYXJzZSIsImF0b2IiLCJnZW5lcmF0ZUtleSIsImRlY2lwaGVyIiwiZGVjcnlwdGVkIiwiZmluYWwiLCJjaXBoZXIiLCJlbmNyeXB0ZWQiLCJQbHVnaW5Nb2R1bGUiLCJsb2FkUGx1Z2luRGF0YSIsImxvYWQiLCJzYXZlUGx1Z2luRGF0YSIsInJlbW90ZSIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsImNoYW5uZWxTd2l0Y2giLCJzdGFydFBsdWdpbiIsInN0b3BQbHVnaW4iLCJlbmFibGVQbHVnaW4iLCJkaXNhYmxlUGx1Z2luIiwidG9nZ2xlUGx1Z2luIiwicCIsImZpbGVuYW1lT3JOYW1lIiwiYmRwbHVnaW4iLCJkZWxldGUiLCJlZGl0Iiwic2hlbGwiLCJvcGVuRXh0ZXJuYWwiLCJ1cGRhdGVQbHVnaW5MaXN0Iiwic2F2ZWQiLCJuZXdNZXNzYWdlIiwib25NZXNzYWdlIiwib25Td2l0Y2giLCJwb3BvdXRXaW5kb3ciLCJ3aW5kb3dzIiwiTWFwIiwicG9wb3V0TW9kdWxlIiwiZ2V0V2luZG93Iiwic2V0SW1tZWRpYXRlIiwiYmRFdmVudHMiLCJyZW1vdmVUaGVtZXMiLCJhcHBseVRoZW1lcyIsInRoZW1lTmFtZSIsInRoZW1lIiwiZXhpc3RpbmciLCJ1bmVzY2FwZSIsInJlbW92ZUF0dHJpYnV0ZSIsIlYyX1B1YmxpY1NlcnZlcnMiLCJfYXBwZW5kQnV0dG9uIiwiVjJDX1B1YmxpY1NlcnZlcnMiLCJyb290SWQiLCJidXR0b24iLCJidG4iLCJjaXJjbGVCdXR0b25NYXNrIiwiY2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXIiLCJkb3dubG9hZFByb2dyZXNzIiwidHV0b3JpYWxDb250YWluZXIiLCJhZGRCdXR0b24iLCJndWlsZFBhdGNoIiwiR3VpbGRMaXN0Iiwid2VicGFja01vZHVsZXMiLCJHdWlsZExpc3RPbGQiLCJyZW1vdmVCdXR0b24iLCJCRFNpZGViYXJIZWFkZXIiLCJQdXJlQ29tcG9uZW50Iiwic2lkZWJhckNvbXBvbmVudHMiLCJIZWFkZXIiLCJJdGVtIiwiY2hhbmdlbG9nQnV0dG9uIiwiSGlzdG9yeSIsInJlbmRlcmVkIiwiaXNDbGVhcmluZ0NhY2hlIiwiVjJfU2V0dGluZ3NQYW5lbCIsInVwZGF0ZVNldHRpbmdzIiwic2lkZWJhciIsIlYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciIsInJlZ2lzdGVyQ29tcG9uZW50cyIsInJlZ2lzdGVyIiwibWFrZUNvbXBvbmVudCIsImxpZ2h0Y29yZENvbXBvbmVudCIsIlByZXNlbmNlQ29tcG9uZW50IiwiQWNjb3VudEluZm9zQ29tcG9uZW50IiwiQXBpUHJldmlld0NvbXBvbmVudCIsImNvcmVDb21wb25lbnQiLCJjdXN0b21Dc3NDb21wb25lbnQiLCJyZW5kZXJBZGRvblBhbmUiLCJjb3JlU2V0dGluZ3MiLCJnZXRTZXR0aW5ncyIsImNhdGVnb3JpZXMiLCJTZXQiLCJzZWN0aW9ucyIsIlByZXNlbmNlU2V0dGluZ3MiLCJjaGVja2VkIiwicHVibGljU2VydmVyc01vZHVsZSIsInZvaWNlTW9kZSIsInRmSG91ciIsImNvbG9yZWRUZXh0IiwiZE1vZGUiLCJTZXR0aW5ncyIsImRldk1vZGUiLCJjYWxsUmluZ2luZ0JlYXQiLCJzZXR0aW5nc1N0b3JlIiwic2hvd0N1cnJlbnRHYW1lIiwidXBkYXRlUmVtb3RlU2V0dGluZ3MiLCJpcGNSZW5kZXJlciIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwicmVsYXVuY2giLCJjb3JlIiwiTm90aWZpY2F0aW9uc1VzZVNoaW0iLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiaXNDaGVja2VkIiwiVGV4dElucHV0U2V0dGluZyIsInBsYWNlaG9sZGVyIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsImxvb2siLCJob3ZlckNvbG9yIiwiaXBjIiwic2VuZCIsImNob2ljZXMiLCJhY3R1YWwiLCJnZW5lcmFsIiwiU2V0dGluZ1N1YlRpdGxlIiwiRHJvcGRvd24iLCJzZWFyY2hhYmxlIiwiY2xlYXJhYmxlIiwiaW52b2tlIiwiYXJndiIsInNlc3Npb24iLCJjbGVhckNhY2hlIiwiVjJDX1ByZXNlbmNlU2V0dGluZ3MiLCJWMkNfQWNjb3VudEluZm9zIiwiQXBpUHJldmlldyIsIkNzc0VkaXRvciIsIkNvbnRlbnRMaXN0Iiwib3JpZ2luYWxSZW5kZXIiLCJlbnVtZXJhYmxlIiwiQ2FyZExpc3QiLCJTZXR0aW5nQ29tcG9uZW50IiwicGFuZWxzIiwicGFuZWwiLCJnZXRDb21wb25lbnQiLCJMQ2l0ZW1zIiwiTENEZXZJdGVtcyIsIlRoZW1lTW9kdWxlIiwibG9hZFRoZW1lRGF0YSIsInNhdmVUaGVtZURhdGEiLCJlbmFibGVUaGVtZSIsImRpc2FibGVUaGVtZSIsInRvZ2dsZVRoZW1lIiwiYmR0aGVtZSIsInVwZGF0ZVRoZW1lTGlzdCIsIl93aW5kb3dDb25maWdGaWxlIiwidHJhbnNwYXJlbnQiLCJmcmFtZSIsImNoYXJDb2RlQXQiLCJnZXRUZXh0QXJlYSIsImNoYW5uZWxUZXh0QXJlYSIsInRpdGxlV3JhcHBlciIsImluc2VydFRleHQiLCJ0ZXh0YXJlYSIsImZvY3VzIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJleGVjQ29tbWFuZCIsIm1vZHVsZU5hbWUiLCJncm91cENvbGxhcHNlZCIsImdyb3VwRW5kIiwiZm9ybWF0U3RyaW5nIiwic3RyaW5nIiwicmVwbGFjZW1lbnQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsZWQiLCJjYW5jZWxQYXRjaCIsIm9yaWdpbmFsTWV0aG9kIiwiY2FsbE9yaWdpbmFsTWV0aG9kIiwidGVtcFJldCIsIl9fbW9ua2V5UGF0Y2hlZCIsImRpc2Nvbm5lY3QiLCJoYXNOb3RpY2UiLCJmb3JtIiwidG9hc3RXcmFwcGVyIiwiaWNvbiIsInRpbWVvdXQiLCJ0b2FzdEVsZW0iLCJpbm5lclRleHQiLCJtb2RhbE1vZHVsZSIsImhpZGVPbkZ1bGxzY3JlZW4iLCJoZWFkZXJNb2R1bGUiLCJoZWFkZXIiLCJmb290ZXIyTW9kdWxlIiwiZm9jdXNMb2NrIiwiYmFja2Ryb3AiLCJiYWNrZHJvcFdpdGhMYXllciIsImNsb3NpbmdMaXN0ZW5lcnMiLCJwbHVnaW5FcnJvcnMiLCJ0aGVtZUVycm9ycyIsImdlbmVyYXRlVGFiIiwidGFicyIsIk1vZGFsU3RhY2siLCJDaGFuZ2Vsb2dDbGFzc2VzIiwiVGV4dEVsZW1lbnQiLCJGbGV4Q2hpbGQiLCJUaXRsZXMiLCJDaGFuZ2Vsb2ciLCJzZWxlY3RhYmxlIiwiTWFya2Rvd25QYXJzZXIiLCJpbWFnZSIsInN1YnRpdGxlIiwiY2UiLCJjaGFuZ2Vsb2dJdGVtcyIsImVudHJ5IiwibWFyZ2luIiwicmVuZGVySGVhZGVyIiwiQ2hpbGQiLCJncm93Iiwic2hyaW5rIiwidGFnIiwiVGFncyIsIkg0IiwiU2l6ZXMiLCJTTUFMTCIsIkNvbG9ycyIsIlNUQU5EQVJEIiwiZGF0ZSIsInJlbmRlckZvb3RlciIsIkFuY2hvckNsYXNzZXMiLCJhbmNob3IiLCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyIiwiam9pblN1cHBvcnRTZXJ2ZXIiLCJqb2luQkQyIiwic3VwcG9ydExpbmsiLCJkZWZhdWx0Rm9vdGVyIiwib25TY3JvbGwiLCJNb2RhbEFjdGlvbnMiLCJNYXJrZG93biIsIkNvbmZpcm1hdGlvbk1vZGFsIiwiZW1wdHlGdW5jdGlvbiIsIm9wZW5Nb2RhbCIsInJlZCIsIm1vZGFsS2V5IiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsImlzRGVmYXVsdCIsIm1vZCIsInByb3h5IiwiZnVuYyIsIl9fcHJvdG9fXyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwiam9pbkxDIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwibWFyZ2luTW9kdWxlMiIsImRlZmF1bHRNYXJnaW5oNSIsImNvbG9yTW9kdWxlIiwiY29sb3JTdGFuZGFyZCIsInNpemVNb2R1bGUiLCJzY3JvbGxiYXJNb2R1bGUxIiwic2Nyb2xsYmFyR2hvc3RIYWlybGluZSIsIkd1aWxkTW9kdWxlIiwiZ2V0UmVsYXRpb25zaGlwcyIsInNlc3Npb25Nb2R1bGUiLCJnZXRTZXNzaW9ucyIsInNpemUxNCIsImg1IiwiZ2V0UHJvZmlsZVZhbHVlIiwiZ2V0U3RhdGlzdGljcyIsImdldFNlc3Npb25WYWx1ZSIsIm1hcmdpbkJvdHRvbTIwIiwic2Vzc2lvbnNSYXciLCJzZXNzaW9ucyIsInNlc3Npb25JZCIsImNsaWVudEluZm8iLCJvcyIsImNsaWVudCIsImFjdGl2aXRpZXMiLCJyZXBlYXQiLCJjcmVhdGVkQXQiLCJhdmF0YXJVUkwiLCJhdmF0YXIiLCJnZXRBdmF0YXJVUkwiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRGdWxsWWVhciIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJmbGFncyIsImhhc1ByZW1pdW1TdWJzY3JpcHRpb24iLCJlbWFpbCIsIm1mYUVuYWJsZWQiLCJtb2JpbGUiLCJwaG9uZSIsInZlcmlmaWVkIiwibnNmd0FsbG93ZWQiLCJyZWxhdGlvbnMiLCJmcmllbmRzIiwiaXNGcmllbmQiLCJpc0Jsb2NrZWQiLCJoaWdodGxpZ2h0SlMiLCJoaWdobGlnaHQiLCJtZXNzYWdlTW9kdWxlMSIsIm1lc3NhZ2VNb2R1bGUyIiwiQ29kZUNvbnRlbnQiLCJsaXN0TGFuZ3VhZ2VzIiwiX19odG1sIiwibGFuZ3VhZ2UiLCJtYXJnaW5Cb3R0b204IiwiZm9ybU1vZHVsZSIsInN0YXRlcyIsIkZvcm1TZWN0aW9uIiwiYWxsQ29tcG9uZW50cyIsImNvbXAiLCJjb21wTmFtZSIsImNvbXBQYXRoIiwicmVuZGVycyIsIkNvbXBvbmVudFByZXZpZXciLCJ0YWIiLCJBbGxQcmV2aWV3cyIsImdldFByb3BzIiwicmVuZGVyUHJldmlldyIsInBhZGRpbmciLCJib3JkZXJSYWRpdXMiLCJyZW5kZXJDb2RlIiwiZ2VuZXJhdGVDb2RlIiwiZ2V0U3RyRm9yUHJvcCIsImxhbmciLCJTdHJpbmciLCIkJHR5cGVvZiIsIlN5bWJvbCIsImZvciIsImNvbXBDYXRlZ29yeSIsInByb3BTdHJpbmdzIiwiY2hpbGRyZW5Qcm9wIiwic3RyIiwib3BlblRhZyIsImNsb3NlVGFnIiwidmlzaWJsZUtleSIsInByb3BPYmplY3QiLCJpc0xhc3QiLCJpc0ZpcnN0IiwiY2hpbGRyZW5EYXRhIiwiaGVscCIsInN1Y2Nlc3MiLCJzZXRTdGF0ZSIsIm1hcmdpbkJvdHRvbSIsImNsYXNzbmFtZXMiLCJnZXRDbGFzc05hbWUiLCJiZXRhIiwidXNlclNldHRpbmdzVm9pY2UiLCJmbGV4IiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJ0cnVzdGVkIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib25BZGRvbkNoYW5nZXMiLCJvcGVuRm9sZGVyIiwib3BlblBhdGgiLCJvcGVuSXRlbSIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldEFkZG9ucyIsInNvcnRlZEFkZG9ucyIsImIiLCJjYXAiLCJmaXJzdCIsInNlY29uZCIsImxvY2FsZUNvbXBhcmUiLCJyZW5kZXJDaGVja1VwZGF0ZXMiLCJaZXJlc1BsdWdpbkxpYnJhcnkiLCJQbHVnaW5VcGRhdGVzIiwiY2hlY2tBbGwiLCJ0b29sdGlwSXNTaG93aW5nIiwidG9vbHRpcCIsIm1hcmdpbkxlZnQiLCJjaGVja1VwZGF0ZUJ1dHRvbiIsIkVtdWxhdGVkVG9vbHRpcCIsImF0dGFjaEV2ZW50cyIsInJlZnJlc2hJY29uIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJUZXh0SW5wdXQiLCJlbWl0Q2hhbmdlIiwiaW5wdXQiLCJWMkNfQ29udGVudENvbHVtbiIsImNvbnRlbnRNb2R1bGUiLCJjb250ZW50Q29sdW1uIiwiY29udGVudENvbHVtbkRlZmF1bHQiLCJWMkNfQ3NzRWRpdG9yIiwibGluZXMiLCJkZXRhY2hlZEVkaXRvciIsIlYyQ19Dc3NFZGl0b3JEZXRhY2hlZCIsInVwZGF0ZUNzcyIsInNhdmVDc3MiLCJkZXRhY2giLCJkZXRhY2hlZCIsImVkaXRvciIsImFjZSIsInNldFRoZW1lIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJkZXRhY2hlZFJvb3QiLCJjb2RlTWlycm9yIiwibGluZU51bWJlcnMiLCJtb2RlIiwiaW5kZW50VW5pdCIsInNjcm9sbGJhclN0eWxlIiwiX2Njc3MiLCJjY3NzIiwidXBkYXRlTGluZUNvdW50IiwibGluZUNvdW50IiwiU2V0dGluZ3NUaXRsZSIsIkNoZWNrYm94IiwiYm9yZGVyUmlnaHQiLCJib3JkZXJMZWZ0IiwiZm9udFNpemUiLCJhcmciLCJkcm9vdCIsIl9yb290IiwiaW5qZWN0RGV0YWNoZWRSb290Iiwicm9vdCIsImluamVjdFJvb3QiLCJCREVycm9yQm91bmRhcnkiLCJoYXNFcnJvciIsImNvbXBvbmVudERpZENhdGNoIiwiRGVsZXRlIiwiRG93bkFycm93IiwiRWRpdCIsIm1hcmdpbk1vZHVsZSIsIm1hcmdpblRvcDYwIiwiVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIiwicHJldmlldyIsImlzZmV0Y2hpbmciLCJhc3NldENvbXBvbmVudHMiLCJ1cGRhdGVXaGVuRmV0Y2hlZCIsImRlZmF1bHRTZXR0aW5nIiwiUlBDUHJvcHMiLCJhc3NldCIsInVwZGF0ZVByZXZpZXciLCJvcHRpb25zQ29tcG9uZW50cyIsIm9oZ29kb2hmdWNrIiwiX29wdGlvbnNDb21wb25lbnRzIiwiYXJyYXkiLCJpbnB1dFRleHRNb2R1bGVzIiwiSW5wdXRUZXh0IiwicmVtb3ZlS2V5YmluZCIsIl9ob3Jpem9udGFsIiwiaW5wdXRNaW5pIiwic2l6ZTE2Iiwic2l6ZTIwIiwibGFzdEVkaXRlZCIsImlzVGltaW5nIiwicm93TW9kdWxlIiwiZmxleE1vZHVsZSIsImlucHV0TW9kdWxlIiwic2l6ZU1vZHVsZTIiLCJyb3ciLCJmbGV4Q2hpbGQiLCJJbnB1dE51bWJlck1vZHVsZXMiLCJJbnB1dE51bWJlciIsImNvbG9yVHJhbnNwYXJlbnQiLCJjbGlwYm9hcmQiLCJJbnB1dENob2ljZU1vZHVsZXMiLCJJbnB1dENob2ljZSIsIkRpdmlkZXJNb2R1bGVzIiwiRGl2aWRlciIsImRpdmlkZXIiLCJkaXZpZGVyRGVmYXVsdCIsIkRpc2NvcmRCdXR0b24iLCJScGNQcmV2aWV3IiwiYWN0aXZlIiwiY2hhbmdlVGFiIiwiYW5jaWVudFRhYiIsInNldEFjdGl2ZSIsInJwYyIsImlzQWN0aXZlIiwiUHJvZmlsZSIsIlBvcG91dCIsIlRhYiIsImVtcHR5Q2xhc3NlcyIsIlByZXNlbmNlRXJyb3JDYXRjaGVyIiwiZXJySW5mbyIsImVtcHR5U3RhdGVJbWFnZSIsImVtcHR5U3RhdGUiLCJlbXB0eVN0YXRlSGVhZGVyIiwiZW1wdHlTdGF0ZVN1YnRleHQiLCJwb3BvdXRNb2R1bGVzIiwiVXNlclBvcG91dENvbXBvbmVudCIsIlBvcG91dFByb3BzIiwiVXNlclBvcG91dCIsInJlbmRlcjEiLCJjaGFubmVsSWQiLCJkaXNhYmxlVXNlclByb2ZpbGVMaW5rIiwiX1VzZXJQb3BvdXQiLCJwb3BvdXQiLCJleGNsdWRlUHJvcGVydGllcyIsInByb2ZpbGVNb2R1bGVzIiwiVXNlclByb2ZpbGVDb21wb25lbnQiLCJQcm9maWxlUHJvcHMiLCJjb25uZWN0ZWRQcm9maWxlU3RvcmUiLCJVc2VyUHJvZmlsZSIsInJlbmRlcjIiLCJyZW5kZXIzIiwicmVuZGVyNCIsInByb2ZpbGUiLCJTZXR0aW5nc1ZpZXciLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsImhvb2tzIiwic2VsZWN0ZWRDYXRlZ29yeSIsImxvYWRpbmciLCJzZXJ2ZXJzIiwiY29ubmVjdGlvbiIsImNhdGVnb3J5U2x1Z3MiLCJmZXRjaCIsInNlYXJjaEVuZFBvaW50Iiwic2VydmVyIiwiam9pbmVkIiwiZW5kIiwidGVybSIsImNhdGVnb3J5QnV0dG9ucyIsInRvdGFsIiwic2VydmVyQ2FyZCIsInBpbm5lZCIsImFjY2VwdEludml0ZSIsImludml0ZV9jb2RlIiwiam9pbkVuZFBvaW50IiwiaWRlbnRpZmllciIsImNyZWRlbnRpYWxzIiwid2luZG93T3B0aW9ucyIsInJvdW5kIiwic2NyZWVuWCIsInNjcmVlblkiLCJ3aW4iLCJqb2luV2luZG93IiwiQnJvd3NlcldpbmRvdyIsIndlYkNvbnRlbnRzIiwibG9hZFVSTCIsInNldE1lbnVCYXJWaXNpYmlsaXR5IiwicmVzaXphYmxlIiwibWF4aW1pemFibGUiLCJtaW5pbWl6YWJsZSIsImFsd2F5c09uVG9wIiwiY2VudGVyIiwid2ViUHJlZmVyZW5jZXMiLCJub2RlSW50ZWdyYXRpb24iLCJiZFNlcnZlciIsIm9ubGluZSIsIm1lbWJlcnMiLCJpY29uVXJsIiwibmF0aXZlam9pbiIsInNlcnZlcjIiLCJndWlsZExpc3QiLCJnZXRGbGF0dGVuZWRHdWlsZElkcyIsImRlZmF1bHRMaXN0IiwiREVGQVVMVF9BVkFUQVJTIiwiU2VydmVyQ2FyZCIsImZhbGxiYWNrIiwiZmxvb3IiLCJjb25uZWN0RW5kUG9pbnQiLCJyZXNwb25zZSIsIm9uU2V0U2VjdGlvbiIsInNlYXJjaElucHV0IiwiZ2V0VGhpcyIsInNlcmNoaW5wdXQiLCJzZWFyY2hpbnB1dCIsIm1heExlbmd0aCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJ1c2VFZmZlY3QiLCJUYWJCYXJTZXBhcmF0b3IiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsIm5vV3JhcCIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJkcmFnZ2FibGUiLCJob3Jpem9udGFsIiwiVjJDX1JlbG9hZEljb24iLCJ4bWxucyIsIlYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiU2V0dGluZ3NHcm91cCIsInN3aXRjaEl0ZW0iLCJiZXRhQ2xhc3NOYW1lcyIsIlYyQ19TZXR0aW5nc0dyb3VwIiwicmVuZGVyT2xkU2V0dGluZ3MiLCJidXR0b25Db21wb25lbnQiLCJWMkNfU2V0dGluZ3NUaXRsZSIsIlN3aXRjaEl0ZW0iLCJWMkNfVGFiQmFyU2VwYXJhdG9yIiwiVG9vbHRpcENsYXNzZXMiLCJnZXRUb29sdGlwQ2xhc3NlcyIsIlRvb2x0aXBMYXllcnMiLCJnZXRUb29sdGlwTGF5ZXJzIiwiZ2V0Q2xhc3MiLCJzaWRlT3JDb2xvciIsInVwcGVyQ2FzZSIsInRvb2x0aXBDbGFzcyIsImNsYXNzRXhpc3RzIiwidG9QeCIsInByZXZlbnRGbGlwIiwidG9vbHRpcEVsZW1lbnQiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwiY2FuU2hvd0Fib3ZlIiwiY2FuU2hvd0JlbG93IiwiY2FuU2hvd0xlZnQiLCJjYW5TaG93UmlnaHQiLCJfY2xhc3NOYW1lIiwic2hvd0Fib3ZlIiwic2hvd0JlbG93Iiwic2hvd0xlZnQiLCJzaG93UmlnaHQiLCJjZW50ZXJIb3Jpem9udGFsbHkiLCJjZW50ZXJWZXJ0aWNhbGx5Iiwibm9kZWNlbnRlciIsImZpbmRET01Ob2RlIiwiVjJDX1hTdmciXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFD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QyxlQUFTLEVBQUUsTUFBWjtBQUFvQnkrQixVQUFJLEVBQUUsU0FBMUI7QUFBcUN0RCxPQUFDLEVBQUU7QUFBeEMsS0FBakMsQ0FKSixDQUhHLENBQVA7QUFVSDs7QUFoQnFELEM7Ozs7Ozs7Ozs7O0FDRjFELG1DOzs7Ozs7Ozs7OztBQ0FBLHFDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLCtCOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLHVDOzs7Ozs7Ozs7OztBQ0FBLGlDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJleHBvcnQgY29uc3QgbWluaW11bURpc2NvcmRWZXJzaW9uID0gXCIwLjAuMzA4XCI7XG5leHBvcnQgY29uc3QgY3VycmVudERpc2NvcmRWZXJzaW9uID0gKHdpbmRvdy5EaXNjb3JkTmF0aXZlICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcCAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbiAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbigpKSB8fCBcIjAuMC4zMDhcIjtcbmV4cG9ydCBjb25zdCBtaW5TdXBwb3J0ZWRWZXJzaW9uID0gXCIwLjMuMFwiO1xuZXhwb3J0IGNvbnN0IGJiZFZlcnNpb24gPSBcIjAuMy41XCI7XG5leHBvcnQgY29uc3QgYmJkQ2hhbmdlbG9nID0ge1xuICAgIGRlc2NyaXB0aW9uOiBcIkJpZyB0aGluZ3MgYXJlIGNvbWluZy5cIixcbiAgICBjaGFuZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiBcIkJ1ZyBGaXhlc1wiLFxuICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiLFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICBcIlNvbWUgZml4ZXMgcmVsYXRlZCB0byBzaG93aW5nIG1vZGFscyBpbiB0aGUgYEJkQXBpYC5cIixcbiAgICAgICAgICAgICAgICBcIkZpeGVkIHRoZSBvcGVuIGZvbGRlciBidXR0b25zIGZvciBwbHVnaW5zIGFuZCB0aGVtZXNcIlxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgXVxufTtcblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzID0ge1xuICAgIFwiQ3VzdG9tIGNzcyBsaXZlIHVwZGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMFwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcbiAgICBcIkN1c3RvbSBjc3MgYXV0byB1ZHBhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTFcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXG4gICAgXCJCZXR0ZXJEaXNjb3JkIEJsdWVcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLWJcIiwgIGluZm86IFwiUmVwbGFjZSBEaXNjb3JkIGJsdWUgd2l0aCBCRCBCbHVlXCIsICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogZmFsc2UsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwifSxcblxuICAgIC8qIENvcmUgKi9cbiAgICAvKiA9PT09PT0gKi9cbiAgICBcIlB1YmxpYyBTZXJ2ZXJzXCI6ICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMVwiLCAgaW5mbzogXCJEaXNwbGF5IHB1YmxpYyBzZXJ2ZXJzIGJ1dHRvblwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIk1pbmltYWwgTW9kZVwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMlwiLCAgaW5mbzogXCJIaWRlIGVsZW1lbnRzIGFuZCByZWR1Y2UgdGhlIHNpemUgb2YgZWxlbWVudHMuXCIsICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIlZvaWNlIE1vZGVcIjogICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNFwiLCAgaW5mbzogXCJPbmx5IHNob3cgdm9pY2UgY2hhdFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIkhpZGUgQ2hhbm5lbHNcIjogICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtM1wiLCAgaW5mbzogXCJIaWRlIGNoYW5uZWxzIGluIG1pbmltYWwgbW9kZVwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIkRhcmsgTW9kZVwiOiAgICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNVwiLCAgaW5mbzogXCJNYWtlIGNlcnRhaW4gZWxlbWVudHMgZGFyayBieSBkZWZhdWx0KHdpcClcIiwgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIlZvaWNlIERpc2Nvbm5lY3RcIjogICAgICAgICAgIHtpZDogXCJiZGEtZGMtMFwiLCAgaW5mbzogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIjI0IEhvdXIgVGltZXN0YW1wc1wiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtNlwiLCAgaW5mbzogXCJSZXBsYWNlIDEyaHIgdGltZXN0YW1wcyB3aXRoIHByb3BlciBvbmVzXCIsICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIkNvbG9yZWQgVGV4dFwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtN1wiLCAgaW5mbzogXCJNYWtlIHRleHQgY29sb3IgdGhlIHNhbWUgYXMgcm9sZSBjb2xvclwiLCAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcbiAgICBcIk5vcm1hbGl6ZSBDbGFzc2VzXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTRcIiwgaW5mbzogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG5cbiAgICAvKiBDb250ZW50ICovXG4gICAgXCJDb250ZW50IEVycm9yIE1vZGFsXCI6ICAgICAgICB7aWQ6IFwiZm9yay1wcy0xXCIsIGluZm86IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcbiAgICBcIlNjYW4gUGx1Z2luc1wiOiAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTZcIiwgaW5mbzogXCJTY2FuIHBsdWdpbnMgZm9yIGFueSB0aHJlYXQgdGhhdCBjYW4gYmUgaGlkZGVuIGluc2lkZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcbiAgICBcIlNob3cgVG9hc3RzXCI6ICAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTJcIiwgaW5mbzogXCJTaG93cyBhIHNtYWxsIG5vdGlmaWNhdGlvbiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJTY3JvbGwgVG8gU2V0dGluZ3NcIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy0zXCIsIGluZm86IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJBdXRvbWF0aWMgTG9hZGluZ1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy01XCIsIGluZm86IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJFbmFibGUgRWRpdCBCdXR0b25cIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy03XCIsIGluZm86IFwiRW5hYmxlIGFuIEVkaXQgQnV0dG9uIG9uIHRoZSBwbHVnaW4gYW5kIHRoZW1lIHBhbmVsLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiVGhlbWVzIGluIFBvcG91dCBXaW5kb3dcIjogICAge2lkOiBcImxpZ2h0Y29yZC05XCIsIGluZm86IFwiRW5hYmxlIHRoZW1lcyBpbiBQb3BvdXQgV2luZG93LiAoRm9yIGV4YW1wbGUsIHdoZW4gZGV0YWNoaW5nIHNjcmVlbnNoYXJlLilcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwiLCBleHBlcmltZW50YWw6IHRydWV9LFxuXG4gICAgLyogRGV2ZWxvcGVyICovXG4gICAgXCJEZXZlbG9wZXIgTW9kZVwiOiAgICAgICAgIFx0ICB7aWQ6IFwiYmRhLWdzLThcIiwgaW5mbzogXCJEZXZlbG9wZXIgTW9kZSBUb2dnbGVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcbiAgICBcIkNvcHkgU2VsZWN0b3JcIjpcdFx0XHQgIHtpZDogXCJmb3JrLWRtLTFcIiwgaW5mbzogXCJBZGRzIGEgXFxcIkNvcHkgU2VsZWN0b3JcXFwiIG9wdGlvbiB0byBjb250ZXh0IG1lbnVzIHdoZW4gZGV2ZWxvcGVyIG1vZGUgaXMgYWN0aXZlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXG5cbiAgICAvKiogTGlnaHRjb3JkICovXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKSAoTm90IGltcGxlbWVudGVkKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcbiAgICBcIkJsdXIgUGVyc29uYWwgSW5mb3JtYXRpb25cIjogIHtpZDogXCJsaWdodGNvcmQtNlwiLCBpbmZvOiBcIkJsdXIgc2Vuc2l0aXZlIGluZm9ybWF0aW9ucyBsaWtlIGVtYWlsLCBwYXltZW50IGluZm9zIGFuZCBtb3JlLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJDYWxsaW5nIFJpbmcgQmVhdFwiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTJcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIHNwZWNpYWwgY2FsbGluZyBiZWF0LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzICYgTGlnaHRjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiLCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIgYW5kIHRoZSBcXFwiTGlnaHRjb3JkIEFwaVxcXCIgc2VjdGlvbi5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiQWQgQmxvY2tcIjogICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC00XCIsIGluZm86IFwiQmxvY2sgYW55IEJPVCB0aGF0IGRtcyB5b3Ugd2l0aCBhbiBpbnZpdGUgbGluay4gRXZlbiBpbiBhbiBlbWJlZC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiRW5hYmxlIExpZ2h0Y29yZCBTZXJ2ZXJzXCI6ICAge2lkOiBcImxpZ2h0Y29yZC01XCIsIGluZm86IFwiRW5hYmxlIExpZ2h0Y29yZCdzIHNlcnZlcnMuIERpc2FibGluZyB0aGlzIHdpbGwgZGlzYWJsZSBjdXN0b20gYmFkZ2VzLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcbiAgICBcIkxpZ2h0Y29yZCBUYWJzXCI6ICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtOFwiLCBpbmZvOiBcIkFsbG93cyB5b3UgdG8gbGF1bmNoIG11bHRpcGxlIGluc3RhbmNlcyBvZiBMaWdodGNvcmQgaW4gdGhlIHNhbWUgd2luZG93LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIiwgZXhwZXJpbWVudGFsOiB0cnVlfSxcbiAgICBcIlVzZSBOb3RpZmljYXRpb24gU2hpbVwiOiAgICAgIHtpZDogXCJsaWdodGNvcmQtMTBcIiwgaW5mbzogXCJCYXNpY2FsbHkgZG9uJ3QgdXNlIFdpbmRvd3MncyBOb3RpZmljYXRpb25zLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcIndpbjMyXCIsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiRW1vamkgUHJlZml4XCI6ICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0xMVwiLCBpbmZvOiBcIkNoYW5nZSB0aGUgcHJlZml4IHVzZWQgZm9yIGZyZWUgbml0cm9zIGVtb2ppcy4gUGxlYXNlIHB1dCBvbmx5IG9uZSBjaGFyYWN0ZXIuIERlZmF1bHQ6IC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGRlZmF1bHQ6IFwiLlwifSxcblxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgdGhlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcbiAgICBcIk5vIFdpbmRvdyBCb3VuZHNcIjogICAgICAgICAgIHtpZDogXCJub193aW5kb3dfYm91bmRcIiwgaW5mbzogXCJEaXNhYmxlIFdpbmRvdyBCb3VuZHMuIENhbiBiZSB1c2VmdWwgaWYgeW91IHVzZSBhIHdpbmRvdyBtYW5hZ2VyLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxuICAgIFwiRW5hYmxlIEdsYXNzdHJvblwiOiAgICAgICAgICAge2lkOiBcImVuYWJsZV9nbGFzc3Ryb25cIiwgaW5mbzogXCJFbmFibGUgR2xhc3N0cm9uLiBJZiB5b3UncmUgbm90IHVzaW5nIHRyYW5zcGFyZW50IHRoZW1lcywgdGhpcyBjYW4gcmVkdWNlIGxhZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxuICAgIFxuICAgIC8qKiBSaWNoUHJlc2VuY2UgKi9cbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXG4gICAgXCJiZGEtZ3MtMlwiOiBmYWxzZSxcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXG4gICAgXCJiZGEtZ3MtNVwiOiB0cnVlLFxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcbiAgICBcImJkYS1ncy04XCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXG4gICAgXCJiZGEtZXMtMlwiOiB0cnVlLFxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxuICAgIFwiYmRhLWVzLTdcIjogdHJ1ZSxcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcbiAgICBcImJkYS1kYy0wXCI6IGZhbHNlLFxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLTlcIjogdHJ1ZSxcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxuICAgIFwiZm9yay1wcy0yXCI6IHRydWUsXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxuICAgIFwiZm9yay1wcy01XCI6IHRydWUsXG4gICAgXCJmb3JrLXBzLTZcIjogdHJ1ZSxcbiAgICBcImZvcmstcHMtN1wiOiBmYWxzZSxcbiAgICBcImZvcmstZXMtMlwiOiBmYWxzZSxcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxuICAgIFwiZm9yay13cC0xXCI6IGZhbHNlLFxuICAgIFwiZm9yay13cC0yXCI6IGZhbHNlLFxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXG4gICAgXCJsaWdodGNvcmQtMVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0yXCI6IHRydWUsXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0zXCI6IGZhbHNlLFxuICAgIFwibGlnaHRjb3JkLTRcIjogZmFsc2UsXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxuICAgIFwibGlnaHRjb3JkLTZcIjogdHJ1ZSxcbiAgICBcImxpZ2h0Y29yZC03XCI6IGZhbHNlLFxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXG4gICAgXCJsaWdodGNvcmQtOVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0xMFwiOiBmYWxzZSxcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcbn07XG5cblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzQ29va2llID0ge307XG5cbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRSUEMgPSB7XG4gICAgXCJuYW1lXCI6IFwiTGlnaHRjb3JkXCIsXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxuICAgIFwic3RhdGVcIjogXCJMaWdodGNvcmQgQ2xpZW50XCIsXG4gICAgXCJkZXRhaWxzXCI6IFwiQnJvd3NpbmcgRGlzY29yZFwiLFxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxuICAgIFwiYXNzZXRzLnNtYWxsXCI6IG51bGwsXG4gICAgXCJhc3NldHMubGFyZ2VcIjogXCI3MTIzMjM4MjEwMzc2ODI3OTFcIlxufVxuXG5leHBvcnQgY29uc3QgbGlnaHRjb3JkU2V0dGluZ3MgPSB7fTtcbmV4cG9ydCBjb25zdCBkZWZhdWx0TGlnaHRjb3JkU2V0dGluZ3MgPSB7fTtcblxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XG5leHBvcnQgY29uc3QgYmR0aGVtZUVycm9ycyA9IFtdOyAvLyBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XG5cbmV4cG9ydCBjb25zdCBiZHRoZW1lcyA9IHt9O1xuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luQ29va2llID0ge307XG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xuaW1wb3J0IGxvYWRpbmdJY29uIGZyb20gXCIuL2xvYWRpbmdJY29uXCI7XG5sb2NhbFN0b3JhZ2VGaXgoKTtcbmxvYWRpbmdJY29uKCk7XG5cbmNvbnN0IGRlcHJlY2F0ZUdsb2JhbCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGVkIEdsb2JhbFwiLCBgXCIke2tleX1cIiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiBQbGVhc2Ugb25seSB1c2UgQmRBcGkuYCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTsgIFxufTtcblxuXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XG5cbmNvbnN0IGdsb2JhbEtleXMgPSBPYmplY3Qua2V5cyhHbG9iYWxzKTtcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XG5cblxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL21vZHVsZXMvYmRFdmVudHNcIjtcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcblxuZGVwcmVjYXRlR2xvYmFsKFwiQkRWMlwiLCBCRFYyKTtcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xuZGVwcmVjYXRlR2xvYmFsKFwiVXRpbHNcIiwgVXRpbHMpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcbmRlcHJlY2F0ZUdsb2JhbChcIkRhdGFTdG9yZVwiLCBEYXRhU3RvcmUpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XG5cbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xuXG5pbXBvcnQgQ29yZSBmcm9tIFwiLi9tb2R1bGVzL2NvcmVcIjtcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xuXG4vLyBUT0RPOiBDaGFuZ2UgSW5pdCBtb2RlIGFuZCBzdG9wIHVzaW5nIENvcmVXcmFwcGVyLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKGJkQ29uZmlnLCBtZXRob2RzKSB7XG4gICAgICAgIENvcmUuc2V0Q29uZmlnKGJkQ29uZmlnKTtcbiAgICAgICAgQ29yZS5zZXRNZXRob2RzKG1ldGhvZHMpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xuICAgICAgICBDb3JlLmluaXQoKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gICAgY29uc3QgdjJMb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgdjJMb2FkZXIuY2xhc3NOYW1lID0gXCJiZC1sb2FkZXJ2MlwiO1xyXG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2MkxvYWRlcik7XHJcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBcImNvbnRlbnRXaW5kb3dcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KGNvbnRlbnRXaW5kb3csIHtcclxuICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImxvY2FsU3RvcmFnZVwiKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBvYmpbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUHJldmVudCBpbnRlcmNlcHRpb24gYnkgcGF0Y2hpbmcgUmVmbGVjdC5hcHBseSBhbmQgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0LCBcImFwcGx5XCIsIHt2YWx1ZTogUmVmbGVjdC5hcHBseSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcblxyXG4gICAgY29uc3Qgb09wZW4gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbjtcclxuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgIGlmICh1cmwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImFwaS93ZWJob29rc1wiKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XHJcbiAgICBpbmplY3QyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHR3ZWx2ZUhvdXIgPSBuZXcgUmVnRXhwKGAoWzAtOV17MSwyfSk6KFswLTldezEsMn0pXFxcXHMoQU18UE0pYCk7XHJcbiAgICAgICAgY29uc3QgY29udmVydCA9IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gZGF0YS5yZXR1cm5WYWx1ZS5tYXRjaCh0d2VsdmVIb3VyKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaGVkIHx8IG1hdGNoZWQubGVuZ3RoICE9PSA0KSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMTJcIiA6IHBhcnNlSW50KG1hdGNoZWRbMV0pICsgMTJ9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBjYW5jZWxDb3p5ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImNhbGVuZGFyRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ296eSBtb2RlXHJcbiAgICAgICAgY29uc3QgY2FuY2VsQ29tcGFjdCA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJkYXRlRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ29tcGFjdCBtb2RlXHJcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSB0aGlzLmNhbmNlbDI0SG91cigpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXG5cbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XG5sZXQgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cblxuY29uc3QgYmxvY2tlZCA9IHt9XG5cbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXG5mdW5jdGlvbiBnZXRDdXJyZW50VXNlcigpe1xuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgZW5hYmxlKCl7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICAgIGRpc3BhdGNoZXIuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpe1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcbiAgICB9XG5cbiAgICBhbnRpRE0oZXYpe1xuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxuICAgICAgICBpZihldi5tZXNzYWdlLmF1dGhvci5pZCA9PT0gZ2V0Q3VycmVudFVzZXIoKS5pZClcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsKGV2Lm1lc3NhZ2UuY2hhbm5lbF9pZClcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxuXG4gICAgICAgIGlmKGNoYW5uZWwudHlwZSAhPT0gMSlyZXR1cm5cblxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cblxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcbiAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChgW0FkQmxvY2tdOiBCbG9ja2VkICR7ZXYubWVzc2FnZS5hdXRob3IudXNlcm5hbWV9IyR7ZXYubWVzc2FnZS5hdXRob3IuZGlzY3JpbWluYXRvcn1gLCB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYoIXJlbGF0aW9uU2hpcE1vZHVsZSlyZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXG4gICAgICAgICAgICB9LCAyKVxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxuICAgIGlmKEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5nZy9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmNvbS9pbnZpdGUvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZGFwcC5jb20vaW52aXRlL1wiKSlyZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkcyB8fCBbXVxuICAgIGlmKGVtYmVkcy5sZW5ndGggPT09IDApcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcbiAgICAgICAgaWYoKGVtYmVkLnRpdGxlIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxuICAgICAgICBpZigoZW1iZWQuZmllbGRzIHx8IFtdKS5tYXAoZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcbn0iLCJpbXBvcnQge3NldHRpbmdzUlBDLCBkZWZhdWx0UlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uRGlzcGF0Y2hlciYmbS5kZWZhdWx0JiZtLmRlZmF1bHQuZGlzcGF0Y2gpWzBdLmRlZmF1bHRcclxuY29uc3QgQWN0aW9uVHlwZXMgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uQWN0aW9uVHlwZXMpWzBdLkFjdGlvblR5cGVzXHJcblxyXG5jb25zdCBzb2NrZXRJZCA9IFwibGlnaHRjb3JkLXNwb29mLXNvY2tldFwiXHJcbmNvbnN0IHBpZCA9IHByb2Nlc3MucGlkXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ3VzdG9tUmljaFByZXNlbmNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gc2V0dGluZ3NSUENcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGZvcm1hdGVkR2FtZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQgPT09IGZhbHNlKXJldHVybiBudWxsXHJcbiAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgfVxyXG5cclxuICAgIHNlbmRHYW1lKCl7XHJcbiAgICAgICAgZGlzcGF0Y2hlci5kaXNwYXRjaCh7XHJcbiAgICAgICAgICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQ0FMX0FDVElWSVRZX1VQREFURSxcclxuICAgICAgICAgICAgc29ja2V0SWQsXHJcbiAgICAgICAgICAgIHBpZCxcclxuICAgICAgICAgICAgYWN0aXZpdHk6IHRoaXMuZm9ybWF0ZWRHYW1lXHJcbiAgICAgICAgfSkgICBcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKSB7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkVuYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZXQoc2V0dGluZ3NSUEMgfHwgT2JqZWN0LmNyZWF0ZShkZWZhdWx0UlBDKSlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpIHtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEaXNhYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmZXRjaEFzc2V0cyhhcHBsaWNhdGlvbklkKXtcclxuICAgICAgICBsZXQgYXNzZXRzID0gYXdhaXQgQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXNzZXRzKVswXS5nZXRBc3NldHMoYXBwbGljYXRpb25JZClcclxuICAgICAgICBpZihhc3NldHMudW5kZWZpbmVkICYmIHR5cGVvZiBhc3NldHMudW5kZWZpbmVkID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBBcHBsaWNhdGlvblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXNzZXRzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGFjdGl2aXR5KXtcclxuICAgICAgICB0aGlzLmdhbWUgPSBhY3Rpdml0eVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxufSIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XG5pbXBvcnQgeyB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tIFwiY3J5cHRvXCI7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBMYXllcnMge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gW11cbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkxheWVycyA9IHRoaXNcbiAgICB9XG5cbiAgICBnZXQgaXNJbmplY3RlZCgpe1xuICAgICAgICByZXR1cm4gISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiZGl2LkxheWVycy5pbmplY3RlZFwiKVxuICAgIH1cblxuICAgIGluamVjdCgpe1xuICAgICAgICBpZih0aGlzLmlzSW5qZWN0ZWQpcmV0dXJuXG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBjbGFzc05hbWVMYXllcnNcbiAgICAgICAgXSA9IFtcbiAgICAgICAgICAgIFV0aWxzLnJlbW92ZURhKHYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmxheWVycyAmJiBlLmxheWVyKS5sYXllcnMpXG4gICAgICAgIF1cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitjbGFzc05hbWVMYXllcnMpO1xuICAgICAgICBpZiAoIWxheWVycykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBSZWFjdEluc3RhbmNlID0gTGlnaHRjb3JkLkFwaS5VdGlscy5GaW5kUmVhY3QobGF5ZXJzLCAxKVxuICAgICAgICBpZighUmVhY3RJbnN0YW5jZSlyZXR1cm4gbGF5ZXJzXG4gICAgICAgIHRoaXMuUmVhY3RJbnN0YW5jZSA9IFJlYWN0SW5zdGFuY2VcbiAgICAgICAgbGV0IHJlbmRlciA9IFJlYWN0SW5zdGFuY2UucmVuZGVyXG4gICAgICAgIFJlYWN0SW5zdGFuY2UucmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJldHVyblZhbHVlID0gcmVuZGVyLmNhbGwoUmVhY3RJbnN0YW5jZSlcbiAgICAgICAgICAgIGxldCBjbGFzc0xpc3QgPSByZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jbGFzc05hbWUuc3BsaXQoXCIgXCIpXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcIkxheWVyc1wiKVxuICAgICAgICAgICAgY2xhc3NMaXN0LnB1c2goXCJpbmplY3RlZFwiKVxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2xhc3NOYW1lID0gY2xhc3NMaXN0LmpvaW4oXCIgXCIpXG5cbiAgICAgICAgICAgIHRoaXMubGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNoaWxkcmVuLnB1c2gobGF5ZXJbMV0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcbiAgICAgICAgfVxuICAgICAgICBSZWFjdEluc3RhbmNlLmZvcmNlVXBkYXRlKClcbiAgICB9XG5cbiAgICBjcmVhdGVMYXllcihjaGlsZHJlbiwgcHJvcHMgPSB7fSl7XG4gICAgICAgIGxldCBpZCA9IHV1aWR2NCgpXG4gICAgICAgIGxldCBsYXllciA9IG51bGxcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChbaWQsIDxMYXllciB7Li4ucHJvcHN9IGdldExheWVyPXtsYXkgPT4ge1xuICAgICAgICAgICAgbGF5ZXIgPSBsYXlcbiAgICAgICAgfX0ga2V5PXtpZH0gaWQ9e2lkfSByZW1vdmU9eygpID0+IHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleChlID0+IGVbMF0gPT09IGlkKVxuICAgICAgICAgICAgaWYoaW5kZXggPT09IC0xKXJldHVyblxuICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgbGF5ZXIgPSBudWxsXG4gICAgICAgICAgICBpZih0aGlzLlJlYWN0SW5zdGFuY2UpdGhpcy5SZWFjdEluc3RhbmNlLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0KClcbiAgICAgICAgfX0+e2NoaWxkcmVufTwvTGF5ZXI+XSlcbiAgICAgICAgaWYodGhpcy5SZWFjdEluc3RhbmNlKXRoaXMuUmVhY3RJbnN0YW5jZS5mb3JjZVVwZGF0ZSgpXG4gICAgICAgIHRoaXMuaW5qZWN0KClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlbW92ZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKCFsYXllcil7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMubGF5ZXJzLmZpbmRJbmRleChlID0+IGVbMF0gPT09IGlkKVxuICAgICAgICAgICAgICAgICAgICBpZihpbmRleCA9PT0gLTEpcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5ZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuUmVhY3RJbnN0YW5jZSl0aGlzLlJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdCgpXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLnJlbW92ZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmxldCBMYXllck1vZHVsZXNcbmV4cG9ydCBjbGFzcyBMYXllciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBuZXcgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQuVmFsdWUoMClcbiAgICAgICAgfSBcbiAgICAgICAgdGhpcy5wcm9wcy5nZXRMYXllcih0aGlzKVxuICAgICAgICB0aGlzLmtleWRvd24gPSB0aGlzLmtleWRvd24uYmluZCh0aGlzKVxuICAgIH1cblxuICAgIGtleWRvd24oZSl7XG4gICAgICAgIGlmIChlLndoaWNoID09PSAyNykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgcmV0dXJuIExheWVyTW9kdWxlcyB8fCAoTGF5ZXJNb2R1bGVzID0gW1xuICAgICAgICAgICAgdjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuVmFsdWUgJiYgZS5kZWZhdWx0LmRpdilcbiAgICAgICAgXSlcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5rZXlkb3duKVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KGV2KXtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMua2V5ZG93bilcbiAgICB9XG5cbiAgICByZW1vdmUoKXtcbiAgICAgICAgdGhpcy5wcm9wcy5yZW1vdmUoKVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxFbnRlcihldil7XG4gICAgICAgIHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LnRpbWluZyh0aGlzLnN0YXRlLmFuaW1hdGlvbiwge1xuICAgICAgICAgICAgdG9WYWx1ZTogMSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDBcbiAgICAgICAgfSkuc3RhcnQoZXYpXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbExlYXZlKGV2KXtcbiAgICAgICAgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQudGltaW5nKHRoaXMuc3RhdGUuYW5pbWF0aW9uLCB7XG4gICAgICAgICAgICB0b1ZhbHVlOiAwLFxuICAgICAgICAgICAgZHVyYXRpb246IDEwMFxuICAgICAgICB9KS5zdGFydChldilcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IGludGVycG9sYXRpb24gPSB0aGlzLnN0YXRlLmFuaW1hdGlvbi5pbnRlcnBvbGF0ZSh7XG4gICAgICAgICAgICBpbnB1dFJhbmdlOiBbMCwgMV0sXG4gICAgICAgICAgICBvdXRwdXRSYW5nZTogWzEuMDcsIDFdXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBzdHlsZSA9IHtcbiAgICAgICAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuYW5pbWF0aW9uLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBbe1xuICAgICAgICAgICAgICAgIHNjYWxlOiBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgICB9XVxuICAgICAgICB9XG4gICAgICAgIGxldCBEaXYgPSB0aGlzLm1vZHVsZXNbMF0uZGVmYXVsdC5kaXZcbiAgICAgICAgcmV0dXJuIDxEaXYgY2xhc3NOYW1lPXtbX19TRUNSRVRfRU1PVElPTl9fLmNzcyh7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgICAgIFdlYmtpdEJveE9yaWVudDogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgV2Via2l0Qm94RGlyZWN0aW9uOiBcIm5vcm1hbFwiLFxuICAgICAgICAgICAgbXNGbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgICAgICAgIHpJbmRleDogMTAxXG4gICAgICAgIH0pLHByb2Nlc3MucGxhdGZvcm09PT1cIndpbjMyXCI/X19TRUNSRVRfRU1PVElPTl9fLmNzcyh7XG4gICAgICAgICAgICB0b3A6IFwiLTIycHhcIixcbiAgICAgICAgICAgIHBhZGRpbmdUb3A6IFwiMjJweFwiXG4gICAgICAgIH0pOm51bGwsLi4uKHRoaXMucHJvcHMuY2xhc3NOYW1lP3RoaXMucHJvcHMuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKTpbXSldLmZpbHRlcihlPT5lKS5qb2luKFwiIFwiKSB8fCBudWxsfSBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICA8L0Rpdj5cbiAgICB9XG59XG5MYXllci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgaWQ6IG51bGwsXG4gICAgY2hpbGRyZW46IG51bGxcbn0iLCJpbXBvcnQge3BsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuY29uc3QgQmRBcGkgPSB7XG4gICAgZ2V0IFJlYWN0KCkgeyByZXR1cm4gQkRWMi5SZWFjdDsgfSxcbiAgICBnZXQgUmVhY3RET00oKSB7IHJldHVybiBCRFYyLlJlYWN0RG9tOyB9LFxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxuICAgIGdldCBXaW5kb3dDb25maWdGaWxlKCkge3JldHVybiBVdGlscy5XaW5kb3dDb25maWdGaWxlO30sXG4gICAgZ2V0IHNldHRpbmdzKCkge3JldHVybiBzZXR0aW5nczt9LFxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIG51bGx9LCAvLyBkZXByZWNhdGVkLCBkZWxldGVkIGFsbCBlbW90ZXMgZnJvbSBiZXR0ZXJkaXNjb3JkLlxuICAgIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH0sXG4gICAgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxufTtcblxuQmRBcGkuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gVXRpbHMuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKTtcbn07XG5cbkJkQXBpLmdldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gVXRpbHMuZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpO1xufTtcblxuQmRBcGkuc2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKTtcbn07XG5cbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXG4vL2lkID0gaWQgb2YgZWxlbWVudFxuLy9jc3MgPSBjdXN0b20gY3NzXG5CZEFwaS5pbmplY3RDU1MgPSBmdW5jdGlvbiAoaWQsIGNzcykge1xuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQoaWQpLCBjc3MpO1xufTtcblxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XG4vL2lkID0gaWQgb2YgZWxlbWVudFxuQmRBcGkuY2xlYXJDU1MgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSk7XG59O1xuXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcbi8vY3NzID0gY3VzdG9tIGNzc1xuQmRBcGkubGlua0pTID0gZnVuY3Rpb24gKGlkLCB1cmwpIHtcbiAgICBET00uYWRkU2NyaXB0KERPTS5lc2NhcGVJRChpZCksIHVybCk7XG59O1xuXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcbi8vaWQgPSBpZCBvZiBlbGVtZW50XG5CZEFwaS51bmxpbmtKUyA9IGZ1bmN0aW9uIChpZCkge1xuICAgIERPTS5yZW1vdmVTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSk7XG59O1xuXG4vL0dldCBhbm90aGVyIHBsdWdpblxuLy9uYW1lID0gbmFtZSBvZiBwbHVnaW5cbkJkQXBpLmdldFBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKGJkcGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gYmRwbHVnaW5zW25hbWVdLnBsdWdpbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vL0dldCBCZXR0ZXJEaXNjb3JkIENvcmVcbkJkQXBpLmdldENvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgVXRpbHMud2FybihcIkRlcHJlY2F0aW9uIE5vdGljZVwiLCBgQmRBcGkuZ2V0Q29yZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuYCk7XG4gICAgcmV0dXJuIG1haW5Db3JlO1xufTtcblxuLyoqXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIG1vZGFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIGEgc3RyaW5nIG9mIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbW9kYWxcbiAqL1xuQmRBcGkuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCB7Y2FuY2VsVGV4dDogbnVsbH0pO1xufTtcblxuLyoqXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcbiAqL1xuQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zKTtcbn07XG5cbi8vU2hvdyB0b2FzdCBhbGVydFxuQmRBcGkuc2hvd1RvYXN0ID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgVXRpbHMuc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMpO1xufTtcblxuLy8gRmluZHMgbW9kdWxlXG5CZEFwaS5maW5kTW9kdWxlID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChmaWx0ZXIpO1xufTtcblxuLy8gRmluZHMgbW9kdWxlXG5CZEFwaS5maW5kQWxsTW9kdWxlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRBbGwoZmlsdGVyKTtcbn07XG5cbi8vIEZpbmRzIG1vZHVsZVxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvcHMgPSBmdW5jdGlvbiguLi5wcm9wcykge1xuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMocHJvcHMpO1xufTtcblxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvdG90eXBlcyA9IGZ1bmN0aW9uKC4uLnByb3Rvcykge1xuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3RvdHlwZXMocHJvdG9zKTtcbn07XG5cbkJkQXBpLmZpbmRNb2R1bGVCeURpc3BsYXlOYW1lID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKG5hbWUpO1xufTtcblxuLy8gR2V0cyByZWFjdCBpbnN0YW5jZVxuQmRBcGkuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygd2luZG93LmpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpIG5vZGUgPSBub2RlWzBdO1xuICAgIHJldHVybiBCRFYyLmdldEludGVybmFsSW5zdGFuY2Uobm9kZSk7XG59O1xuXG4vLyBHZXRzIGRhdGFcbkJkQXBpLmxvYWREYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XG59O1xuXG5CZEFwaS5nZXREYXRhID0gQmRBcGkubG9hZERhdGE7XG5cbi8vIFNldHMgZGF0YVxuQmRBcGkuc2F2ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXksIGRhdGEpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCBkYXRhKTtcbn07XG5cbkJkQXBpLnNldERhdGEgPSBCZEFwaS5zYXZlRGF0YTtcblxuLy8gRGVsZXRlcyBkYXRhXG5CZEFwaS5kZWxldGVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XG4gICAgcmV0dXJuIERhdGFTdG9yZS5kZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XG59O1xuXG4vLyBQYXRjaGVzIG90aGVyIGZ1bmN0aW9uc1xuQmRBcGkubW9ua2V5UGF0Y2ggPSBmdW5jdGlvbih3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFV0aWxzLm1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpO1xufTtcblxuLy8gRXZlbnQgd2hlbiBlbGVtZW50IGlzIHJlbW92ZWRcbkJkQXBpLm9uUmVtb3ZlZCA9IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFV0aWxzLm9uUmVtb3ZlZChub2RlLCBjYWxsYmFjayk7XG59O1xuXG4vLyBXcmFwcyBmdW5jdGlvbiBpbiB0cnkuLmNhdGNoXG5CZEFwaS5zdXBwcmVzc0Vycm9ycyA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSkge1xuICAgIHJldHVybiBVdGlscy5zdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpO1xufTtcblxuLy8gVGVzdHMgZm9yIHZhbGlkIEpTT05cbkJkQXBpLnRlc3RKU09OID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiBVdGlscy50ZXN0SlNPTihkYXRhKTtcbn07XG5cbkJkQXBpLmlzUGx1Z2luRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gISFwbHVnaW5Db29raWVbbmFtZV07XG59O1xuXG5CZEFwaS5pc1RoZW1lRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gISF0aGVtZUNvb2tpZVtuYW1lXTtcbn07XG5cbkJkQXBpLmlzU2V0dGluZ0VuYWJsZWQgPSBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiAhIXNldHRpbmdzQ29va2llW2lkXTtcbn07XG5cbkJkQXBpLmVuYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCB0cnVlKTtcbn07XG5cbkJkQXBpLmRpc2FibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgZmFsc2UpO1xufTtcblxuQmRBcGkudG9nZ2xlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsICFzZXR0aW5nc0Nvb2tpZVtpZF0pO1xufTtcblxuLy8gR2V0cyBkYXRhXG5CZEFwaS5nZXRCRERhdGEgPSBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldEJERGF0YShrZXkpO1xufTtcblxuLy8gU2V0cyBkYXRhXG5CZEFwaS5zZXRCRERhdGEgPSBmdW5jdGlvbihrZXksIGRhdGEpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldEJERGF0YShrZXksIGRhdGEpO1xufTtcblxuXG5cbmNvbnN0IG1ha2VBZGRvbkFQSSA9IChjb29raWUsIGxpc3QsIG1hbmFnZXIpID0+IG5ldyBjbGFzcyBBZGRvbkFQSSB7XG5cbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBtYW5hZ2VyLmZvbGRlcjt9XG5cbiAgICBpc0VuYWJsZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gISFjb29raWVbbmFtZV07XG4gICAgfVxuXG4gICAgZW5hYmxlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZW5hYmxlKG5hbWUpO1xuICAgIH1cblxuICAgIGRpc2FibGUobmFtZSkge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5kaXNhYmxlKG5hbWUpO1xuICAgIH1cblxuICAgIHRvZ2dsZShuYW1lKSB7XG4gICAgICAgIGlmIChjb29raWVbbmFtZV0pIHRoaXMuZGlzYWJsZShuYW1lKTtcbiAgICAgICAgZWxzZSB0aGlzLmVuYWJsZShuYW1lKTtcbiAgICB9XG5cbiAgICByZWxvYWQobmFtZSkge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5yZWxvYWQobmFtZSk7XG4gICAgfVxuXG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgaWYgKGxpc3QuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChsaXN0W25hbWVdLnBsdWdpbikgcmV0dXJuIGxpc3RbbmFtZV0ucGx1Z2luO1xuICAgICAgICAgICAgcmV0dXJuIGxpc3RbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0QWxsKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKGsgPT4gdGhpcy5nZXQoaykpLmZpbHRlcihhID0+IGEpO1xuICAgIH1cbn07XG5cbkJkQXBpLlBsdWdpbnMgPSBtYWtlQWRkb25BUEkocGx1Z2luQ29va2llLCBiZHBsdWdpbnMsIHBsdWdpbk1vZHVsZSk7XG5CZEFwaS5UaGVtZXMgPSBtYWtlQWRkb25BUEkodGhlbWVDb29raWUsIGJkdGhlbWVzLCB0aGVtZU1vZHVsZSk7XG5cbmV4cG9ydCBkZWZhdWx0IEJkQXBpO1xuXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQmRBcGkgPSBCZEFwaSIsIi8qIEJERXZlbnRzICovXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJERXZlbnRzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CREV2ZW50cyA9IHRoaXNcbiAgICB9XG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxuICAgIG9mZihldmVudE5hbWUsIGV2ZW50QWN0aW9uKSB7dGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50QWN0aW9uKTt9XG59OyIsIi8qKlxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcbiAqL1xuXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcblxubGV0IHNlbGVjdG9yc1xuY29uc3QgcmVtb3ZlRGEgPSBVdGlscy5yZW1vdmVEYVxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKCl7XG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxuICAgIGlmKCFzdGFuZGFyZFNpZGViYXJWaWV3KXJldHVybiBudWxsXG4gICAgbGV0IGRlZmF1bHRDbGFzc05hbWUgPSByZW1vdmVEYShzdGFuZGFyZFNpZGViYXJWaWV3LnN0YW5kYXJkU2lkZWJhclZpZXcpXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxuICAgIGxldCB1c2VyU2V0dGluZ3NBY2NvdW50ID0gQkRNb2R1bGVzLmdldChlID0+IGUudXNlclNldHRpbmdzQWNjb3VudClbMF1cbiAgICBjb25zdCBjaGlsZHJlbiA9IEJETW9kdWxlcy5nZXQoZSA9PiB0eXBlb2YgZS5jaGlsZHJlbiA9PT0gXCJzdHJpbmdcIilbMF1cbiAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLnBheW1lbnQtaW5mbyAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZXNjcmlwdGlvbiAmJiB0eXBlb2YgZS5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiAmJiBlLmRlc2NyaXB0aW9uLmluY2x1ZGVzKFwiZm9ybVRleHRcIikpWzBdLmRlc2NyaXB0aW9uKX1gKVxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcbiAgICBpZih1c2VyU2V0dGluZ3NBY2NvdW50KXtcbiAgICAgICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKHVzZXJTZXR0aW5nc0FjY291bnQudXNlclNldHRpbmdzQWNjb3VudCl9IGRpdjpudGgtY2hpbGQoMik+ZGl2Om50aC1jaGlsZCgyKT4uJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS52aWV3Qm9keSlbMF0udmlld0JvZHkpfWApXG4gICAgICAgIHNlbGVjdHMucHVzaChgLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NTZWN1cml0eSl9IC4ke3JlbW92ZURhKGNoaWxkcmVuLmNoaWxkcmVuKX0gPiBkaXY6bnRoLWNoaWxkKDIpYClcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdHNcbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJsdXJQcml2YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgIH1cblxuICAgIGVuYWJsZSgpe1xuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgc2VsZWN0b3JzID0gc2VsZWN0b3JzIHx8IGdldFNlbGVjdG9ycygpXG5cbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXG4gICAgICAgIERPTVRvb2xzLmFkZFN0eWxlKFwiYmx1clByaXZhdGVcIiwgYFxuJHtzZWxlY3RvcnMuam9pbihcIiwgXCIpfSB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcbiAgICBmaWx0ZXI6IGJsdXIoNHB4KTtcbiAgICBvcGFjaXR5OiAuODtcbn1cblxuJHtzZWxlY3RvcnMubWFwKGUgPT4gZStcIjpob3ZlclwiKS5qb2luKFwiLCBcIil9ICB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xuICAgIGZpbHRlcjogbm9uZTtcbiAgICBvcGFjaXR5OiAxO1xufWApXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpe1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXG4gICAgfVxufSIsImltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xuXG5jb25zdCBub3JtYWxpemVkUHJlZml4ID0gXCJkYVwiO1xuY29uc3QgcmFuZENsYXNzID0gbmV3IFJlZ0V4cChgXig/ISR7bm9ybWFsaXplZFByZWZpeH0tKSgoPzpbQS1aYS16XXxbMC05XXwtKSspLSg/OltBLVphLXpdfFswLTldfC18Xyl7Nn0kYCk7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDbGFzc05vcm1hbGl6ZXIge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5DbGFzc05vcm1hbGl6ZXIgPSB0aGlzXG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcbiAgICB9XG5cbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodmFsdWUuZW5kc1dpdGgoXCJweFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImNoXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiZW1cIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJtc1wiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpICYmICh2YWx1ZS5sZW5ndGggPT0gNyB8fCB2YWx1ZS5sZW5ndGggPT0gNCkpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoXCJjYWxjKFwiKSB8fCB2YWx1ZS5pbmNsdWRlcyhcInJnYmFcIikpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG1vZHVsZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG1vZHVsZS5fX2VzTW9kdWxlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIG1vZHVsZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2R1bGVbYmFzZUNsYXNzTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChcIi1cIikubGVuZ3RoID09PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5sZW5ndGggfHwgbWF0Y2gubGVuZ3RoIDwgMikgY29udGludWU7IC8vIFNob3VsZG4ndCBldmVyIGhhcHBlbiBzaW5jZSB0aGV5IHBhc3NlZCB0aGUgbW9kdWxlRmlsdGVyLCBidXQgeW91IG5ldmVyIGtub3dcbiAgICAgICAgICAgICAgICBjb25zdCBjYW1lbENhc2UgPSBtYXRjaFsxXS5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVucGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV07XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nICs9IGAgJHtub3JtYWxDbGFzc31gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBub3JtYWxpemVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNsZW4gPSBjbGFzc2VzLmxlbmd0aDsgYyA8IGNsZW47IGMrKykge1xuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdChjbGFzc2VzW2NdKSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NsYXNzID0gbWF0Y2guc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGAke25vcm1hbGl6ZWRQcmVmaXh9LSR7bmV3Q2xhc3N9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbGVtZW50LmNoaWxkcmVuKSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoY2hpbGQpO1xuICAgIH1cblxuICAgIHJldmVydEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgICAgaWYgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgaWYgKGNsYXNzZXNbY10uc3RhcnRzV2l0aChgJHtub3JtYWxpemVkUHJlZml4fS1gKSkgdG9SZW1vdmUucHVzaChjbGFzc2VzW2NdKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4udG9SZW1vdmUpO1xuICAgIH1cblxuICAgIHBhdGNoRE9NTWV0aG9kcygpIHtcbiAgICAgICAgY29uc3QgY29udGFpbnMgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zO1xuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRva2VucyA9IHRva2VuLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGNvbnRhaW5zLCB0aGlzLCBbdG9rZW4uc3BsaXQoXCIgXCIpWzBdXSk7XG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShhZGQsIHRoaXMsIHRva2Vucyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShyZW1vdmUsIHRoaXMsIHRva2Vucyk7XG4gICAgICAgIH07XG4gICAgfVxuXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb2xvcmVkVGV4dCB7XHJcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWxDb2xvcmVkVGV4dCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2FuY2VsQ29sb3JlZFRleHQgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50ID0gcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUeXBlID0gbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxUeXBlLl9fb3JpZ2luYWxNZXRob2QpIHJldHVybjsgLy8gRG9uJ3QgcGF0Y2ggYWdhaW5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxUeXBlKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVDb2xvciA9IHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0gPyBwcm9wcy5tZXNzYWdlLmNvbG9yU3RyaW5nIHx8IFwiXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsVHlwZTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlQ29udGVudC50eXBlLnR5cGUsIG9yaWdpbmFsVHlwZSk7XHJcbiAgICAgICAgfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWVNYXJrdXAgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdLm1hcmt1cFxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIrY2xhc3NOYW1lTWFya3VwLnNwbGl0KFwiIFwiKVswXSkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCB7IGVuY3J5cHRTZXR0aW5nc0NhY2hlLCBkZWNyeXB0U2V0dGluZ3NDYWNoZSwgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcbmltcG9ydCAqIGFzIGVsZWN0cm9uIGZyb20gXCJlbGVjdHJvblwiXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgTW9kdWxlID0gcmVxdWlyZShcIm1vZHVsZVwiKS5Nb2R1bGU7XG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUoZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoXCJMSUdIVENPUkRfR0VUX0FQUF9QQVRIXCIpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XG5jbGFzcyBNZXRhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJNZXRhRXJyb3JcIjtcbiAgICB9XG59XG5jb25zdCBvcmlnaW5hbEpTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXTtcbmNvbnN0IG9yaWdpbmFsQ1NTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPyBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdIDogKCkgPT4ge3JldHVybiBudWxsO307XG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xuY29uc3QgZXNjYXBlZEF0UmVnZXggPSAvXlxcXFxALztcblxuZXhwb3J0IGxldCBhZGRvbkNhY2hlID0ge31cblxubGV0IGhhc1BhdGNoZWQgPSBmYWxzZVxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbnRlbnRNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRpbWVDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XG4gICAgfVxuXG4gICAgcGF0Y2hFeHRlbnNpb25zKCl7XG4gICAgICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXG4gICAgICAgIGhhc1BhdGNoZWQgPSB0cnVlXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5qc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJwbHVnaW5cIik7XG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwidGhlbWVcIik7XG4gICAgfVxuXG4gICAgZ2V0IHBsdWdpbnNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3BsdWdpbnNGb2xkZXIgfHwgKHRoaXMuX3BsdWdpbnNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJwbHVnaW5zL1wiKSkpO31cbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XG5cbiAgICBsb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSgpe1xuICAgICAgICBpZih0eXBlb2YgZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSAhPT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKFwie31cIikpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSBKU09OLnBhcnNlKGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIikpKVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlID0ge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhhZGRvbkNhY2hlKVxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtrZXldXG4gICAgICAgICAgICBpZighdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKXJldHVybiBkZWxldGUgYWRkb25DYWNoZVtrZXldXG5cbiAgICAgICAgICAgIGxldCBwcm9wcyA9IFt7XG4gICAgICAgICAgICAgICAga2V5OiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwicmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJoYXNoXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxuICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIGZvcihsZXQgcHJvcCBvZiBwcm9wcyl7XG4gICAgICAgICAgICAgICAgaWYoIShwcm9wLmtleSBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3Aua2V5XSAhPT0gcHJvcC50eXBlKXtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih2YWx1ZS5oYXNoICE9PSBrZXkpe1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZhbHVlLnJlc3VsdC5zdXNwZWN0KXsgLy8gcmVmZXRjaCBmcm9tIHJlbW90ZSB0byBiZSBzdXJlIHlvdSdyZSB1cCB0byBkYXRlLlxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXG4gICAgfVxuXG4gICAgc2F2ZUFkZG9uQ2FjaGUoKXtcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShKU09OLnN0cmluZ2lmeShhZGRvbkNhY2hlKSkpXG4gICAgfVxuXG4gICAgd2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGlmICh0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IGNvbnRlbnRUeXBlID09PSBcInBsdWdpblwiO1xuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0gPSBmcy53YXRjaChiYXNlRm9sZGVyLCB7cGVyc2lzdGVudDogZmFsc2V9LCBhc3luYyAoZXZlbnRUeXBlLCBmaWxlbmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudFR5cGUgfHwgIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XG4gICAgICAgICAgICB0cnkge2ZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09IFwiRU5PRU5UXCIpIHJldHVybjtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgcmV0dXJuIHBsdWdpbk1vZHVsZS51bmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGVtZU1vZHVsZS51bmxvYWRUaGVtZShmaWxlbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpLmlzRmlsZSgpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO1xuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMubXRpbWUgfHwgIXN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihzdGF0cy5tdGltZS5nZXRUaW1lKCkpICE9PSBcIm51bWJlclwiKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID09IHN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID0gc3RhdHMubXRpbWUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcInJlbmFtZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcImNoYW5nZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUucmVsb2FkUGx1Z2luKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLnJlbG9hZFRoZW1lKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW53YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXS5jbG9zZSgpO1xuICAgICAgICBkZWxldGUgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV07XG4gICAgfVxuXG4gICAgZXh0cmFjdE1ldGEoY29udGVudCkge1xuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xuICAgICAgICBjb25zdCBoYXNPbGRNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLy9NRVRBXCIpO1xuICAgICAgICBpZiAoaGFzT2xkTWV0YSkgcmV0dXJuIHRoaXMucGFyc2VPbGRNZXRhKGNvbnRlbnQpO1xuICAgICAgICBjb25zdCBoYXNOZXdNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLyoqXCIpO1xuICAgICAgICBpZiAoaGFzTmV3TWV0YSkgcmV0dXJuIHRoaXMucGFyc2VOZXdNZXRhKGNvbnRlbnQpO1xuICAgICAgICB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcbiAgICB9XG5cbiAgICBwYXJzZU9sZE1ldGEoY29udGVudCkge1xuICAgICAgICBjb25zdCBtZXRhID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcbiAgICAgICAgY29uc3QgcmF3TWV0YSA9IG1ldGEuc3Vic3RyaW5nKG1ldGEubGFzdEluZGV4T2YoXCIvL01FVEFcIikgKyA2LCBtZXRhLmxhc3RJbmRleE9mKFwiKi8vXCIpKTtcbiAgICAgICAgaWYgKG1ldGEuaW5kZXhPZihcIk1FVEFcIikgPCAwKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbHMudGVzdEpTT04ocmF3TWV0YSk7XG4gICAgICAgIGlmICghcGFyc2VkKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBjb3VsZCBub3QgYmUgcGFyc2VkLlwiKTtcbiAgICAgICAgaWYgKCFwYXJzZWQubmFtZSkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgbWlzc2luZyBuYW1lIGRhdGEuXCIpO1xuICAgICAgICBwYXJzZWQuZm9ybWF0ID0gXCJqc29uXCI7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuXG4gICAgcGFyc2VOZXdNZXRhKGNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LnNwbGl0KFwiLyoqXCIsIDIpWzFdLnNwbGl0KFwiKi9cIiwgMSlbMF07XG4gICAgICAgIGNvbnN0IG91dCA9IHt9O1xuICAgICAgICBsZXQgZmllbGQgPSBcIlwiO1xuICAgICAgICBsZXQgYWNjdW0gPSBcIlwiO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2suc3BsaXQoc3BsaXRSZWdleCkpIHtcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFwiQFwiICYmIGxpbmUuY2hhckF0KDEpICE9PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bTtcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gbGluZS5pbmRleE9mKFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmaWVsZCA9IGxpbmUuc3Vic3RyKDEsIGwgLSAxKTtcbiAgICAgICAgICAgICAgICBhY2N1bSA9IGxpbmUuc3Vic3RyKGwgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjY3VtICs9IFwiIFwiICsgbGluZS5yZXBsYWNlKFwiXFxcXG5cIiwgXCJcXG5cIikucmVwbGFjZShlc2NhcGVkQXRSZWdleCwgXCJAXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bS50cmltKCk7XG4gICAgICAgIGRlbGV0ZSBvdXRbXCJcIl07XG4gICAgICAgIG91dC5mb3JtYXQgPSBcImpzZG9jXCI7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudFJlcXVpcmUodHlwZSkge1xuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBpc1BsdWdpbiA/IG9yaWdpbmFsSlNSZXF1aXJlIDogb3JpZ2luYWxDU1NSZXF1aXJlO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24obW9kdWxlLCBmaWxlbmFtZSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gc2VsZi5wbHVnaW5zRm9sZGVyIDogc2VsZi50aGVtZXNGb2xkZXI7XG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZVBhdGggPSBwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgcGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpO1xuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBvc3NpYmxlUGF0aCkgfHwgZmlsZW5hbWUgIT09IGZzLnJlYWxwYXRoU3luYyhwb3NzaWJsZVBhdGgpKSByZXR1cm4gUmVmbGVjdC5hcHBseShvcmlnaW5hbFJlcXVpcmUsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLnN0cmlwQk9NKGNvbnRlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzZWxmLmV4dHJhY3RNZXRhKGNvbnRlbnQpO1xuICAgICAgICAgICAgbWV0YS5maWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgbWV0YS5hZGRlZCA9IHN0YXRzLmF0aW1lTXM7XG4gICAgICAgICAgICBtZXRhLm1vZGlmaWVkID0gc3RhdHMubXRpbWVNcztcbiAgICAgICAgICAgIG1ldGEuc2l6ZSA9IHN0YXRzLnNpemU7XG4gICAgICAgICAgICBpZiAoIWlzUGx1Z2luKSB7XG4gICAgICAgICAgICAgICAgbWV0YS5jc3MgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGlmIChtZXRhLmZvcm1hdCA9PSBcImpzb25cIikgbWV0YS5jc3MgPSBtZXRhLmNzcy5zcGxpdChcIlxcblwiKS5zbGljZSgxKS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBgbW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIG1vZHVsZS5maWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlkRXhwb3J0ID0gIVV0aWxzLmlzRW1wdHkobW9kdWxlLmV4cG9ydHMpO1xuICAgICAgICAgICAgICAgIGlmIChkaWRFeHBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YS50eXBlID0gbW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbWV0YTtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBVdGlscy53YXJuKFwiTW9kdWxlIE5vdCBFeHBvcnRlZFwiLCBgJHttZXRhLm5hbWV9LCBwbGVhc2Ugc3RhcnQgc2V0dGluZyBtb2R1bGUuZXhwb3J0c2ApO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGBcXG5tb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O1xcbm1vZHVsZS5leHBvcnRzLnR5cGUgPSAke21ldGEuZXhwb3J0cyB8fCBtZXRhLm5hbWV9O2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIGZpbGVuYW1lKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBtYWtlUGxhY2Vob2xkZXJQbHVnaW4oZGF0YSkge1xuICAgICAgICByZXR1cm4ge3BsdWdpbjoge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICBnZXROYW1lOiAoKSA9PiB7cmV0dXJuIGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lO30sXG4gICAgICAgICAgICAgICAgZ2V0QXV0aG9yOiAoKSA9PiB7cmV0dXJuIFwiPz8/XCI7fSxcbiAgICAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogKCkgPT4ge3JldHVybiBkYXRhLm1lc3NhZ2UgPyBkYXRhLm1lc3NhZ2UgOiBcIlRoaXMgcGx1Z2luIHdhcyB1bmFibGUgdG8gYmUgbG9hZGVkLiBDaGVjayB0aGUgYXV0aG9yJ3MgcGFnZSBmb3IgdXBkYXRlcy5cIjt9LFxuICAgICAgICAgICAgICAgIGdldFZlcnNpb246ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWUsXG4gICAgICAgICAgICBmaWxlbmFtZTogZGF0YS5maWxlbmFtZSxcbiAgICAgICAgICAgIHNvdXJjZTogZGF0YS5zb3VyY2UgPyBkYXRhLnNvdXJjZSA6IFwiXCIsXG4gICAgICAgICAgICB3ZWJzaXRlOiBkYXRhLndlYnNpdGUgPyBkYXRhLndlYnNpdGUgOiBcIlwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XG5cbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSksIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9LCAoaGFzaCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZihyZXN1bHQpe1xuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGVbcmVzdWx0Lmhhc2hdID0ge1xuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgIGhhc2g6IHJlc3VsdC5oYXNoLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQuc3VzcGVjdCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJUaGlzIHBsdWdpbiBtaWdodCBiZSBkYW5nZXJvdXMgKFwiK3Jlc3VsdC5oYXJtK1wiKS5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJUaGlzIHBsdWdpbiBtaWdodCBiZSBkYW5nZXJvdXMgKFwiK3Jlc3VsdC5oYXJtK1wiKS5cIilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7X19ub25fd2VicGFja19yZXF1aXJlX18ocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29tcGlsZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxuICAgICAgICBjb25zdCBjb250ZW50ID0gX19ub25fd2VicGFja19yZXF1aXJlX18ocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XG4gICAgICAgIGlmKCFjb250ZW50Lm5hbWUpcmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ2Fubm90IGVzY2FwZSB0aGUgSUQuXCIsIGVycm9yOiBuZXcgRXJyb3IoXCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkXCIpfVxuICAgICAgICBjb250ZW50LmlkID0gVXRpbHMuZXNjYXBlSUQoY29udGVudC5uYW1lKTtcbiAgICAgICAgLy9pZighaWQpcmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiSW52YWxpZCBJRFwiLCBlcnJvcjogbmV3IEVycm9yKFwiUGxlYXNlIGZpeCB0aGUgbmFtZSBvZiBcIitmaWxlbmFtZStcIi4gQmV0dGVyRGlzY29yZCBjYW4ndCBlc2NhcGUgYW4gSUQuXCIpfVxuICAgICAgICBpZiAoaXNQbHVnaW4pIHtcbiAgICAgICAgICAgIGlmICghY29udGVudC50eXBlKSByZXR1cm47XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQucGx1Z2luID0gbmV3IGNvbnRlbnQudHlwZSgpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXTtcbiAgICAgICAgICAgICAgICBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXSA9IGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29uc3RydWN0ZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGJkdGhlbWVzW2NvbnRlbnQubmFtZV07XG4gICAgICAgICAgICBiZHRoZW1lc1tjb250ZW50Lm5hbWVdID0gY29udGVudDtcbiAgICAgICAgfVxuICAgIH0gICBcblxuICAgIHVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZihmaWxlbmFtZSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mKHR5cGUpID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWxldGUgX19ub25fd2VicGFja19yZXF1aXJlX18uY2FjaGVbX19ub25fd2VicGFja19yZXF1aXJlX18ucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSB1bmxvYWRlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319O31cbiAgICB9XG5cbiAgICBpc0xvYWRlZChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xuICAgICAgICB0cnkge19fbm9uX3dlYnBhY2tfcmVxdWlyZV9fLmNhY2hlW19fbm9uX3dlYnBhY2tfcmVxdWlyZV9fLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO31cbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiBmYWxzZTt9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHJlbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcbiAgICAgICAgY29uc3QgY2FudFVubG9hZCA9IHRoaXMudW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XG4gICAgICAgIGlmIChjYW50VW5sb2FkKSByZXR1cm4gY2FudFVubG9hZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xuICAgIH1cblxuICAgIGxvYWROZXdDb250ZW50KHR5cGUpIHtcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcbiAgICAgICAgY29uc3QgY29udGVudExpc3QgPSBPYmplY3QudmFsdWVzKGlzUGx1Z2luID8gYmRwbHVnaW5zIDogYmR0aGVtZXMpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gY29udGVudExpc3QuZmlsdGVyKHQgPT4gIWZpbGVzLmluY2x1ZGVzKHQuZmlsZW5hbWUpKS5tYXAoYyA9PiBpc1BsdWdpbiA/IGMucGx1Z2luLmdldE5hbWUoKSA6IGMubmFtZSk7XG4gICAgICAgIGNvbnN0IGFkZGVkID0gZmlsZXMuZmlsdGVyKGYgPT4gIWNvbnRlbnRMaXN0LmZpbmQodCA9PiB0LmZpbGVuYW1lID09IGYpICYmIGYuZW5kc1dpdGgoZmlsZUVuZGluZykgJiYgZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGYpKS5pc0ZpbGUoKSk7XG4gICAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRBbGxDb250ZW50KHR5cGUpIHtcbiAgICAgICAgdGhpcy5wYXRjaEV4dGVuc2lvbnMoKVxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHRoaXMubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxufTtcblxuLyoqXG4gKiBEb24ndCBleHBvc2UgY29udGVudE1hbmFnZXIgLSBjb3VsZCBiZSBkYW5nZXJvdXMgZm9yIG5vd1xuICovIiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMsIGxpZ2h0Y29yZFNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IHNldHRpbmdzUGFuZWwgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcbmltcG9ydCBMaWdodGNvcmRMb2dvIGZyb20gXCIuLi9zdmcvTGlnaHRjb3JkXCI7XG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xuaW1wb3J0IEVtb2ppTW9kdWxlIGZyb20gXCIuL2Vtb2ppTW9kdWxlXCJcbmltcG9ydCAqIGFzIGVsZWN0cm9uIGZyb20gXCJlbGVjdHJvblwiXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xuXG5sZXQgbWV0aG9kc1xuZnVuY3Rpb24gQ29yZSgpIHt9XG5cblxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZCkgcmV0dXJuO1xuICAgIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIGNvbmZpZyk7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZS5wcm90b3R5cGUsIFwibWV0aG9kc1wiLCB7XG4gICAgZ2V0KCl7XG4gICAgICAgIHJldHVybiBtZXRob2RzXG4gICAgfVxufSlcblxuQ29yZS5wcm90b3R5cGUuc2V0TWV0aG9kcyA9IGZ1bmN0aW9uKG0pIHtcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XG4gICAgbWV0aG9kcyA9IG1cbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5oYXNTdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiYmRWZXJzaW9uICsgXCIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9sZCB2ZXJzaW9uIChcIiArIGN1cnJlbnREaXNjb3JkVmVyc2lvbiArIFwiKSBvZiBEaXNjb3JkLiBQbGVhc2UgdXBkYXRlIHlvdXIgRGlzY29yZCBpbnN0YWxsYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5FRCkge1xuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggUG93ZXJjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcbiAgICB0aGlzLmluaXRTZXR0aW5ncygpO1xuXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xuICAgIEJEVjIuaW5pdGlhbGl6ZSgpO1xuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJVcGRhdGluZyBTZXR0aW5nc1wiKTtcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgQWRkb25zIENhY2hlXCIpXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgUGx1Z2luc1wiKTtcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcblxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFRoZW1lc1wiKTtcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XG5cbiAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20oRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xuICAgIH0pO1xuXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcblxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIE1haW4gT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcblxuICAgIC8vIFNob3cgbG9hZGluZyBlcnJvcnNcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XG4gICAgICAgIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBiZHBsdWdpbkVycm9ycywgdGhlbWVzOiBiZHRoZW1lRXJyb3JzfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gRGF0YVN0b3JlLmdldEJERGF0YShcInZlcnNpb25cIik7XG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcInZlcnNpb25cIiwgYmJkVmVyc2lvbik7XG4gICAgfVxuXG4gICAgRW1vamlNb2R1bGUuc3RhcnQoKVxuXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFBpbGxzLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgUGlsbHMgUGF0Y2hcIikoKTtcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lc3NhZ2VIZWFkZXIuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBDaGF0IFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xuXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xuICAgICAgICBsZXQgYWxlcnQgPSBVdGlscy5hbGVydChcIkZpcnN0IEluc3RhbGxhdGlvblwiLCBcIkFzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBpbnN0YWxsIExpZ2h0Y29yZCwgV2UgYWRkZWQgdHdvIGRlZmF1bHQgdGhlbWVzIGFuZCBvbmUgZGVmYXVsdCBwbHVnaW4gaW4geW91ciBwbHVnaW4vdGhlbWUgZm9sZGVyLiBDaGVjayBpdCBpbiB0aGUgUGx1Z2luL1RoZW1lIHNldHRpbmdzLlwiKVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxuICAgIGlmKGxvZ28pe1xuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cbiAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00NC44MSw5LjY3VjYuMzNjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MUEzLjUzLDMuNTMsMCwwLDAsNDYuMiwzYy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5LjY3YzAsMi4yMSwxLjg5LDMuMzMsMy43NywzLjMzYTMuODcsMy44NywwLDAsMCwzLjQ1LTIuMThsLTIuMTItMUM0NywxMS4xNyw0NC44MSwxMC44NSw0NC44MSw5LjY3Wk0xMC42OCwxMi44OWgyLjQxVjMuMTdIMTAuNjhaTTcxLjc2LDMuMTRINjguMTlWNy4yM0w3MC41Nyw5LjR2LTRoMS4yN2MuODEsMCwxLjIxLjQxLDEuMjEsMXYzYzAsLjYzLS4zOCwxLjA1LTEuMjEsMS4wNUg2OC4xOHYyLjMxaDMuNTdjMS45MiwwLDMuNzItMSwzLjcyLTMuMlY2LjM5Qzc1LjQ4LDQuMTMsNzMuNjgsMy4xNCw3MS43NiwzLjE0Wk01NC4yMiwzYy0yLDAtNCwxLjEtNCwzLjM0VjkuNjZjMCwyLjIzLDIsMy4zNCw0LDMuMzRzMy45NS0xLjExLDMuOTUtMy4zNFY2LjM0QzU4LjE5LDQuMTEsNTYuMiwzLDU0LjIyLDNabTEuNTUsNi42NmMwLC43LS43OCwxLjA2LTEuNTQsMS4wNnMtMS41NS0uMzUtMS41NS0xLjA2VjYuMzRjMC0uNzIuNzUtMS4xLDEuNS0xLjFzMS41OS4zNSwxLjU5LDEuMVpNNjYuODQsNi4zNGMwLTIuMjktMS41OC0zLjItMy41NS0zLjJINTkuNDZ2OS43M2gyLjQ1VjkuNzdoLjQzbDIuMjIsMy4wOWgzTDY1LDkuNTJDNjYuMTMsOS4xNSw2Ni44NCw4LjE0LDY2Ljg0LDYuMzRaTTYzLjMzLDcuNjVINjEuOTFWNS40M2gxLjQyQTEuMTEsMS4xMSwwLDEsMSw2My4zMyw3LjY1Wk0yOS44MywxM2gyLjQyVjMuMDZIMjkuODNWNi43M2wtMywwVjMuMDlIMjQuN3Y5Ljc4aDIuMTRWOC42OGwzLDBaTTE3LjE2LDkuNzZWNi40MmMwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxYTMuNTUsMy41NSwwLDAsMC0zLjM2LTIuMjRjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNzZjMCwyLjIxLDIsMy4xNSwzLjksMy4xNXMzLjU4LTEsMy41OC0zVjcuNThIMTguNzlsMCwxLjM2SDIwLjN2Ljc3QzIwLjMsMTAuOTIsMTcuMTYsMTAuOTQsMTcuMTYsOS43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuOTMgLTMpXCIvPlxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XG48L3N2Zz5gXG4gICAgfVxufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRyaWJ1dGVzID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxuICAgIHRoaXMuY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGF0dHJpYnNQYXRjaHMuZm9yRWFjaChlID0+IGUoKSlcbiAgICB9XG5cbiAgICB3aGlsZSghdjIuTWVzc2FnZUNvbXBvbmVudClhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSlcbiAgICBcbiAgICAvLyBUT0RPOiB0cnkgdG8gcGF0Y2ggY29ycmVjdGx5IHRoZSB1c2VyIHBvcG91dCBvbiBhIG5leHQgdXBkYXRlXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkRpc2NvcmRUYWdcIilcbiAgICAudGhlbihEaXNjb3JkVGFnID0+IHtcbiAgICAgICAgbGV0IERpc2NvcmRUYWdDb21wID0gRGlzY29yZFRhZy5kZWZhdWx0XG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdCA9IGZ1bmN0aW9uKHByb3BzKXtcbiAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IERpc2NvcmRUYWdDb21wKHByb3BzKVxuXG4gICAgICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxuXG4gICAgICAgICAgICBsZXQgYmFkZ2VEaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCIsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCI1cHhcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcbiAgICAgICAgICAgICAgICBrZXk6IFwiYmFkZ2VzLVwiK2lkLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5oZXJpdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtyZXR1cm5WYWx1ZV1cblxuICAgICAgICAgICAgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgcHJvcHMudXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYmFkZ2VEaXYpXG4gICAgICAgICAgICBsZXQgZGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBjaGlsZHJlbilcbiAgICAgICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBwcm9wcy51c2VyLCBmYWxzZSlcblxuICAgICAgICAgICAgcmV0dXJuIGRpdlxuICAgICAgICB9XG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IERpc2NvcmRUYWdDb21wLmRpc3BsYXlOYW1lXG4gICAgfSlcblxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBpZihkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UpeyAvLyB0aGlzIGNhbiBiZSBhIGJsb2NrZWQgbWVzc2FnZSAobm90IG9wZW5lZClcbiAgICAgICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJkYXRhLW1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcbiAgICAgICAgfVxuICAgIH19KSlcbiAgICAgICAgLypcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcIm1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcbiAgICB9fSkpKi9cbn1cblxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcbiAgICBsZXQgdGltZXNDaGVja2VkID0gMDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lc0NoZWNrZWQgPj0gNTApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSBcImxvYWRpbmdcIikgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge3NldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7fSk7XG4gICAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAvLyBObyBleHRlcm5hbHNcbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xuICAgIGlmKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgZGVmYXVsdFJQQyk7XG4gICAgfVxuICAgIGlmKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpe1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgZGVmYXVsdENvb2tpZSk7XG4gICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5sb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIGluIGRlZmF1bHRDb29raWUpIHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9IGRlZmF1bHRDb29raWVbc2V0dGluZ107XG4gICAgICAgICAgICAgICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucHJvdG90eXBlICYmIGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMpXG4gICAgLnRoZW4oc2V0dGluZ01vZHVsZSA9PiB7XG5cbiAgICAgICAgbGV0IGdldFByZWRpY2F0ZVNlY3Rpb25zID0gc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9uc1xuICAgICAgICBzZXR0aW5nTW9kdWxlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBnZXRQcmVkaWNhdGVTZWN0aW9ucy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcblxuICAgICAgICAgICAgaWYoIXJlc3VsdFsxXSlyZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICBpZihyZXN1bHRbMV0uc2VjdGlvbiA9PT0gXCJNeSBBY2NvdW50XCIpeyAvLyB1c2VyIHNldHRpbmdzLCBub3QgZ3VpbGQgc2V0dGluZ3NcbiAgICAgICAgICAgICAgICBsZXQgcG9wZWQgPSBbXVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uc2V0dGluZ3NQYW5lbC5yZW5kZXJTaWRlYmFyKHRoaXMpKVxuXG4gICAgICAgICAgICAgICAgd2hpbGUocG9wZWRbMF0pe1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwb3BlZC5wb3AoKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICB9KVxufTtcblxuXG5sZXQgY2xhc3NOYW1lTGF5ZXJcbmxldCBjbGFzc05hbWVTb2NpYWxMaW5rc1xubGV0IGNsYXNzTmFtZU1vZGFsXG5cbkNvcmUucHJvdG90eXBlLmluaXRPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtYWluT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgcGx1Z2luTW9kdWxlLnJhd09ic2VydmVyKG11dGF0aW9uKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcbiAgICAgICAgICAgIGlmICghbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggfHwgIShtdXRhdGlvbi5hZGRlZE5vZGVzWzBdIGluc3RhbmNlb2YgRWxlbWVudCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcblxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZUxheWVyKWNsYXNzTmFtZUxheWVyID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVTb2NpYWxMaW5rcyljbGFzc05hbWVTb2NpYWxMaW5rcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc29jaWFsTGlua3MgJiYgdHlwZW9mIGUuc29jaWFsTGlua3MgPT09IFwic3RyaW5nXCIpWzBdLnNvY2lhbExpbmtzXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lTW9kYWwpY2xhc3NOYW1lTW9kYWwgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1vZGFsICYmIHR5cGVvZiBlLm1vZGFsID09PSBcInN0cmluZ1wiICYmIGUuaW5uZXIgJiYgdHlwZW9mIGUuaW5uZXIgPT09IFwic3RyaW5nXCIgJiYgIWUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlKVswXS5tb2RhbFxuXG4gICAgICAgICAgICBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSA9PT0gXCJHVUlMRF9TRVRUSU5HU1wiKXtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZVNvY2lhbExpbmtzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50RWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ICYmIG5vZGUucXVlcnlTZWxlY3RvcihcIiNhY2Vfc2V0dGluZ3NtZW51XCIpKSBub2RlLmlkID0gXCJhY2Vfc2V0dGluZ3NtZW51X2NvbnRhaW5lclwiO1xuXG4gICAgICAgICAgICAvLyBFbW9qaSBQaWNrZXJcbiAgICAgICAgICAgIC8vbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZW1vamlQaWNrZXItM20xUy1qXCIpLmxlbmd0aCAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLmVtb2ppUGlja2VyLTNtMVMtalwiKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImFuaW1hdG9yTGVmdC0xRVF4VTBcIilcbiAgICAgICAgICAgIC8vaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyMikgJiYgbm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZUVtb2ppUGlja2VyKS5sZW5ndGggICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrY2xhc3NOYW1lRW1vamlQaWNrZXIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUFuaW1hdG9yTGVmdCkpIHF1aWNrRW1vdGVNZW51Lm9ic0NhbGxiYWNrKG5vZGUpO1xuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIG1haW5PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7XG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgIH0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUuc2hvd0NoYW5nZWxvZ01vZGFsID0gZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIFV0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zKTtcbn07XG5cbkNvcmUucHJvdG90eXBlLmFsZXJ0ID0gZnVuY3Rpb24odGl0bGUsIGNvbnRlbnQpIHtcbiAgICByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hTb2NpYWwgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5zb2NpYWxQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IFRhYkJhciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiVGFiQmFyXCIpO1xuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuICAgIGlmICghVGFiQmFyKSByZXR1cm47XG4gICAgdGhpcy5zb2NpYWxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKFRhYkJhci5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoIDwgMykgcmV0dXJuO1xuICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gM10udHlwZS5kaXNwbGF5TmFtZSAhPT0gXCJTZXBhcmF0b3JcIikgcmV0dXJuO1xuICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XG4gICAgICAgIGlmIChBbmNob3IpIHtcbiAgICAgICAgICAgIGxldCBzb2NpYWxNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc29jaWFsTGlua3MpWzBdXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGU7XG4gICAgICAgICAgICBjb25zdCBuZXdPbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWwgPSBvcmlnaW5hbCguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZFwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRFwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLXNvY2lhbC1sb2dvXCJ9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUgPSBuZXdPbmU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgY2xhc3NOYW1lQ29sb3JNdXRlZCxcbiAgICAgICAgICAgIHNpemVzLFxuICAgICAgICAgICAgY2xhc3NOYW1lVmVyc2lvbkhhc2hcbiAgICAgICAgXSA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yTXV0ZWQpWzBdLmNvbG9yTXV0ZWQsXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVyc2lvbkhhc2gpWzBdLnZlcnNpb25IYXNoXG4gICAgICAgIF1cblxuICAgICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGAoJHtiZENvbmZpZy5oYXNoID8gYmRDb25maWcuaGFzaC5zdWJzdHJpbmcoMCwgNykgOiBiZENvbmZpZy5icmFuY2h9KWA7XG4gICAgICAgIGNvbnN0IGJ1aWxkSW5mbyA9IGVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKFwiTElHSFRDT1JEX0dFVF9CVUlMRF9JTkZPU1wiKVxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgTGlnaHRjb3JkICR7YnVpbGRJbmZvLnZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIGAoJHsoYnVpbGRJbmZvLmNvbW1pdCB8fCBcIlVua25vd25cIikuc2xpY2UoMCwgNyl9KWApKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcbiAgICAgICAgXVxuICAgICAgICBcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcbiAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XG4gICAgICAgIH07XG4gICAgfX0pO1xufTtcblxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZ3VpbGRzV3JhcHBlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwid3JhcHBlclwiLCBcInVucmVhZE1lbnRpb25zQmFyXCIpO1xuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZExpc3RJdGVtcyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcbiAgICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XG4gICAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucmV0dXJuVmFsdWUgJiYgZGF0YS50aGlzT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGRcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSBjbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnNlbGVjdGVkKSBjbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYXVkaW8pIGNsYXNzTmFtZSArPSBcIiBiZC1hdWRpb1wiO1xuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmJhZGdlKSBjbGFzc05hbWUgKz0gXCIgYmQtYmFkZ2VcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYW5pbWF0YWJsZSkgY2xhc3NOYW1lICs9IFwiIGJkLWFuaW1hdGFibGVcIjtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuZ3VpbGRQaWxsUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XG4gICAgdGhpcy5ndWlsZFBpbGxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKGd1aWxkUGlsbCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgICBjb25zdCBndWlsZENvbXBvbmVudHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInJlbmRlckxpc3RJdGVtXCIpO1xuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGd1aWxkQ29tcG9uZW50cy5TZXBhcmF0b3IoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xuICAgIH19KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSlyZXR1cm5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcblxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXG4gICAgICAgIGNoaWxkcmVuLnB1c2goQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcbiAgICAgICAgfSkpXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcbiAgICB9fSlcbn1cblxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhlYWRlclBhdGNoKSByZXR1cm47XG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVzc2FnZUhlYWRlciB8fCAhTWVzc2FnZUhlYWRlci5kZWZhdWx0KSByZXR1cm47XG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xuICAgICAgICAvLyBjb25zdCBoZWFkZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wc1wiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIGF1dGhvciwgdHJ1ZSlcbiAgICB9fSk7XG59O1xuXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmFkZ2VzLVwiK2lkKVxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXG4gICAgICAgIGlmKGRpdi5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5cbiAgICAgICAgbGV0IGJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICBibG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJsb2NrRGl2KVxuXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuXG4gICAgICAgIGRpc3RhbnQuZ2V0QmFkZ2VzKHVzZXIuaWQpXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudXNlciA9IHVzZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pIFxuICAgICAgICAgICAgICAgIGlmKCFiYWRnZS5ocmVmKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxuICAgICAgICAgICAgICAgICAgICBiYWRnZS5ocmVmID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXG4gICAgICAgICAgICAgICAgZGl2Mi5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG59XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLm1lbWJlckxpc3RQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVtYmVyTGlzdEl0ZW0gfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLnJlbmRlckRlY29yYXRvcnMpIHJldHVybjtcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCB1c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcbiAgICAgICAgKVxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGVyZSB3aWxsIG5ldmVyIGJlIGFuIGluamVjdGlvbiBwYXRoLCBzbyB3ZSBkbyBub3QgbmVlZCB0aGUgY29kZSBiZWxvdy4gXG4gICAgLy8gSW5zZXJ0IGNvbW1lbnRzIHNvIGl0IHdpbGwgYmUgZXJhc2VkIHdoZW4gcHJvZHVjdGlvbi5cbiAgICBcbiAgICBjb25zdCBpbmplY3Rpb25QYXRoID0gRGF0YVN0b3JlLmluamVjdGlvblBhdGg7XG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvKlxuXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpO1xuXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcbiAgICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xuXG4gICAgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlcXVlc3QuZ2V0KHt1cmw6IHppcExpbmssIGVuY29kaW5nOiBudWxsfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhzYXZlZFppcCwgcmVzKSk7XG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XG5cbiAgICAgICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiV3JpdGluZyBcIiArIHNhdmVkWmlwKTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xuXG4gICAgLy8gQ2hlY2sgYW5kIGRlbGV0ZSByZW5hbWUgZXh0cmFjdGlvblxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XG4gICAgXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcbiAgICB6aXBmaWxlLm9uKFwiZW50cnlcIiwgZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcblxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgZW50cnkuZmlsZU5hbWUpO1xuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcblxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcblxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGluamVjdGlvblBhdGgsIGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xuXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXG4gICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnVubGluayhzYXZlZFppcCwgcmVzb2x2ZSkpO1xuXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcbiAgICByZXR1cm4gc3VjY2VzczsqL1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IENvcmUoKTtcblxuLyoqXG4gKiBEb24ndCBleHBvc2UgY29yZSAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XG4gKi8iLCJpbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IHJlbGVhc2VDaGFubmVsID0gRGlzY29yZE5hdGl2ZS5nbG9iYWxzID8gRGlzY29yZE5hdGl2ZS5nbG9iYWxzLnJlbGVhc2VDaGFubmVsIDogRGlzY29yZE5hdGl2ZS5hcHAgPyBEaXNjb3JkTmF0aXZlLmFwcC5nZXRSZWxlYXNlQ2hhbm5lbCgpIDogXCJzdGFibGVcIjtcblxubGV0IGRhdGFQYXRoID0gXCJcIjtcbmlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIGRhdGFQYXRoID0gcHJvY2Vzcy5lbnYuQVBQREFUQTtcbmVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCIpIGRhdGFQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIFwiTGlicmFyeVwiLCBcIlByZWZlcmVuY2VzXCIpO1xuZWxzZSBkYXRhUGF0aCA9IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA/IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA6IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBcIi5jb25maWdcIik7XG5kYXRhUGF0aCA9IHBhdGguam9pbihkYXRhUGF0aCwgXCJCZXR0ZXJEaXNjb3JkXCIpO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGF0YVN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kYXRhID0ge3NldHRpbmdzOiB7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX19O1xuICAgICAgICB0aGlzLnBsdWdpbkRhdGEgPSB7fTtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRhdGFTdG9yZSA9IHRoaXNcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuQkRGaWxlKSkgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLkJERmlsZSwgXCJ1dGYtOFwiKSlcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpKSByZXR1cm47XG4gICAgICAgICAgICBsZXQgc2V0dGluZ3MgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyh0aGlzLnNldHRpbmdzRmlsZSk7XG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCB7W3JlbGVhc2VDaGFubmVsXTogc2V0dGluZ3N9KTtcbiAgICAgICAgICAgIGVsc2Ugc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fSwgc2V0dGluZ3MpO1xuICAgICAgICAgICAgdGhpcy5zZXRCRERhdGEoXCJzZXR0aW5nc1wiLCBzZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgVXRpbHMuYWxlcnQoXCJDb3JydXB0IFN0b3JhZ2VcIiwgXCJUaGUgYmQgc3RvcmFnZSBoYXMgc29tZWhvdyBiZWNvbWUgY29ycnVwdC4gWW91IG1heSBlaXRoZXIgdHJ5IHRvIHNhbHZhZ2UgdGhlIGZpbGUgb3IgZGVsZXRlIGl0IHRoZW4gcmVsb2FkLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpbmplY3Rpb25QYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGNvbmZpZ0ZpbGUoKSB7cmV0dXJuIHRoaXMuX2NvbmZpZ0ZpbGUgfHwgKHRoaXMuX2NvbmZpZ0ZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5pbmplY3Rpb25QYXRoLCBcImJldHRlcmRpc2NvcmRcIiwgXCJjb25maWcuanNvblwiKSk7fVxuICAgIGdldCBCREZpbGUoKSB7cmV0dXJuIHRoaXMuX0JERmlsZSB8fCAodGhpcy5fQkRGaWxlID0gcGF0aC5yZXNvbHZlKGRhdGFQYXRoLCBcImJkc3RvcmFnZS5qc29uXCIpKTt9XG4gICAgZ2V0IHNldHRpbmdzRmlsZSgpIHtyZXR1cm4gdGhpcy5fc2V0dGluZ3NGaWxlIHx8ICh0aGlzLl9zZXR0aW5nc0ZpbGUgPSBwYXRoLnJlc29sdmUoZGF0YVBhdGgsIFwiYmRzZXR0aW5ncy5qc29uXCIpKTt9XG4gICAgZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSB7cmV0dXJuIHBhdGgucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBwbHVnaW5OYW1lICsgXCIuY29uZmlnLmpzb25cIik7fVxuXG4gICAgZ2V0U2V0dGluZ0dyb3VwKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldIHx8IG51bGw7XG4gICAgfVxuXG4gICAgc2V0U2V0dGluZ0dyb3VwKGtleSwgZGF0YSkge1xuICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gPSBkYXRhO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGdldEJERGF0YShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IFwiXCI7XG4gICAgfVxuXG4gICAgc2V0QkREYXRhKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5kYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICBnZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XG4gICAgfVxuXG4gICAgc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldID0gdmFsdWU7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwidXRmLThcIik7XG4gICAgfVxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERldk1vZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRlYnVnTGlzdGVuZXIgPSB0aGlzLmRlYnVnTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lciA9IHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5zdGFydERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSB0aGlzLnN0YXJ0Q29weVNlbGVjdG9yKCk7XG4gICAgfVxuICAgIFxuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XG4gICAgfVxuXG4gICAgc3RhcnREZWJ1Z0xpc3RlbmVyKCkge1xuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgc3RvcERlYnVnTGlzdGVuZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgc3RhcnRDb3B5U2VsZWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgc3RvcENvcHlTZWxlY3RvcigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIpO1xuICAgIH1cblxuICAgIGRlYnVnTGlzdGVuZXIoZSkge1xuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTE5IHx8IGUud2hpY2ggPT0gMTE4KSB7Ly9GOFxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIlY1slY0Rldk1vZGUlY10gJWNCcmVhay9SZXN1bWVcIiwgXCJjb2xvcjogcmVkO1wiLCBcImNvbG9yOiAjMzAzMDMwOyBmb250LXdlaWdodDo3MDA7XCIsIFwiY29sb3I6cmVkO1wiLCBcIlwiKTtcbiAgICAgICAgICAgIGRlYnVnZ2VyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWRlYnVnZ2VyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgfVxuICAgIH1cblxuICAgIGNvcHlTZWxlY3Rvckxpc3RlbmVyKGUpIHtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5nZXRTZWxlY3RvcihlLnRhcmdldCk7XG4gICAgXG4gICAgICAgICAgICBsZXQgW1xuICAgICAgICAgICAgICAgIGNsYXNzTGF5ZXIsIFxuICAgICAgICAgICAgICAgIGNsYXNzSXRlbXNcbiAgICAgICAgICAgIF0gPSBbXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmRpc2FibGVkUG9pbnRlckV2ZW50cylbMF0sXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tZW51KVswXVxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBmdW5jdGlvbiBhdHRhY2goKSB7XG4gICAgICAgICAgICAgICAgaWYoIWNsYXNzSXRlbXMgfHwgIWNsYXNzTGF5ZXIubGF5ZXIpcmV0dXJuIGNvbnNvbGUubG9nKGNsYXNzSXRlbXMsIGNsYXNzTGF5ZXIubGF5ZXIpXG5cbiAgICAgICAgICAgICAgICBsZXQgY20gPSBET00ucXVlcnkoXCIuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5tZW51KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBET00ucXVlcnkoXCIjYXBwLW1vdW50ID4gLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzTGF5ZXIubGF5ZXJDb250YWluZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzTGF5ZXIubGF5ZXJ9XCI+YCk7XG4gICAgICAgICAgICAgICAgICAgIGNtID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubWVudX0gJHtjbGFzc0l0ZW1zLnN0eWxlRmxleGlibGV9ICR7Y2xhc3NJdGVtcy5hY2NvbW1vZGF0ZVNjcm9sbGJhcn0gYmQtY29udGV4dC1tZW51XCIgc3R5bGU9XCJcIj48L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmFwcGVuZChjbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY21XcmFwKTtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IGUuY2xpZW50WSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWVudVwiKVxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKVxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuaWQgPSBcImJkLWNvcHktc2VsZWN0b3ItY29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ29weSBTZWxlY3RvciBBY3Rpb25zXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJDbGFzc2VzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zY3JvbGxlcldyYXApWzBdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtzY3JvbGxlckNsYXNzZXMuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlckNsYXNzZXMudGhlbWVHaG9zdEhhaXJsaW5lfVwiPjwvZGl2PmApXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyKVswXS5zY3JvbGxlcn0gJHtjbGFzc0l0ZW1zLnNjcm9sbGVyfVwiPjwvZGl2PmApXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyV3JhcC5hcHBlbmQoc2Nyb2xsZXIpXG4gICAgICAgICAgICAgICAgICAgIGNtLmFwcGVuZChzY3JvbGxlcldyYXApXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQ00gPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSAhPT0gMjcpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtV3JhcC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHJlbW92ZUNNKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gY20ucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gY20uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdXG4gICAgICAgICAgICAgICAgY29uc3QgY21nID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cImdyb3VwXCI+PC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGNtaSA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLml0ZW19ICR7Y2xhc3NJdGVtcy5sYWJlbENvbnRhaW5lcn0gJHtjbGFzc0l0ZW1zLmNvbG9yRGVmYXVsdH1cIiByb2xlPVwibWVudWl0ZW1cIiBpZD1cImJkLWNvcHktc2VsZWN0b3ItaXRlbS1jbVwiPjwvZGl2PmApO1xuICAgICAgICAgICAgICAgIGNtaS5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubGFiZWx9XCI+Q29weSBTZWxlY3RvcjwvZGl2PmApKTtcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5OYXRpdmVNb2R1bGUuY29weShzZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBET00ucXVlcnlBbGwoXCJkaXZbcm9sZT1tZW51aXRlbV0uXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5mb2N1c2VkKSlcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgJiYgZWxlbWVudHMuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LnJlbW92ZShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LmFkZChjbGFzc0l0ZW1zLmZvY3VzZWQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNtZy5hcHBlbmQoY21pKTtcbiAgICAgICAgICAgICAgICBpZihzY3JvbGxlci5jaGlsZE5vZGVzLmxlbmd0aCl7IC8vIGFwZW5kIGEgc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5zZXBhcmF0b3J9XCI+PC9kaXY+YClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKHNlcGFyYXRvcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKGNtZyk7XG4gICAgICAgICAgICAgICAgaWYoY21XcmFwLmNsaWVudEhlaWdodCA8IGNtV3JhcC5zY3JvbGxIZWlnaHQpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nIFwiK2NtV3JhcC5zdHlsZS50b3ApXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSAoY21XcmFwLnN0eWxlLnRvcCAtIGNtZy5jbGllbnRIZWlnaHQpICsgXCJweFwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nXCIrY21XcmFwLnN0eWxlLnRvcClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGF0dGFjaCwgMSk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHJldHVybiBgIyR7ZWxlbWVudC5pZH1gO1xuICAgICAgICAvKipcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZnVsbFBhdGgoZWwpe1xuICAgICAgICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICAgICAgICB3aGlsZSAoZWwucGFyZW50Tm9kZSl7XG4gICAgICAgICAgICAgIGlmIChlbC5pZCl7XG4gICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdCgnIycrZWwuaWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZiAoZWw9PWVsLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKStBcnJheS5mcm9tKGVsLmNsYXNzTGlzdC5lbnRyaWVzKCkpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTEsZT1lbDtlLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7ZT1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsYysrKTtcbiAgICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpKygodHlwZW9mIGVsLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbC5jbGFzc05hbWUpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhIWUpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikrXCI6bnRoLWNoaWxkKFwiK2MrXCIpXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbD1lbC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmFtZXMuam9pbihcIiA+IFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVsbFBhdGgoZWxlbWVudClcbiAgICB9XG59OyIsImV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXNhYmxlVHlwaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnN0YXJ0VHlwaW5nKVxyXG4gICAgICAgIC50aGVuKHR5cGluZ01vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3BUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RvcFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc2FibGVUeXBpbmcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcbmltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0IHsgc2V0dGluZ3NDb29raWUgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHsgLy8gR2VuZXJhdGUgVVVJRCAoTm8gY3J5cHRvIHJuZylcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufSAgXG5cbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxubGV0IGJhZGdlc1RvRmV0Y2ggPSBbXVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7XG4gICAgICAgICAgICBiYWRnZXM6IHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EaXN0YW50U2VydmVyID0gdGhpc1xuICAgIH1cblxuICAgIGdldCBjYWNoZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVcbiAgICB9XG5cbiAgICBzZXQgY2FjaGUoZGF0YSl7XG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fY2FjaGUsIGRhdGEpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1c3RvbSBiYWRnZXMgZnJvbSB0aGUgdXNlciBJRC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXG4gICAgICAgIGlmKGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0pcmV0dXJuIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cblxuICAgICAgICBsZXQgcmVzb2x2ZVxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHJlc29sdmUgPSByZXMpKVxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxuXG4gICAgICAgIGNvbnN0IGJhZGdlcyA9IFtdXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSlyZXR1cm4gcmVzb2x2ZShbXSlcbiAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2gucHVzaChbdXNlciwgcmVzb2x2ZV0pXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXG4gICAgICAgICAgICAgICAgaWYodXNlcnMubGVuZ3RoID09PSAwKXJldHVyblxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1c2Vycy5maW5kKHByb21pc2UgPT4gcHJvbWlzZVswXSA9PT0gdXNlci51c2VyX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVsxXSh1c2VyLmJhZGdlcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyIGluc3RhbmNlb2YgTGlnaHRjb3JkRXJyb3IpKWNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgfSlcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcbiAgICAgICAgICAgIGlmKCFDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gV2UgZG8gbm90IGhhdmUgdGhlIENvbXBvbmVudCwgc2tpcCBpdC5cbiAgICAgICAgICAgIGlmKGJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIEFscmVhZHkgaW5zZXJ0ZWQuXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZSA9IHtcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxuICAgICAgICB9LCA2MDAwMDApO1xuXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxuICAgICAgICBkZWxldGUgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxuICAgICAgICByZXR1cm4gYmFkZ2VzXG4gICAgfVxufVxuXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XG4gICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pe1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IExpZ2h0Y29yZEVycm9yKFwiVGhlIGN1cnJlbnQgc2V0dGluZ3MgYmxvY2tlZCB0aGUgcmVxdWVzdC5cIikpXG4gICAgfVxuICAgIHJldHVybiBub2RlRmV0Y2goYCR7Q29uc3RhbnRzLlNFUlZFUl9VUkx9L2FwaS92MSR7cm91dGV9YCwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ0xJRU5UXCI6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihkYXRhID8ge1xuICAgICAgICAgICAgYm9keTogZGF0YVxuICAgICAgICB9IDoge30pXG4gICAgfSlcbn1cblxuY2xhc3MgTGlnaHRjb3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxuICAgICAgICB0aGlzLm5hbWUgPSBcIkxpZ2h0Y29yZEVycm9yXCJcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XG4gICAgU0VSVkVSX1VSTDogXCJodHRwczovL2xpZ2h0Y29yZC5vcmdcIixcbiAgICBiYWRnZXM6IFsgLy8gVE9ETzogQWRkIG1vcmUgYmFkZ2VzICsgc2VydmVyIHNpZGUgc3ZnXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcbiAgICAgICAgICAgIGlkOiBcImYwNDY5OGY1LTgxNmItNDFlMy1iZDAxLTkyMjkxMTkzZDdhNVwiLFxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXG4gICAgICAgICAgICAgICAgXCI2OTY0ODExOTQ0NDMwMTQxNzRcIixcbiAgICAgICAgICAgICAgICBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudDogQnVnSHVudGVyQmFkZ2UsXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9saWdodGNvcmQvbGlnaHRjb3JkL3dpa2kvYmFkZ2VzI2J1Z19odW50ZXJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ1ZmZvb25cIixcbiAgICAgICAgICAgIGlkOiBcIjA2OTA0ZDMxLTY1YjQtNDFlYy1hNTBjLTg2NThiYmQxYWY5NlwiLFxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXG4gICAgICAgICAgICAgICAgXCIzODkwMTY4OTU1NDM3MDU2MDJcIixcbiAgICAgICAgICAgICAgICBcIjY2NDYwMDEzNDUyODY2MzU2NVwiLFxuICAgICAgICAgICAgICAgIFwiNjI1MzUwNjU3ODI5ODk2MjI0XCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxuICAgICAgICAgICAgY29tcG9uZW50OiBDaXJjdXMsXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8veW91dHUuYmUvRUp0YjZ6LWRsVDg/dD0xNDVcIlxuICAgICAgICB9XG4gICAgXVxufVxuXG5leHBvcnQgY29uc3QgUm91dGVzID0ge1xuICAgIGJhZGdlczogYC91c2Vycy9iYWRnZXNgXG59IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxOCBaYWNoYXJ5IFJhdWVuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcbiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZFxuICogdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsXG4gKiBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQVxuICogUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GXG4gKiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkVcbiAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICogXG4gKiBGcm9tOiBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CRFBsdWdpbkxpYnJhcnlcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2VcbiAqIEBuYW1lIE9mZnNldFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRvcCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gTGVmdCBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIE91dGVyIGhlaWdodCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBPdXRlciB3aWR0aCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKi9cblxuIC8qKlxuICogRnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHJlbW92ZXMgYWRkZWQgbGlzdGVuZXIuXG4gKiBAY2FsbGJhY2sgbW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyXG4gKi9cbiBcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVRvb2xzIHtcblxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xuICAgICAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcbiAgICB9XG5cbiAgICAvKipcblx0ICogQWRkcyBhIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgYXMgdGhlIGVsZW1lbnQgaWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNzcyAtIGNzcyB0byBhZGQgdG8gdGhlIGRvY3VtZW50XG5cdCAqL1xuXHRzdGF0aWMgYWRkU3R5bGUoaWQsIGNzcykge1xuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKERPTVRvb2xzLmNyZWF0ZUVsZW1lbnQoYDxzdHlsZSBpZD1cIiR7aWR9XCI+JHtjc3N9PC9zdHlsZT5gKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcblx0ICovXG5cdHN0YXRpYyByZW1vdmVTdHlsZShpZCkge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcy9yZXF1aXJlcyBhIHJlbW90ZSBzY3JpcHQgdG8gYmUgbG9hZGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGZvciB0aGlzIHNjcmlwdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gdXJsIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgc2NyaXB0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2NyaXB0IGlzIGxvYWRlZFxuXHQgKi9cblx0c3RhdGljIGFkZFNjcmlwdChpZCwgdXJsKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHRcdFx0Y29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcblx0XHRcdHNjcmlwdC5pZCA9IGlkO1xuXHRcdFx0c2NyaXB0LnNyYyA9IHVybDtcblx0XHRcdHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcblx0XHRcdHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xuXHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoc2NyaXB0KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgcmVtb3RlIHNjcmlwdCBmcm9tIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXG5cdCAqL1xuXHRzdGF0aWMgcmVtb3ZlU2NyaXB0KGlkKSB7XG4gICAgICAgIGlkID0gdGhpcy5lc2NhcGVJRChpZCk7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gaHR0cHM6Ly9qYXZhc2NyaXB0LmluZm8vanMtYW5pbWF0aW9uXG4gICAgc3RhdGljIGFuaW1hdGUoe3RpbWluZyA9IF8gPT4gXywgdXBkYXRlLCBkdXJhdGlvbn0pIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIFxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0ZSh0aW1lKSB7XG4gICAgICAgICAgLy8gdGltZUZyYWN0aW9uIGdvZXMgZnJvbSAwIHRvIDFcbiAgICAgICAgICBsZXQgdGltZUZyYWN0aW9uID0gKHRpbWUgLSBzdGFydCkgLyBkdXJhdGlvbjtcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uID4gMSkgdGltZUZyYWN0aW9uID0gMTtcbiAgICAgIFxuICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGVcbiAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWluZyh0aW1lRnJhY3Rpb24pO1xuICAgICAgXG4gICAgICAgICAgdXBkYXRlKHByb2dyZXNzKTsgLy8gZHJhdyBpdFxuICAgICAgXG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA8IDEpIHtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgICB9XG4gICAgICBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG15IHNoaXQgdmVyc2lvbiBvZiBub3QgaGF2aW5nIHRvIHVzZSBgJGAgZnJvbSBqUXVlcnkuIE1lYW5pbmdcbiAgICAgKiB0aGF0IHlvdSBjYW4gcGFzcyBhIHNlbGVjdG9yIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucXVlcnl9LlxuICAgICAqIEl0IGFsc28gbWVhbnMgdGhhdCB5b3UgY2FuIHBhc3MgYSBzdHJpbmcgb2YgaHRtbCBhbmQgaXQgd2lsbCBwZXJmb3JtIGFuZCByZXR1cm4gYHBhcnNlSFRNTGAuXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucXVlcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeSBvciBIVE1MIHRvIHBhcnNlXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBFaXRoZXIgdGhlIHJlc3VsdCBvZiBgcGFyc2VIVE1MYCBvciBgcXVlcnlgXG4gICAgICovXG4gICAgc3RhdGljIFEoc2VsZWN0b3IpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGFyc2VIVE1MKHNlbGVjdG9yKTtcbiAgICAgICAgY29uc3QgaXNIVE1MID0gZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0ID8gQXJyYXkuZnJvbShlbGVtZW50KS5zb21lKG4gPT4gbi5ub2RlVHlwZSA9PT0gMSkgOiBlbGVtZW50Lm5vZGVUeXBlID09PSAxO1xuICAgICAgICBpZiAoaXNIVE1MKSByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBmb3VuZCBlbGVtZW50IG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHF1ZXJ5KHNlbGVjdG9yLCBiYXNlRWxlbWVudCA9IGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBBcnJheSBvZiBhbGwgZm91bmQgZWxlbWVudHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcXVlcnlBbGwoc2VsZWN0b3IsIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHN0cmluZyBvZiBIVE1MIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLFxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIGxpc3Qgb2YgZWxlbWVudHMgYXQgdGhlIHRvcCBsZXZlbCwgdGhleSBjYW4gdGhlbiBiZSBhcHBlbmRlZCBhbGwgYXQgb25jZSB0byBhbm90aGVyIG5vZGUuXG4gICAgICogXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxuICAgICAqIG5vZGVzIGFuZCB0aGVyZSB3ZXJlIG11bHRpcGxlIHRvcCBsZXZlbCBub2Rlcywgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgbm9kZSBpcyByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEhUTUwgdG8gYmUgcGFyc2VkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIFRoZSByZXN1bHQgb2YgSFRNTCBwYXJzaW5nXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIGlmIChmcmFnbWVudCkgcmV0dXJuIG5vZGU7XG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IG5vZGUuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2Rlc1swXTtcbiAgICB9XG5cbiAgICAvKiogQWx0ZXJuYXRlIG5hbWUgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MfSAqL1xuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtyZXR1cm4gdGhpcy5wYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQpO31cbiAgICBcbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIHN0cmluZyBvZiBodG1sIGFuZCBlc2NhcGVzIGl0IHVzaW5nIHRoZSBicm93ZXIncyBvd24gZXNjYXBpbmcgbWVjaGFuaXNtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBlc2NhcGVkXG4gICAgICovXG4gICAgc3RhdGljIGVzY2FwZUhUTUwoaHRtbCkge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgICAgICBjb25zdCBzcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuRWxlbWVudC5hcHBlbmQodGV4dE5vZGUpO1xuICAgICAgICB0ZXh0Tm9kZS5ub2RlVmFsdWUgPSBodG1sO1xuICAgICAgICByZXR1cm4gc3BhbkVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gYWRkXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBhZGRDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSBjbGFzc2VzW2NdID0gY2xhc3Nlc1tjXS50b1N0cmluZygpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gcmVtb3ZlXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyByZW1vdmVDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQ6IFRvZ2dsZSBjbGFzcyB2YWx1ZTtcbiAgICAgKiBpLmUuLCBpZiBjbGFzcyBleGlzdHMgdGhlbiByZW1vdmUgaXQgYW5kIHJldHVybiBmYWxzZSwgaWYgbm90LCB0aGVuIGFkZCBpdCBhbmQgcmV0dXJuIHRydWUuXG4gICAgICogV2hlbiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50OlxuICAgICAqIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgY2xhc3MgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHRvZ2dsZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZGljYXRvcl0gLSBPcHRpb25hbCBpbmRpY2F0b3IgZm9yIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgdG9nZ2xlZFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lLCBpbmRpY2F0b3IpIHtcbiAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpLmZpbHRlcihjID0+IGMpO1xuICAgICAgICBpZiAodHlwZW9mKGluZGljYXRvcikgIT09IFwidW5kZWZpbmVkXCIpIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMsIGluZGljYXRvcikpO1xuICAgICAgICBlbHNlIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMpKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGEgc3BlY2lmaWMgY2xhc3NcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gYHRydWVgIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgY2xhc3MsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKS5ldmVyeShjID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBvbmUgY2xhc3Mgd2l0aCBhbm90aGVyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkTmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gcmVwbGFjZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lIC0gTmV3IG5hbWUgZm9yIHRoZSBjbGFzc1xuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVwbGFjZUNsYXNzKGVsZW1lbnQsIG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVwbGFjZShvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBhcHBlbmRlZCB0byBhbm90aGVyIG5vZGVcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBhcHBlbmRlZCB0b1xuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIGFwcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhhdE5vZGUuYXBwZW5kKHRoaXNOb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIHByZXBlbmRlZCB0byBhbm90aGVyIG5vZGVcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBwcmVwZW5kZWQgdG9cbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBwcmVwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICB0aGF0Tm9kZS5wcmVwZW5kKHRoaXNOb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50Lmluc2VydEFmdGVyKG90aGVyRWxlbWVudClgLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldE5vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIGluc2VydEFmdGVyKHRoaXNOb2RlLCB0YXJnZXROb2RlKSB7XG4gICAgICAgIHRhcmdldE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc05vZGUsIHRhcmdldE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gdGhpc05vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGFmdGVyIGEgc3BlY2lmaWMgZWxlbWVudCwgc2ltaWxhciB0byBqUXVlcnkncyBgdGhpc0VsZW1lbnQuYWZ0ZXIobmV3RWxlbWVudClgLlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIGFmdGVyKHRoaXNOb2RlLCBuZXdOb2RlKSB7XG4gICAgICAgIHRoaXNOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHRoaXNOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5leHQgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIG5leHQgc2libGluZyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV4dChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiKyBcIiArIHNlbGVjdG9yKSA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHN1YnNlcXVlbnQgc2libGluZ3MuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgbmV4dCBzaWJsaW5ncyBvZlxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBuZXh0QWxsKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIn4gKlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdWJzZXF1ZW50IHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGZvbGxvd2luZyBzaWJsaW5ncyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV4dFVudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBbXTsgXG4gICAgICAgIHdoaWxlIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIG5leHQucHVzaChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJldmlvdXMgc2libGluZyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgcHJldmlvdXMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHJldHVybiBwcmV2aW91cyAmJiBwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSA/IHByZXZpb3VzIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHByZWNlZWRpbmcgc2libGluZ3MuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBwcmV2aW91c0FsbChlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107XG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XG4gICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXG4gICAgICovXG4gICAgc3RhdGljIHByZXZpb3VzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTsgXG4gICAgICAgIHdoaWxlIChlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZy5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgd2hpY2ggaW5kZXggaW4gY2hpbGRyZW4gYSBjZXJ0YWluIG5vZGUgaXMuIFNpbWlsYXIgdG8galF1ZXJ5J3MgYCQuaW5kZXgoKWBcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIG5vZGUgdG8gZmluZCBpdHMgaW5kZXggaW4gcGFyZW50XG4gICAgICogQHJldHVybnMge251bWJlcn0gSW5kZXggb2YgdGhlIG5vZGVcbiAgICAgKi9cbiAgICBzdGF0aWMgaW5kZXhJblBhcmVudChub2RlKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XG4gICAgICAgIGxldCBudW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gbm9kZSkgcmV0dXJuIG51bTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5pbmRleEluUGFyZW50fSAqL1xuICAgIHN0YXRpYyBpbmRleChub2RlKSB7cmV0dXJuIHRoaXMuaW5kZXhJblBhcmVudChub2RlKTt9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgaWYgaXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwYXJlbnQgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggcGFyZW50XG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBzaWJsaW5nIGVsZW1lbnQgb3IgbnVsbFxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XG4gICAgICAgIHJldHVybiAhc2VsZWN0b3IgfHwgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpID8gZWxlbWVudC5wYXJlbnRFbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxuICAgICAqL1xuICAgIHN0YXRpYyBmaW5kQ2hpbGQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXG4gICAgICovXG4gICAgc3RhdGljIGZpbmRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYW5jZXN0b3JzIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHBhcmVudHMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHBhcmVudHMgdG9cbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgcGFyZW50c1xuICAgICAqL1xuICAgIHN0YXRpYyBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgICAgIGlmIChzZWxlY3Rvcikgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKTtcbiAgICAgICAgZWxzZSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFuY2VzdG9ycyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBhbmNlc3RvcnMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHNpYmxpbmdzIG9mIHRoZSBlbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBzaWJsaW5ncyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCIqXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHNpYmxpbmdzIHRvXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXG4gICAgICovXG4gICAgc3RhdGljIHNpYmxpbmdzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCIqXCIpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoZSA9PiBlICE9IGVsZW1lbnQgJiYgZS5tYXRjaGVzKHNlbGVjdG9yKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIGNzcyBzdHlsZXMgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgc3R5bGUgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdHlsZS4gIFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIC0gQXR0cmlidXRlIHRvIGdldCBvciBzZXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFZhbHVlIHRvIHNldCBmb3IgYXR0cmlidXRlXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3NzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW2F0dHJpYnV0ZV07XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbYXR0cmlidXRlXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIHdpZHRoIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHdpZHRoIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgd2lkdGguICBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBXaWR0aCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHN0YXRpYyB3aWR0aChlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS53aWR0aCk7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSBoZWlnaHQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgaGVpZ2h0IGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgaGVpZ2h0LiAgXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSGVpZ2h0IHRvIHNldFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgc3RhdGljIGhlaWdodChlbGVtZW50LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5oZWlnaHQpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbm5lciB0ZXh0IG9mIGFuIGVsZW1lbnQgaWYgZ2l2ZW4gYSB2YWx1ZSwgb3RoZXJ3aXNlIHJldHVybnMgaXQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIHRleHQgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gQ29udGVudCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVpdGhlciB0aGUgc3RyaW5nIHNldCBieSB0aGlzIGNhbGwgb3IgdGhlIGN1cnJlbnQgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLlxuICAgICAqL1xuICAgIHN0YXRpYyB0ZXh0KGVsZW1lbnQsIHRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZih0ZXh0KSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlubmVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciB3aWR0aCBvZlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIGlubmVyV2lkdGgoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lckhlaWdodCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIGhlaWdodCBvZlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBpbm5lckhlaWdodChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlcldpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgd2lkdGggb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBvdXRlcldpZHRoKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciBoZWlnaHQgb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb3V0ZXJIZWlnaHQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYWdlLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG9mZnNldCBvZlxuICAgICAqIEByZXR1cm4ge09mZnNldH0gLSBUaGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIG9mZnNldChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgbGlzdGVuZXJzKCkgeyByZXR1cm4gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7IH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb25gIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXG4gICAgICogXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgb25jZS5cbiAgICAgKiBgY29uc3QgY2FuY2VsID0gRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJmaXJlZCFcIik7IGNhbmNlbCgpO30pO2BcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHN0YXRpYyBvbihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XG4gICAgICAgICAgICBjb25zdCBuZXdDYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NhbmNlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgbWV0aG9kIG1hdGNoZXMge0BsaW5rIG1vZHVsZTpET01Ub29scy5vbn0gYnV0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGZcbiAgICAgKiBhbmQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgdXBvbiB0aGUgZmlyc3QgZmlyaW5nIG9mIHRoZSBkZXNpcmVkIGV2ZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgc3RhdGljIG9uY2UoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xuICAgICAgICB9IDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSByZXR1cm47XG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XG4gICAgICAgIGxldCBtYXRjaEZpbHRlciA9IGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09IHR5cGUsIGRlZmF1bHRGaWx0ZXIgPSBfID0+IF87XG4gICAgICAgIGlmIChlbGVtZW50KSBtYXRjaEZpbHRlciA9IGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50LCBkZWZhdWx0RmlsdGVyID0gbCA9PiBsLmVsZW1lbnQgPT0gZWxlbWVudDtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSB8fCBbXTtcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPyBsaXN0ZW5lcnMuZmlsdGVyKG1hdGNoRmlsdGVyKSA6IGxpc3RlbmVycy5maWx0ZXIoZGVmYXVsdEZpbHRlcik7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbGlzdC5sZW5ndGg7IGMrKykgbGlzdFtjXS5jYW5jZWwoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvZmZgIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXG4gICAgICogXG4gICAgICogUmF0aGVyIHRoYW4gYXR0ZW1wdCB0byBleHBsYWluLCBJJ2xsIHNob3cgc29tZSBleGFtcGxlIHVzYWdlcy5cbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgb25DbGljayk7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlZCB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCBvbkNsaWNrKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrXCIsIG9uQ2xpY2spO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcIi5teVBsdWdpblwiKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXG4gICAgICogYERPTVRvb2xzLm9mZihcImNsaWNrLm15UGx1Z2luXCIpO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiLm15UGx1Z2luXCIpO2BcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0geyhFbGVtZW50fHN0cmluZyl9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbW92ZSBsaXN0ZW5lciBmcm9tXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudF0gLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gW2RlbGVnYXRlXSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIG9yaWdpbmFsIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIG9mZihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YoZWxlbWVudCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuX19vZmZBbGwoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAobmFtZXNwYWNlKSByZXR1cm4gdGhpcy5fX29mZkFsbChldmVudCwgZWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciB3aGVuIHRoZSBub2RlIGlzIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keS5cbiAgICAgKiBUaGUgbGlzdGVuZXIgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIHVwb24gZmlyaW5nLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBub2RlIHRvIHdhaXQgZm9yXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZXZlbnRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9uTW91bnQgLSBkZXRlcm1pbmVzIGlmIGl0IHNob3VsZCBmaXJlIG9uIE1vdW50IG9yIG9uIFVubW91bnRcbiAgICAgKi9cbiAgICBzdGF0aWMgb25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgb25Nb3VudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci51bnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2spO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrLCBtdXRhdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20ob25Nb3VudCA/IG11dGF0aW9uLmFkZGVkTm9kZXMgOiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGB0cnVlYCAqL1xuICAgIHN0YXRpYyBvbk1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2spOyB9XG5cbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGBmYWxzZWAgKi9cbiAgICBzdGF0aWMgb25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxuXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnR9ICovXG4gICAgc3RhdGljIG9uQWRkZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudChub2RlLCBjYWxsYmFjayk7IH1cblxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vblVubW91bnR9ICovXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vblVubW91bnQobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbWJpbmVzIG11bHRpcGxlIGVsZW1lbnRzIGludG8gb25lIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gYXJyYXkgb2YgZWxlbWVudHMgdG8gcHV0IGludG8gYSBzaW5nbGUgcGFyZW50XG4gICAgICovXG4gICAgc3RhdGljIHdyYXAoZWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgZG9tV3JhcHBlciA9IHRoaXMucGFyc2VIVE1MKGA8ZGl2IGNsYXNzPVwiZG9tLXdyYXBwZXJcIj48L2Rpdj5gKTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgZG9tV3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50c1tlXSk7XG4gICAgICAgIHJldHVybiBkb21XcmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBub2RlIHRvIGFuIEhUTUxFbGVtZW50LiBUaGlzIGlzIG1haW5seSB1c2VkIGJ5IGxpYnJhcnkgbW9kdWxlcy5cbiAgICAgKiBAcGFyYW0geyhqUXVlcnl8RWxlbWVudCl9IG5vZGUgLSBub2RlIHRvIHJlc29sdmVcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZUVsZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcbiAgICB9XG59XG5cbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5ET00gPSBET01Ub29scyIsImltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgRW1vamlSZWdleDogLzxhP1xcLihcXHcrKVxcLihcXGQrKT4vZ1xyXG59XHJcblxyXG5sZXQgQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxubGV0IEVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG5sZXQgQXV0b2NvbXBsZXRlTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpWzBdXHJcbmxldCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpWzBdXHJcbmxldCBFbW9qaU1vZHVsZVF1ZXJ5ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpWzBdXHJcbmxldCBNZXNzYWdlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylbMF1cclxubGV0IGd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpWzBdXHJcbmxldCBlbW9qaVNlYXJjaCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcbmNvbnN0IGFwcFNldHRpbmdzID0gTGlnaHRjb3JkLkFwaS5zZXR0aW5nc1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEVtb2ppTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5pbml0KCkuY2F0Y2goZXJyID0+IFV0aWxzLmVycihcIkVtb2ppTW9kdWxlXCIsIFwiQW4gZXJyb3Igb2NjdXJlZFwiLCBlcnIpKSAvLyBiZXR0ZXIgbG9nZ2luZ1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICAvKiogRW1vamkgQXV0b0NvbXBsZXRlICovXHJcbiAgICAgICAgaWYoIUF1dG9jb21wbGV0ZU1vZHVsZSlBdXRvY29tcGxldGVNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXHJcbiAgICAgICAgaWYoIUVtb2ppTW9kdWxlUXVlcnkpRW1vamlNb2R1bGVRdWVyeSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylcclxuICAgICAgICBpZighTWVzc2FnZXMpTWVzc2FnZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVxyXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcclxuICAgICAgICBpZighZW1vamlTZWFyY2gpZW1vamlTZWFyY2ggPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbiAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW1wiRW1vamkgUHJlZml4XCJdXHJcbiAgICAgICAgY29uc3QgZ2V0VmFsdWUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXBwU2V0dGluZ3MuZ2V0KFwiQkRfXCIrc2V0dGluZy5pZCwgc2V0dGluZy5kZWZhdWx0KVxyXG4gICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpcmV0dXJuIHNldHRpbmcuZGVmYXVsdFxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKEF1dG9jb21wbGV0ZU1vZHVsZSAmJiBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyAmJiBFbW9qaU1vZHVsZVF1ZXJ5ICYmIE1lc3NhZ2VzICYmIGd1aWxkTW9kdWxlICYmIGVtb2ppU2VhcmNoKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcclxuICAgICAgICAgICAgY29uc3QgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnNcclxuICAgICAgICAgICAgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IGZ1bmN0aW9uKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgdmFsdWUuTElHSFRDT1JEX0VNT0pJUyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKGFyZzEsIGFyZzIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIGdldFZhbHVlKCkgPT09IGFyZzFcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW1vamlVc2FibGUoY29uZGl0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdHModCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gRW1vamlNb2R1bGVRdWVyeS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKHQsIGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHRzKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChlLCB0LCBhLmVtb2ppcywgbiwgciwgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORywgTWVzc2FnZXMuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSSwgQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuRW1vamksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5pZCB8fCBlLnVuaXF1ZU5hbWUgfHwgZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsOiBnZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWxkOiBudWxsICE9IGUuZ3VpbGRJZCA/IGd1aWxkTW9kdWxlLmRlZmF1bHQuZ2V0R3VpbGQoZS5ndWlsZElkKSA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoKSArIGUgKyBnZXRWYWx1ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhaW5UZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFJhd1RleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3Qgc3RhcnQgYXV0b2NvbXBsZXRpb24gb2YgTGlnaHRjb3JkJ3MgZW1vamlzLlwiKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBFbW9qaSBkaXNwbGF5ICovXHJcbiAgICAgICAgd2hpbGUgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb2ppUmVuZGVyKXsgLy8gVE9ETzogUHJvcGVyIGVtb2ppIGZvcm1hdHRpbmcgLyByZW5kZXJpbmdcclxuICAgICAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2VcIilcclxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlKXJldHVyblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50XCIpXHJcbiAgICAgICAgICAgICAgICBpZighY29udGVudCB8fCAhY29udGVudC5sZW5ndGgpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge3tcclxuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgaWQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgICogfVtdfVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihub2RlKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJzZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IEVtb2ppTW9kdWxlQXBpLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKHBhcnNlZFsyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVtb2ppKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW1vamkubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBwYXJzZWRbMF0uc3RhcnRzV2l0aChcIjxhXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWRbMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihoYXNQYXJzZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmQpcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzLmZpbmQoZSA9PiBlLnJhdyA9PSB3b3JkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighQ3VzdG9tRW1vamlNb2R1bGUpQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUVtb2ppTW9kdWxlLkN1c3RvbUVtb2ppLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYCR7Z2V0VmFsdWUoKX0ke2Vtb2ppLm5hbWV9JHtnZXRWYWx1ZSgpfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppSWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bWJvYWJsZTogYXJyLmxlbmd0aCA9PT0gMSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZXZpb3VzLmxlbmd0aCA9PT0gMClyZXR1cm4gW2N1cnJlbnRdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gKz0gYCAke2N1cnJlbnR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIitjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIiwgY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKC4uLndvcmRzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShuZXdDb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQucHVzaChuZXdDb250ZW50LnNoaWZ0KCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICB9LypcclxuICAgICAgICBsZXQgdXNlck1vZHVsZVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJFbW9qaVBpY2tlckxpc3RSb3dcIilcclxuICAgICAgICAudGhlbihFbW9qaVBpY2tlckxpc3RSb3cgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2xhc3NzID0gRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHRcclxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQgPSBjbGFzcyBFbW9qaVBpY2tlckxpc3RSb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlcigpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSlyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIHRoaXMucHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlEZXNjcmlwdG9yczogdGhpcy5wcm9wcy5lbW9qaURlc2NyaXB0b3JzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaXNEaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBFbW9qaVBpY2tlckxpc3RSb3cuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IFwiRW1vamlQaWNrZXJMaXN0Um93XCJcclxuICAgICAgICB9KSovXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIoKTtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBEKGUsIHQsIG4sIHIsIG8sIGksIHMsIHUsIGwsIGMpIHtcclxuICAgIGlmIChudWxsID09IG4gfHwgMCA9PT0gbi5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgdmFyIGQgPSBuLm1hcCgoZnVuY3Rpb24oZSwgbikge1xyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHUsIE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBvbkNsaWNrOiBvLFxyXG4gICAgICAgICAgICBvbkhvdmVyOiByLFxyXG4gICAgICAgICAgICBzZWxlY3RlZDogdCA9PT0gbixcclxuICAgICAgICAgICAgaW5kZXg6IG5cclxuICAgICAgICB9LCBsKGUsIG4pKSlcclxuICAgIH0pKTtcclxuICAgIHJldHVybiBbUihpLCBzLCBlLCBjKSwgZF1cclxufVxyXG5cclxuZnVuY3Rpb24gUihlLCB0LCBuLCByKSB7XHJcbiAgICB2YXIgYSA9IChuLmxlbmd0aCA+IDAgPyBlLmZvcm1hdCh7XHJcbiAgICAgICAgcHJlZml4OiByKG4pXHJcbiAgICB9KSA6IHQpXHJcbiAgICBpZihBcnJheS5pc0FycmF5KGEpKXtcclxuICAgICAgICBhLnVuc2hpZnQoUmVhY3QuY3JlYXRlRWxlbWVudChcInN0cm9uZ1wiLCB7fSwgXCJbTGlnaHRjb3JkXSBcIikpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBhID0gXCJbTElHSFRDT1JEXSBcIithXHJcbiAgICB9XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChBdXRvY29tcGxldGVNb2R1bGUuZGVmYXVsdC5UaXRsZSwge1xyXG4gICAgICAgIHRpdGxlOiBhXHJcbiAgICB9LCBhKVxyXG59XHJcblIuZGlzcGxheU5hbWUgPSBcInJlbmRlckhlYWRlclwiO1xyXG5cclxubGV0IEVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxyXG5sZXQgaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUgJiYgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxubGV0IGlzVXNhYmxlID0gZmFsc2VcclxubGV0IGhhc1BhdGNoZWQgPSBmYWxzZVxyXG5cclxuZnVuY3Rpb24gc2V0RW1vamlVc2FibGUodXNhYmxlKXtcclxuICAgIGlzVXNhYmxlID0gdXNhYmxlXHJcbiAgICBpZihoYXNQYXRjaGVkKXJldHVyblxyXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKUVtb2ppRmlsdGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkKVswXVxyXG4gICAgaWYoIUVtb2ppRmlsdGVyTW9kdWxlKXJldHVyblxyXG4gICAgaWYoIWlzRW1vamlEaXNhYmxlZClpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5cclxuICAgIGhhc1BhdGNoZWQgPSB0cnVlXHJcbiAgICBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZCA9IGZ1bmN0aW9uKGVtb2ppKXtcclxuICAgICAgICBpZihpc1VzYWJsZSl7XHJcbiAgICAgICAgICAgIGlmKGVtb2ppLnN1cnJvZ2F0ZXMgfHwgZW1vamkuZGl2ZXJzaXR5KXJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNFbW9qaURpc2FibGVkLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIlxuY29uc3Qge3VzZVN0YXRlfSA9IEJEVjIucmVhY3RcblxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9yY2VVcGRhdGUoKXtcbiAgICBjb25zdCBbLHNldFZhbHVlXSA9IHVzZVN0YXRlKDApXG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZm9yY2VVcGRhdGUoKXtcbiAgICAgICAgc2V0VmFsdWUoZSA9PiBlKzEpXG4gICAgfVxufSIsImltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIlxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIlxuaW1wb3J0IHsgYmFzZW5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQgY29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxuaW1wb3J0IHsgYWRkb25DYWNoZSB9IGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCJcblxuY29uc3QgY2FjaGUgPSB7fVxuY29uc3QgY2FjaGUyID0ge31cblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFBsdWdpbkNlcnRpZmllciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlBsdWdpbkNlcnRpZmllciA9IHRoaXNcbiAgICB9XG5cbiAgICBwYXRjaChhdHRhY2htZW50LCBpZCl7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhcnQoKXtcblxuICAgIH1cblxuICAgIGlzVHJ1c3RlZChoYXNoKXtcbiAgICAgICAgcmV0dXJuIGNhY2hlW2hhc2hdICYmICFjYWNoZVtoYXNoXS5zdXNwZWN0XG4gICAgfVxufVxuXG5jb25zdCB0ZXN0cyA9IFtcbiAgICBbL3Rva2VuL2dpLCAwLCAwXSxcbiAgICBbL2VtYWlsL2dpLCAwLCAwXSxcbiAgICBbL21mYVxcLi9naSwgMCwgMF0sXG4gICAgWy8yZmEvZ2ksIDAsIDBdLFxuICAgIFsvcGhvbmUvZ2ksIDAsIDBdLFxuICAgIFsvY2hpbGRfcHJvY2Vzcy9naSwgMCwgMF0sXG4gICAgWy9sb2NhbFN0b3JhZ2UvZ2ksIDAsIDBdLFxuICAgIFsvZ2V0R2xvYmFsL2dpLCAwLCAwXSxcbiAgICBbL0Jyb3dzZXJXaW5kb3cvZ2ksIDAsIDBdLFxuICAgIFsvc3lzdGVtMzIvZ2ksIDAsIDBdLFxuICAgIFsvcGFzc3dvcmQvZ2ksIDAsIDBdLFxuICAgIFsvZXZhbC9naSwgMCwgMF0sXG4gICAgWy9XZWJBc3NlbWJseS9naSwgMCwgMF0sXG4gICAgWy9YTUxIdHRwUmVxdWVzdChcXC58XFxbW1wiJ2BdKXByb3RvdHlwZS9naSwgMCwgMF0sXG4gICAgWy93aW5kb3dcXC5mZXRjaCggKyk/PS9naSwgMCwgMF0sXG4gICAgLyoqIE9iZnVzY2F0aW9uIC8gaGlkZGVuIC8gd29ya2Fyb3VuZHMgKi9cbiAgICBbLyhbXCInYF1cXCspW1wiJ2BdXFx3W1wiJ2BdL2dpLCAxLCAxXSxcbiAgICBbL1tcIidgXVxcd1tcIidgXShcXCtbXCInYF0pL2dpLCAxLCAxXSxcbiAgICBbL1xcJHtbXCInYF1cXHcrW1wiJ2BdfS9naSwgMSwgMV0sXG4gICAgLyoqIGhleGFkZWNpbWFsICovXG4gICAgWy9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIDEsIDFdLFxuICAgIFsvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJyggKyk/LCggKyk/J1teJ117NH0nXFwpL2csIDEsIDFdLCAvLyBfMHg4ZGI3KCcweDAnLCAneDFdZicpXG4gICAgLyoqIG1hbmdsZWQgKi9cbiAgICBbL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIDEsIDFdLCAvLyBiKCcweDAnKVxuICAgIFsvXFx3K1xcKCcweFtcXGRhYmNkZWZdKycoICspPywoICspPydbXiddezR9J1xcKS9nLCAxLCAxXSwgLy8gYignMHgwJywgJ3gxXWYnKVxuICAgIC8qKiBzdHJpbmcgYXJyYXkgYXQgc3RhcnQgKi9cbiAgICBbL152YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2ksIDEsIDFdXG5dXG5cbmNvbnN0IHRocmVhdHMgPSBbXG4gICAgXCJBY2NvdW50IFN0ZWFsZXIvVmlydXNcIixcbiAgICBcIk9iZnVzY2F0aW9uL0hpZGRlbiBjb2RlXCJcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKXtcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIilcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGNvbnN0IG5vX2NvbW1lbnRzID0gZGF0YS5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfChbXlxcXFw6XXxeKVxcL1xcLy4qJC9nbSwgXCJcIikudHJpbSgpLy8gcmVtb3ZpbmcgYWxsIGNvbW1lbnRzIGZyb20gcGx1Z2lucyAocmVtb3ZlIG1ldGEgYW5kIG90aGVyLilcblxuICAgIGZvcihjb25zdCBbdGVzdCwgdHlwZSwgcmVtb3ZlQ29tbWVudF0gb2YgdGVzdHMpe1xuICAgICAgICBjb25zdCBzY3JwdCA9IHJlbW92ZUNvbW1lbnQgPT09IDEgPyBub19jb21tZW50cyA6IGRhdGFcbiAgICAgICAgaWYodGVzdC5leGVjKHNjcnB0KSl7XG4gICAgICAgICAgICBpc0hhcm1mdWwgPSB0aHJlYXRzW3R5cGVdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtoYXNoVG9VcmxbaGFzaF0uc3BsaXQoXCIvXCIpLnBvcCgpfSBmYWlsZWQgYXQgdGVzdGAsIHRlc3QsIFwiLiBNYXJrZWQgYXNcIiwgdGhyZWF0c1t0eXBlXSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZighaXNIYXJtZnVsKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxuICAgIGNhY2hlW2hhc2hdID0ge1xuICAgICAgICBzdXNwZWN0OiB0cnVlLFxuICAgICAgICBuYW1lOiBoYXNoVG9VcmxbaGFzaF0uc3BsaXQoXCIvXCIpLnBvcCgpLFxuICAgICAgICB0eXBlOiBoYXNoVG9VcmxbaGFzaF0uZW5kc1dpdGgoXCIuanNcIikgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwiLFxuICAgICAgICBoYXJtOiBpc0hhcm1mdWwsXG4gICAgICAgIGhhc2g6IGhhc2gsXG4gICAgICAgIGZpbGVuYW1lXG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKGBGb3VuZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgJHtjYWNoZVtoYXNoXS50eXBlLnRvTG93ZXJDYXNlKCl9OiAke2NhY2hlW2hhc2hdLm5hbWV9YClcblxuICAgIHJlc3VsdENhbGxiYWNrKGNhY2hlW2hhc2hdKVxufVxuXG5jb25zdCBoYXNoVG9VcmwgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tIYXNoKGhhc2gsIGRhdGEsIGZpbGVuYW1lLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spe1xuICAgIGNvbnNvbGUubG9nKGBGaWxlOiAke2ZpbGVuYW1lfSBoYXNoOiAke2hhc2h9YClcbiAgICBpZighY2FjaGVbaGFzaF0pe1xuICAgICAgICBub2RlRmV0Y2goXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvTGlnaHRjb3JkL2ZpbGVoYXNoZXNAbWFzdGVyL2hhc2hlcy9cIitoYXNoLCB7IC8vIFVzaW5nIG5vZGUtZmV0Y2ggdG8gYnlwYXNzIGNvcnNcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoXCJMSUdIVENPUkRfR0VUX1VTRVJfQUdFTlRcIikgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xuICAgICAgICAgICAgICAgIGlmKGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcbiAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKVxuICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFjaygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgICAgICAgcmVzdWx0Lmhhc2ggPSBoYXNoXG4gICAgICAgICAgICByZXN1bHQuZmlsZW5hbWUgPSBmaWxlbmFtZVxuXG4gICAgICAgICAgICBjYWNoZVtoYXNoXSA9IHJlc3VsdFxuXG4gICAgICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCByZWFkIGZyb20gZ2l0aHViLiAke2Vycn1gKVxuICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxuICAgICAgICAgICAgY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpXG4gICAgICAgIH0pXG4gICAgfWVsc2V7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhY2hlW2hhc2hdXG5cbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlKF9fcGF0aCwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrID0gKGhhc2gpID0+IHt9LCBpc0Zyb21Mb2FkZXIgPSBmYWxzZSl7ICAgIFxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXG5cbiAgICBjcmVhdGVSZWFkU3RyZWFtKF9fcGF0aCkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcbiAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXG4gICAgfSkub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcblxuICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBfX3BhdGhcblxuICAgICAgICBpZihpc0Zyb21Mb2FkZXIgJiYgYWRkb25DYWNoZVtoYXNoUmVzdWx0XSl7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVbaGFzaFJlc3VsdF1cbiAgICAgICAgICAgICAgICBjb250ZW50TWFuYWdlci5zYXZlQWRkb25DYWNoZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayh2YWx1ZS5yZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZCl7XG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXG4gICAgaWYoIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpICYmICFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXG5cbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKFwiTElHSFRDT1JEX0dFVF9VU0VSX0FHRU5UXCIpXG4gICAgICAgIH1cbiAgICB9KS50aGVuKHJlcyA9PiB7XG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xuICAgICAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxuICAgICAgICB9KVxuICAgICAgICByZXMuYm9keS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcblxuICAgICAgICAgICAgY2FjaGUyW2F0dGFjaG1lbnQudXJsXSA9IGhhc2hSZXN1bHRcbiAgICAgICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IGF0dGFjaG1lbnQudXJsXG5cbiAgICAgICAgICAgIGNoZWNrSGFzaChoYXNoUmVzdWx0LCBkYXRhLCBhdHRhY2htZW50LmZpbGVuYW1lLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKVxuICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICAgICAgaWYoZWxlbSllbGVtLnJlbW92ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pLmNhdGNoKCgpPT57fSlcbn1cblxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxubGV0IGNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXG5cbi8qKlxuICogXG4gKiBAcGFyYW0ge0hUTUxEaXZFbGVtZW50W119IGVsZW1lbnRzIFxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcbiAqL1xuZnVuY3Rpb24gcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBmaWxlbmFtZSl7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVybiAvLyBhbHJlYWR5IGNlcnRpZmllZC9kaXYgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cblxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxuICAgIGlmKCFjaGlsZE1vZHVsZSljaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXVxuICAgIFxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcInJnYigyNDAsIDcxLCA3MSlcIlxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBcbiAgICAgICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yKGxldCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgKipcIitmaWxlbmFtZStcIioqIG1pZ2h0IGJlIGRhbmdlcm91cyAqKihcIityZXN1bHQuaGFybStcIikqKi4gXFxuXFxuKipXZSBkb24ndCByZWNvbW1hbmQgdG8gZG93bmxvYWQgaXQqKi4gSG93ZXZlciwgeW91IGNhbiBzdGlsbCBkbyBpdCBiZWxvdy5cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJEb24ndCAhXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhcIkxJR0hUQ09SRF9PUEVOX0VYVEVSTkFMXCIsIGNoaWxkLmhyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZShjaGlsZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxuICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgIH1cbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLlwifSwgXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn19LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OlwiMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlwiMzJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDpcIjMyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDpcIiNmMDQ3NDdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s6XCJ1cmwoI3N2Zy1tYXNrLXN0YXR1cy1kbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSwgZGl2KVxuICAgIH1lbHNlIGlmKCFyZXN1bHQub2ZmaWNpYWwpe1xuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBjZXJ0aWZpZWQgYnkgTGlnaHRjb3JkLlwifSwgXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiIzRmNTQ1Y1wiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiBcIkluc3RhbGwgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiIG9uIExpZ2h0Y29yZC5cIn0sIFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgP1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YWxsIGFuZCBsYXVuY2ggdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkby5cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgYW5kIEluc3RhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkkndmUgY2hhbmdlZCBteSBtaW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGluaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIHdhcyBub3QgMjAwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW5zdGFsbFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgXSlcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxuICAgIH1lbHNle1xuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiB3YXMgbWFkZSBieSB0aGUgZGV2ZWxvcGVycyBvZiBMaWdodGNvcmQuXCIsIHN0eWxlOlwiYnJhbmRcIn0sIFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwiLCBmbG9hdDogXCJsZWZ0XCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcImN1cnJlbnRDb2xvclwiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNMTAuNyw1LjI4YTIuOSwyLjksMCwwLDAtMi4xMS44Ni4xMS4xMSwwLDAsMCwwLC4xNmwxLjA1Ljk0YS4xMS4xMSwwLDAsMCwuMTUsMCwxLjI3LDEuMjcsMCwwLDEsLjktLjMzYy42NSwwLC42NS43My42NS43M2EuNjQuNjQsMCwwLDEtLjY1LjY1LDEuNzMsMS43MywwLDAsMS0xLjE4LS41NGMtLjMxLS4yNi0uMzYtLjMyLS43My0uNjZTNy4wNiw1LjI4LDUuNjUsNS4yOEEyLjI2LDIuMjYsMCwwLDAsMy4zNyw3LjU2LDIuNTksMi41OSwwLDAsMCwzLjgyLDlhMi4xOCwyLjE4LDAsMCwwLDEuODMuODksMi45NCwyLjk0LDAsMCwwLDIuMS0uODEuMTEuMTEsMCwwLDAsMC0uMTZMNi43NCw4QS4xMS4xMSwwLDAsMCw2LjYsOGExLjU4LDEuNTgsMCwwLDEtLjk0LjI5aDBBLjcxLjcxLDAsMCwxLDUsNy41Nkg1YS42My42MywwLDAsMSwuNjUtLjY0Yy43MSwwLDEuNDIuNzUsMS45NCwxLjI3Ljc1Ljc2LDEuNjYsMS43OSwzLjExLDEuNzRBMi4yOCwyLjI4LDAsMCwwLDEzLDcuNjRhMi41OSwyLjU5LDAsMCwwLS40NS0xLjQ3QTIuMTQsMi4xNCwwLDAsMCwxMC43LDUuMjhaXCJ9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCJ9LCBvbkNsaWNrKCl7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJMaWdodGNvcmQgd2lsbCBhdXRvbWF0aWNhbGx5IGRvd25sb2FkIGFuZCBsb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIi4gWW91IG11c3QgZW5hYmxlIGl0IGluIHRoZSBzZXR0aW5ncy5cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgYW5kIEluc3RhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkkndmUgY2hhbmdlZCBteSBtaW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGZXRjaChsaW5rKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCByZXMuYnVmZmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnN0YWxsUGF0aCA9IGpvaW4ocmVzdWx0LnR5cGUgPT09IFwiUGx1Z2luXCIgPyBjb250ZW50TWFuYWdlci5fcGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLl90aGVtZXNGb2xkZXIsIHJlc3VsdC5maWxlbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhpbnN0YWxsUGF0aCwgY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChyZXN1bHQudHlwZStcIiBzdWNjZXNmdWxseSBpbnN0YWxsZWQuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMjQgMjRcIixzdHlsZTp7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiZmlsbFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIF0pXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNwYW4sIGRpdilcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEtleWVkQXJyYXkob2JqKXtcbiAgICBsZXQgYXJyID0gW11cbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XG4gICAgICAgIGFyci5wdXNoKFtrLCBvYmpba11dKVxuICAgIH0pXG4gICAgcmV0dXJuIGFyclxufVxuXG5sZXQga2V5ID0gbnVsbFxubGV0IHNhdmUgPSBudWxsXG5cbndpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKG09Pm0uT2JqZWN0U3RvcmFnZSlcbi50aGVuKGxvY2FsU3RvcmFnZU1vZHVsZSA9PiB7XG4gICAgbGV0IGxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZU1vZHVsZS5pbXBsXG4gICAgc2F2ZSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXQoXCJQbHVnaW5DZXJ0aWZpZXJLZXlFbmNyeXB0aW9uX19cIiwgYnRvYShKU09OLnN0cmluZ2lmeShrZXkpKSlcbiAgICB9XG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzYXZlKClcbiAgICB9LCAxMDAwMDApO1xuICAgIHRyeXtcbiAgICAgICAgbGV0IHZhbCA9IHNhZmVKU09OUGFyc2UoYXRvYihsb2NhbFN0b3JhZ2UuZ2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIpKSlcbiAgICAgICAgaWYodmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoICE9PSAyIHx8IHZhbC5maW5kKGUgPT4gdHlwZW9mIGUgIT09IFwic3RyaW5nXCIpIHx8IEJ1ZmZlci5mcm9tKHZhbFswXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAxNiB8fCBCdWZmZXIuZnJvbSh2YWxbMV0sIFwiYmFzZTY0XCIpLmxlbmd0aCAhPT0gMzIpe1xuICAgICAgICAgICAgZ2VuZXJhdGVLZXkoKVxuICAgICAgICAgICAgc2F2ZSgpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB2YWxcbiAgICB9Y2F0Y2goZSl7XG4gICAgICAgIGdlbmVyYXRlS2V5KClcbiAgICAgICAgc2F2ZSgpXG4gICAgfVxufSlcblxuZnVuY3Rpb24gZ2VuZXJhdGVLZXkoKXtcbiAgICBrZXkgPSBbY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZyhcImJhc2U2NFwiKSwgY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImJhc2U2NFwiKV1cbn1cblxuZnVuY3Rpb24gc2FmZUpTT05QYXJzZShqc29uKXtcbiAgICB0cnl7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXG4gICAgfWNhdGNoKGUpe1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gbmV3IEVycm9yKGUpIDogZVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGEpe1xuICAgIHRyeXtcbiAgICAgICAgbGV0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoXCJhZXMtMjU2LWNiY1wiLCBCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpKVxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwiYmFzZTY0XCIpKTtcbiAgICAgICAgZGVjcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZGVjcnlwdGVkLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWQudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgfWNhdGNoKGUpe1xuICAgICAgICByZXR1cm4gXCJ7fVwiXG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGEpe1xuICAgIGxldCBhcmdzID0gW0J1ZmZlci5mcm9tKGtleVsxXSwgXCJiYXNlNjRcIiksIEJ1ZmZlci5mcm9tKGtleVswXSwgXCJiYXNlNjRcIildXG4gICAgXG4gICAgbGV0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCAuLi5hcmdzKTtcbiAgICBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhLCBcInV0ZjhcIikpO1xuICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRlZCwgY2lwaGVyLmZpbmFsKCldKTtcbiAgICByZXR1cm4gZW5jcnlwdGVkLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmNsYXNzIFBsdWdpbk1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlBsdWdpbk1vZHVsZSA9IHRoaXNcbiAgICB9XG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlcjt9XG59XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbnMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5sb2FkUGx1Z2luRGF0YSgpO1xuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7XG4gICAgICAgICAgICBpZiAocGx1Z2luLmxvYWQgJiYgdHlwZW9mKHBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIHBsdWdpbi5sb2FkKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIG5hbWUgKyBcIiBjb3VsZCBub3QgYmUgbG9hZGVkLlwiLCBlcnIpO1xuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW25hbWVdKSBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcblxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5zdGFydCgpO1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XG4gICAgICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcInN0YXJ0KCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKVxuICAgIH1cbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG5cbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLm9uKFwiZGlkLW5hdmlnYXRlLWluLXBhZ2VcIiwgdGhpcy5jaGFubmVsU3dpdGNoLmJpbmQodGhpcykpO1xuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdGFydFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RhcnQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdGFydGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIHBsdWdpbiArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RvcFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RvcCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdG9wcGVkLmApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0b3BwZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCkgKyBcIiBjb3VsZCBub3QgYmUgc3RvcHBlZC5cIiwgZXJyKTtcbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSB0cnVlO1xuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4pO1xuICAgIGVsc2UgdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy50b2dnbGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gKGNvbnNvbGUubG9nKHAuZmlsZW5hbWUsIGZpbGVuYW1lKSkgfHwgcC5maWxlbmFtZSA9PSBmaWxlbmFtZSkucGx1Z2luO1xuICAgIHRyeSB7IGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTt9XG4gICAgY2F0Y2ggKGVycikge2lmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJdfSk7fVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1sb2FkZWRcIiwgcGx1Z2luLmdldE5hbWUoKSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVubG9hZFBsdWdpbiA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luLnBsdWdpbi5nZXROYW1lKCk7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xuICAgIGRlbGV0ZSBiZHBsdWdpbnNbcGx1Z2luXTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XG4gICAgfVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXVubG9hZGVkXCIsIHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIHRoaXMudW5sb2FkUGx1Z2luKGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm4gdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lT3JOYW1lKTtcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xuICAgIGNvbnN0IGVuYWJsZWQgPSBwbHVnaW5Db29raWVbcGx1Z2luXTtcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCAmJiB0eXBlb2YoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQoKTtcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXJlbG9hZGVkXCIsIHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRQbHVnaW4obmFtZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuRXh0ZXJuYWwoYCR7ZnVsbFBhdGh9YCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZVBsdWdpbkxpc3QgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJwbHVnaW5cIik7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkUGx1Z2luKG5hbWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbkNvb2tpZSwgc2F2ZWQpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc2F2ZVBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInBsdWdpbnNcIiwgcGx1Z2luQ29va2llKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubmV3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uTWVzc2FnZSgpOyB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvbk1lc3NhZ2UgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmNoYW5uZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25Td2l0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uU3dpdGNoKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uU3dpdGNoIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yYXdPYnNlcnZlciA9IGZ1bmN0aW9uKGUpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub2JzZXJ2ZXIoZSk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9ic2VydmVyIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IFBsdWdpbk1vZHVsZSgpOyIsImltcG9ydCB7IHRoZW1lQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCJcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIHBvcG91dFdpbmRvdyB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBXaW5kb3c+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aW5kb3dzID0gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpe1xuICAgICAgICBsZXQgcG9wb3V0TW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFdpbmRvdylcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfT1BFTlwiLCAoZXYpID0+IHtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQHR5cGUge1dpbmRvd31cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBwb3BvdXRNb2R1bGUuZGVmYXVsdC5nZXRXaW5kb3coZXYua2V5KVxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5zZXQoZXYua2V5LCB3aW5kb3cpXG5cbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NMaXN0ID0gd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcIndpbmRvdy1wb3BvdXRcIilcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcImxpZ2h0Y29yZFwiKVxuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZXYua2V5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfQ0xPU0VcIiwgKGV2KSA9PiB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5kZWxldGUoZXYua2V5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1lbmFibGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1kaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXG4gICAgICAgIH0pXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtcmVsb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxuICAgICAgICB9KVxuICAgICAgICBiZEV2ZW50cy5vbihcInRoZW1lLXVubG9hZGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGVuYWJsZSgpe1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHRoaXMudXBkYXRlKClcbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMudXBkYXRlKClcbiAgICB9XG5cbiAgICB1cGRhdGUoa2V5KXtcbiAgICAgICAgaWYoIXRoaXMud2luZG93cy5zaXplKXJldHVyblxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVRoZW1lcyhrZXkpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUaGVtZXMoa2V5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGhlbWVzKGtleSl7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgaWYoa2V5KXtcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaGVtZXMoa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUaGVtZXMoa2V5KXtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgaWYoa2V5KXtcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShcIndpbGwtcmVtb3ZlXCIsIFwidHJ1ZVwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhiZHRoZW1lcylcbiAgICAgICAgICAgIC5mb3JFYWNoKHRoZW1lTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lQ29va2llW3RoZW1lTmFtZV0pcmV0dXJuIC8vIHRoZW1lIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZU5hbWVdXG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lKXJldHVybiAvLzpzaHJ1ZzpcblxuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtkYXRhLWxpZ2h0Y29yZC10aGVtZT10cnVlXSNcIitET00uZXNjYXBlSUQodGhlbWUuaWQpKVxuICAgICAgICAgICAgICAgIGlmKGV4aXN0aW5nKXtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJ3aWxsLXJlbW92ZVwiKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pZCA9IERPTS5lc2NhcGVJRCh0aGVtZS5pZClcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpZ2h0Y29yZC10aGVtZVwiLCBcInRydWVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbd2lsbC1yZW1vdmU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVRoZW1lcyhrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuaW1wb3J0IFYyQ19QdWJsaWNTZXJ2ZXJzIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnNcIjtcbmltcG9ydCBMYXllcnMgZnJvbSBcIi4vTGF5ZXJzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyX1B1YmxpY1NlcnZlcnMgPSB0aGlzXG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBMYXllcnMuY3JlYXRlTGF5ZXIoKGNsb3NlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QdWJsaWNTZXJ2ZXJzLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIiwgY2xvc2V9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldCBidXR0b24oKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIGJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XG4gICAgICAgIGJ0bi5hcHBlbmQobGFiZWwpO1xuICAgICAgICByZXR1cm4gYnRuO1xuICAgIH1cblxuICAgIF9hcHBlbmRCdXR0b24oKSB7XG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lclxuICAgICAgICBdID0gW1xuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZG93bmxvYWRQcm9ncmVzcyAmJiBlLnR1dG9yaWFsQ29udGFpbmVyKVswXS50dXRvcmlhbENvbnRhaW5lcilcbiAgICAgICAgXVxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYGRpdi4ke2NsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyfSA+IGRpdmApO1xuICAgICAgICBET00uYWZ0ZXIoZ3VpbGRzLCB0aGlzLmJ1dHRvbik7XG4gICAgfVxuXG4gICAgYWRkQnV0dG9uKCkge1xuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xuICAgICAgICBjb25zdCBHdWlsZExpc3RPbGQgPSB3ZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24oKTtcbiAgICB9XG5cbiAgICByZW1vdmVCdXR0b24oKSB7XG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xuICAgICAgICBjb25zdCBidXR0b24gPSBET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpO1xuICAgICAgICBpZiAoYnV0dG9uKSBidXR0b24ucmVtb3ZlKCk7XG4gICAgfVxufTsiLCJpbXBvcnQge3NldHRpbmdzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3NSUEMsIGxpZ2h0Y29yZFNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIGZyb20gXCIuL3NldHRpbmdzUGFuZWxTaWRlYmFyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xuaW1wb3J0IHZvaWNlTW9kZSBmcm9tIFwiLi92b2ljZU1vZGVcIjtcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xuXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XG5pbXBvcnQgQ2FyZExpc3QgZnJvbSBcIi4uL3VpL2FkZG9ubGlzdFwiO1xuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xuaW1wb3J0IFYyQ19BY2NvdW50SW5mb3MgZnJvbSBcIi4uL3VpL0FjY291bnRJbmZvc1wiO1xuaW1wb3J0IHsgcmVtb3RlLCBpcGNSZW5kZXJlciB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IEFudGlBZERNIGZyb20gXCIuL0FudGlBZERNXCI7XG5pbXBvcnQgYmx1clByaXZhdGUgZnJvbSBcIi4vYmx1clByaXZhdGVcIjtcbmltcG9ydCBkaXNhYmxlVHlwaW5nIGZyb20gXCIuL2Rpc2FibGVUeXBpbmdcIjtcbmltcG9ydCBBcGlQcmV2aWV3IGZyb20gXCIuLi91aS9BcGlQcmV2aWV3XCI7XG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuLi91aS9zd2l0Y2hcIjtcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4uL3VpL21hcmdpbnRvcFwiO1xuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCI7XG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vdWkvaWNvbnMvaGlzdG9yeVwiO1xuaW1wb3J0IGNvcmUgZnJvbSBcIi4vY29yZVwiO1xuaW1wb3J0IHBvcG91dFdpbmRvdyBmcm9tIFwiLi9wb3BvdXRXaW5kb3dcIjtcbmltcG9ydCBUZXh0SW5wdXRTZXR0aW5nIGZyb20gXCIuLi91aS9UZXh0SW5wdXRTZXR0aW5nXCI7XG5pbXBvcnQgeyB1c2VGb3JjZVVwZGF0ZSB9IGZyb20gXCIuL2hvb2tzXCI7XG5cbmNsYXNzIEJEU2lkZWJhckhlYWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgc2lkZWJhckNvbXBvbmVudHMgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5TZXBhcmF0b3IgJiYgZS5IZWFkZXIgJiYgZS5JdGVtKVxuXG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0J1dHRvbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkNoYW5nZWxvZ1wifSwgXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtmbG9hdDogXCJyaWdodFwiLCBjdXJzb3I6IFwicG9pbnRlclwifSwgY2xhc3NOYW1lOiBcImJkLWNoYW5nZWxvZy1idXR0b25cIiwgb25DbGljazogKCkgPT4ge1V0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO319LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHJlbmRlcmVkID0gbmV3IHNpZGViYXJDb21wb25lbnRzLkhlYWRlcih7XG4gICAgICAgICAgICBjaGlsZHJlbjogUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgXCJCYW5kYWdlZCBCRFwiLCBjaGFuZ2Vsb2dCdXR0b24pLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkXG4gICAgfVxufVxuXG5sZXQgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1NldHRpbmdzUGFuZWwge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MgPSB0aGlzLnVwZGF0ZVNldHRpbmdzLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tcG9uZW50cygpXG4gICAgfVxuXG4gICAgcmVnaXN0ZXJDb21wb25lbnRzKCl7XG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGlnaHRjb3JkXCIsIG1ha2VDb21wb25lbnQodGhpcy5saWdodGNvcmRDb21wb25lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInN0YXR1c1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuUHJlc2VuY2VDb21wb25lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImxjYXBpcHJldmlld1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQXBpUHJldmlld0NvbXBvbmVudC5iaW5kKHRoaXMpKSlcblxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJCRENoYW5nZWxvZ1RpdGxlXCIsIG1ha2VDb21wb25lbnQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCRFNpZGViYXJIZWFkZXIoKS5yZW5kZXIoKVxuICAgICAgICB9KSlcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiY29yZVwiLCBtYWtlQ29tcG9uZW50KHRoaXMuY29yZUNvbXBvbmVudC5iaW5kKHRoaXMpKSlcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiY3VzdG9tY3NzXCIsIG1ha2VDb21wb25lbnQodGhpcy5jdXN0b21Dc3NDb21wb25lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInBsdWdpbnNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInBsdWdpbnNcIikpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJ0aGVtZXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInRoZW1lc1wiKSkpXG4gICAgfVxuICAgIFxuICAgIGdldCBjb3JlU2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImNvcmVcIik7XG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xuICAgIH1cblxuICAgIGdldCBsaWdodGNvcmRTZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwibGlnaHRjb3JkXCIpO1xuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgUHJlc2VuY2VTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJzdGF0dXNcIilcbiAgICB9XG5cbiAgICBnZXRTZXR0aW5ncyhjYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXRlZ29yeSAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnI7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9XG5cblxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkLCBzaWRlYmFyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoaWQsIGNoZWNrZWQsIHNpZGViYXIpO1xuICAgIH1cblxuICAgIHVwZGF0ZVNldHRpbmdzKGlkLCBlbmFibGVkLCBzaWRlYmFyKSB7XG4gICAgICAgIGlmKCFbXCJsaWdodGNvcmQtOFwiLCBcIm5vX3dpbmRvd19ib3VuZFwiLCBcImVuYWJsZV9nbGFzc3Ryb25cIiwgXCJsaWdodGNvcmQtMTBcIiwgXCJsaWdodGNvcmQtMTFcIl0uaW5jbHVkZXMoaWQpKXNldHRpbmdzQ29va2llW2lkXSA9IGVuYWJsZWQ7XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTJcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMVwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcbiAgICAgICAgICAgIGVsc2UgcHVibGljU2VydmVyc01vZHVsZS5yZW1vdmVCdXR0b24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy00XCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB2b2ljZU1vZGUuc3RhcnQoKTtcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5hYmxlZCAmJiBpZCA9PSBcImJkYS1ncy02XCIpIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtN1wiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgQ2xhc3NOb3JtYWxpemVyLnN0YXJ0KCk7XG4gICAgICAgICAgICBlbHNlIENsYXNzTm9ybWFsaXplci5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTVcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInBsdWdpblwiKTtcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiZm9yay13cC0xXCIpIHtcbiAgICAgICAgICAgIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJ0cmFuc3BhcmVudFwiLCBlbmFibGVkKTtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xuICAgICAgICAgICAgZWxzZSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIFwiIzJmMzEzNlwiKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLThcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wRGVidWdMaXN0ZW5lcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1kbS0xXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gZmFsc2VcbiAgICAgICAgICAgIHNpZGViYXIuZm9yY2VVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMlwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxuICAgICAgICAgICAgICAgIGlmKHNldHRpbmdzU3RvcmUgJiYgIXNldHRpbmdzU3RvcmUuZGVmYXVsdC5zaG93Q3VycmVudEdhbWUpe1xuICAgICAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncylbMF0uZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIEN1c3RvbVJpY2hQcmVzZW5jZS5kaXNhYmxlKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xuICAgICAgICAgICAgaXBjUmVuZGVyZXIuc2VuZFN5bmMoXCJMSUdIVENPUkRfU0VUX0FMV0FZU19PTl9UT1BcIiwgZW5hYmxlZClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTRcIikge1xuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIEFudGlBZERNLmRpc2FibGUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNlwiKSB7XG4gICAgICAgICAgICBpZihlbmFibGVkKXtcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5lbmFibGUoKVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xuICAgICAgICAgICAgICAgIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGRpc2FibGVUeXBpbmcuZGlzYWJsZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC04XCIpe1xuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gd2luZG93LkxpZ2h0Y29yZC5BcGkuc2V0dGluZ3NcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcImlzVGFic1wiLCBlbmFibGVkKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXG4gICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmFwcC5yZWxhdW5jaCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC05XCIpIHtcbiAgICAgICAgICAgIHBvcG91dFdpbmRvd1tlbmFibGVkID8gXCJlbmFibGVcIiA6IFwiZGlzYWJsZVwiXSgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0xMFwiKXtcbiAgICAgICAgICAgIGNvcmUubWV0aG9kcy5Ob3RpZmljYXRpb25zVXNlU2hpbShlbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcIm5vX3dpbmRvd19ib3VuZFwiKXtcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHdpbmRvdy5MaWdodGNvcmQuQXBpLnNldHRpbmdzXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGVuYWJsZWQpXG5cbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIklTX01BWElNSVpFRFwiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiSVNfTUlOSU1JWkVEXCIpIFxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiV0lORE9XX0JPVU5EU1wiKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIERpc2NvcmROYXRpdmUuYXBwLnJlbGF1bmNoKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwiZW5hYmxlX2dsYXNzdHJvblwiKXtcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHdpbmRvdy5MaWdodGNvcmQuQXBpLnNldHRpbmdzXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJHTEFTU1RST05cIiwgZW5hYmxlZClcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxuICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihpZCA9PT0gXCJsaWdodGNvcmQtMTFcIil7XG4gICAgICAgICAgICBsZXQgYXBwU2V0dGluZ3MgPSB3aW5kb3cuTGlnaHRjb3JkLkFwaS5zZXR0aW5nc1xuICAgICAgICAgICAgaWYoIWVuYWJsZWQpe1xuICAgICAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIkJEX1wiK2lkKVxuICAgICAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiQkRfXCIraWQsIGVuYWJsZWQpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0yXCJdKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtM1wiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTRcIl0pIHZvaWNlTW9kZS5zdGFydCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNVwiXSkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdKSBjb2xvcmVkVGV4dC5pbmplY3RDb2xvcmVkVGV4dCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTRcIl0pIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMVwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMlwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCJdKSBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTNcIl0pIGlwY1JlbmRlcmVyLnNlbmRTeW5jKFwiTElHSFRDT1JEX1NFVF9BTFdBWVNfT05fVE9QXCIsIHRydWUpXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNlwiXSkgYmx1clByaXZhdGUuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTdcIl0pIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTlcIl0pIHBvcG91dFdpbmRvdy5lbmFibGUoKVxuXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcblxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XG4gICAgfVxuXG4gICAgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpO1xuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcbiAgICB9XG5cbiAgICByZW5kZXJTaWRlYmFyKHNpZGViYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhci5yZW5kZXIoc2lkZWJhcik7XG4gICAgfVxuXG4gICAgY29yZUNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXG4gICAgfVxuXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIsIGZvcmNlVXBkYXRlKSB7XG4gICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHdpbmRvdy5MaWdodGNvcmQuQXBpLnNldHRpbmdzXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLmxpZ2h0Y29yZFNldHRpbmdzLm1hcCgoc2VjdGlvbiwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIChpID09PSAwID8gbnVsbCA6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChNYXJnaW5Ub3ApKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDJcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LCBzZWN0aW9uLnRpdGxlKSxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tlZCA9IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtOFwiKWlzQ2hlY2tlZCA9IGFwcFNldHRpbmdzLmdldChcImlzVGFic1wiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJub193aW5kb3dfYm91bmRcIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwiZW5hYmxlX2dsYXNzdHJvblwiKWlzQ2hlY2tlZCA9IGFwcFNldHRpbmdzLmdldChcIkdMQVNTVFJPTlwiLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpaXNDaGVja2VkID0gIWFwcFNldHRpbmdzLmdldChcIkRFRkFVTFRfTk9USUZJQ0FUSU9OU1wiLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFtcImxpZ2h0Y29yZC0xMVwiXS5pbmNsdWRlcyhzZXR0aW5nLmlkKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFwcFNldHRpbmdzLmdldChcIkJEX1wiK3NldHRpbmcuaWQsIHNldHRpbmcuZGVmYXVsdCB8fCBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUZXh0SW5wdXRTZXR0aW5nLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgdmFsdWUsIHBsYWNlaG9sZGVyOiBzZXR0aW5nLmRlZmF1bHQgfHwgbnVsbCwgb25DaGFuZ2U6IChpZCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoaWQsIHZhbHVlLCBzaWRlYmFyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IGlzQ2hlY2tlZCwgb25DaGFuZ2U6IChpZCwgY2hlY2tlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09IFwibGlnaHRjb3JkLThcIiAmJiBpc0NoZWNrZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiZ3JlZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCJzbWFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwiYnJhbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuaXBjLnNlbmQoXCJORVdfVEFCXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFwiT3BlbiBhIG5ldyBUYWJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIiAmJiBpc0NoZWNrZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNob2ljZXMgPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjdHVhbCA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcy5wdXNoKFwiYmx1cmJlaGluZFwiLCBcImFjcnlsaWNcIiwgXCJ0cmFuc3BhcmVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IGFwcFNldHRpbmdzLmdldChcIkdMQVNTVFJPTl9CTFVSXCIsIFwiYmx1cmJlaGluZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcy5wdXNoKFwidGl0bGViYXJcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2VsZWN0aW9uXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1lbnVcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicG9wb3ZlclwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzaWRlYmFyXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzaGVldFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3aW5kb3dcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaHVkXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZ1bGxzY3JlZW4tdWlcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidG9vbHRpcFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInVuZGVyLXdpbmRvd1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bmRlci1wYWdlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBhcHBTZXR0aW5ncy5nZXQoXCJHTEFTU1RST05fVklCUkFOQ1lcIiwgXCJmdWxsc2NyZWVuLXVpXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlLCB7fSwgXCJHbGFzc3Ryb24gQmx1clwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogY2hvaWNlcy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYWN0dWFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBjUmVuZGVyZXIuaW52b2tlKFwiTElHSFRDT1JEX1NFVF9CTFVSX1RZUEVcIiwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGNSZW5kZXJlci5pbnZva2UoXCJMSUdIVENPUkRfU0VUX1ZJQlJBTkNZXCIsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSksIFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxuICAgICAgICAgICAgICAgIGxvb2s6IFwiZ2hvc3RcIixcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgICAgb25DbGljaygpe1xuICAgICAgICAgICAgICAgICAgICBpcGNSZW5kZXJlci5zZW5kU3luYyhcIkxJR0hUQ09SRF9SRUxBVU5DSF9BUFBcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogcmVtb3RlLnByb2Nlc3MuYXJndi5zbGljZSgxKS5jb25jYXQoW1wiLS1kaXNhYmxlLWJldHRlcmRpc2NvcmRcIl0pXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cmFwcGVyOiB0cnVlXG4gICAgICAgICAgICB9LCBcIlJlbGF1bmNoIHdpdGhvdXQgQmV0dGVyRGlzY29yZFwiKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogXCJ5ZWxsb3dcIixcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXG4gICAgICAgICAgICAgICAgc2l6ZTogXCJtZWRpdW1cIixcbiAgICAgICAgICAgICAgICBob3ZlckNvbG9yOiBcInJlZFwiLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNDbGVhcmluZ0NhY2hlKXJldHVyblxuICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNsZWFyaW5nIGNhY2hlLi4uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW5mb1wiXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnNlc3Npb24uY2xlYXJDYWNoZSgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNhY2hlIGlzIGNsZWFyZWQgIVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLiBDaGVjayBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy5cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3cmFwcGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0NsZWFyaW5nQ2FjaGVcbiAgICAgICAgICAgIH0sIFwiQ2xlYXIgY2FjaGVcIilcbiAgICAgICAgXVxuICAgIH1cblxuICAgIFByZXNlbmNlQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QcmVzZW5jZVNldHRpbmdzLCB7XG4gICAgICAgICAgICBrZXk6IFwibHBwYW5uZWxcIixcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLlByZXNlbmNlU2V0dGluZ3NcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBBY2NvdW50SW5mb3NDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0FjY291bnRJbmZvcywge1xuICAgICAgICAgICAga2V5OiBcImxhcGFubmVsXCJcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBBcGlQcmV2aWV3Q29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFwaVByZXZpZXcsIHtcbiAgICAgICAgICAgIGtleTogXCJsYXBpcGFubmVsXCJcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjdXN0b21Dc3NDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3NzRWRpdG9yLCB7a2V5OiBcImNzc2VkaXRvclwifSlcbiAgICB9XG5cbiAgICByZW5kZXJBZGRvblBhbmUodHlwZSkge1xuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXG4gICAgICAgIC8vIFJlYWN0IHJlZnVzZXMgdG8gY2hhbmdlIHRoZSBidXR0b24gd2hlbiBnb2luZ1xuICAgICAgICAvLyBiZXR3ZWVuIHBsdWdpbnMgYW5kIHRoZW1lcyBwYWdlLi4uIHNvbWV0aGluZ1xuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cbiAgICAgICAgY2xhc3MgQ29udGVudExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0LkNvbXBvbmVudCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMucHJvcHMudHlwZS5yZXBsYWNlKFwic1wiLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMudHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgcmVuZGVyKCkge3JldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO31cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlbmRlciA9IENvbnRlbnRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb250ZW50TGlzdC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZX0pKVxuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsIG9uIHdpbmRvd1xuICovXG5cbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQoY2hpbGRyZW4pe1xuICAgIGNsYXNzIFNldHRpbmdDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgICAgICByZW5kZXIoKXtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihzaWRlYmFyLCAoKSA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpXG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHNpZGViYXJcbiAgICByZXR1cm4gKHMpID0+IHtcbiAgICAgICAgc2lkZWJhciA9IHNcbiAgICAgICAgcmV0dXJuIFNldHRpbmdDb21wb25lbnRcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnBhbmVscyA9IHt9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXIocGFuZWwsIGNvbXBvbmVudCl7XG4gICAgICAgIHRoaXMucGFuZWxzW3BhbmVsXSA9IGNvbXBvbmVudFxuICAgIH1cblxuICAgIGdldENvbXBvbmVudChwYW5lbCwgc2lkZWJhcil7XG4gICAgICAgIHJldHVybiB0aGlzLnBhbmVsc1twYW5lbF0oc2lkZWJhcilcbiAgICB9XG5cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgdGV4dDogXCJCZXR0ZXJEaXNjb3JkIFNldHRpbmdzXCIsIFxuICAgICAgICAgICAgaWQ6IFwiY29yZVwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLCBcbiAgICAgICAgICAgIGlkOiBcInBsdWdpbnNcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB0ZXh0OiBcIlRoZW1lc1wiLCBcbiAgICAgICAgICAgIGlkOiBcInRoZW1lc1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRleHQ6IFwiQ3VzdG9tIENTU1wiLCBcbiAgICAgICAgICAgIGlkOiBcImN1c3RvbWNzc1wiXG4gICAgICAgIH1dO1xuICAgIH1cblxuICAgIGdldCBMQ2l0ZW1zKCl7XG4gICAgICAgIGxldCBpdGVtcyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkxpZ2h0Y29yZCBTZXR0aW5nc1wiLFxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJSaWNoUHJlc2VuY2VcIiwgXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkFjY291bnQgSW5mb1wiLFxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBnZXQgTENEZXZJdGVtcygpe1xuICAgICAgICBsZXQgaXRlbXMgPSBbXVxuICAgICAgICBpZighd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlKXJldHVybiBpdGVtc1xuICAgICAgICBpdGVtcy5wdXNoKC4uLltcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZCBBcGlcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkNvbXBvbmVudHMgUHJldmlld1wiLFxuICAgICAgICAgICAgICAgIGlkOiBcImxjYXBpcHJldmlld1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIF0pXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHJlbmRlcihzaWRlYmFyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJMaWdodGNvcmRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnRoaXMuTENpdGVtcy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5nZXRDb21wb25lbnQoZS5pZCwgc2lkZWJhcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLnRoaXMuTENEZXZJdGVtcy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoZS5zZWN0aW9uKXJldHVybiBlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5nZXRDb21wb25lbnQoZS5pZCwgc2lkZWJhcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkNVU1RPTVwiLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KFwiQkRDaGFuZ2Vsb2dUaXRsZVwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnRoaXMuaXRlbXMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH1cbn1cblxuLyoqXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsU2lkZWJhciBvbiB3aW5kb3dcbiAqLyIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuaW1wb3J0IGJkRXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XG5cbmNsYXNzIFRoZW1lTW9kdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVGhlbWVNb2R1bGUgPSB0aGlzXG4gICAgfVxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XG59XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubG9hZFRoZW1lRGF0YSgpO1xuICAgIGJkdGhlbWVFcnJvcnMuc3BsaWNlKDAsIDAsIC4uLihhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkVGhlbWVzKCkpKTtcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoZW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XG4gICAgICAgIGlmICghdGhlbWVDb29raWVbdGhlbWUubmFtZV0pIHRoZW1lQ29va2llW3RoZW1lLm5hbWVdID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcbiAgICB9XG4gICAgZm9yIChjb25zdCB0aGVtZSBpbiB0aGVtZUNvb2tpZSkge1xuICAgICAgICBpZiAoIWJkdGhlbWVzW3RoZW1lXSkgZGVsZXRlIHRoZW1lQ29va2llW3RoZW1lXTtcbiAgICB9XG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSB0cnVlO1xuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xuICAgIGJkRXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtZW5hYmxlZFwiKVxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gYXBwbGllZC5gKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5lbmFibGVUaGVtZShuYW1lLCByZWxvYWQpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcbiAgICBiZEV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWRpc2FibGVkXCIpXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBkaXNhYmxlZC5gKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lKTtcbiAgICBlbHNlIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlVGhlbWUobmFtZSk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInRoZW1lXCIpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIEl0IG1heSBub3QgaGF2ZSBiZWVuIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpO1xuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWxvYWRlZFwiLCB0aGVtZS5uYW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS51bmxvYWRUaGVtZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpO1xuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XG4gICAgZGVsZXRlIGJkdGhlbWVzW3RoZW1lXTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XG4gICAgfVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuO1xuICAgIHRoaXMudW5sb2FkVGhlbWUoYmR0aGVtZS5maWxlbmFtZSk7XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmR0aGVtZS5maWxlbmFtZSk7XG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybiB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSksIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUsIHRydWUpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcbiAgICB9XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1yZWxvYWRlZFwiLCB0aGVtZSk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJlbG9hZFRoZW1lKG5hbWUpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuRXh0ZXJuYWwoYCR7ZnVsbFBhdGh9YCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInRoZW1lc1wiLCB0aGVtZUNvb2tpZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgVGhlbWVNb2R1bGUoKTsiLCJpbXBvcnQge2JiZFZlcnNpb259IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cbiAgICBzdGF0aWMgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfVxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgaGVpZ2h0ICovXG4gICAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cblxuICAgIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd0NvbmZpZ0ZpbGUgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXRXaW5kb3dQcmVmZXJlbmNlKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBzZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdHJpcEJPTShjb250ZW50KSB7XG4gICAgICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xuICAgICAgICByZXR1cm4gRE9NLnF1ZXJ5KFwiLlwiK3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoYW5uZWxUZXh0QXJlYSAmJiBlLnRpdGxlV3JhcHBlcilbMF0uY2hhbm5lbFRleHRBcmVhKStcIiB0ZXh0YXJlYVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xuICAgICAgICB0ZXh0YXJlYS5mb2N1cygpO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCB0ZXh0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGxvZyhtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgd2Fybihtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogI0U4QTQwMDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogI0U4QTQwMDtcIiwgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGVycihtb2R1bGVOYW1lLCBtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogcmVkOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiByZWQ7XCIsIFwiXCIpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCIlY0Vycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UsIFwiY29sb3I6IHJlZDtcIik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBzdHJpbmdzIHdpdGggcGxhY2Vob2xkZXJzIChge3twbGFjZWhvbGRlcn19YCkgaW50byBmdWxsIHN0cmluZ3MuXG4gICAgICogUXVpY2sgZXhhbXBsZTogYFBsdWdpblV0aWxpdGllcy5mb3JtYXRTdHJpbmcoXCJIZWxsbywge3t1c2VyfX1cIiwge3VzZXI6IFwiWmVyZWJvc1wifSlgXG4gICAgICogd291bGQgcmV0dXJuIFwiSGVsbG8sIFplcmVib3NcIi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gc3RyaW5nIHRvIGZvcm1hdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgLSBvYmplY3QgbGl0ZXJhbCBvZiBwbGFjZWhvbGRlcnMgdG8gcmVwbGFjZW1lbnRzXG4gICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9ybWF0U3RyaW5nKHN0cmluZywgdmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIGluIHZhbHVlcykge1xuICAgICAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdmFsdWVzW3ZhbF07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlbWVudCkpIHJlcGxhY2VtZW50ID0gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihyZXBsYWNlbWVudCkgPT09IFwib2JqZWN0XCIgJiYgcmVwbGFjZW1lbnQgIT09IG51bGwpIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7JHt2YWx9fX1gLCBcImdcIiksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHN0YXRpYyBlc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZihvYmopICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4ge1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgdGhpcy5lcnIoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIG1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcihtZXRob2ROYW1lLCBcImRvZXMgbm90IGV4aXN0IGZvclwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xuICAgICAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIC8vd2hhdFttZXRob2ROYW1lXSA9IG9yaWdNZXRob2Q7XG4gICAgICAgICAgICBjYW5jZWxlZCA9IHRydWUgLy8gdGhpcyBhbGxvdyB0byBtb25rZXlwYXRjaCBtb3JlIHRoYW4gb25lIHRpbWUuXG4gICAgICAgIH07XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmKGNhbmNlbGVkKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ01ldGhvZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBtZXRob2RBcmd1bWVudHM6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxuICAgICAgICAgICAgICAgIGNhbGxPcmlnaW5hbE1ldGhvZDogKCkgPT4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEub3JpZ2luYWxNZXRob2QuYXBwbHkoZGF0YS50aGlzT2JqZWN0LCBkYXRhLm1ldGhvZEFyZ3VtZW50cylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBSZXQgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhpbnN0ZWFkLCBcImBpbnN0ZWFkYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGFmdGVyLCBcImBhZnRlcmAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuYXNzaWduKHdoYXRbbWV0aG9kTmFtZV0sIG9yaWdNZXRob2QpO1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7cmV0dXJuIG9yaWdNZXRob2QudG9TdHJpbmcoKTt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbXV0YXRpb25zLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbbV07XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xuICAgICAgICAgICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoL1xccz9cXC5cXHM/LykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XG4gICAgICAgIH0sIG9iaik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBzaG93cyBhIHRvYXN0IHNpbWlsYXIgdG8gYW5kcm9pZCB0b3dhcmRzIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IFRoZSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9hc3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuIE9wdGlvbmFsIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIENoYW5nZXMgdGhlIHR5cGUgb2YgdGhlIHRvYXN0IHN0eWxpc3RpY2FsbHkgYW5kIHNlbWFudGljYWxseS4gQ2hvaWNlczogXCJcIiwgXCJpbmZvXCIsIFwic3VjY2Vzc1wiLCBcImRhbmdlclwiL1wiZXJyb3JcIiwgXCJ3YXJuaW5nXCIvXCJ3YXJuXCIuIERlZmF1bHQ6IFwiXCJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuaWNvbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIHNob3cgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZS4gQSB0b2FzdCB3aXRob3V0IHR5cGUgd2lsbCBhbHdheXMgaGF2ZSBubyBpY29uLiBEZWZhdWx0OiB0cnVlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGltZW91dCBBZGp1c3RzIHRoZSB0aW1lIChpbiBtcykgdGhlIHRvYXN0IHNob3VsZCBiZSBzaG93biBmb3IgYmVmb3JlIGRpc2FwcGVhcmluZyBhdXRvbWF0aWNhbGx5LiBEZWZhdWx0OiAzMDAwXG4gICAgICovXG4gICAgc3RhdGljIHNob3dUb2FzdChjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKSkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIityZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyICYmIGUuaGFzTm90aWNlKVswXS5zaWRlYmFyKStcIiArIGRpdlwiKSB8fCBudWxsO1xuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiZm9ybVwiKSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcbiAgICAgICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0c1wiKTtcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImJvdHRvbVwiLCBib3R0b20rXCJweFwiKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIilcbiAgICAgICAgY29uc3Qge3R5cGUgPSBcIlwiLCBpY29uID0gdHJ1ZSwgdGltZW91dCA9IDMwMDB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdFwiKTtcbiAgICAgICAgaWYgKHR5cGUpIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwidG9hc3QtXCIgKyB0eXBlKTtcbiAgICAgICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xuICAgICAgICB0b2FzdEVsZW0uaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgdG9hc3RXcmFwcGVyLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XG4gICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgYGNhbGMoNTAlIC0gJHt0b2FzdFdyYXBwZXIub2Zmc2V0V2lkdGggLyAyfXB4KWApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRvYXN0RWxlbS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFsZXJ0KHRpdGxlLCBjb250ZW50KSB7XG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPiR7dGl0bGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcbiAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcbiAgICAgICAgY29uc3QgY2xvc2luZ0xpc3RlbmVycyA9IFtdXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2xvc2U6IChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogcGx1Z2luRXJyb3JzID0gW10sIHRoZW1lczogdGhlbWVFcnJvcnMgPSBbXX0pIHtcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMgfHwgIXRoZW1lRXJyb3JzKSByZXR1cm47XG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzLmxlbmd0aCAmJiAhdGhlbWVFcnJvcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCBiZC1jb250ZW50LW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWlubmVyICR7bW9kYWxNb2R1bGUuaW5uZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPjxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRlbnQgRXJyb3JzPC9kaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhciBUT1BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlBsdWdpbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlRoZW1lczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPk5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+TWVzc2FnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+RXJyb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgXG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFiKGVycm9ycykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvcnNcIj5gKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPiR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPiR7ZXJyLm1lc3NhZ2V9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPjxhIGNsYXNzPVwiZXJyb3ItbGlua1wiIGhyZWY9XCJcIj4ke2Vyci5lcnJvciA/IGVyci5lcnJvci5tZXNzYWdlIDogXCJcIn08L2E+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucXVlcnlTZWxlY3RvckFsbChcImFcIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGBFcnJvciBkZXRhaWxzIGZvciAke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX0uYCwgZXJyLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgdGFicyA9IFtnZW5lcmF0ZVRhYihwbHVnaW5FcnJvcnMpLCBnZW5lcmF0ZVRhYih0aGVtZUVycm9ycyldO1xuICAgIFxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYi1iYXItaXRlbVwiKS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbS5zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkgRE9NLnJlbW92ZUNsYXNzKHNlbGVjdGVkLCBcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKGUudGFyZ2V0LCBcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnNjcm9sbGVyXCIpO1xuICAgICAgICAgICAgc2Nyb2xsZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZCh0YWJzW0RPTS5pbmRleChlLnRhcmdldCldKTtcbiAgICAgICAgfSkpO1xuICAgIFxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XG4gICAgICAgIGlmIChwbHVnaW5FcnJvcnMubGVuZ3RoKSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbVwiKS5jbGljaygpO1xuICAgICAgICBlbHNlIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpWzFdLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XG4gICAgICAgIGNvbnN0IENoYW5nZWxvZ0NsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImZpeGVkXCIsIFwiaW1wcm92ZWRcIik7XG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xuICAgICAgICBjb25zdCBGbGV4Q2hpbGQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIkNoaWxkXCIpO1xuICAgICAgICBjb25zdCBUaXRsZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIlRhZ3NcIiwgXCJkZWZhdWx0XCIpO1xuICAgICAgICBjb25zdCBDaGFuZ2Vsb2cgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuc2VsZWN0YWJsZSA9PSBmYWxzZSk7XG4gICAgICAgIGNvbnN0IE1hcmtkb3duUGFyc2VyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJkZWZhdWx0UnVsZXNcIiwgXCJwYXJzZVwiKTtcbiAgICAgICAgaWYgKCFDaGFuZ2Vsb2cgfHwgIU1vZGFsU3RhY2sgfHwgIUNoYW5nZWxvZ0NsYXNzZXMgfHwgIVRleHRFbGVtZW50IHx8ICFGbGV4Q2hpbGQgfHwgIVRpdGxlcyB8fCAhTWFya2Rvd25QYXJzZXIpIHJldHVybjtcbiAgICBcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaW1hZ2UgPSBcImh0dHBzOi8vcmVwb3NpdG9yeS1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzEwNTQ3MzUzNy85NTdiNTQ4MC03YzI2LTExZTktODQwMS01MGZhODIwY2JhZTVcIiwgXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCIsIFxuICAgICAgICAgICAgY2hhbmdlcyA9IFtdLCBcbiAgICAgICAgICAgIHRpdGxlID0gXCJCYW5kYWdlZEJEXCIsIFxuICAgICAgICAgICAgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLCBcbiAgICAgICAgICAgIGZvb3RlclxuICAgICAgICB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgY2UgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0l0ZW1zID0gW2NlKFwiaW1nXCIsIHtzcmM6IGltYWdlfSldO1xuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJwXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGRlc2NyaXB0aW9uKSkpO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5nZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY2hhbmdlc1tjXTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdID8gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA6IENoYW5nZWxvZ0NsYXNzZXMuYWRkZWQ7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW4gPSBjID09IDAgPyBDaGFuZ2Vsb2dDbGFzc2VzLm1hcmdpblRvcCA6IFwiXCI7XG4gICAgICAgICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwiaDFcIiwge2NsYXNzTmFtZTogYCR7dHlwZX0gJHttYXJnaW59YCx9LCBlbnRyeS50aXRsZSkpO1xuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGNlKFwidWxcIiwgbnVsbCwgZW50cnkuaXRlbXMubWFwKGkgPT4gY2UoXCJsaVwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShpKSkpKTtcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2gobGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVuZGVySGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSxcbiAgICAgICAgICAgICAgICBjZShUaXRsZXMuZGVmYXVsdCwge3RhZzogVGl0bGVzLlRhZ3MuSDR9LCB0aXRsZSksXG4gICAgICAgICAgICAgICAgY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJELCBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuZGF0ZX0sIHN1YnRpdGxlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICBcbiAgICAgICAgY29uc3QgcmVuZGVyRm9vdGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gICAgICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xuICAgICAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcbiAgICAgICAgICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgQkRWMi5qb2luQkQyKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBjZShBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogY2UoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZvb3RlciA9IGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sIGZvb3RlciA/IGZvb3RlciA6IGRlZmF1bHRGb290ZXIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjZShDaGFuZ2Vsb2csIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogQ2hhbmdlbG9nQ2xhc3Nlcy5jb250YWluZXIsXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvblNjcm9sbDogXyA9PiBfLFxuICAgICAgICAgICAgICAgIG9uQ2xvc2U6IF8gPT4gXyxcbiAgICAgICAgICAgICAgICByZW5kZXJIZWFkZXI6IHJlbmRlckhlYWRlcixcbiAgICAgICAgICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hhbmdlbG9nSXRlbXNcbiAgICAgICAgICAgIH0sIHByb3BzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgTW9kYWxBY3Rpb25zID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJvcGVuTW9kYWxcIiwgXCJ1cGRhdGVNb2RhbFwiKTtcbiAgICAgICAgY29uc3QgTWFya2Rvd24gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1hcmtkb3duXCIpO1xuICAgICAgICBjb25zdCBDb25maXJtYXRpb25Nb2RhbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiQ29uZmlybU1vZGFsXCIpO1xuICAgICAgICBpZiAoIU1vZGFsQWN0aW9ucyB8fCAhQ29uZmlybWF0aW9uTW9kYWwgfHwgIU1hcmtkb3duKSByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xuXG4gICAgICAgIGNvbnN0IGVtcHR5RnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgICAgICAgY29uc3Qge29uQ29uZmlybSA9IGVtcHR5RnVuY3Rpb24sIG9uQ2FuY2VsID0gZW1wdHlGdW5jdGlvbiwgY29uZmlybVRleHQgPSBcIk9rYXlcIiwgY2FuY2VsVGV4dCA9IFwiQ2FuY2VsXCIsIGRhbmdlciA9IGZhbHNlLCBrZXkgPSB1bmRlZmluZWR9ID0gb3B0aW9ucztcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIGNvbnRlbnQgPSBbY29udGVudF07XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50Lm1hcChjID0+IHR5cGVvZihjKSA9PT0gXCJzdHJpbmdcIiA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZG93biwgbnVsbCwgYykgOiBjKTtcbiAgICAgICAgcmV0dXJuIE1vZGFsQWN0aW9ucy5vcGVuTW9kYWwocHJvcHMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChDb25maXJtYXRpb25Nb2RhbCwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0aXRsZSxcbiAgICAgICAgICAgICAgICByZWQ6IGRhbmdlcixcbiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogY29uZmlybVRleHQsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogb25DYW5jZWxcbiAgICAgICAgICAgIH0sIHByb3BzKSwgY29udGVudCk7XG4gICAgICAgIH0sIHttb2RhbEtleToga2V5fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCByZW1vdmVEYSgpe1xuICAgICAgICByZXR1cm4gcmVtb3ZlRGFcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZURhKGNsYXNzTmFtZSl7XG4gICAgaWYoIWNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXG4gICAgcmV0dXJuIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuZmlsdGVyKGUgPT4gIWUuc3RhcnRzV2l0aChcImRhLVwiKSkuam9pbihcIiBcIilcbn1cblxuVXRpbHMuc2hvd1RvYXN0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoVXRpbHMuc2hvd1RvYXN0LCBcIkNvdWxkIG5vdCBzaG93IHRvYXN0LlwiKTtcblxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlV0aWxzID0gVXRpbHMiLCJpbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5XZWJwYWNrTW9kdWxlcyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xuICAgICAgICAgICAgZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcbiAgICAgICAgICAgIGRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XG5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLmdldFRva2VuIHx8IHRoZU1vZHVsZS5nZXRFbWFpbCB8fCB0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBwcm90ZWN0ID0gKHRoZU1vZHVsZSwgaXNEZWZhdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vZCA9ICFpc0RlZmF1bHQgPyB0aGVNb2R1bGUuZGVmYXVsdCA6IHRoZU1vZHVsZVxuICAgICAgICAgICAgICAgIGlmKCFtb2QpcmV0dXJuIHRoZU1vZHVsZVxuICAgICAgICAgICAgICAgIGlmIChtb2QucmVtb3ZlICYmIG1vZC5zZXQgJiYgbW9kLmNsZWFyICYmIG1vZC5nZXQgJiYgIW1vZC5zb3J0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZC5nZXRUb2tlbiAmJiAhbW9kLmdldEVtYWlsICYmICFtb2Quc2hvd1Rva2VuKXJldHVybiB0aGVNb2R1bGVcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG1vZCwge1xuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiZ2V0VG9rZW5cIiB8fCBwcm9wID09PSBcImdldEVtYWlsXCIgfHwgcHJvcCA9PT0gXCJzaG93VG9rZW5cIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBmdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldFRva2VuXCIgJiYgb2JqLmdldFRva2VuKSByZXR1cm4gKCkgPT4gXCJtZmEuWENuYkt6bzBDTElxZEp6Qm5MMEQ4UGZEcnVxa0pOSGp3SFh0cjM5VVUzRjhoSHg0M2pvaklTeWk1amRqTzUyZTlfZTlNam1hZlpGRnBjLXNlT01hXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldEVtYWlsXCIgJiYgb2JqLmdldEVtYWlsKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwic2hvd1Rva2VuXCIgJiYgb2JqLnNob3dUb2tlbikgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcIl9fcHJvdG9fX1wiICYmIG9iai5fX3Byb3RvX18pIHJldHVybiBwcm94eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialtmdW5jXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYoIWlzRGVmYXVsdCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGVNb2R1bGUsIHtkZWZhdWx0OiBwcm94eX0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gcHJvdGVjdChtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobS5kZWZhdWx0LCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xuICAgICAgICAgICAgY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9IChwcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XG4gICAgICAgICAgICBjb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7ZmluZCwgZmluZEFsbCwgZmluZEJ5VW5pcXVlUHJvcGVydGllcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9O1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHRoaXMuaW50ZXJuYWwgPSB7XG4gICAgICAgICAgICByZWFjdDogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIkNvbXBvbmVudFwiLCBcIlB1cmVDb21wb25lbnRcIiwgXCJDaGlsZHJlblwiLCBcImNyZWF0ZUVsZW1lbnRcIiwgXCJjbG9uZUVsZW1lbnRcIl0pLFxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRJbnRlcm5hbEluc3RhbmNlID0gZSA9PiBlW09iamVjdC5rZXlzKGUpLmZpbmQoayA9PiBrLnN0YXJ0c1dpdGgoXCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZVwiKSldO1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjIgPSB0aGlzXG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZSgpIHtcblxuICAgIH1cblxuICAgIGpvaW5CRDEoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIwVG1mbzVaYk9SQ1JxYkFkXCIpO31cbiAgICBsZWF2ZUJEMSgpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiODYwMDQ3NDQ5NjY5MTQwNDhcIik7fVxuXG4gICAgam9pbkJEMigpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjJIU2NtOGpcIik7fVxuICAgIGxlYXZlQkQyKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCIyODA4MDY0NzI5MjgxOTg2NTZcIik7fVxuXG4gICAgam9pbkxDKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiN2VGZmYyQVwiKTt9XG4gICAgbGVhdmVMQygpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiNzA1OTA4MzUwMjE4NjY2MTE3XCIpO31cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3R9XG4gICAgICovXG4gICAgZ2V0IHJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxuICAgICAqL1xuICAgIGdldCBSZWFjdCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdDt9XG4gICAgLyoqXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XG4gICAgICovXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cbiAgICAgKi9cbiAgICBnZXQgUmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxuICAgICAqL1xuICAgIGdldCByZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxuICAgICAqL1xuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxuXG4gICAgZ2V0IGFuY2hvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCJdKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTt9XG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cbiAgICBnZXQgbWVzc2FnZUNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJtZXNzYWdlXCIsIFwiY29udGFpbmVyQ296eVwiXSk7fVxuICAgIGdldCBndWlsZENsYXNzZXMoKSB7XG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmd1aWxkc0Vycm9yICYmIGUuc2VsZWN0ZWQpWzBdXG4gICAgICAgIGNvbnN0IHBpbGwgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ibG9iQ29udGFpbmVyKVswXVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcblx0fVxuXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XG4gICAgZ2V0IE1lc3NhZ2VDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTWVzc2FnZVwiKTt9XG4gICAgZ2V0IFRpbWVGb3JtYXR0ZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJkYXRlRm9ybWF0XCJdKTt9XG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XG4gICAgZ2V0IE5hdGl2ZU1vZHVsZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNldEJhZGdlXCJdKTt9XG4gICAgZ2V0IEludml0ZUFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO31cbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxuICAgIGdldCBUb29sdGlwcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5oaWRlICYmIG0uc2hvdyAmJiAhbS5zZWFyY2ggJiYgIW0uc3VibWl0ICYmICFtLnNlYXJjaCAmJiAhbS5hY3RpdmF0ZVJhZ2luZ0RlbW9uICYmICFtLmRpc21pc3MpO31cbiAgICBnZXQgS2V5R2VuZXJhdG9yKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLnRvU3RyaW5nICYmIC9cImJpbmFyeVwiLy50ZXN0KG0udG9TdHJpbmcoKSkpO31cbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XG4gICAgZ2V0IFVzZXJTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEN1cnJlbnRVc2VyXCJdKTt9XG4gICAgZ2V0IENoYW5uZWxTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldENoYW5uZWxcIl0pO31cbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cbiAgICBnZXQgUHJpdmF0ZUNoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2VsZWN0UHJpdmF0ZUNoYW5uZWxcIl0pO31cblxuICAgIG9wZW5ETSh1c2VySWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZklkID0gdGhpcy5Vc2VyU3RvcmUuZ2V0Q3VycmVudFVzZXIoKS5pZDtcbiAgICAgICAgaWYgKHNlbGZJZCA9PSB1c2VySWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xuICAgICAgICBpZiAocHJpdmF0ZUNoYW5uZWxJZCkgcmV0dXJuIHRoaXMuUHJpdmF0ZUNoYW5uZWxBY3Rpb25zLnNlbGVjdFByaXZhdGVDaGFubmVsKHByaXZhdGVDaGFubmVsSWQpO1xuICAgICAgICB0aGlzLkNoYW5uZWxBY3Rpb25zLm9wZW5Qcml2YXRlQ2hhbm5lbChzZWxmSWQsIHVzZXJJZCk7XG4gICAgfVxuXG4gICAgcGFyc2VTZXR0aW5ncyhjYXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xuICAgICAgICAgICAgfSByZXR1cm4gYXJyO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IHN0eWxlID0gYFxyXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGF0LTNiUnh4dSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNpZGViYXItMks4cEZoIHtcclxuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFZvaWNlTW9kZSB7XHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiVm9pY2VNb2RlXCIpO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbmRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbmRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBtLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKC4uLnByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxubGV0IG1vZCA9ICB7ZmluZCwgZmluZEFsbCwgZmluZEJ5UHJvcHMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuZXhwb3J0IGRlZmF1bHQgbW9kXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuV2VicGFja01vZHVsZXMgPSBtb2QiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRMb2dvIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNjggMTY4LjY5XCIgey4uLnByb3BzfSBoZWlnaHQ9XCIxMDAlXCIgd2lkdGg9e3Byb3BzLnNpemV9PlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19hXCIgeDE9ezY2Ljd9IHkxPXstNDg3Ljd9IHgyPXs2Ni43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19iXCIgeDE9ezEwMS43fSB5MT17LTQ4Ny43fSB4Mj17MTAxLjd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNC45IDM1LjNoMTM5LjJWMTMzSDE0Ljl6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMS43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2IpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwdjE2OGwxNjggLjY5VjB6bTExMS4zIDEyNC4xcy0zLjQtNC4xLTYuMy03LjdjMTIuNi0zLjUgMTcuNC0xMS4zIDE3LjQtMTEuM2E1Mi41MiA1Mi41MiAwIDAxLTExLjEgNS42IDY4LjYzIDY4LjYzIDAgMDEtMzguOSA0IDcwLjEyIDcwLjEyIDAgMDEtMTQuMS00LjEgNDguODggNDguODggMCAwMS03LjEtMy4zYy0uMy0uMi0uNi0uMy0uOS0uNWEuNzYuNzYgMCAwMC0uNC0uMmMtMS43LTEtMi42LTEuNi0yLjYtMS42czQuNiA3LjYgMTYuOCAxMS4yYy0yLjkgMy42LTYuNCA3LjktNi40IDcuOS0yMS4yLS42LTI5LjMtMTQuNS0yOS4zLTE0LjUgMC0zMC42IDEzLjgtNTUuNCAxMy44LTU1LjQgMTMuOC0xMC4zIDI2LjktMTAgMjYuOS0xMGwxIDEuMUM1Mi44IDUwLjMgNDUgNTcuOSA0NSA1Ny45YTU2LjIgNTYuMiAwIDAxNS43LTIuNyA3Mi4xOSA3Mi4xOSAwIDAxMjEuOC02IDguNzUgOC43NSAwIDAxMS42LS4yIDg5LjEgODkuMSAwIDAxMTkuNC0uMiA3OC40NSA3OC40NSAwIDAxMjguOSA5LjFzLTcuNS03LjItMjMuOS0xMi4xbDEuMy0xLjVzMTMuMS0uMyAyNi45IDEwYzAgMCAxMy44IDI0LjggMTMuOCA1NS40LjEtLjEtOCAxMy44LTI5LjIgMTQuNHpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2MpXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuMSAxMi4zYy0yLjUgMy4yLTYuMSA0LjgtOC45IDQuM0wzLjYgMjguOGMtLjcuOS0xLjkgMS0yLjguMy0uOS0uNy0xLTEuOS0uNC0yLjhMMTAgMTQuMWMtMS4zLTIuNS0uNi02LjQgMi05LjcgMy4yLTQgOC01LjUgMTAuOC0zLjRzMi40IDcuMi0uNyAxMS4zelwiIGZpbGw9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmN1cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICByZXR1cm4gKDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiAgey4uLnRoaXMucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjREQyRTQ0XCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMzIDMzYTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMmwxLTEyaDI4bDEgMTJ6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRUE1OTZFXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTEzIDM1Yy0uNzkyLTEuODc1LTEuNzUtMy4yOTEtMy40MTctNC42NjYgMS43NS0xLjQ1OSA0LjU0Mi01LjUgNS4yNS04LjI5MnMyLjc1IDguMTI1IDIuMDQyIDEwLjYyNVMxMyAzNSAxMyAzNXptMTAuMzAzIDBjLjc5MS0xLjg3NSAxLjc1LTMuMjkxIDMuNDE2LTQuNjY2LTEuNzUtMS40NTktNC41NDEtNS41LTUuMjUtOC4yOTItLjcwNy0yLjc5Mi0yLjc1IDguMTI1LTIuMDQgMTAuNjI1LjcwOCAyLjUgMy44NzQgMi4zMzMgMy44NzQgMi4zMzN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjQkUxOTMxXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzI4IDI0LjI2M0EyLjUgMi41IDAgMDA4IDIyLjVjMC0uNTY1LS4xOTUtMS4wODEtLjUxMS0xLjVINGwtLjI3MiAzLjI2M3ptMjguNTQ0IDBMMzIgMjFoLTMuNDg5QTIuNDgyIDIuNDgyIDAgMDAyOCAyMi41YTIuNSAyLjUgMCAwMDQuMjcyIDEuNzYzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjE0XCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI2XCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjMgMzVIMTNzMi02IDItMTNoNmMwIDcgMiAxMyAyIDEzek0xNyAyaDJ2N2gtMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTVBQ0VFXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4LjgzOC4yMDZDMTcuNjY3LjA0MiAxNyAuMzE4IDE3IDEuNDE4djFjMCAxLjEuODY1IDEuNzUzIDEuOTIzIDEuNDUxbDUuMTU0LS45MDFjMS43MTUtLjM0MyAxLjU0OC0xLjU5My4wODUtMS44ODRMMTguODM4LjIwNnpcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNDQ0Q2RERcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTggNmwtLjA4MS4xMjNDMTAuOTM4IDE2Ljk4MSAzIDE1LjAxNSAzIDE5djIuNWEyLjUgMi41IDAgMDA0Ljk1LjVIMTJhMiAyIDAgMDA0IDBoNGEyIDIgMCAwMDQgMGg0LjA1YTIuNSAyLjUgMCAwMDQuOTUtLjVWMTljMC00LTgtMi0xNS0xM3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxnIGZpbGw9XCIjRjVGOEZBXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy45NDggNi4wNzhsLS4wMy4wNDVDMTcuMTMyIDExLjYxOSAxMC44MTEgMTYuMTI2IDggMTh2NGEyIDIgMCAwMDQgMHYtNGMuOTgyLS45ODIgNS44MTMtNi43ODcgNS45ODQtMTEuNzMyLS4wMS0uMDY0LS4wMjctLjEyNi0uMDM2LS4xOXptLjA4LjM5OEMxOC4zMjQgMTEuMzc0IDIzLjAzMSAxNy4wMzEgMjQgMTh2NGEyIDIgMCAwMDQgMHYtNGMtMi43NS0xLjgzMy04Ljk1My02LjE5LTkuOTcyLTExLjUyNHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy45ODQgNi4yN0MxNy45MjIgOC4zNDYgMTcuNjA2IDE2LjM5NCAxNiAxOHY0YTIgMiAwIDAwNCAwdi00Yy0xLjU2NC0xLjU2NC0xLjkwNS05LjI0MS0xLjk3OS0xMS41NTktLjAxMS0uMDU3LS4wMjctLjExMy0uMDM3LS4xNzF6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XG5cbi8qKlxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKX1cbiAqL1xuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5sZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cbmxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXG5sZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cbmxldCBzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cbmNvbnN0IEd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzKVswXS5kZWZhdWx0XG5jb25zdCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRSZWxhdGlvbnNoaXBzKVswXS5kZWZhdWx0XG5jb25zdCBzZXNzaW9uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0U2Vzc2lvbnMpWzBdLmRlZmF1bHRcbmNvbnN0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQWNjb3VudEluZm9zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZighbWFyZ2luTW9kdWxlMiltYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxuICAgICAgICBpZighY29sb3JNb2R1bGUpY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxuICAgICAgICBpZighc2l6ZU1vZHVsZSlzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJBY2NvdW50IEluZm9zXCIvPixcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cbiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVxuICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0UHJvZmlsZVZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cbiAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljc1xuICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U3RhdGlzdGljcygpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3RlZCBTZXNzaW9uc1xuICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U2Vzc2lvblZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj5cbiAgICAgICAgXVxuICAgIH1cblxuICAgIGdldFNlc3Npb25WYWx1ZSgpe1xuICAgICAgICBjb25zdCBzZXNzaW9uc1JhdyA9IHNlc3Npb25Nb2R1bGUuZ2V0U2Vzc2lvbnMoKVxuICAgICAgICBjb25zdCBzZXNzaW9ucyA9IE9iamVjdC5rZXlzKHNlc3Npb25zUmF3KS5maWx0ZXIoZSA9PiBlICE9PSBcImFsbFwiKS5tYXAoZSA9PiBzZXNzaW9uc1Jhd1tlXSlcblxuICAgICAgICBpZihzZXNzaW9ucy5sZW5ndGggPT09IDApcmV0dXJuIFwiLSBObyBzZXNzaW9uIGRldGVjdGVkLiBQbGVhc2UgdHJ5IGluIGEgZmV3IHNlY29uZHNcIlxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlc3Npb25zLm1hcChlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgKyBpZDogJHtlLnNlc3Npb25JZH1cbisgb3M6ICR7ZS5jbGllbnRJbmZvLm9zWzBdLnRvVXBwZXJDYXNlKCkrZS5jbGllbnRJbmZvLm9zLnNsaWNlKDEpfVxuKyBjbGllbnQ6ICR7ZS5jbGllbnRJbmZvLmNsaWVudH1cbisgc3RhdHVzOiAke2Uuc3RhdHVzfVxuKyBBY3Rpdml0aWVzOiAke2UuYWN0aXZpdGllcy5sZW5ndGh9YFxuICAgICAgICB9KS5qb2luKFwiXFxuXCIrXCItXCIucmVwZWF0KDM4KStcIlxcblwiKVxuICAgIH1cblxuICAgIGdldFByb2ZpbGVWYWx1ZSgpe1xuICAgICAgICBjb25zdCB1c2VyID0gdXNlck1vZHVsZS5nZXRDdXJyZW50VXNlcigpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7RGF0ZX1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHVzZXIuY3JlYXRlZEF0XG5cbiAgICAgICAgbGV0IGF2YXRhclVSTCA9IHVzZXIuYXZhdGFyVVJMXG4gICAgICAgIGlmKHVzZXIuYXZhdGFyICYmIHVzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSl7XG4gICAgICAgICAgICBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTChcImdpZlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoYXZhdGFyVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKXtcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IFwiaHR0cHM6Ly9kaXNjb3JkLmNvbVwiK2F2YXRhclVSTFxuICAgICAgICB9XG4gICAgICAgIGlmKGF2YXRhclVSTC5lbmRzV2l0aChcIj9zaXplPTEyOFwiKSl7XG4gICAgICAgICAgICBhdmF0YXJVUkwgPSBhdmF0YXJVUkwucmVwbGFjZShcIj9zaXplPTEyOFwiLCBcIj9zaXplPTQwOTZcIilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgKyBVc2VybmFtZTogJHt1c2VyLnVzZXJuYW1lfVxuKyBEaXNjcmltaW5hdG9yOiAke3VzZXIuZGlzY3JpbWluYXRvcn1cbisgVGFnOiAke3VzZXIudGFnfVxuKyBJRDogJHt1c2VyLmlkfVxuKyBBdmF0YXI6ICR7dXNlci5hdmF0YXJ9XG4rIEF2YXRhciBVUkw6ICR7YXZhdGFyVVJMfVxuKyBDcmVhdGlvbiBEYXRlOiAkeyhjcmVhdGVkQXQuZ2V0RGF0ZSgpKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldE1vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRGdWxsWWVhcigpKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtjcmVhdGVkQXQuZ2V0SG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1oICR7Y3JlYXRlZEF0LmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1taW4gJHtjcmVhdGVkQXQuZ2V0U2Vjb25kcygpfXNcbisgRmxhZ3M6ICR7dXNlci5mbGFnc31cbisgSGFzIE5pdHJvOiAke3VzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiA/IFwiWWVzXCIgOiBcIk5vXCJ9XG4tIEVtYWlsOiAke3VzZXIuZW1haWx9XG4tIDJGQTogJHt1c2VyLm1mYUVuYWJsZWQgPyBcIlllc1wiIDogXCJOb1wifVxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxuLSBQaG9uZTogJHt1c2VyLnBob25lIHx8IFwiTm9uZVwifVxuLSBWZXJpZmllZDogJHt1c2VyLnZlcmlmaWVkfVxuLSBDYW4gU2VlIE5TRlcgQ2hhbm5lbHM6ICR7dXNlci5uc2Z3QWxsb3dlZH1gO1xuICAgIH1cblxuICAgIGdldFN0YXRpc3RpY3MoKXtcblxuICAgICAgICBjb25zdCBndWlsZHMgPSBPYmplY3QudmFsdWVzKEd1aWxkTW9kdWxlLmdldEd1aWxkcygpKVxuICAgICAgICBjb25zdCByZWxhdGlvbnMgPSBPYmplY3Qua2V5cyhyZWxhdGlvblNoaXBNb2R1bGUuZ2V0UmVsYXRpb25zaGlwcygpKVxuICAgICAgICBjb25zdCBmcmllbmRzID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0ZyaWVuZChlKSlcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNCbG9ja2VkKGUpKVxuXG4gICAgICAgIHJldHVybiBgKyBTZXJ2ZXIgQ291bnQ6ICR7Z3VpbGRzLmxlbmd0aH0gc2VydmVyc1xuKyBSZWxhdGlvbnM6ICR7cmVsYXRpb25zLmxlbmd0aH0gcmVsYXRpb25zXG4rIEZyaWVuZHMgQ291bnQ6ICR7ZnJpZW5kcy5sZW5ndGh9IGZyaWVuZHNcbi0gQmxvY2tlZCBVc2VycyBDb3VudDogJHtibG9ja2VkLmxlbmd0aH0gYmxvY2tlZCB1c2Vyc2BcbiAgICB9XG59XG5cblxubGV0IGhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhpZ2hsaWdodClbMF1cbmxldCBtZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cbmxldCBtZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxuXG5jbGFzcyBDb2RlQ29udGVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMSltZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUyKW1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXG4gICAgICAgIGlmKCFzY3JvbGxiYXJNb2R1bGUxKXNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxuICAgICAgICBpZighaGlnaHRsaWdodEpTKWhpZ2h0bGlnaHRKUyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmxpc3RMYW5ndWFnZXMpWzBdXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7bWVzc2FnZU1vZHVsZTEubWFya3VwfSAke21lc3NhZ2VNb2R1bGUyLm1lc3NhZ2VDb250ZW50fWB9PlxuICAgICAgICAgICAgPHByZT5cbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxuXG4gICAgICAgICAgICAgICAgPC9jb2RlPlxuICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0+PC9kaXY+XG4gICAgICAgIDwvZGl2PilcbiAgICB9XG59IiwiLy8gR29vZCBsdWNrIHRvIHJlYWQgbXkgY29kZSwgRXZlbiBtZSBjYW4ndCByZWFkIGl0IHByb3Blcmx5LlxuXG5pbXBvcnQgeyBzdGF0IH0gZnJvbSBcImZzXCJcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuLi9tb2R1bGVzL2Rpc3RhbnRcIlxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiXG5cbmxldCBmb3JtTW9kdWxlXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlQcmV2aWV3IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc3RhdGVzOiBbXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGlmKCFmb3JtTW9kdWxlKWZvcm1Nb2R1bGUgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5Gb3JtU2VjdGlvbilcbiAgICAgICAgLyoqIFxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb25bXX1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGFsbENvbXBvbmVudHMgPSBbLi4ubmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKS5tYXAoZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXSkubWFwKGsgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtrXSlcbiAgICAgICAgfSkuZmxhdCgpKV1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9XCJMaWdodGNvcmQncyBBcGkgQXZhaWxsYWJsZSBjb21wb25lbnRzXCI+XG4gICAgICAgICAgICAgICAgPGZvcm1Nb2R1bGUuRm9ybVRleHQgdHlwZT1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwiXCIgc2VsZWN0YWJsZT17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICBUaGVzZSBjb21wb25lbnRzIGFyZSBoZXJlIGZvciB0aGUgcGx1Z2luIGRldnMuIFRoZXkgY2FuIHF1aWNrbHkgZW1iZWQgYW55IGNvbXBvbmVudCBiZWxvdyB3aXRoIHRoaXMgcGFuZWwuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5Ub3A6IFwiMjBweFwifX0+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiaW5mb1wiPkFsbCB0aGVzZSBjb21wb25lbnRzIGhhdmUgZXJyb3IgaGFuZGxpbmcuIElmIHlvdSB3YW50IG5vbmUsIGFkZCBgLm9yaWdpbmFsYCBhZnRlciB0aGUgY29tcG9uZW50IHBhdGguPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cbiAgICAgICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJ3YXJuXCI+V2UgZG8gbm90IHJlY29tbWVuZCBtb2RpZnlpbmcgdGhlc2UgY29tcG9uZW50IHdpdGggcGx1Z2lucy4gT25seSBkbyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy48L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PlxuICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD5cbiAgICAgICAgICAgICAgICA8TWFyZ2luVG9wPjwvTWFyZ2luVG9wPlxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cIm91dGxpbmVkXCIgc2l6ZT1cIm1lZGl1bVwiIGhvdmVyQ29sb3I9XCJncmVlblwiIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vbGlnaHRjb3JkLm9yZy9MaWdodGNvcmRBcGkvXCIpXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtU2VjdGlvbj4sXG4gICAgICAgICAgICBhbGxDb21wb25lbnRzLm1hcChjb21wID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wTmFtZSA9IGNvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcFBhdGggPSBgTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLiR7T2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKX0uJHtjb21wTmFtZX1gXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRQcmV2aWV3IGtleT17Y29tcFBhdGh9IGNvbXA9e2NvbXB9IC8+XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlcnMoKXtcblxuICAgIH1cbn1cblxuY2xhc3MgQ29tcG9uZW50UHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHRhYjogXCJwcmV2aWV3XCIsXG4gICAgICAgICAgICBlbGVtOiBwcm9wcy5jb21wLFxuICAgICAgICAgICAgb3B0aW9uczoge31cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wcm9wcy5jb21wXG4gICAgICAgIGxldCBBbGxQcmV2aWV3cyA9IFtdXG4gICAgICAgIGlmKGNvbXAuQWxsUHJldmlld3MpQWxsUHJldmlld3MgPSBjb21wLkFsbFByZXZpZXdzXG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcbiAgICAgICAgbGV0IGdldFByb3BzID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbmFsID0ge31cbiAgICAgICAgICAgIEFsbFByZXZpZXdzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmFsW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV0gPSBjYXRlZ29yeVswXVtPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1dXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUub3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmFsW2tleV0gPSBBbGxQcmV2aWV3cy5maW5kKGUgPT4gZS5maW5kKGUgPT4gZVtrZXldKSlbc3RhdGUub3B0aW9uc1trZXldXVtrZXldXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbmRlclByZXZpZXcgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxuICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIGxldCByZW5kZXJDb2RlID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICBKU1hcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkVycm9yQ2F0Y2hlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5Db2RlQmxvY2sgbGFuZ3VhZ2U9XCJqc3hcIiBjb250ZW50PXtnZW5lcmF0ZUNvZGUoXCJqc3hcIil9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdFxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcbiAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlICYmIHZhbHVlLiQkdHlwZW9mICYmICh2YWx1ZS4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgdmFsdWUuJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xuICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXG59fSxcblJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XG5iYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsXG5wYWRkaW5nOiBcIjMwcHggMzBweFwiLFxuYm9yZGVyUmFkaXVzOiBcIjhweFwiXG59LCBjbGFzc05hbWU6IFwibGMtdGFiLWJveC1zaGFkb3dcIiB9LFxuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZSwgbnVsbCwgXCJQcmV2aWV3IHRhYnNcIilcbilcbilgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcImpzeFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9e3tcbm1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcbn19PlxuPGRpdiBzdHlsZT17e1xuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXG4gICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXG4gICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG59fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxuICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZT5QcmV2aWV3IHRhYnM8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlxuPC9kaXY+XG48L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCBcIiAgICBcIilcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdlbmVyYXRlQ29kZSA9IGZ1bmN0aW9uKGxhbmcpeyAvLyBjb2RlIGZvcm1hdHRpbmcgaXMgaGFyZFxuICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxuICAgICAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKVxuICAgICAgICAgICAgY29uc3QgY29tcENhdGVnb3J5ID0gY2F0ZWdvcmllcy5maW5kKGUgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtjb21wTmFtZV0pXG4gICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBnZXRQcm9wcygpXG5cbiAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xuICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUHJvcCA9IG51bGxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjaGlsZHJlblwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcCA9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGtleStcIj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGB7JHtnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKX19YFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCBvcGVuVGFnXG4gICAgICAgICAgICAgICAgaWYoY2hpbGRyZW5Qcm9wKXtcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VUYWcgPSBgPC8ke2NvbXBQYXRofT5gXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtvcGVuVGFnfVxcbiAgICAke2NoaWxkcmVuUHJvcH1cXG4ke2Nsb3NlVGFnfWBcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0vPmBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5UYWdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcInJlYWN0XCIpe1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuIHx8IG51bGxcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBpZihjaGlsZHJlbiAmJiBjaGlsZHJlbi4kJHR5cGVvZiAmJiAoY2hpbGRyZW4uJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IGNoaWxkcmVuLiQkdHlwZW9mID09PSAweGVhYzcpKXtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRTdHJGb3JQcm9wKGNoaWxkcmVuLCBjb21wUGF0aCwgbGFuZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gdmlzaWJsZUtleStcIjogXCJcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpLnNwbGl0KFwiXFxuXCIpLm1hcCgoc3RyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiICAgIFwiICsgc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXG4gICAgICAgICAgICAgICAgaWYocHJvcFN0cmluZ3MubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MuZm9yRWFjaCgoc3RyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighaXNGaXJzdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIlxcbiAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTGFzdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPVwiXFxufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGF0YSA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiAmJiBjaGlsZHJlbi5zdGFydHNXaXRoKFwiUmVhY3QuY3JlYXRlRWxlbWVudFwiKSA/IGNoaWxkcmVuIDogSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XG4gICAgICAgIGxldCBpbmZvID0gaGVscC5pbmZvID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiaW5mb1wiPlxuICAgICAgICAgICAge2hlbHAuaW5mb31cbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxuICAgICAgICBsZXQgd2FybiA9IGhlbHAud2FybiA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cIndhcm5cIj5cbiAgICAgICAgICAgIHtoZWxwLndhcm59XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgbGV0IGRhbmdlciA9IGhlbHAuZGFuZ2VyID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICB7aGVscC5kYW5nZXJ9XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgbGV0IGVycm9yID0gaGVscC5lcnJvciA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImVycm9yXCI+XG4gICAgICAgICAgICB7aGVscC5lcnJvcn1cbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxuICAgICAgICBsZXQgc3VjY2VzcyA9IGhlbHAuc3VjY2VzcyA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cInN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIHtoZWxwLnN1Y2Nlc3N9XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgcmV0dXJuICg8ZGl2PlxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nc1RpdGxlPlxuICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cbiAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XG4gICAgICAgICAgICB7aW5mb31cbiAgICAgICAgICAgIHtzdWNjZXNzfVxuICAgICAgICAgICAge3dhcm59XG4gICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICB7ZGFuZ2VyfVxuICAgICAgICAgICAge0FsbFByZXZpZXdzLm1hcChjYXRlZ29yeSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0ub25DbGljaylyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5jaGlsZHJlbilyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5Lmxlbmd0aCA9PT0gMSlyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1cbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtrZXl9XG4gICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT4sXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIm9wdC1cIitpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pfSB2YWx1ZT17XCJvcHQtXCIrKHN0YXRlLm9wdGlvbnNba2V5XSB8fCBcIjBcIil9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tleV06ICh2YWx1ZS52YWx1ZSB8fCBcIjBcIikucmVwbGFjZShcIm9wdC1cIiwgXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfX0gc2VhcmNoYWJsZT17dHJ1ZX0vPixcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXG4gICAgICAgICAgICAgICAgYWN0aXZlPXtzdGF0ZS50YWJ9IGNoaWxkcmVuPXtzdGF0ZS50YWIgPT09IFwicHJldmlld1wiID8gcmVuZGVyUHJldmlldygpIDogcmVuZGVyQ29kZSgpfSBvbkNoYW5nZT17KHRhYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH19Lz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVGV4dElucHV0IGZyb20gXCIuL2NvbXBvbmVudHMvdGV4dGlucHV0XCI7XHJcblxyXG5sZXQgY2xhc3NuYW1lcyA9IFtdXHJcbmZ1bmN0aW9uIGdldENsYXNzTmFtZShuYW1lKXtcclxuICAgIGxldCBjbGFzc05hbWUgPSBjbGFzc25hbWVzLmZpbmQoZSA9PiBlLnN0YXJ0c1dpdGgobmFtZStcIi1cIikpXHJcbiAgICBpZihjbGFzc05hbWUpcmV0dXJuIGNsYXNzTmFtZVxyXG4gICAgY2xhc3NOYW1lID0gQkRNb2R1bGVzLmdldChlID0+IGVbbmFtZV0pWzBdW25hbWVdXHJcbiAgICBjbGFzc25hbWVzLnB1c2goY2xhc3NOYW1lKVxyXG4gICAgcmV0dXJuIGNsYXNzTmFtZVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0SW5wdXRTZXR0aW5nIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQge3RleHQsIGluZm99ID0gdGhpcy5wcm9wcy5kYXRhO1xyXG4gICAgICAgIGlmKHRoaXMucHJvcHMuZGF0YS5leHBlcmltZW50YWwpe1xyXG4gICAgICAgICAgICBpZighY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKFwiYmV0YS1cIikpKXtcclxuICAgICAgICAgICAgICAgIGNsYXNzbmFtZXMucHVzaChCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iZXRhICYmICghZS5jb250YWluZXIgJiYgIWUudXNlclNldHRpbmdzVm9pY2UpKVswXS5iZXRhKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZm8gPSBbXHJcbiAgICAgICAgICAgICAgICBpbmZvLFxyXG4gICAgICAgICAgICAgICAgPHN1cCBjbGFzc05hbWU9e2dldENsYXNzTmFtZShcImJldGFcIil9PihFWFBFUklNRU5UQUwpPC9zdXA+XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXtcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17XCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9PlxyXG4gICAgICAgICAgICAgICAgPGgzIGtleT1cInRpdGxlXCIgY2xhc3NOYW1lPVwidWktZm9ybS10aXRsZSBoMyBtYXJnaW4tcmVzZXQgbWFyZ2luLXJlc2V0IHVpLWZsZXgtY2hpbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dGV4dH1cclxuICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICA8VGV4dElucHV0IGtleT1cImlucHV0XCIgb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHZhbHVlPXt0aGlzLnByb3BzLnZhbHVlfSBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcnx8bnVsbH0gLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidWktZm9ybS10ZXh0IHN0eWxlLWRlc2NyaXB0aW9uIG1hcmdpbi10b3AtNFwiIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCJcclxuICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICB7aW5mb31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcblxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCIuL2ljb25zL2RlbGV0ZVwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XG5pbXBvcnQgeyBwcm9jZXNzRmlsZSB9IGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbkNlcnRpZmllclwiO1xuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1BsdWdpbkNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IFwiXCI7XG5cbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVsZXRlID0gdGhpcy5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuZW5hYmxlZCxcbiAgICAgICAgICAgIHNldHRpbmdzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXG4gICAgICAgICAgICB0cnVzdGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNob3dTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgY2xvc2VTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKCFjb250YWluZXIpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgQ29udGFpbmVyIGlzIHVuZGVmaW5lZC5gKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNCb3R0b20gPSBjVG9wICsgY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICAgICAgICAgICAgY29uc3QgZUJvdHRvbSA9IGVUb3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICByZXR1cm4gIChlVG9wIDwgY1RvcCB8fCBlQm90dG9tID4gY0JvdHRvbSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMucmVmcy5jYXJkTm9kZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJjb250ZW50UmVnaW9uU2Nyb2xsZXItXFxcIl1cIilcbiAgICAgICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyLCB0aGlzTm9kZSkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlT2Zmc2V0ID0gRE9NLm9mZnNldCh0aGlzTm9kZSk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG4gICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXNOb2RlT2Zmc2V0LnRvcCAtIGNvbnRhaW5lck9mZnNldC50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wIC0gMzA7XG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCAtIChwcm9ncmVzcyAqIChvcmlnaW5hbCAtIGVuZFBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xuICAgICAgICB0cnkgeyB0aGlzLnNldHRpbmdzUGFuZWwgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKCk7IH1cbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxuXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3Mtb3BlbiB1aS1zd2l0Y2gtaXRlbVwiLCByZWY6IFwiY2FyZE5vZGVcIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCAhPT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtfX2h0bWw6IHRoaXMuc2V0dGluZ3NQYW5lbH19KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVtuYW1lSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJuYW1lIGJkYS1uYW1lXCJ9LCBuYW1lKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJ2ZXJzaW9uIGJkYS12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgYXV0aG9ySW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3thdXRob3J9fVwiKTtcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImF1dGhvciBiZGEtYXV0aG9yXCJ9O1xuICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCkge1xuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XG4gICAgICAgICAgICAgICAgcHJvcHMudGFyZ2V0ID0gXCJfYmxhbmtcIjtcblxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xuICAgICAgICAgICAgICAgIGlmIChhdXRob3IuaWQpIHByb3BzLm9uQ2xpY2sgPSAoKSA9PiB7QkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7IEJEVjIub3BlbkRNKGF1dGhvci5pZCk7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGl0bGUuZmxhdCgpO1xuICAgIH1cblxuICAgIG1ha2VMaW5rKHRpdGxlLCB1cmwpIHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwic3RyaW5nXCIpIHByb3BzLmhyZWYgPSB1cmw7XG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcImZ1bmN0aW9uXCIpIHByb3BzLm9uQ2xpY2sgPSAoZXZlbnQpID0+IHtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdXJsKCk7fTtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcbiAgICB9XG5cbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWJ1dHRvblwiIG9uQ2xpY2s9e2FjdGlvbn0+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWVcbiAgICB9XG5cbiAgICBnZXQgbGlua3MoKSB7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gW107XG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcbiAgICAgICAgaWYgKGFkZG9uLndlYnNpdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIldlYnNpdGVcIiwgYWRkb24ud2Vic2l0ZSkpO1xuICAgICAgICBpZiAoYWRkb24uc291cmNlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTb3VyY2VcIiwgYWRkb24uc291cmNlKSk7XG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcbiAgICAgICAgICAgIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlN1cHBvcnQgU2VydmVyXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ZXIgPSAvXFwuZ2dcXC8oLiopJC87XG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3Rlci50ZXN0KGNvZGUpKSBjb2RlID0gY29kZS5tYXRjaCh0ZXN0ZXIpWzFdO1xuICAgICAgICAgICAgICAgIEJEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpO1xuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcbiAgICAgICAgaWYgKGFkZG9uLnBhdHJlb24pIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlBhdHJlb25cIiwgYWRkb24ucGF0cmVvbikpO1xuICAgICAgICByZXR1cm4gbGlua3M7XG4gICAgfVxuXG4gICAgZ2V0IGZvb3RlcigpIHtcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xuICAgICAgICByZXR1cm4gKGxpbmtzLmxlbmd0aCB8fCB0aGlzLmhhc1NldHRpbmdzKSAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLWZvb3RlciBiZGEtZm9vdGVyXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWxpbmtzIGJkYS1saW5rc1wifSxcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtvbkNsaWNrOiB0aGlzLnNob3dTZXR0aW5ncywgY2xhc3NOYW1lOiBcImJkLWJ1dHRvbiBiZGEtc2V0dGluZ3MtYnV0dG9uXCIsIGRpc2FibGVkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSwgXCJTZXR0aW5nc1wiKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnByb3BzLnRvZ2dsZSAmJiB0aGlzLnByb3BzLnRvZ2dsZSh0aGlzLm5hbWUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSk7XG4gICAgfVxuXG4gICAgZWRpdCgpIHt0aGlzLnByb3BzLmVkaXQodGhpcy5uYW1lKTt9XG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxuICAgIHJlbG9hZCgpIHt0aGlzLnByb3BzLnJlbG9hZCh0aGlzLm5hbWUpO31cblxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxuICAgIGdldCBhdXRob3IoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiB0aGlzLnByb3BzLmFkZG9uLmF1dGhvcik7fVxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogdGhpcy5wcm9wcy5hZGRvbi5kZXNjcmlwdGlvbik7fVxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IHthdXRob3JJZCwgYXV0aG9yTGlua30gPSB0aGlzLnByb3BzLmFkZG9uO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xuICAgICAgICAgICAgaWYoIXRoaXMuaXNTY2FubmluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHJlc29sdmUodGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgPyBjb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCB0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnVubW91bnRlZClyZXR1cm5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IHJlc3VsdC5zdXNwZWN0ID8gXCJzdXNwZWN0XCIgOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgKCkgPT4ge30pXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IFwic3VzcGVjdFwiKXtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcInJnYigyNDAsIDcxLCA3MSlcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24taGVhZGVyIGJkYS1oZWFkZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtdGl0bGUgYmRhLWhlYWRlci10aXRsZVwifSwgdGhpcy5idWlsZFRpdGxlKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB7bmFtZTogdGhpcy5hdXRob3IsIGlkOiBhdXRob3JJZCwgbGluazogYXV0aG9yTGlua30pKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5lZGl0ICYmIHRoaXMubWFrZUJ1dHRvbihcIkVkaXRcIiwgPEVkaXRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5lZGl0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVtb3ZlICYmIHRoaXMubWFrZUJ1dHRvbihcIkRlbGV0ZVwiLCA8RGVsZXRlSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZGVsZXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlci13cmFwIGJkYS1kZXNjcmlwdGlvbi13cmFwIHNjcm9sbGVyLXdyYXAgZmFkZVwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlciBiZC1hZGRvbi1kZXNjcmlwdGlvbiBiZGEtZGVzY3JpcHRpb24gc2Nyb2xsZXJcIn0sIHRoaXMuZGVzY3JpcHRpb24pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5mb290ZXJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xuaW1wb3J0IENvbnRlbnRDb2x1bW4gZnJvbSBcIi4vY29udGVudENvbHVtblwiO1xuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XG5pbXBvcnQgU2VhcmNoIGZyb20gXCIuL2NvbXBvbmVudHMvc2VhcmNoXCI7XG5cbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XG5pbXBvcnQgYmRFdmVudHMgZnJvbSBcIi4uL21vZHVsZXMvYmRFdmVudHNcIjtcbmltcG9ydCBFbXVsYXRlZFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xuXG5jb25zdCBUb29sdGlwID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcmRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge3NvcnQ6IFwibmFtZVwiLCBhc2NlbmRpbmc6IHRydWUsIHF1ZXJ5OiBcIlwifTtcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XG4gICAgICAgIHRoaXMuY29va2llID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Db29raWUgOiB0aGVtZUNvb2tpZTtcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Nb2R1bGUgOiB0aGVtZU1vZHVsZTtcblxuICAgICAgICB0aGlzLnNvcnQgPSB0aGlzLnNvcnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZXZlcnNlID0gdGhpcy5yZXZlcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcblxuICAgICAgICB0aGlzLm9uQWRkb25DaGFuZ2VzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25BZGRvbkNoYW5nZXMgPSB0aGlzLm9uQWRkb25DaGFuZ2VzLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpe1xuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfWxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXG4gICAgICAgIGJkRXZlbnRzLm9uKGAke3R5cGV9dW5sb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX1sb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXG4gICAgICAgIGJkRXZlbnRzLm9mZihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcbiAgICB9XG5cbiAgICBvcGVuRm9sZGVyKCkge1xuICAgICAgICBjb25zdCBzaGVsbCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbDtcbiAgICAgICAgY29uc3Qgb3BlbiA9IHNoZWxsLm9wZW5QYXRoIHx8IHNoZWxsLm9wZW5JdGVtO1xuICAgICAgICBvcGVuKHRoaXMuaXNQbHVnaW5zID8gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcik7XG4gICAgfVxuXG4gICAgZWRpdChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xuICAgICAgICBjb25zdCBzaG91bGREZWxldGUgPSBhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGUobmFtZSk7XG4gICAgICAgIGlmICghc2hvdWxkRGVsZXRlKSByZXR1cm47XG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XG4gICAgfVxuXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIEJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbChcIkFyZSBZb3UgU3VyZT9cIiwgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJHtuYW1lfT9gLCB7XG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge3Jlc29sdmUodHJ1ZSk7fSxcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgc29ydE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7bGFiZWw6IFwiTmFtZVwiLCB2YWx1ZTogXCJuYW1lXCJ9LFxuICAgICAgICAgICAge2xhYmVsOiBcIkF1dGhvclwiLCB2YWx1ZTogXCJhdXRob3JcIn0sXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxuICAgICAgICAgICAge2xhYmVsOiBcIlJlY2VudGx5IEFkZGVkXCIsIHZhbHVlOiBcImFkZGVkXCJ9LFxuICAgICAgICAgICAge2xhYmVsOiBcIkxhc3QgTW9kaWZpZWRcIiwgdmFsdWU6IFwibW9kaWZpZWRcIn0sXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0IGRpcmVjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcbiAgICAgICAgICAgIHtsYWJlbDogXCJEZXNjZW5kaW5nXCIsIHZhbHVlOiBmYWxzZX1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICByZXZlcnNlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcbiAgICB9XG5cbiAgICBzb3J0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NvcnQ6IHZhbHVlfSk7XG4gICAgfVxuXG4gICAgc2VhcmNoKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3F1ZXJ5OiBldmVudC50YXJnZXQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKX0pO1xuICAgIH1cblxuICAgIGdldFByb3BzKGFkZG9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IHRoaXMuZ2V0TmFtZShhZGRvbiksXG4gICAgICAgICAgICBlbmFibGVkOiB0aGlzLmNvb2tpZVt0aGlzLmdldE5hbWUoYWRkb24pXSxcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXG4gICAgICAgICAgICBlZGl0OiBzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtN1wiXSA/IHRoaXMuZWRpdC5iaW5kKHRoaXMpIDogbnVsbCxcbiAgICAgICAgICAgIHJlbW92ZTogdGhpcy5kZWxldGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcbiAgICAgICAgICAgIGhhc2g6IGFkZG9uLmhhc2hcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBnZXQgbGlzdCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy50eXBlID09PSBcInBsdWdpbnNcIiA/IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKSA6IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpO1xuICAgIH1cblxuICAgIGdldEFkZG9ucygpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IHRoaXMuc3RhdGUuc29ydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3RhdGUuc29ydC5zbGljZSgxKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gYS5wbHVnaW4gJiYgYS5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYS5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpIDogdGhpcy5nZXRTdHJpbmcoYVt0aGlzLnN0YXRlLnNvcnRdKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiB0aGlzLmdldFN0cmluZyhiW3RoaXMuc3RhdGUuc29ydF0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0LnRvTG9jYWxlTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzZWNvbmQudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoZmlyc3QgPiBzZWNvbmQpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gW107XG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgc29ydGVkQWRkb25zLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0QXV0aG9yKGFkZG9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuZ2V0RGVzY3JpcHRpb24oYWRkb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lKSBtYXRjaGVzID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChhdXRob3IpIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGF1dGhvci50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgdmVyc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcykgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoYWRkb24pO1xuICAgICAgICAgICAgcmVuZGVyZWQucHVzaCg8RXJyb3JCb3VuZGFyeT48QWRkb25DYXJkIHsuLi5wcm9wc30gcmVsb2FkPXshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgdGhpcy5tYW5hZ2VyLnJlbG9hZC5iaW5kKHRoaXMubWFuYWdlcil9IC8+PC9FcnJvckJvdW5kYXJ5Pik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkO1xuICAgIH1cblxuICAgIGdldE5hbWUoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IGFkZG9uLm5hbWUpO31cbiAgICBnZXRBdXRob3IoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogYWRkb24uYXV0aG9yKTt9XG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxuICAgIGdldFZlcnNpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IGFkZG9uLnZlcnNpb24pO31cblxuICAgIHJlbmRlckNoZWNrVXBkYXRlcygpe1xuICAgICAgICBpZighd2luZG93LlplcmVzUGx1Z2luTGlicmFyeSlyZXR1cm4gbnVsbFxuICAgICAgICBpZighd2luZG93LlBsdWdpblVwZGF0ZXMpcmV0dXJuIG51bGxcbiAgICAgICAgaWYodHlwZW9mIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsICE9PSBcImZ1bmN0aW9uXCIpcmV0dXJuIG51bGxcbiAgICAgICAgaWYoIXRoaXMuaXNQbHVnaW5zKXJldHVybiBudWxsXG5cbiAgICAgICAgbGV0IHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxuICAgICAgICBsZXQgdG9vbHRpcFxuICAgICAgICByZXR1cm4gPFRvb2x0aXBXcmFwIHRleHQ9XCJDaGVja3MgZm9yIHVwZGF0ZXMgb2YgcGx1Z2lucyB0aGF0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBSaWdodC1jbGljayBmb3IgYSBsaXN0LlwiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3ttYXJnaW5MZWZ0OiBcIjEwcHhcIn19IG9uTW91c2VMZWF2ZT17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0b29sdGlwSXNTaG93aW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC5oaWRlKClcbiAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gcmVmPVwiY2hlY2tVcGRhdGVCdXR0b25cIiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cImZpbGxlZFwiIHNpemU9XCJtaW5cIiBob3ZlckNvbG9yPVwiZGVmYXVsdFwiIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBpbiBwcm9ncmVzcy5cIiwge3R5cGU6IFwiaW5mb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJQbHVnaW4gdXBkYXRlIGNoZWNrIGNvbXBsZXRlLlwiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0gZGlzYWJsZWQ9e2ZhbHNlfSBvblJpZ2h0Q2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMucmVmcy5jaGVja1VwZGF0ZUJ1dHRvbilyZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuUGx1Z2luVXBkYXRlcyB8fCAhd2luZG93LlBsdWdpblVwZGF0ZXMucGx1Z2lucykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZih0b29sdGlwSXNTaG93aW5nKXJldHVyblxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwID0gbmV3IEVtdWxhdGVkVG9vbHRpcCh0aGlzLnJlZnMuY2hlY2tVcGRhdGVCdXR0b24ucmVmcy5vcmlnaW5hbC5yZWZzLmJ1dHRvbiwgT2JqZWN0LnZhbHVlcyh3aW5kb3cuUGx1Z2luVXBkYXRlcy5wbHVnaW5zKS5tYXAocCA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkZTogXCJib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50czogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC5zaG93KClcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcElzU2hvd2luZyA9IHRydWVcbiAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgZm9yIFVwZGF0ZXNcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L1Rvb2x0aXBXcmFwPlxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cbiAgICAgICAgICAgIHsocHJvcHMpID0+IFxuICAgICAgICAgICAgPFJlbG9hZEljb24gey4uLnByb3BzfSBjbGFzc05hbWU9XCJiZC1pY29uIGJkLXJlbG9hZCBiZC1yZWxvYWQtaGVhZGVyXCIgc2l6ZT1cIjE4cHhcIiBvbkNsaWNrPXthc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhlbWVNb2R1bGUudXBkYXRlVGhlbWVMaXN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgICAgfX0gLz5cbiAgICAgICAgICAgIH08L1Rvb2x0aXA+O1xuICAgICAgICBjb25zdCBhZGRvbkNhcmRzID0gdGhpcy5nZXRBZGRvbnMoKTtcblxuICAgICAgICByZXR1cm4gPENvbnRlbnRDb2x1bW4gdGl0bGU9e2Ake3RoaXMucHJvcHMudHlwZS50b1VwcGVyQ2FzZSgpfeKAlCR7YWRkb25DYXJkcy5sZW5ndGh9YH0+XG4gICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24ga2V5PVwiZm9sZGVyLWJ1dHRvblwiIGNvbG9yPVwiYnJhbmRcIiBcbiAgICAgICAgICAgICAgICBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9IHdyYXBwZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiMTBweFwiXG4gICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgT3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXJcbiAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XG4gICAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja1VwZGF0ZXMoKX1cbiAgICAgICAgICAgIHshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgcmVmcmVzaEljb259XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWNvbnRyb2xzIGJkLWFkZG9uLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1kcm9wZG93bnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuc29ydE9wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnNvcnR9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+T3JkZXI6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLmRpcmVjdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnJldmVyc2V9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmRhLXNsaXN0IGJkLWFkZG9uLWxpc3RcIj57YWRkb25DYXJkc308L2Rpdj5cbiAgICAgICAgPC9Db250ZW50Q29sdW1uPlxuICAgIH1cbn1cblxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENhcmRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXG59KTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRMb2dvIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwibWV0YWRhdGFcIiwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxNVwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzNcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjEwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzMpXCJ9LCBkOiBcIk0xMTk1LjQ0KzEzNS40NDJMMTE5NS40NCsxMzUuNDQyTDk5Ny42KzEzNi40NDJDMTAyNC4yKzE0OS43NDIrMTE3MC4zNCsxNjMuNTQyKzExOTMuNjQrMTc5Ljc0MkMxMjY0LjM0KzIyOC44NDIrMTMxOS43NCsyOTEuMjQyKzEzNTguMjQrMzY1LjA0MkMxMzk4LjE0KzQ0MS42NDIrMTQxOS43NCs1MzAuNjQyKzE0MjIuNTQrNjI5LjY0MkwxNDIyLjU0KzYzMC44NDJMMTQyMi41NCs2MzIuMDQyQzE0MjIuNTQrNzczLjE0MisxNDIyLjU0KzEyMjguMTQrMTQyMi41NCsxMzY5LjE0TDE0MjIuNTQrMTM3MC4zNEwxNDIyLjU0KzEzNzEuNTRDMTQxOS44NCsxNDcwLjU0KzEzOTguMjQrMTU1OS41NCsxMzU4LjI0KzE2MzYuMTRDMTMxOS43NCsxNzA5Ljk0KzEyNjQuNDQrMTc3Mi4zNCsxMTkzLjY0KzE4MjEuNDRDMTE3MS4wNCsxODM3LjE0KzEwMjUuNysxODUwLjU0KzEwMDArMTg2My41NEwxMTkzLjU0KzE4NjQuNTRDMTUzOS43NCsxODY2LjQ0KzE4NjQuNTQrMTY5My4zNCsxODY0LjU0KzEyOTYuNjRMMTg2NC41NCs3MTYuOTQyQzE4NjYuNDQrMzEyLjQ0MisxNTQxLjY0KzEzNS40NDIrMTE5NS40NCsxMzUuNDQyWlwiLCBmaWxsOiBcIiMxNzE3MTdcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzEpXCJ9LCBkOiBcIk0xNDY5LjI1KzYzMS40NDJDMTQ1OS41NSsyNzguMDQyKzExODMuMDUrMTM1LjQ0Mis4MjYuNjUrMTM1LjQ0MkwxMzUuNDUrMTM1LjQ0MkwxMzUuNDUrMTAwNEMxMzUuNDUrMTAwNCsxMzUuNDI3KzEyNTUuMjErMzU1LjYyNisxMjU1LjIxQzU3NS44MjUrMTI1NS4yMSs1NzUuODQ4KzEwMDQrNTc1Ljg0OCsxMDA0TDU3Ny40NSs0OTAuNDQyTDgzNC40NSs0OTAuNDQyQzExMDguOTUrNDkwLjQ0MisxMTA4Ljk1KzgzNS4zNDIrODM0LjQ1KzgzNS4zNDJMNjY0LjY1KzgzNS4zNDJMNjY0LjY1KzExNjQuODRMODM0LjQ1KzExNjQuODRDOTIzLjkzMisxMTY0Ljg0Kzk4NC4yNDQrMTIwMS40OCsxMDE1LjM5KzEyNTAuODdDMTA3OS43OCsxMzUzKzEwMTkuNDcrMTUwOS42NCs4MzQuNDUrMTUwOS42NEwxMzUuNDUrMTUwOS42NEwxMzUuNDUrMTg2NC41NEw4MjYuNjUrMTg2NC41NEMxMTgyLjk1KzE4NjQuNTQrMTQ1OS40NSsxNzIxLjk0KzE0NjkuMjUrMTM2OC41NEMxNDY5LjI1KzEyMDUuOTQrMTQyNC43NSsxMDg0LjQ0KzEzNDYuMzUrOTk5Ljk0MkMxNDI0Ljc1KzkxNS41NDIrMTQ2OS4yNSs3OTQuMDQyKzE0NjkuMjUrNjMxLjQ0MlpcIiwgZmlsbDogXCIjRkZGRkZGXCIsIG9wYWNpdHk6IFwiMVwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NoZWNrYm94IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImxpXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94IFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3gsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWlubmVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94SW5uZXIpWzBdLmNoZWNrYm94SW5uZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi4vaWNvbnMvZG93bmFycm93XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XHJcbiAgICAgICAgdGhpcy5kcm9wZG93biA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZGVNZW51ID0gdGhpcy5oaWRlTWVudS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dNZW51KGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZU1lbnUoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3RlZCgpIHtyZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09IHRoaXMuc3RhdGUudmFsdWUpO31cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LW9wdGlvbnNcIj5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qtb3B0aW9uJHtzZWxlY3RlZC52YWx1ZSA9PSBvcHQudmFsdWUgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gfSBvbkNsaWNrPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcywgb3B0LnZhbHVlKX0+e29wdC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZSA9PSBcInRyYW5zcGFyZW50XCIgPyBcIiBiZC1zZWxlY3QtdHJhbnNwYXJlbnRcIiA6IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5zdGF0ZS5vcGVuID8gXCIgbWVudS1vcGVuXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuLy8gcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBcIj5cclxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cclxuLy8gPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbi8vICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbi8vICAgICA8L2Rpdj5cclxuLy8gPC9kaXY+XHJcbi8vIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4vLyA8L2Rpdj47IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcbmltcG9ydCBTZWFyY2hJY29uIGZyb20gXCIuLi9pY29ucy9zZWFyY2hcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBmb2N1c2VkOiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gW1wiYmQtc2VhcmNoLXdyYXBwZXJcIl1cbiAgICAgICAgaWYodGhpcy5zdGF0ZS5mb2N1c2VkKWNsYXNzTmFtZS5wdXNoKFwiZm9jdXNlZFwiKVxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZS5qb2luKFwiIFwiKX0+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0gb25LZXlEb3duPXt0aGlzLnByb3BzLm9uS2V5RG93bn0gdHlwZT1cInRleHRcIiBcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmQtc2VhcmNoXCIgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXJ9IG1heExlbmd0aD1cIjUwXCIgXG4gICAgICAgICAgICAgICAgICAgIG9uRm9jdXM9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ZvY3VzZWQ6IHRydWV9KVxuICAgICAgICAgICAgICAgICAgICB9fSBvbkJsdXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ZvY3VzZWQ6IGZhbHNlfSlcbiAgICAgICAgICAgICAgICAgICAgfX0vPlxuICAgICAgICAgICAgICAgICAgICA8U2VhcmNoSWNvbiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9O1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlN3aXRjaCBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZX0gdmFsdWU9e3RoaXMuc3RhdGUuY2hlY2tlZH0gLz5cbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHRJbnB1dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge3ZhbHVlOiB0aGlzLnByb3BzLnZhbHVlfTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSA9IHRoaXMuZW1pdENoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQub3JpZ2luYWwgcmVmPXtjb25zb2xlLmxvZ30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHZhbHVlPXt0aGlzLnN0YXRlLnZhbHVlfSBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gb25CbHVyPXt0aGlzLmVtaXRDaGFuZ2V9Lz5cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbHVlLCB0aGlzLnByb3BzKVxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7dmFsdWU6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZW1pdENoYW5nZSgpe1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBTaG91bGQgZW1pdCBjaGFuZ2VzLmApXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NvbnRlbnRDb2x1bW4gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgZGlzcGxheU5hbWUoKSB7cmV0dXJuIFwiQ29udGVudENvbHVtblwiO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbiAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5wcm9wcy50aXRsZSA/IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgdGhpcy5wcm9wcy50aXRsZSkgOiBudWxsXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uICsgXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCIsIHN0eWxlOiB7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIlxuXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcbmltcG9ydCBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZnJvbSBcIi4vY3NzRWRpdG9yRGV0YWNoZWRcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5wcm9wcy5saW5lcyA9IDA7XG4gICAgICAgIHNlbGYuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICAgIHNlbGYuYXR0YWNoID0gc2VsZi5hdHRhY2guYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5kZXRhY2hlZEVkaXRvciA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQ3NzRWRpdG9yRGV0YWNoZWQsIHthdHRhY2g6IHNlbGYuYXR0YWNofSk7XG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLmRldGFjaCA9IHNlbGYuZGV0YWNoLmJpbmQoc2VsZik7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGV0YWNoZWQ6IHRoaXMucHJvcHMuZGV0YWNoZWQgfHwgQkRWMi5lZGl0b3JEZXRhY2hlZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICAvLyB0aGlzLnVwZGF0ZUxpbmVDb3VudCgpO1xuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvZGlzY29yZFwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5zZXRNb2RlKFwiYWNlL21vZGUvY3NzXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDc3MoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChwcmV2U3RhdGUuZGV0YWNoZWQgJiYgIXNlbGYuc3RhdGUuZGV0YWNoZWQpIHtcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLmRldGFjaGVkUm9vdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb2RlTWlycm9yKCkge1xuICAgIH1cblxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXG4gICAgICAgICAgICBtb2RlOiBcImNzc1wiLFxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXG4gICAgICAgICAgICBzY3JvbGxiYXJTdHlsZTogXCJzaW1wbGVcIlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBjc3MoKSB7XG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xuICAgICAgICBsZXQgY2NzcyA9IFwiXCI7XG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xuICAgICAgICAgICAgY2NzcyA9IEJ1ZmZlci5mcm9tKF9jY3NzLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNjc3M7XG4gICAgfVxuXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGNvbnN0IHtkZXRhY2hlZH0gPSBzZWxmLnN0YXRlO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge2lkOiBcImVkaXRvci1kZXRhY2hlZFwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJoM1wiLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgIWRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRGV0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gZGV0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVzcyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcImN0cmxcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCIsXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdpdGggdGhlIGVkaXRvciBmb2N1c2VkIHRvIGFjY2VzcyB0aGUgZWRpdG9yJ3Mgc2V0dGluZ3MuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgXVxuICAgIH1cblxuICAgIG9uQ2xpY2soYXJnKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBzd2l0Y2ggKGFyZykge1xuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImRldGFjaFwiOlxuICAgICAgICAgICAgICAgIHNlbGYuZGV0YWNoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVDc3MoKSB7XG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XG4gICAgfVxuXG4gICAgc2F2ZUNzcygpIHtcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIEJ1ZmZlci5mcm9tKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSwgXCJ1dGYtOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKSk7XG4gICAgfVxuXG4gICAgZGV0YWNoKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkZXRhY2hlZDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZHJvb3QgPSBzZWxmLmRldGFjaGVkUm9vdDtcbiAgICAgICAgaWYgKCFkcm9vdCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gSU5KRUNUIFJPT1Q6IC5hcHBcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc2VsZi5kZXRhY2hlZEVkaXRvciwgZHJvb3QpO1xuICAgIH1cblxuICAgIGdldCBkZXRhY2hlZFJvb3QoKSB7XG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xuICAgICAgICBpZiAoIV9yb290KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0RGV0YWNoZWRSb290KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcm9vdDtcbiAgICB9XG5cbiAgICBpbmplY3REZXRhY2hlZFJvb3QoKSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcCkpO1xuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhdHRhY2goKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9XG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIlxuXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5vbkNoYW5nZSA9IHNlbGYub25DaGFuZ2UuYmluZChzZWxmKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL2Rpc2NvcmRcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcbiAgICB9XG5cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgY3NzKCkge1xuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGNjc3MgPSBCdWZmZXIuZnJvbShfY2NzcywgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjY3NzO1xuICAgIH1cblxuICAgIGdldCByb290KCkge1xuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcbiAgICAgICAgaWYgKCFfcm9vdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yb290O1xuICAgIH1cblxuICAgIGluamVjdFJvb3QoKSB7XG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcCkpO1xuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmQtZGV0YWNoZWQtY3NzLWVkaXRvclwiLCBpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWVkaXRvclwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtaW5uZXJwYW5lXCJ9LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImVkaXRvci13cmFwcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hlY2tib3gsIHtpZDogXCJsaXZlLXVwZGF0ZVwiLCB0ZXh0OiBcIkxpdmUgVXBkYXRlXCIsIG9uQ2hhbmdlOiBzZWxmLm9uQ2hhbmdlLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXX0pXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJzYXZlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwIDNweCAzcHggMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImF0dGFjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBhdHRhY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xpY2soaWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhdHRhY2hcIjpcbiAgICAgICAgICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2VkaXRvci1kZXRhY2hlZFwiKSkgc2VsZi5wcm9wcy5hdHRhY2goKTtcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5yb290KTtcbiAgICAgICAgICAgICAgICBzZWxmLnJvb3QucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVDc3MoKSB7XG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XG4gICAgfVxuXG4gICAgc2F2ZUNzcygpIHtcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIEJ1ZmZlci5mcm9tKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSwgXCJ1dGYtOFwiKS50b1N0cmluZyhcImJhc2U2NFwiKSk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtoYXNFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJyZWFjdC1lcnJvclwifSwgXCJDb21wb25lbnQgRXJyb3JcIik7ICBcclxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVsZXRlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDBWMHpcIi8+PHBhdGggZD1cIk02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6bTIuNDYtNy4xMmwxLjQxLTEuNDFMMTIgMTIuNTlsMi4xMi0yLjEyIDEuNDEgMS40MUwxMy40MSAxNGwyLjEyIDIuMTItMS40MSAxLjQxTDEyIDE1LjQxbC0yLjEyIDIuMTItMS40MS0xLjQxTDEwLjU5IDE0bC0yLjEzLTIuMTJ6TTE1LjUgNGwtMS0xaC01bC0xIDFINXYyaDE0VjR6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTIgOS4yOUwxMiAxMy4xN2wzLjg4LTMuODhjLjM5LS4zOSAxLjAyLS4zOSAxLjQxIDAgLjM5LjM5LjM5IDEuMDIgMCAxLjQxbC00LjU5IDQuNTljLS4zOS4zOS0xLjAyLjM5LTEuNDEgMEw2LjcgMTAuN2MtLjM5LS4zOS0uMzktMS4wMiAwLTEuNDEuMzktLjM4IDEuMDMtLjM5IDEuNDIgMHpcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+O1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6XCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIgLz5cbiAgICAgICAgICAgICAgIDwvc3ZnPjtcbiAgICB9XG59Iiwiey8qIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIiB3aWR0aD1cIjE4cHhcIiBoZWlnaHQ9XCIxOHB4XCI+XG4gICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cbiAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XG48L3N2Zz4gKi99XG5cbmltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGlzdG9yeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMThweFwiO1xuICAgICAgICByZXR1cm4gPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnpcIi8+XG4gICAgICAgIDwvc3ZnPjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDBWMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+O1xuICAgIH1cbn0iLCJsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZSltYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcbmltcG9ydCBWMkNfU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IHsgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4uL21vZHVsZXMvQ3VzdG9tUmljaFByZXNlbmNlXCJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmxldCBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QcmVzZW5jZVNldHRpbmdzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikgfHwgZGVmYXVsdFJQQyxcbiAgICAgICAgICAgIGFzc2V0czogW11cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJldmlldyA9IG51bGxcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMgPSBuZXcgU2V0KClcbiAgICB9XG5cbiAgICB1cGRhdGVXaGVuRmV0Y2hlZChjb21wKXtcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuYWRkKGNvbXApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHtJbnB1dFRleHR9IHNldHRpbmcgXG4gICAgICovXG4gICAgb25DaGFuZ2Uoc2V0dGluZywgdmFsdWUpe1xuICAgICAgICBsZXQgZGVmYXVsdFNldHRpbmcgPSBSUENQcm9wcy5maW5kKGUgPT4gZS5pZCA9PT0gc2V0dGluZy5wcm9wcy5pZClcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIHRoaXMuc3RhdGUuZGF0YSwge1xuICAgICAgICAgICAgICAgIFtkZWZhdWx0U2V0dGluZy5pZF06ICEhdmFsdWUgPyB2YWx1ZSA6IG51bGxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLnN0YXRlLmFzc2V0c1xuICAgICAgICB9KVxuICAgICAgICBpZihzZXR0aW5nLnByb3BzLmlkID09PSBcImFwcGxpY2F0aW9uX2lkXCIpe1xuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcbiAgICAgICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKClcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLnNldChzZXR0aW5nc1JQQylcbiAgICB9XG5cbiAgICBmZXRjaEFzc2V0cygpe1xuICAgICAgICBpZih0aGlzLmlzZmV0Y2hpbmcgPT09IHRydWUpe1xuICAgICAgICAgICAgbGV0IGFwcCA9IHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZFxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkICE9PSBhcHApe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXG4gICAgICAgICAgICB9LCA1MDAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gdHJ1ZVxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZmV0Y2hBc3NldHModGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKVxuICAgICAgICAudGhlbihhc3NldHMgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcbiAgICAgICAgICAgICAgICBhc3NldHM6IE9iamVjdC5rZXlzKGFzc2V0cykubWFwKGsgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXNzZXQgPSBhc3NldHNba11cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhc3NldC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhc3NldC50eXBlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHVwZGF0ZVByZXZpZXcoZGF0YSl7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGF0YVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgfHwgKFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzR3JvdXAgdGl0bGU9XCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIiBzZXR0aW5ncz17dGhpcy5wcm9wcy5zZXR0aW5nc30gb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9Lz4sXG4gICAgICAgICAgICA8TWFyZ2luVG9wIC8+LFxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJSaWNoUHJlc2VuY2VcIi8+LFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7LyoqIG9wdGlvbnMgKi99XG4gICAgICAgICAgICAgICAge3RoaXMub3B0aW9uc0NvbXBvbmVudHN9XG4gICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz5cbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlByZXZpZXdcIi8+XG4gICAgICAgICAgICAgICAgey8qKiBwcmV2aWV3ICovfVxuICAgICAgICAgICAgICAgIDxScGNQcmV2aWV3IHNldHRpbmdzPXt0aGlzfS8+XG4gICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj4sXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9e3dpbmRvdy5vaGdvZG9oZnVja30+XG4gICAgICAgICAgICAgICAgT2ggZ29kIE9oIGZ1Y2tcbiAgICAgICAgICAgIDwvYnV0dG9uPixcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUxrWWE3cnBzX2c0XCIpXG4gICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICBTZWUgPyBJIHB1bGxlZCBhIGxpdGxlIHNuZWFreSBvbiB5YVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBnZXQgb3B0aW9uc0NvbXBvbmVudHMoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb21wb25lbnRzIHx8ICh0aGlzLl9vcHRpb25zQ29tcG9uZW50cyA9IFJQQ1Byb3BzLm1hcChlID0+IHtcbiAgICAgICAgICAgIGlmKGUudHlwZSA9PT0gXCJ0ZXh0XCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRUZXh0IHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwibnVtYmVyXCIpe1xuICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IFs8SW5wdXROdW1iZXIgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5dLypcbiAgICAgICAgICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnVuc2hpZnQoPERpc2NvcmRCdXR0b24gdGl0bGU9XCJDb3B5IEN1cnJlbnQgVGltZXN0YW1wXCIgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXG4gICAgICAgICAgICAgICAgICAgIH19IC8+KVxuICAgICAgICAgICAgICAgIH0qL1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcImNob2ljZVwiKXtcbiAgICAgICAgICAgICAgICBpZihbXCJhc3NldHMuc21hbGxcIiwgXCJhc3NldHMubGFyZ2VcIl0uaW5jbHVkZXMoZS5pZCkpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0Q2hvaWNlIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfSBjaG9pY2VzPXtbe3ZhbHVlOiBcIm5vbmVcIiwgbGFiZWw6IFwiTm8gYXNzZXRzXCJ9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpfS8+XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVua25vd24gY2hvaWNlLlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSlcbiAgICB9XG59XG5jb25zdCBSUENQcm9wcyA9IFtcbiAgICB7XG4gICAgICAgIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXG4gICAgICAgIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHRpdGxlOiBcIk5hbWVcIixcbiAgICAgICAgaWQ6IFwibmFtZVwiLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiRGV0YWlsc1wiLFxuICAgICAgICBpZDogXCJkZXRhaWxzXCIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBwbGFjZWhvbGRlcjogXCJCcm93c2luZyBEaXNjb3JkXCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiU3RhdGVcIixcbiAgICAgICAgaWQ6IFwic3RhdGVcIixcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZCBDbGllbnRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJUaW1lc3RhbXAgU3RhcnRcIixcbiAgICAgICAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBnZXQgcGxhY2Vob2xkZXIoKXtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiTGFyZ2VBc3NldFwiLFxuICAgICAgICBpZDogXCJhc3NldHMubGFyZ2VcIixcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJTbWFsbEFzc2V0XCIsXG4gICAgICAgIGlkOiBcImFzc2V0cy5zbWFsbFwiLFxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXG4gICAgfSxcbl1cblxubGV0IGlucHV0VGV4dE1vZHVsZXNcbmNsYXNzIElucHV0VGV4dCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIGlmKGlucHV0VGV4dE1vZHVsZXMgJiYgaW5wdXRUZXh0TW9kdWxlc1swXSlyZXR1cm4gaW5wdXRUZXh0TW9kdWxlc1xuICAgICAgICByZXR1cm4gaW5wdXRUZXh0TW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxuICAgICAgICBdXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfX0gdHlwZT1cInRleHRcIi8+XG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXG5cbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIHJvd01vZHVsZSxcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXG4gICAgICAgICAgICBmbGV4TW9kdWxlLFxuICAgICAgICAgICAgaW5wdXRNb2R1bGUsXG4gICAgICAgICAgICBzaXplTW9kdWxlMixcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xuXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8RGl2aWRlci8+XG4gICAgICAgIDwvZGl2PilcbiAgICB9XG59XG5cbmxldCBJbnB1dE51bWJlck1vZHVsZXNcbmNsYXNzIElucHV0TnVtYmVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgcmV0dXJuIElucHV0TnVtYmVyTW9kdWxlcyB8fCAoSW5wdXROdW1iZXJNb2R1bGVzID0gW1xuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXSxcbiAgICAgICAgXSlcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSB0eXBlPVwibnVtYmVyXCIgb25DaGFuZ2U9eyh2YWx1ZSwgbmFtZSwgaW5wdXQpID0+IHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdKy9nLCBcIlwiKVxuICAgICAgICAgICAgaWYodmFsdWUgPT0gdGhpcy5zdGF0ZS5kYXRhKXtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRWYWx1ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfX0gdHlwZT1cInRleHRcIi8+XG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXG5cbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIHJvd01vZHVsZSxcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXG4gICAgICAgICAgICBmbGV4TW9kdWxlLFxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cblxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XG4gICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cbiAgICAgICAgICAgICAgICB7c2V0dGluZy5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIgPyBcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcbiAgICAgICAgICAgICAgICB9fSBjb2xvcj1cImJyYW5kXCI+Q29weSBjdXJyZW50IHRpbWVzdGFtcDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+IDogbnVsbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufVxuXG5sZXQgSW5wdXRDaG9pY2VNb2R1bGVzXG5jbGFzcyBJbnB1dENob2ljZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA/IFwiYXNzZXQtXCIrdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gOiBcIm5vbmVcIlxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci51cGRhdGVXaGVuRmV0Y2hlZCh0aGlzKVxuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKXtcbiAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcbiAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSA9PT0gXCJub25lXCIgPyBudWxsIDogdmFsdWUucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcbiAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcbiAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xuICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEgPT09IFwibm9uZVwiID8gbnVsbCA6IHRoaXMuc3RhdGUuZGF0YS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGRhdGE6IHZhbHVlXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgICBcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gSW5wdXRDaG9pY2VNb2R1bGVzIHx8IChJbnB1dENob2ljZU1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cbiAgICAgICAgXSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcblxuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgcm93TW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcbiAgICAgICAgICAgIGZsZXhNb2R1bGVcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xuICAgICAgICBcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcbiAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgb3B0aW9ucy51bnNoaWZ0KHtcbiAgICAgICAgICAgIHZhbHVlOiBcIm5vbmVcIixcbiAgICAgICAgICAgIGxhYmVsOiBcIk5vIGFzc2V0c1wiXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxuICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkRyb3Bkb3duIHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9wdGlvbnM9e29wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IC8+XG4gICAgICAgICAgICAgICAgey8qPFNlbGVjdCB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpfSBvcHRpb25zPXtvcHRpb25zfS8+Ki99XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaXZpZGVyLz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn1cblxubGV0IERpdmlkZXJNb2R1bGVzID0gW11cbmNsYXNzIERpdmlkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gRGl2aWRlck1vZHVsZXMmJkRpdmlkZXJNb2R1bGVzWzBdID8gRGl2aWRlck1vZHVsZXMgOiAoRGl2aWRlck1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyRGVmYXVsdClbMF1cbiAgICAgICAgXSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIGRpdmlkZXIsXG4gICAgICAgICAgICBkaXZpZGVyRGVmYXVsdFxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2Ake2RpdmlkZXIuZGl2aWRlcn0gJHtkaXZpZGVyRGVmYXVsdC5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cbiAgICB9XG59XG5cbmNsYXNzIERpc2NvcmRCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxuXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfSBjb2xvcj1cImJyYW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxuICAgICAgICAgICAgICAgIDwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn1cblxuY2xhc3MgUnBjUHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMgPSB7fSl7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgYWN0aXZlOiBcInByb2ZpbGVcIlxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFicyA9IFtdXG5cbiAgICAgICAgdGhpcy5wcm9wcy5zZXR0aW5ncy5wcmV2aWV3ID0gdGhpc1xuICAgIH1cblxuICAgIGNoYW5nZVRhYih0YWIpe1xuICAgICAgICBsZXQgYW5jaWVudFRhYiA9IHRoaXMuc3RhdGUuYWN0aXZlXG4gICAgICAgIGlmKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZClyZXR1cm5cblxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgIGUuc2V0QWN0aXZlKGZhbHNlKVxuICAgICAgICB9KVxuICAgICAgICB0YWIuc2V0QWN0aXZlKHRydWUpXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiB0YWIucHJvcHMuaWRcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYldyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFibmF2XCIgc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fT5cbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiRnVsbCBQcm9maWxlXCIgaWQ9XCJwcm9maWxlXCIvPlxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJVc2VyIFBvcG91dFwiIGlkPVwicG9wb3V0XCIvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8UHJlc2VuY2VFcnJvckNhdGNoZXIgcHJldmlldz17dGhpcy5wcmV2aWV3fSBzdGF0ZT17dGhpcy5zdGF0ZS5ycGN9IHByb3BzPXt7cHJldmlldzogdGhpc319IGtleT17dGhpcy5zdGF0ZS5hY3RpdmV9IC8+XG4gICAgICAgIDwvZGl2PilcbiAgICB9ICAgXG5cbiAgICBpc0FjdGl2ZSh0YWIpe1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYlxuICAgIH1cblxuICAgIGdldCBwcmV2aWV3KCl7XG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlID09PSBcInByb2ZpbGVcIilyZXR1cm4gUHJvZmlsZVxuICAgICAgICByZXR1cm4gUG9wb3V0XG4gICAgfVxufVxuXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGFjdGl2ZTogcHJvcHMucHJldmlldy5pc0FjdGl2ZShwcm9wcy5pZClcbiAgICAgICAgfVxuICAgICAgICBwcm9wcy5wcmV2aWV3LnRhYnMucHVzaCh0aGlzKVxuICAgIH1cblxuICAgIHNldEFjdGl2ZShpc0FjdGl2ZSl7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiAhIWlzQWN0aXZlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWBcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUpe1xuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUFjdGl2ZWBcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBvbkNsaWNrPXsoKT0+e1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5wcmV2aWV3LmNoYW5nZVRhYih0aGlzKVxuICAgICAgICB9fT5cbiAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufVxuXG5sZXQgZW1wdHlDbGFzc2VzXG5jbGFzcyBQcmVzZW5jZUVycm9yQ2F0Y2hlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29tcG9uZW50RGlkQ2F0Y2goZXJyLCBlcnJJbmZvKXtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIsIGVyckluZm8pXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZXJyb3I6IHRydWVcbiAgICAgICAgfSlcbiAgICB9XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGlmKCF0aGlzLnN0YXRlKXtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZXJyb3Ipe1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpZXcgPSBuZXcgdGhpcy5wcm9wcy5wcmV2aWV3KHRoaXMucHJvcHMucHJvcHMpXG4gICAgICAgICAgICAgICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnByb3BzLnN0YXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aWV3LnJlbmRlcigpXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcigpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZW1wdHlDbGFzc2VzID0gZW1wdHlDbGFzc2VzIHx8IEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZW1wdHlTdGF0ZUltYWdlICYmIGUuZW1wdHlTdGF0ZSlcbiAgICAgICAgICAgIGlmKCFlbXB0eUNsYXNzZXMpe1xuICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjIwcHhcIlxuICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxuICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT17YGxjLXRhYi1ib3gtc2hhZG93ICR7ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGV9YH0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZUltYWdlfSBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBcIjIwcHhcIlxuICAgICAgICAgICAgICAgICAgICB9fT5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSGVhZGVyfT5BbiBlcnJvciBvY2N1cmVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVTdWJ0ZXh0fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuIEpvaW4gb3VyIMKtXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9e2Ake0JEVjIuYW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YH0gcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PXswfSBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5qb2luTEMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIMKtIGZvciBoZWxwLlxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIH1cbn1cblxubGV0IHBvcG91dE1vZHVsZXNcbmxldCBVc2VyUG9wb3V0Q29tcG9uZW50XG5sZXQgUG9wb3V0UHJvcHNcbmNsYXNzIFBvcG91dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgcmV0dXJuIHBvcG91dE1vZHVsZXMgfHwgKHBvcG91dE1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlVzZXJQb3BvdXRcIiksXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIGdldENvbXBvbmVudCgpe1xuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgVXNlclBvcG91dCxcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xuXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVuZGVyMSA9IFVzZXJQb3BvdXQuZGVmYXVsdCh7XG4gICAgICAgICAgICAgICAgdXNlcklkOiB1c2VyLmlkLCBcbiAgICAgICAgICAgICAgICBndWlsZElkOiBudWxsLCBcbiAgICAgICAgICAgICAgICBjaGFubmVsSWQ6IG51bGwsIFxuICAgICAgICAgICAgICAgIGRpc2FibGVVc2VyUHJvZmlsZUxpbms6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBVc2VyUG9wb3V0Q29tcG9uZW50ID0gcmVuZGVyMS50eXBlXG4gICAgICAgICAgICBQb3BvdXRQcm9wcyA9IHJlbmRlcjEucHJvcHNcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcigpXG4gICAgICAgIH0sIG51bGwpXG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGlmKCFVc2VyUG9wb3V0Q29tcG9uZW50KXJldHVybiB0aGlzLmdldENvbXBvbmVudCgpXG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBfVXNlclBvcG91dCxcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xuXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxuXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXG4gICAgICAgICAgICBsZXQgZ2FtZSA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XG4gICAgICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXG4gICAgICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2FtZVxuICAgICAgICB9KS5jYWxsKHtcbiAgICAgICAgICAgIGdhbWU6IGRhdGFcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBwb3BvdXQgPSBuZXcgVXNlclBvcG91dENvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQb3BvdXRQcm9wcywge1xuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5LFxuICAgICAgICAgICAgdXNlcklkOiB1c2VyLmlkXG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcblxuICAgICAgICAvLyByZW1vdmUgdGhlIHN0b3AgcHJvcGFnYXRpb24gc2hpdC5cbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gPGRpdiB7Li4ud2luZG93LkxpZ2h0Y29yZC5BcGkuXy5leGNsdWRlUHJvcGVydGllcyhwb3BvdXQucHJvcHMsIFtcIm9uQ2xpY2tcIiwgXCJvbkNvbnRleHRNZW51XCJdKX0gLz5cblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0IGxjLXRhYi1ib3gtc2hhZG93XCI+XG4gICAgICAgICAgICB7Y29udGFpbmVyfVxuICAgICAgICA8L2Rpdj5cbiAgICB9XG59XG5cbmxldCBwcm9maWxlTW9kdWxlc1xubGV0IFVzZXJQcm9maWxlQ29tcG9uZW50XG5sZXQgUHJvZmlsZVByb3BzXG5sZXQgY29ubmVjdGVkUHJvZmlsZVN0b3JlXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gcHJvZmlsZU1vZHVsZXMgfHwgKHByb2ZpbGVNb2R1bGVzID0gW1xuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJVc2VyUHJvZmlsZVwiKSxcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpXG4gICAgICAgIF0pXG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBVc2VyUHJvZmlsZSxcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xuXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxuICAgICAgICBpZighVXNlclByb2ZpbGVDb21wb25lbnQpe1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyMSA9IG5ldyBVc2VyUHJvZmlsZS5kZWZhdWx0KHtcbiAgICAgICAgICAgICAgICB1c2VyOiB1c2VyXG4gICAgICAgICAgICB9KS5yZW5kZXIoKVxuICAgICAgICAgICAgY29ubmVjdGVkUHJvZmlsZVN0b3JlID0gcmVuZGVyMS50eXBlXG4gICAgICAgICAgICBjb25zdCByZW5kZXIyID0gbmV3IHJlbmRlcjEudHlwZShyZW5kZXIxLnByb3BzKS5yZW5kZXIoKVxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMyA9IHJlbmRlcjIudHlwZS5yZW5kZXIocmVuZGVyMi5wcm9wcywgbnVsbClcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjQgPSBuZXcgcmVuZGVyMy50eXBlKHJlbmRlcjMucHJvcHMpLnJlbmRlcigpXG4gICAgICAgICAgICBVc2VyUHJvZmlsZUNvbXBvbmVudCA9IHJlbmRlcjQudHlwZVxuICAgICAgICB9XG4gICAgICAgIGlmKCFVc2VyUHJvZmlsZUNvbXBvbmVudCl0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgdGhlIFVzZXJQcm9maWxlQ29tcG9uZW50IGNvbXBvbmVudC5gKVxuXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXG4gICAgICAgICAgICBsZXQgZ2FtZSA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XG4gICAgICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXG4gICAgICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ2FtZVxuICAgICAgICB9KS5jYWxsKHtcbiAgICAgICAgICAgIGdhbWU6IGRhdGFcbiAgICAgICAgfSlcblxuICAgICAgICBQcm9maWxlUHJvcHMgPSBuZXcgY29ubmVjdGVkUHJvZmlsZVN0b3JlKHtcbiAgICAgICAgICAgIHVzZXI6IHVzZXIsXG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge31cbiAgICAgICAgfSkucmVuZGVyKCkucHJvcHNcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IG5ldyBVc2VyUHJvZmlsZUNvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQcm9maWxlUHJvcHMsIHtcbiAgICAgICAgICAgIGFjdGl2aXR5OiBhY3Rpdml0eVxuICAgICAgICB9KSkucmVuZGVyKCkucHJvcHMuY2hpbGRyZW4gLy8gYnlwYXNzIHRyYWNraW5nXG5cbiAgICAgICAgcHJvZmlsZS5wcm9wcy5zdHlsZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBcImF1dG9cIlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiIGxjLXRhYi1ib3gtc2hhZG93XCI+XG4gICAgICAgICAgICB7cHJvZmlsZX1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuLi9zZXR0aW5nc1RpdGxlXCI7XG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuLi90YWJCYXJTZXBhcmF0b3JcIjtcblxuaW1wb3J0IFNlcnZlckNhcmQgZnJvbSBcIi4vc2VydmVyQ2FyZFwiO1xuaW1wb3J0IHsgdXNlRm9yY2VVcGRhdGUgfSBmcm9tIFwiLi4vLi4vbW9kdWxlcy9ob29rc1wiO1xuXG5sZXQgU2V0dGluZ3NWaWV3XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHVibGljU2VydmVycyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsb3NlID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5ID0gdGhpcy5jaGFuZ2VDYXRlZ29yeS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2VhcmNoS2V5RG93biA9IHRoaXMuc2VhcmNoS2V5RG93bi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbiA9IHRoaXMuY2hlY2tDb25uZWN0aW9uLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuam9pbiA9IHRoaXMuam9pbi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcblxuICAgICAgICB0aGlzLkd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0R3VpbGRzXCJdKTtcbiAgICAgICAgdGhpcy5BdmF0YXJEZWZhdWx0cyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRVc2VyQXZhdGFyVVJMXCIsIFwiREVGQVVMVF9BVkFUQVJTXCJdKTtcbiAgICAgICAgdGhpcy5JbnZpdGVBY3Rpb25zID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7XG4gICAgICAgIHRoaXMuU29ydGVkR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRTb3J0ZWRHdWlsZHNcIl0pO1xuXG4gICAgICAgIHRoaXMuaG9va3MgPSBbXVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbigpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgIHNlcnZlcnM6IFtdLFxuICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAgICAgICBzdGF0ZTogMCxcbiAgICAgICAgICAgICAgICB1c2VyOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VjdGlvbjogdGhpcy5jYXRlZ29yeVNsdWdzWzBdLFxuICAgICAgICAgICAgdGhlbWU6IFwiZGFya1wiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMucHJvcHMuY2xvc2UoKVxuICAgIH1cblxuICAgIHNlYXJjaChxdWVyeSwgY2xlYXIpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGZldGNoKGAke3NlbGYuc2VhcmNoRW5kUG9pbnR9JHtxdWVyeX0ke3F1ZXJ5ID8gXCImc2NoZW1hPW5ld1wiIDogXCI/c2NoZW1hPW5ld1wifWAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIlxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgYXdhaXQgcmVzLnRleHQoKVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gZGF0YS5yZXN1bHRzLnJlZHVjZSgoYXJyLCBzZXJ2ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2VydmVyKTtcbiAgICAgICAgICAgICAgICAvLyBhcnIucHVzaCg8U2VydmVyQ2FyZCBzZXJ2ZXI9e3NlcnZlcn0gam9pbj17c2VsZi5qb2lufS8+KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICBpZiAoIWNsZWFyKSB7XG4gICAgICAgICAgICAgICAgc2VydmVycyA9IHNlbGYuc3RhdGUuc2VydmVycy5jb25jYXQoc2VydmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3NlcnZlcnMudW5zaGlmdChzZWxmLmJkU2VydmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGVuZCA9IGRhdGEuc2l6ZSArIGRhdGEuZnJvbTtcbiAgICAgICAgICAgIGRhdGEubmV4dCA9IGA/ZnJvbT0ke2VuZH1gO1xuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgZGF0YS5uZXh0ICs9IGAmdGVybT0ke3NlbGYuc3RhdGUudGVybX1gO1xuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSkgZGF0YS5uZXh0ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XG4gICAgICAgICAgICBpZiAoZW5kID49IGRhdGEudG90YWwpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLnRvdGFsO1xuICAgICAgICAgICAgICAgIGRhdGEubmV4dCA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGBTaG93aW5nIDEtJHtlbmR9IG9mICR7ZGF0YS50b3RhbH0gcmVzdWx0cyBpbiAke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIHRpdGxlICs9IGAgZm9yICR7c2VsZi5zdGF0ZS50ZXJtfWA7XG5cbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzOiBzZXJ2ZXJzLFxuICAgICAgICAgICAgICAgIG5leHQ6IGRhdGEubmV4dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkZhaWxlZCB0byBsb2FkIHNlcnZlcnMuIENoZWNrIGNvbnNvbGUgZm9yIGRldGFpbHNcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgam9pbihzZXJ2ZXJDYXJkKSB7XG4gICAgICAgIGlmIChzZXJ2ZXJDYXJkLnByb3BzLnBpbm5lZCkgcmV0dXJuIHRoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGUoc2VydmVyQ2FyZC5wcm9wcy5pbnZpdGVfY29kZSk7XG5cbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5qb2luRW5kUG9pbnR9LyR7c2VydmVyQ2FyZC5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcn1gLHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlcnZlckNhcmQuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xuICAgIH1cblxuICAgIGNvbm5lY3QoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZi53aW5kb3dPcHRpb25zO1xuICAgICAgICBvcHRpb25zLnggPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5YICsgd2luZG93LmlubmVyV2lkdGggLyAyIC0gb3B0aW9ucy53aWR0aCAvIDIpO1xuICAgICAgICBvcHRpb25zLnkgPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5ZICsgd2luZG93LmlubmVySGVpZ2h0IC8gMiAtIG9wdGlvbnMuaGVpZ2h0IC8gMik7XG5cbiAgICAgICAgY29uc3Qgd2luID0gc2VsZi5qb2luV2luZG93ID0gbmV3IChyZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XG4gICAgICAgIHdpbi53ZWJDb250ZW50cy5vbihcImRpZC1uYXZpZ2F0ZVwiLCAoZXZlbnQsIHVybCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XG4gICAgICAgICAgICB3aW4uY2xvc2UoKTtcbiAgICAgICAgICAgIHNlbGYuY2hlY2tDb25uZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW4ubG9hZFVSTCh1cmwpO1xuICAgICAgICB3aW4uc2V0TWVudUJhclZpc2liaWxpdHkoZmFsc2UpXG4gICAgfVxuXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxuICAgICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtaW5pbWl6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcbiAgICAgICAgICAgIGZyYW1lOiB0cnVlLFxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcbiAgICAgICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBiZFNlcnZlcigpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzAwMDArXCIsXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjcwMDAwK1wiLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzg2MDA0NzQ0OTY2OTE0MDQ4LzI5MmU3ZjZiZmZmMmI3MWRmZDEzZTUwOGE4NTlhZWRkLndlYnBcIixcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgICBvbmxpbmU6IFwiMTAwK1wiLFxuICAgICAgICAgICAgbWVtYmVyczogXCIzMDArXCIsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBMaWdodGNvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI3MDU5MDgzNTAyMTg2NjYxMTdcIixcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC5wbmdcIixcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KVxuICAgICAgICBdXG4gICAgfVxuXG4gICAgZ2V0IHNlYXJjaEVuZFBvaW50KCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcbiAgICB9XG5cbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL2ouZGlzY29yZHNlcnZlcnMuY29tXCI7XG4gICAgfVxuXG4gICAgZ2V0IGNvbm5lY3RFbmRQb2ludCgpIHtcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgICAgICAgIGlmKCF0ZXh0KXtcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dClcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IDAsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAxLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuaG9va3MuZm9yRWFjaCgoZSkgPT4gZSgpKVxuICAgICAgICBTZXR0aW5nc1ZpZXcgPSBTZXR0aW5nc1ZpZXcgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlNldHRpbmdzVmlld1wiKVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJwdWJzbGF5ZXJyb290XCJ9LCBcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NWaWV3LCB7XG4gICAgICAgICAgICAgICAgb25TZXRTZWN0aW9uOiAoc2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5KHRoaXMuY2F0ZWdvcnlTbHVncy5pbmRleE9mKHNlY3Rpb24pKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VjdGlvbnM6IHRoaXMuc2VjdGlvbnMsXG4gICAgICAgICAgICAgICAgb25DbG9zZTogdGhpcy5jbG9zZSxcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiB0aGlzLnN0YXRlLnNlY3Rpb25cbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBzZWN0aW9ucygpe1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXVxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXG4gICAgICAgICAgICBsYWJlbDogXCJQdWJsaWMgU2VydmVyc1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiQ1VTVE9NXCIsXG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLnNlYXJjaElucHV0LmJpbmQobnVsbCwgKCkgPT4gdGhpcywgdGhpcy5zZWFyY2hLZXlEb3duKVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxuICAgICAgICAgICAgbGFiZWw6IFwiQ2F0ZWdvcmllc1wiXG4gICAgICAgIH0sIC4uLnRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IHRoaXMuY2F0ZWdvcnlTbHVnc1tpbmRleF0sXG4gICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuY29udGVudC5iaW5kKG51bGwsICgpID0+IHRoaXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkNVU1RPTVwiLFxuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5mb290ZXJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuY29ubmVjdGlvbi5iaW5kKG51bGwsICgpID0+IHRoaXMpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzZWN0aW9uc1xuICAgIH1cbiAgICBcbiAgICBzZWFyY2hJbnB1dChnZXRUaGlzLCBzZWFyY2hLZXlEb3duKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gQkRWMi5yZWFjdC51c2VTdGF0ZShcIlwiKVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS1pdGVtXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10ZXh0LWlucHV0IGZsZXgtdmVydGljYWxcIiwgc3R5bGU6IHt3aWR0aDogXCIxNzJweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiAoc2VyY2hpbnB1dCkgPT4gKGdldFRoaXMoKS5yZWZzLnNlYXJjaGlucHV0ID0gc2VyY2hpbnB1dCksIFxuICAgICAgICAgICAgICAgICAgICBvbktleURvd246IHNlYXJjaEtleURvd24sIFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUudGFyZ2V0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsIFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsIFxuICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6IFwiNTBcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcgfHwgZS53aGljaCAhPT0gMTMpIHJldHVybjtcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBxdWVyeSA9IGA/dGVybT0ke2UudGFyZ2V0LnZhbHVlfWA7XG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xuICAgIH1cblxuICAgIGdldCBjYXRlZ29yeVNsdWdzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5QnV0dG9ucy5tYXAoZSA9PiBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15cXHdcXGRdKy9nLCBcIl9cIikpXG4gICAgfVxuXG4gICAgZ2V0IGNhdGVnb3J5QnV0dG9ucygpIHtcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcbiAgICB9XG5cbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO1xuICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcbiAgICAgICAgICAgIHRlcm06IG51bGwsXG4gICAgICAgICAgICBzZWN0aW9uOiBzZWxmLmNhdGVnb3J5U2x1Z3NbaWRdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaWQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29udGVudChnZXRUaGlzKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSBnZXRUaGlzKCk7XG4gICAgICAgIHNlbGYudXNlU3RhdGUoKVxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSBzZWxmLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSBzZWxmLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuY29ubmVjdGlvbi5zdGF0ZSA9PT0gMSkgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChzZWxmLm5vdENvbm5lY3RlZC5iaW5kKG51bGwsIGdldFRoaXMpKTtcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7cmVmOiAocmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgKHNlbGYucmVmcy5jb250ZW50ID0gcmVmKVxuICAgICAgICAgICAgfSwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pLFxuICAgICAgICAgICAgc2VsZi5iZFNlcnZlcixcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge2tleTogc2VydmVyLmlkZW50aWZpZXIsIHNlcnZlcjogc2VydmVyLCBqb2luOiBzZWxmLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIiwgc3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxMHB4XCJ9fSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLmxvYWRpbmcgPyBcIkxvYWRpbmdcIiA6IFwiTG9hZCBNb3JlXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSlcbiAgICAgICAgKV07XG4gICAgfVxuXG4gICAgbm90Q29ubmVjdGVkKGdldFRoaXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IGdldFRoaXMoKTtcbiAgICAgICAgLy9yZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHsgdGV4dDogc2VsZi5zdGF0ZS50aXRsZSB9KTtcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7a2V5OiBcIm5jY1wiLCByZWY6IChyZWYpID0+IChzZWxmLnJlZnMuY29udGVudCA9IHJlZiksIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImgyXCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxuICAgICAgICAgICAgICAgIFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogXCIxOHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksIHNlbGYuYmRTZXJ2ZXJcbiAgICAgICAgKV07XG4gICAgfVxuXG4gICAgZm9vdGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJhXCIsXG4gICAgICAgICAgICAgICAge2hyZWY6IFwiaHR0cHM6Ly9kaXNjb3Jkc2VydmVycy5jb21cIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICBcIkRpc2NvcmRzZXJ2ZXJzLmNvbVwiXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXNlU3RhdGUoKXtcbiAgICAgICAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpXG4gICAgICAgIEJEVjIuUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9va3MucHVzaChsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmhvb2tzLmZpbmRJbmRleChlID0+IGU9PT1saXN0ZW5lcilcbiAgICAgICAgICAgICAgICBpZihpbmRleCA8IDApcmV0dXJuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKVxuICAgIH1cblxuICAgIGNvbm5lY3Rpb24oZ2V0VGhpcykge1xuICAgICAgICBjb25zdCBzZWxmID0gZ2V0VGhpcygpO1xuICAgICAgICBzZWxmLnVzZVN0YXRlKClcbiAgICAgICAgY29uc3Qge2Nvbm5lY3Rpb259ID0gc2VsZi5zdGF0ZTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IDIpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtjb2xvcjogXCIjYjliYmJlXCIsIGZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcbiAgICAgICAgICAgICAgICBcIkNvbm5lY3RlZCBhczogXCIsXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtwYWRkaW5nOiBcIjVweCAxMHB4IDAgMTBweFwifX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1pbkhlaWdodDogXCIyMHB4XCJ9LCB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIiwgb25DbGljazogc2VsZi5jb25uZWN0fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVjb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXJ2ZXJDYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuc2VydmVyLmljb25VcmwpIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2luZWQ6IHRoaXMucHJvcHMuZ3VpbGRMaXN0LmluY2x1ZGVzKHRoaXMucHJvcHMuc2VydmVyLmlkZW50aWZpZXIpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjYXJkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2FyZCAmJiBlLmNhcmRQcmltYXJ5KVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxyXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxyXG4gICAgICAgICAgICAvLyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge3JlZjogXCJpbWdcIiwgY2xhc3NOYW1lOiBcImJkLXNlcnZlci1pbWFnZVwiLCBzcmM6IHNlcnZlci5pY29uVXJsLCBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyksIGRyYWdnYWJsZTogZmFsc2V9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuZmxleENoaWxkK1wiIGJkLXNlcnZlci1jb250ZW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwK1wiIGJkLXNlcnZlci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1uYW1lXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5tZW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5IGJkLXNlcnZlci1kZXNjcmlwdGlvbi1jb250YWluZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBzY3JvbGxlciBiZC1zZXJ2ZXItZGVzY3JpcHRpb25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGNvbG9yR3JlZW4tMjlpQUtZXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiIzNhYzE1Y1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGRpc2FibGVkLTlhRjJ1Z1wiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiNjMTNhM2FcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk5cIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCJ9LCBvbkNsaWNrOiAoKSA9PiB7dGhpcy5qb2luKCk7fX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAvLyApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZUVycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XHJcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xyXG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25DbGljayxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1elwifSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZWN0aW9ucy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIGkgIT09IDAgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wLCB7fSkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzR3JvdXAsIE9iamVjdC5hc3NpZ24oe30sIHNlY3Rpb24sIHtvbkNoYW5nZTogdGhpcy5wcm9wcy5vbkNoYW5nZX0pKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XG5pbXBvcnQgeyB1c2VGb3JjZVVwZGF0ZSB9IGZyb20gXCIuLi9tb2R1bGVzL2hvb2tzXCI7XG5cbmxldCBmb3JtTW9kdWxlXG5sZXQgc3dpdGNoSXRlbVxubGV0IGJldGFDbGFzc05hbWVzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NHcm91cCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlcnJvcjogZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlck9sZFNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCB7dGl0bGUsIHNldHRpbmdzLCBidXR0b259ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcbiAgICAgICAgICAgICAgICBidXR0b25Db21wb25lbnQsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICB9fSk7XG4gICAgICAgICAgICAgICAgfSldO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKGVyciwgZXJySW5mbyl7XG4gICAgICAgIGNvbnNvbGUubG9nKGVyciwgZXJySW5mbylcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlcnJvcjogdHJ1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBpZih0aGlzLnN0YXRlLmVycm9yKXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJPbGRTZXR0aW5ncygpXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGlmKCFmb3JtTW9kdWxlKWZvcm1Nb2R1bGUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLkZvcm1TZWN0aW9uKVxuICAgICAgICAgICAgICAgIGlmKCFzd2l0Y2hJdGVtKXN3aXRjaEl0ZW0gPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlN3aXRjaEl0ZW1cIilcbiAgICAgICAgICAgICAgICBpZighYmV0YUNsYXNzTmFtZXMpYmV0YUNsYXNzTmFtZXMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmJldGEgJiYgKCFlLmNvbnRhaW5lciAmJiAhZS51c2VyU2V0dGluZ3NWb2ljZSkpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gW11cbiAgICAgICAgICAgICAgICBpZih0aGlzLnByb3BzLmRlc2NyaXB0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCg8Zm9ybU1vZHVsZS5Gb3JtVGV4dCB0eXBlPVwiZGVzY3JpcHRpb25cIiBzZWxlY3RhYmxlPXtmYWxzZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1UZXh0PiwgPE1hcmdpblRvcD48L01hcmdpblRvcD4pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goLi4udGhpcy5wcm9wcy5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmZvID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5leHBlcmltZW50YWwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5wdXNoKDxzdXAgY2xhc3NOYW1lPXtiZXRhQ2xhc3NOYW1lcy5iZXRhfT4oRVhQRVJJTUVOVEFMKTwvc3VwPilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JjZVVwZGF0ZSA9IHVzZUZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8c3dpdGNoSXRlbS5kZWZhdWx0IG9uQ2hhbmdlPXsodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShzZXR0aW5nLmlkLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH19IGtleT17c2V0dGluZy5pZH0gdmFsdWU9e3NldHRpbmdzQ29va2llW3NldHRpbmcuaWRdfSBjbGFzc05hbWU9e19fU0VDUkVUX0VNT1RJT05fXy5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfSBkaXNhYmxlZD17ZmFsc2V9IGhpZGVCb3JkZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGU9e3NldHRpbmcuaW5mb30gdG9vbHRpcE5vdGU9e251bGx9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbmZvfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zd2l0Y2hJdGVtLmRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9e3RoaXMucHJvcHMudGl0bGV9PlxuICAgICAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPlxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzVGl0bGUgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4vL2gyLTJnV0UtbyB0aXRsZS0zc1pXWVEgc2l6ZTE2LTE0Y0d6NSBoZWlnaHQyMC1tTzJlSU4gd2VpZ2h0U2VtaUJvbGQtTkpleHppIGRhLWgyIGRhLXRpdGxlIGRhLXNpemUxNiBkYS1oZWlnaHQyMCBkYS13ZWlnaHRTZW1pQm9sZCBkZWZhdWx0Q29sb3ItMV9halgwIGRhLWRlZmF1bHRDb2xvciBtYXJnaW5Ub3A2MC0zUEdidEsgZGEtbWFyZ2luVG9wNjAgbWFyZ2luQm90dG9tMjAtMzJxSUQ3IGRhLW1hcmdpbkJvdHRvbTIwXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xuXG5sZXQgY2xhc3NuYW1lcyA9IFtdXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUobmFtZSl7XG4gICAgbGV0IGNsYXNzTmFtZSA9IGNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChuYW1lK1wiLVwiKSlcbiAgICBpZihjbGFzc05hbWUpcmV0dXJuIGNsYXNzTmFtZVxuICAgIGNsYXNzTmFtZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlW25hbWVdKVswXVtuYW1lXVxuICAgIGNsYXNzbmFtZXMucHVzaChjbGFzc05hbWUpXG4gICAgcmV0dXJuIGNsYXNzTmFtZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2hJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgdGhpcy5wcm9wcy5jaGVja2VkKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XG4gICAgICAgIGlmKHRoaXMucHJvcHMuZGF0YS5leHBlcmltZW50YWwpe1xuICAgICAgICAgICAgaWYoIWNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChcImJldGEtXCIpKSl7XG4gICAgICAgICAgICAgICAgY2xhc3NuYW1lcy5wdXNoKEJETW9kdWxlcy5nZXQoZSA9PiBlLmJldGEgJiYgKCFlLmNvbnRhaW5lciAmJiAhZS51c2VyU2V0dGluZ3NWb2ljZSkpWzBdLmJldGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmZvID0gW1xuICAgICAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInN1cFwiLCB7Y2xhc3NOYW1lOiBnZXRDbGFzc05hbWUoXCJiZXRhXCIpfSwgXCIoRVhQRVJJTUVOVEFMKVwiKVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtdmVydGljYWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcCB1aS1zd2l0Y2gtaXRlbVwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC1ob3Jpem9udGFsIGZsZXgtanVzdGlmeS1zdGFydCBmbGV4LWFsaWduLXN0cmV0Y2ggZmxleC1ub3dyYXBcIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2tleTogXCJ0aXRsZVwiLCBjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMyBtYXJnaW4tcmVzZXQgbWFyZ2luLXJlc2V0IHVpLWZsZXgtY2hpbGRcIn0sIHRleHQpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtrZXk6IFwic3dpdGNoXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJTZXBhcmF0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1zZXBhcmF0b3IgbWFyZ2luLXRvcC04IG1hcmdpbi1ib3R0b20tOFwifSk7XHJcbiAgICB9XHJcbn0iLCIvKipcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cbiAqIFdpbGwgYWxzbyByZW1vdmUgdGhlbXNlbHZlcyBpZiB0aGUgbm9kZSB0byB3YXRjaCBpcyByZW1vdmVkIGZyb20gRE9NIHRocm91Z2hcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cbiAqXG4gKiBOb3RlIHRoaXMgaXMgbm90IHVzaW5nIERpc2NvcmQncyBpbnRlcm5hbHMgYnV0IG5vcm1hbCBET00gbWFuaXB1bGF0aW9uIGFuZCBlbXVsYXRlc1xuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxuICpcbiAqIEBtb2R1bGUgRW11bGF0ZWRUb29sdGlwXG4gKiBAdmVyc2lvbiAwLjAuMVxuICovXG5cbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XG5sZXQgVG9vbHRpcENsYXNzZXNcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XG59XG5sZXQgVG9vbHRpcExheWVyc1xuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xufVxuXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xuICAgIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XG59O1xuXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxqUXVlcnkpfSBub2RlIC0gRE9NIG5vZGUgdG8gbW9uaXRvciBhbmQgc2hvdyB0aGUgdG9vbHRpcCBvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1ibGFja10gLSBjb3JyZWxhdGVzIHRvIHRoZSBkaXNjb3JkIHN0eWxpbmcvY29sb3JzIChibGFjaywgYnJhbmQsIGdyZWVuLCBncmV5LCByZWQsIHllbGxvdylcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGJlIGRpc2FibGVkIGZyb20gc2hvd2luZyBvbiBob3ZlclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0YWNoRXZlbnRzPXRydWVdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgbGlzdGVuIHRvIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxuXHQgKi9cblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZSwgYXR0YWNoRXZlbnRzID0gdHJ1ZX0gPSBvcHRpb25zO1xuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xuXHRcdFxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcblxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XG5cblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxuXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XG5cblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XG5cblx0XHRpZihhdHRhY2hFdmVudHMpe1xuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblx0XHRcdFx0dGhpcy5zaG93KCk7XG5cdFxuXHRcdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcblx0XHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKHRoaXMubm9kZSkgPiAtMTtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xuXHRcdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcblx0XHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XG5cdFx0XHR9KTtcblx0XG5cdFx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmhpZGUoKTtcblx0XHRcdH0pO1xuXHRcdH1cbiAgICB9XG5cbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgXG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cykrXCIgfiAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyKSk7IFxuXHR9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBiZWxvdyB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93TGVmdCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoID49IDA7IH1cbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cblxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cblx0aGlkZSgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcblx0fVxuXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXG5cdHNob3coKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xuXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcblx0XHRcdGVsc2UgdGhpcy5zaG93QmVsb3coKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaWRlID09IFwiYm90dG9tXCIpIHtcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcblx0XHRcdGlmICh0aGlzLmNhblNob3dMZWZ0IHx8ICghdGhpcy5jYW5TaG93TGVmdCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93TGVmdCgpO1xuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcblx0XHRcdGVsc2UgdGhpcy5zaG93TGVmdCgpO1xuXHRcdH1cblx0fVxuXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXG5cdHNob3dBYm92ZSgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJ0b3BcIikpO1xuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xuXHR9XG5cbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cblx0c2hvd0JlbG93KCkge1xuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XG5cdH1cblxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLiAqL1xuXHRzaG93TGVmdCgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLSAxMCkpO1xuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xuXHR9XG5cbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXG5cdHNob3dSaWdodCgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJyaWdodFwiKSk7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcblx0fVxuXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcbiAgICAgICAgY29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKHRoaXMubm9kZS5vZmZzZXRXaWR0aCAvIDIpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xuXHR9XG5cblx0Y2VudGVyVmVydGljYWxseSgpIHtcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMikpKTtcblx0fVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi90b29sdGlwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XG4gICAgICAgIHRoaXMubm9kZSA9IEJEVjIucmVhY3REb20uZmluZERPTU5vZGUodGhpcyk7XG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRvb2x0aXA7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19YU3ZnIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge3htbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDEyIDEyXCIsIHN0eWxlOiB7d2lkdGg6IFwiMThweFwiLCBoZWlnaHQ6IFwiMThweFwifX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZ1wiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJiYWNrZ3JvdW5kXCIsIGZpbGw6IFwibm9uZVwiLCBmaWxsUnVsZTogXCJldmVub2RkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMCAwaDEydjEySDBcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7Y2xhc3NOYW1lOiBcImZpbGxcIiwgZmlsbDogXCIjZGNkZGRlXCIsIGQ6IFwiTTkuNSAzLjIwNUw4Ljc5NSAyLjUgNiA1LjI5NSAzLjIwNSAyLjVsLS43MDUuNzA1TDUuMjk1IDYgMi41IDguNzk1bC43MDUuNzA1TDYgNi43MDUgOC43OTUgOS41bC43MDUtLjcwNUw2LjcwNSA2XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibW9kdWxlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGUtZmV0Y2hcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/BetterDiscordApp/dist/index.min.js b/BetterDiscordApp/dist/index.min.js deleted file mode 100644 index c2b7dbc..0000000 --- a/BetterDiscordApp/dist/index.min.js +++ /dev/null @@ -1,2 +0,0 @@ -module.exports=function(e){var t={};function n(s){if(t[s])return t[s].exports;var r=t[s]={i:s,l:!1,exports:{}};return e[s].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(s,r,function(t){return e[t]}.bind(null,r));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t){e.exports=require("electron")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("crypto")},function(e,t){e.exports=require("node-fetch")},function(e,t){e.exports=require("events")},function(e,t){e.exports=require("module")},function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return Us}));var s={};n.r(s),n.d(s,"minimumDiscordVersion",(function(){return r})),n.d(s,"currentDiscordVersion",(function(){return i})),n.d(s,"minSupportedVersion",(function(){return o})),n.d(s,"bbdVersion",(function(){return a})),n.d(s,"bbdChangelog",(function(){return l})),n.d(s,"settings",(function(){return c})),n.d(s,"defaultCookie",(function(){return d})),n.d(s,"settingsCookie",(function(){return h})),n.d(s,"settingsRPC",(function(){return u})),n.d(s,"defaultRPC",(function(){return p})),n.d(s,"lightcordSettings",(function(){return m})),n.d(s,"defaultLightcordSettings",(function(){return g})),n.d(s,"bdpluginErrors",(function(){return f})),n.d(s,"bdthemeErrors",(function(){return b})),n.d(s,"bdConfig",(function(){return y})),n.d(s,"bdthemes",(function(){return v})),n.d(s,"bdplugins",(function(){return w})),n.d(s,"pluginCookie",(function(){return C})),n.d(s,"themeCookie",(function(){return E}));const r="0.0.308",i=window.DiscordNative&&window.DiscordNative.remoteApp&&window.DiscordNative.remoteApp.getVersion&&window.DiscordNative.remoteApp.getVersion()||"0.0.308",o="0.3.0",a="0.3.5",l={description:"Big things are coming.",changes:[{title:"Bug Fixes",type:"fixed",items:["Some fixes related to showing modals in the `BdApi`.","Fixed the open folder buttons for plugins and themes"]}]},c={"Custom css live update":{id:"bda-css-0",info:"",implemented:!0,hidden:!0,cat:"core"},"Custom css auto udpate":{id:"bda-css-1",info:"",implemented:!0,hidden:!0,cat:"core"},"BetterDiscord Blue":{id:"bda-gs-b",info:"Replace Discord blue with BD Blue",implemented:!1,hidden:!1,cat:"core"},"Public Servers":{id:"bda-gs-1",info:"Display public servers button",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Minimal Mode":{id:"bda-gs-2",info:"Hide elements and reduce the size of elements.",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Voice Mode":{id:"bda-gs-4",info:"Only show voice chat",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Hide Channels":{id:"bda-gs-3",info:"Hide channels in minimal mode",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Dark Mode":{id:"bda-gs-5",info:"Make certain elements dark by default(wip)",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Voice Disconnect":{id:"bda-dc-0",info:"Disconnect from voice server when closing Discord",implemented:!0,hidden:!1,cat:"core",category:"modules"},"24 Hour Timestamps":{id:"bda-gs-6",info:"Replace 12hr timestamps with proper ones",implemented:!0,hidden:!1,cat:"core",category:"modules"},"Colored Text":{id:"bda-gs-7",info:"Make text color the same as role color",implemented:!0,hidden:!1,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:!0,hidden:!1,cat:"core",category:"modules"},"Content Error Modal":{id:"fork-ps-1",info:"Shows a modal with plugin/theme errors",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Scan Plugins":{id:"fork-ps-6",info:"Scan plugins for any threat that can be hidden inside.",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Show Toasts":{id:"fork-ps-2",info:"Shows a small notification for important information",implemented:!0,hidden:!1,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:!0,hidden:!1,cat:"core",category:"content manager"},"Automatic Loading":{id:"fork-ps-5",info:"Automatically loads, reloads, and unloads plugins and themes",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Enable Edit Button":{id:"fork-ps-7",info:"Enable an Edit Button on the plugin and theme panel.",implemented:!0,hidden:!1,cat:"core",category:"content manager"},"Themes in Popout Window":{id:"lightcord-9",info:"Enable themes in Popout Window. (For example, when detaching screenshare.)",implemented:!0,hidden:!1,cat:"core",category:"content manager",experimental:!0},"Developer Mode":{id:"bda-gs-8",info:"Developer Mode Toggle",implemented:!0,hidden:!1,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:!0,hidden:!1,cat:"core",category:"developer settings"},"Disable BetterDiscord":{id:"bd-disable",info:"Disable Betterdiscord (plugins, themes, etc) (Not implemented).",implemented:!1,hidden:!1,cat:"lightcord",category:"Lightcord"},"Blur Personal Information":{id:"lightcord-6",info:"Blur sensitive informations like email, payment infos and more.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Calling Ring Beat":{id:"lightcord-2",info:"Enable Discord's special calling beat.",implemented:!0,hidden:!1,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 "Lightcord Api" section.',implemented:!0,hidden:!1,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:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Enable Lightcord Servers":{id:"lightcord-5",info:"Enable Lightcord's servers. Disabling this will disable custom badges.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Disable typing":{id:"lightcord-7",info:"Don't let other see you're typing.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord"},"Lightcord Tabs":{id:"lightcord-8",info:"Allows you to launch multiple instances of Lightcord in the same window.",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord",experimental:!0},"Use Notification Shim":{id:"lightcord-10",info:"Basically don't use Windows's Notifications.",implemented:!0,hidden:"win32"!==process.platform,cat:"lightcord",category:"Lightcord"},"Emoji Prefix":{id:"lightcord-11",info:"Change the prefix used for free nitros emojis. Please put only one character. Default: .",implemented:!0,hidden:!1,cat:"lightcord",category:"Lightcord",default:"."},"Always-on-Top":{id:"lightcord-3",info:"Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.",implemented:!0,hidden:!1,cat:"lightcord",category:"Window"},"No Window Bounds":{id:"no_window_bound",info:"Disable Window Bounds. Can be useful if you use a window manager.",implemented:!0,hidden:"linux"!==process.platform,cat:"lightcord",category:"Window"},"Enable Glasstron":{id:"enable_glasstron",info:"Enable Glasstron. If you're not using transparent themes, this can reduce lag.",implemented:!0,hidden:!1,cat:"lightcord",category:"Window"},Enable:{id:"lightcord-presence-1",info:"Enable RichPresence below.",implemented:!0,hidden:!1,cat:"status"}},d={"bda-gs-1":!0,"bda-gs-2":!1,"bda-gs-3":!1,"bda-gs-4":!1,"bda-gs-5":!0,"bda-gs-6":!1,"bda-gs-7":!1,"bda-gs-8":!1,"bda-es-0":!0,"bda-es-1":!0,"bda-es-2":!0,"bda-es-4":!1,"bda-es-6":!0,"bda-es-7":!0,"bda-gs-b":!1,"bda-es-8":!0,"bda-dc-0":!1,"bda-css-0":!1,"bda-css-1":!1,"bda-es-9":!0,"fork-dm-1":!1,"fork-ps-1":!0,"fork-ps-2":!0,"fork-ps-3":!0,"fork-ps-4":!0,"fork-ps-5":!0,"fork-ps-6":!0,"fork-ps-7":!1,"fork-es-2":!1,"fork-es-3":!0,"fork-wp-1":!1,"fork-wp-2":!1,"fork-beta":!0,"lightcord-1":!1,"lightcord-2":!0,"lightcord-presence-1":!1,"lightcord-3":!1,"lightcord-4":!1,"lightcord-5":!0,"lightcord-6":!0,"lightcord-7":!1,"lightcord-8":!1,"lightcord-9":!1,"lightcord-10":!1,no_window_bound:!1},h={},u={},p={name:"Lightcord",application_id:"711416957718757418",state:"Lightcord Client",details:"Browsing Discord","timestamps.start":Date.now(),"assets.small":null,"assets.large":"712323821037682791"},m={},g={},f=[],b=[],y=Object.create(BetterDiscordConfig),v={},w={},C={},E={},S=webpackJsonp.push([[],{__extra_id__:(e,t,n)=>e.exports=n},[["__extra_id__"]]]);delete S.m.__extra_id__,delete S.c.__extra_id__;const x=e=>{for(const t in S.c)if(S.c.hasOwnProperty(t)){const n=S.c[t].exports;if(n&&n.__esModule&&n.default&&e(n.default))return n.default;if(n&&e(n))return n}return null};let k={find:x,findAll:e=>{const t=[];for(const n in S.c)if(S.c.hasOwnProperty(n)){const s=S.c[n].exports;s&&s.__esModule&&s.default&&e(s.default)?t.push(s.default):s&&e(s)&&t.push(s)}return t},findByProps:(...e)=>x(t=>e.every(e=>void 0!==t[e])),findByPrototypes:(...e)=>x(t=>t.prototype&&e.every(e=>void 0!==t.prototype[e])),findByDisplayName:e=>x(t=>t.displayName===e)};var D=k;window.Lightcord.BetterDiscord.WebpackModules=k;const M=n(2),B=n(1),L=DiscordNative.globals?DiscordNative.globals.releaseChannel:DiscordNative.app?DiscordNative.app.getReleaseChannel():"stable";let N="";N="win32"===process.platform?process.env.APPDATA:"darwin"===process.platform?B.join(process.env.HOME,"Library","Preferences"):process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:B.join(process.env.HOME,".config"),N=B.join(N,"BetterDiscord");var A=new class{constructor(){this.data={settings:{stable:{},canary:{},ptb:{}}},this.pluginData={},window.Lightcord.BetterDiscord.DataStore=this}initialize(){try{M.existsSync(this.BDFile)||M.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8");const e=JSON.parse(M.readFileSync(this.BDFile,"utf-8"));if(e.hasOwnProperty("settings")&&(this.data=e),!M.existsSync(this.settingsFile))return;let t=require(this.settingsFile);M.unlinkSync(this.settingsFile),t=t.hasOwnProperty("settings")?Object.assign({stable:{},canary:{},ptb:{}},{[L]:t}):Object.assign({stable:{},canary:{},ptb:{}},t),this.setBDData("settings",t)}catch(e){console.error(e),Be.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}get configFile(){return this._configFile||(this._configFile=B.resolve(this.injectionPath,"betterdiscord","config.json"))}get BDFile(){return this._BDFile||(this._BDFile=B.resolve(N,"bdstorage.json"))}get settingsFile(){return this._settingsFile||(this._settingsFile=B.resolve(N,"bdsettings.json"))}getPluginFile(e){return B.resolve(Se.pluginsFolder,e+".config.json")}getSettingGroup(e){return this.data.settings[L][e]||null}setSettingGroup(e,t){this.data.settings[L][e]=t,M.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8")}getBDData(e){return this.data[e]||""}setBDData(e,t){this.data[e]=t,M.writeFileSync(this.BDFile,JSON.stringify(this.data,null,4),"utf-8")}getPluginData(e,t){return void 0!==this.pluginData[e]?this.pluginData[e][t]:M.existsSync(this.getPluginFile(e))?(this.pluginData[e]=JSON.parse(M.readFileSync(this.getPluginFile(e))),this.pluginData[e][t]):void 0}setPluginData(e,t,n){void 0!==n&&(void 0===this.pluginData[e]&&(this.pluginData[e]={}),this.pluginData[e][t]=n,M.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4),"utf-8"))}deletePluginData(e,t){void 0===this.pluginData[e]&&(this.pluginData[e]={}),delete this.pluginData[e][t],M.writeFileSync(this.getPluginFile(e),JSON.stringify(this.pluginData[e],null,4),"utf-8")}};const P=n(5);var T=new class extends P{constructor(){super(),window.Lightcord.BetterDiscord.BDEvents=this}dispatch(e,...t){this.emit(e,...t)}off(e,t){this.removeListener(e,t)}};class R{constructor(){window.Lightcord.BetterDiscord.PluginModule=this}get folder(){return Se.pluginsFolder}}R.prototype.loadPlugins=async function(){this.loadPluginData(),f.splice(0,0,...await Se.loadPlugins());const e=Object.keys(w);for(let t=0;tsetTimeout(e,10))}this.savePluginData(),n(0).remote.getCurrentWebContents().on("did-navigate-in-page",this.channelSwitch.bind(this))},R.prototype.startPlugin=function(e,t=!1){try{w[e].plugin.start(),h["fork-ps-2"]&&!t&&Be.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} has started.`)}catch(n){h["fork-ps-2"]&&!t&&Be.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} could not be started.`,{type:"error"}),C[e]=!1,this.savePluginData(),Be.err("Plugins",e+" could not be started.",n)}},R.prototype.stopPlugin=function(e,t=!1){try{w[e].plugin.stop(),h["fork-ps-2"]&&!t&&Be.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} has stopped.`)}catch(n){h["fork-ps-2"]&&!t&&Be.showToast(`${w[e].plugin.getName()} v${w[e].plugin.getVersion()} could not be stopped.`,{type:"error"}),Be.err("Plugins",w[e].plugin.getName()+" could not be stopped.",n)}},R.prototype.enablePlugin=function(e,t=!1){C[e]||(C[e]=!0,this.savePluginData(),this.startPlugin(e,t))},R.prototype.enable=function(e,t=!1){return this.enablePlugin(e,t)},R.prototype.disablePlugin=function(e,t=!1){C[e]&&(C[e]=!1,this.savePluginData(),this.stopPlugin(e,t))},R.prototype.disable=function(e,t=!1){return this.disablePlugin(e,t)},R.prototype.togglePlugin=function(e){C[e]?this.disablePlugin(e):this.enablePlugin(e)},R.prototype.toggle=function(e,t=!1){return this.togglePlugin(e,t)},R.prototype.loadPlugin=async function(e){const t=await Se.loadContent(e,"plugin");if(t)return h["fork-ps-1"]&&Be.showContentErrors({plugins:[t]}),h["fork-ps-2"]&&Be.showToast(e+" could not be loaded.",{type:"error"}),Be.err("ContentManager",e+" could not be loaded.",t);const n=Object.values(w).find(t=>console.log(t.filename,e)||t.filename==e).plugin;try{n.load&&"function"==typeof n.load&&n.load()}catch(e){h["fork-ps-1"]&&Be.showContentErrors({plugins:[e]})}Be.log("ContentManager",`${n.getName()} v${n.getVersion()} was loaded.`),h["fork-ps-2"]&&Be.showToast(`${n.getName()} v${n.getVersion()} was loaded.`,{type:"success"}),T.dispatch("plugin-loaded",n.getName())},R.prototype.unloadPlugin=function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return;const n=t.plugin.getName();C[n]&&this.disablePlugin(n,!0);const s=Se.unloadContent(w[n].filename,"plugin");if(delete w[n],s)return h["fork-ps-1"]&&Be.showContentErrors({plugins:[s]}),h["fork-ps-2"]&&Be.showToast(n+" could not be unloaded. It may have not been loaded yet.",{type:"error"}),Be.err("ContentManager",n+" could not be unloaded. It may have not been loaded yet.",s);Be.log("ContentManager",n+" was unloaded."),h["fork-ps-2"]&&Be.showToast(n+" was unloaded.",{type:"success"}),T.dispatch("plugin-unloaded",n)},R.prototype.delete=function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return;this.unloadPlugin(t.filename);const s=n(1).resolve(Se.pluginsFolder,t.filename);n(2).unlinkSync(s)},R.prototype.reloadPlugin=async function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return this.loadPlugin(e);const n=t.plugin.getName(),s=C[n];s&&this.stopPlugin(n,!0);const r=await Se.reloadContent(w[n].filename,"plugin");if(r)return h["fork-ps-1"]&&Be.showContentErrors({plugins:[r]}),h["fork-ps-2"]&&Be.showToast(n+" could not be reloaded.",{type:"error"}),Be.err("ContentManager",n+" could not be reloaded.",r);w[n].plugin.load&&"function"==typeof w[n].plugin.load&&w[n].plugin.load(),s&&this.startPlugin(n,!0),Be.log("ContentManager",`${n} v${w[n].plugin.getVersion()} was reloaded.`),h["fork-ps-2"]&&Be.showToast(`${n} v${w[n].plugin.getVersion()} was reloaded.`,{type:"success"}),T.dispatch("plugin-reloaded",n)},R.prototype.reload=function(e){return this.reloadPlugin(e)},R.prototype.edit=function(e){const t=Object.values(w).find(t=>t.filename==e)||w[e];if(!t)return;const s=n(1).resolve(Se.pluginsFolder,t.filename);n(0).shell.openExternal(""+s)},R.prototype.updatePluginList=function(){const e=Se.loadNewContent("plugin");for(const t of e.added)this.loadPlugin(t);for(const t of e.removed)this.unloadPlugin(t)},R.prototype.loadPluginData=function(){const e=A.getSettingGroup("plugins");e&&Object.assign(C,e)},R.prototype.savePluginData=function(){A.setSettingGroup("plugins",C)},R.prototype.newMessage=function(){const e=Object.keys(w);for(let t=0;t{if(this.disabled)return;this.show();const e=new MutationObserver(t=>{t.forEach(t=>{const n=Array.from(t.removedNodes),s=n.indexOf(this.node)>-1,r=n.some(e=>e.contains(this.node));(s||r)&&(this.hide(),e.disconnect())})});e.observe(document.body,{subtree:!0,childList:!0})}),this.node.addEventListener("mouseleave",()=>{this.hide()}))}get container(){return document.querySelector("."+Be.removeDa(BDModules.get(e=>e.popouts)[0].popouts)+" ~ ."+Be.removeDa(BDModules.get(e=>e.layerContainer)[0].layerContainer))}get canShowAbove(){return this.node.getBoundingClientRect().top-this.element.offsetHeight>=0}get canShowBelow(){return this.node.getBoundingClientRect().top+this.node.offsetHeight+this.element.offsetHeight<=Be.screenHeight}get canShowLeft(){return this.node.getBoundingClientRect().left-this.element.offsetWidth>=0}get canShowRight(){return this.node.getBoundingClientRect().left+this.node.offsetWidth+this.element.offsetWidth<=Be.screenWidth}hide(){this.element.remove(),this.tooltipElement.className=this._className}show(){this.tooltipElement.className=`${H().tooltip} ${z(this.style)}`,this.labelElement.textContent=this.label,this.container.append(this.element),"top"==this.side&&(this.canShowAbove||!this.canShowAbove&&this.preventFlip?this.showAbove():this.showBelow()),"bottom"==this.side&&(this.canShowBelow||!this.canShowBelow&&this.preventFlip?this.showBelow():this.showAbove()),"left"==this.side&&(this.canShowLeft||!this.canShowLeft&&this.preventFlip?this.showLeft():this.showRight()),"right"==this.side&&(this.canShowRight||!this.canShowRight&&this.preventFlip?this.showRight():this.showLeft())}showAbove(){this.tooltipElement.classList.add(z("top")),this.element.style.setProperty("top",q(this.node.getBoundingClientRect().top-this.element.offsetHeight-10)),this.centerHorizontally()}showBelow(){this.tooltipElement.classList.add(z("bottom")),this.element.style.setProperty("top",q(this.node.getBoundingClientRect().top+this.node.offsetHeight+10)),this.centerHorizontally()}showLeft(){this.tooltipElement.classList.add(z("left")),this.element.style.setProperty("left",q(this.node.getBoundingClientRect().left-this.element.offsetWidth-10)),this.centerVertically()}showRight(){this.tooltipElement.classList.add(z("right")),this.element.style.setProperty("left",q(this.node.getBoundingClientRect().left+this.node.offsetWidth+10)),this.centerVertically()}centerHorizontally(){const e=this.node.getBoundingClientRect().left+this.node.offsetWidth/2;this.element.style.setProperty("left",q(e-this.element.offsetWidth/2))}centerVertically(){const e=this.node.getBoundingClientRect().top+this.node.offsetHeight/2;this.element.style.setProperty("top",q(e-this.element.offsetHeight/2))}}var J=class extends React.Component{constructor(e){super(e)}async componentDidMount(){const{style:e="black",side:t="top",text:n=""}=this.props;this.node=Me.reactDom.findDOMNode(this),this.tooltip=new V(this.node,n,{style:e,side:t})}componentWillUnmount(){this.tooltip.hide(),delete this.tooltip}render(){return this.props.children}},Y=n(2),Z=n(1);const K={},X={};var Q=new class{constructor(){window.Lightcord.BetterDiscord.PluginCertifier=this}patch(e,t){process.nextTick(()=>{!function(e,t){if(!document.getElementById(t))return;if(!e.url.startsWith("https://cdn.discordapp.com/"))return document.getElementById(t).remove();if(!e.filename.endsWith(".plugin.js")&&!e.filename.endsWith(".theme.css"))return document.getElementById(t).remove();j()(e.url,{headers:{"User-Agent":I.ipcRenderer.sendSync("LIGHTCORD_GET_USER_AGENT")}}).then(n=>{if(200!==n.status)throw new Error("File doesn't exist.");const s=$.createHash("sha256");let r=Buffer.alloc(0);n.body.on("data",e=>{r=Buffer.concat([r,e]),s.update(e)}),n.body.on("end",()=>{const n=s.digest("hex");X[e.url]=n,se[n]=e.url,re(n,r,e.filename,n=>{!function(e,t,n){const s=document.getElementById(e);if(!s||s.childNodes.length>0)return;oe||(oe=BDModules.get(e=>e.flowerStarContainer)[0]);ae||(ae=BDModules.get(e=>e.childContainer)[0]);if(t.suspect){try{s.parentNode.style.borderColor="rgb(240, 71, 71)";let e=s=>{for(let r of s.children)"A"===r.tagName?r.addEventListener("click",e=>{e.preventDefault(),e.stopImmediatePropagation(),Be.showConfirmationModal("Are you sure you want to download this ?","The "+t.type.toLowerCase()+" **"+n+"** might be dangerous **("+t.harm+")**. \n\n**We don't recommand to download it**. However, you can still do it below.",{confirmText:"Download Anyway",cancelText:"Don't !",danger:!0,onCancel:()=>{},onConfirm:()=>{I.ipcRenderer.sendSync("LIGHTCORD_OPEN_EXTERNAL",r.href)}})}):["div"].includes(r.tagName.toLowerCase())&&e(r)};e(s.parentNode)}catch(e){console.error(e)}Me.reactDom.render(Me.react.createElement(J,{text:t.type+" "+t.name+" is potentially dangerous."},Me.react.createElement("div",{className:oe.flowerStarContainer,style:{width:"20px",height:"20px"}},Me.react.createElement("svg",{className:BDModules.get(e=>e.svg)[0].svg,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 40 32"},Me.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})))),s)}else if(t.official){s.parentNode.style.borderColor="#4087ed";let e=Me.react.createElement("span",{style:{display:"inherit"}},[Me.react.createElement(J,{text:t.type+" "+t.name+" was made by the developers of Lightcord.",style:"brand"},Me.react.createElement("div",{className:oe.flowerStarContainer,style:{width:"20px",height:"20px",float:"left"}},Me.react.createElement("svg",{className:oe.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2",stroke:"#36393f",style:{color:"#4087ed"}},Me.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"})),Me.react.createElement("div",{className:ae.childContainer},Me.react.createElement("svg",{"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},Me.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"}))))),Me.react.createElement(J,{text:"Install this "+t.type.toLowerCase()+" on Lightcord."},Me.react.createElement("div",{className:oe.flowerStarContainer,style:{width:"20px",height:"20px"},onClick(){Be.showConfirmationModal("Are you sure you want to download this "+t.type.toLowerCase()+" ?","Lightcord will automatically download and load this "+t.type.toLowerCase()+". You must enable it in the settings.",{confirmText:"Download and Install",cancelText:"I've changed my mind",danger:!1,onCancel:()=>{},onConfirm:()=>{let e=le(X).find(e=>e[1]===t.hash)[0];j()(e).then(async e=>{if(200!==e.status)throw new Error("Status was not 200");let n=await e.buffer(),s=Object(Z.join)("Plugin"===t.type?Se._pluginsFolder:Se._themesFolder,t.filename);Object(Y.writeFileSync)(s,n),Be.showToast(t.type+" succesfully installed.")}).catch(e=>{e=e instanceof Error?e:new Error(e),Be.showToast(e.message,{type:"error"})})}})}},Me.react.createElement("svg",{className:oe.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"})))))]);Me.reactDom.render(e,s)}else{s.parentNode.style.borderColor="#4087ed";let e=Me.react.createElement("span",{style:{display:"inherit"}},[Me.react.createElement(J,{text:t.type+" "+t.name+" is certified by Lightcord."},Me.react.createElement("div",{className:oe.flowerStarContainer,style:{width:"20px",height:"20px",float:"left"}},Me.react.createElement("svg",{className:oe.flowerStar,"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},Me.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"})),Me.react.createElement("div",{className:ae.childContainer},Me.react.createElement("svg",{"aria-hidden":"false",width:"20px",height:"20px",viewBox:"0 0 16 15.2"},Me.react.createElement("path",{fill:"#ffffff",d:"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"}))))),Me.react.createElement(J,{text:"Install this "+t.type.toLowerCase()+" on Lightcord."},Me.react.createElement("div",{className:oe.flowerStarContainer,style:{width:"20px",height:"20px"},onClick(){Be.showConfirmationModal("Are you sure you want to download this "+t.type.toLowerCase()+" ?","Lightcord will automatically install and launch this "+t.type.toLowerCase()+". You don't have anything to do.",{confirmText:"Download and Install",cancelText:"I've changed my mind",danger:!1,onCancel:()=>{},onConfirm:()=>{let e=le(X).find(e=>e[1]===t.hash)[0];console.log(e),j()(e).then(async e=>{if(200!==e.status)throw new Error("Status was not 200");let n=await e.buffer(),s=Object(Z.join)("Plugin"===t.type?Se._pluginsFolder:Se._themesFolder,t.filename);console.log(s),Object(Y.writeFileSync)(s,n),Be.showToast(t.type+" succesfully installed.")}).catch(e=>{e=e instanceof Error?e:new Error(e),Be.showToast(e.message,{type:"error"})})}})}},Me.react.createElement("svg",{className:oe.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"})))))]);Me.reactDom.render(e,s)}}(t,n,e.filename)},()=>{let e=document.getElementById(t);e&&e.remove()})})}).catch(()=>{})}(e,t)})}start(){}isTrusted(e){return K[e]&&!K[e].suspect}};const ee=[[/token/gi,0,0],[/email/gi,0,0],[/mfa\./gi,0,0],[/2fa/gi,0,0],[/phone/gi,0,0],[/child_process/gi,0,0],[/localStorage/gi,0,0],[/getGlobal/gi,0,0],[/BrowserWindow/gi,0,0],[/system32/gi,0,0],[/password/gi,0,0],[/eval/gi,0,0],[/WebAssembly/gi,0,0],[/XMLHttpRequest(\.|\[["'`])prototype/gi,0,0],[/window\.fetch( +)?=/gi,0,0],[/(["'`]\+)["'`]\w["'`]/gi,1,1],[/["'`]\w["'`](\+["'`])/gi,1,1],[/\${["'`]\w+["'`]}/gi,1,1],[/_0x\w{4}\('0x[\dabcdef]+'\)/g,1,1],[/_0x\w{4}\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g,1,1],[/\w+\('0x[\dabcdef]+'\)/g,1,1],[/\w+\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g,1,1],[/^var [\w\d_$]+=\["/gi,1,1]],te=["Account Stealer/Virus","Obfuscation/Hidden code"];function ne(e,t,n,s,r){let i=!1;const o=(t=t.toString("utf8")).replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm,"").trim();for(const[n,s,r]of ee){const a=1===r?o:t;if(n.exec(a)){i=te[s],console.log(se[e].split("/").pop()+" failed at test",n,". Marked as",te[s]);break}}if(!i)return s(e);K[e]={suspect:!0,name:se[e].split("/").pop(),type:se[e].endsWith(".js")?"Plugin":"Theme",harm:i,hash:e,filename:r},console.log(`Found potentially dangerous ${K[e].type.toLowerCase()}: ${K[e].name}`),n(K[e])}const se={};function re(e,t,n,s,r){if(console.log(`File: ${n} hash: ${e}`),K[e]){const t=K[e];s(t)}else j()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/"+e,{headers:{"User-Agent":I.ipcRenderer.sendSync("LIGHTCORD_GET_USER_AGENT")}}).then(async i=>{if(200!==i.status){if(n.endsWith(".theme.css"))return r(e);try{ne(e,t,s,r,n)}catch(e){console.error(e),r()}return}const o=await i.json();o.hash=e,o.filename=n,K[e]=o,s(o)}).catch(i=>{if(console.error("Could not read from github. "+i),n.endsWith(".theme.css"))return r(e);ne(e,t,s,r,n)})}function ie(e,t,n=(e=>{}),s=!1){const r=$.createHash("sha256");let i=Buffer.alloc(0);Object(Y.createReadStream)(e).on("data",e=>{i=Buffer.concat([i,e]),r.update(e)}).on("end",()=>{const o=r.digest("hex");if(se[o]=e,s&&Ce[o]){let e=Ce[o];if(!(e.timestampe.flowerStarContainer)[0],ae=BDModules.get(e=>e.childContainer)[0];function le(e){let t=[];return Object.keys(e).forEach(n=>{t.push([n,e[n]])}),t}let ce=null,de=null;function he(){ce=[$.randomBytes(16).toString("base64"),$.randomBytes(32).toString("base64")]}function ue(e){let t=[Buffer.from(ce[1],"base64"),Buffer.from(ce[0],"base64")],n=$.createCipheriv("aes-256-cbc",...t),s=n.update(Buffer.from(e,"utf8"));return s=Buffer.concat([s,n.final()]),s.toString("base64")}window.Lightcord.Api.ensureExported(e=>e.ObjectStorage).then(e=>{let t=e.impl;de=function(){t.set("PluginCertifierKeyEncryption__",btoa(JSON.stringify(ce)))},setInterval(()=>{de()},1e5);try{let e=function(e){try{return JSON.parse(e)}catch(e){return e instanceof Error?new Error(e):e}}(atob(t.get("PluginCertifierKeyEncryption__")));if(e instanceof Error||!Array.isArray(e)||2!==e.length||e.find(e=>"string"!=typeof e)||16!==Buffer.from(e[0],"base64").length||32!==Buffer.from(e[1],"base64").length)return he(),void de();ce=e}catch(e){he(),de()}});const pe=n(1),me=n(2),ge=n(6).Module;ge.globalPaths.push(pe.resolve(I.ipcRenderer.sendSync("LIGHTCORD_GET_APP_PATH"),"node_modules"));class fe extends Error{constructor(e){super(e),this.name="MetaError"}}const be=ge._extensions[".js"],ye=ge._extensions[".css"]?ge._extensions[".css"]:()=>null,ve=/[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/,we=/^\\@/;let Ce={},Ee=!1;var Se=new class{constructor(){this.timeCache={},this.watchers={}}patchExtensions(){Ee||(Ee=!0,ge._extensions[".js"]=this.getContentRequire("plugin"),ge._extensions[".css"]=this.getContentRequire("theme"))}get pluginsFolder(){return this._pluginsFolder||(this._pluginsFolder=me.realpathSync(pe.resolve(y.dataPath+"plugins/")))}get themesFolder(){return this._themesFolder||(this._themesFolder=me.realpathSync(pe.resolve(y.dataPath+"themes/")))}loadAddonCertifierCache(){if("string"!=typeof A.getSettingGroup("PluginCertifierHashes"))A.setSettingGroup("PluginCertifierHashes",ue("{}"));else try{Ce=JSON.parse(function(e){try{let t=$.createDecipheriv("aes-256-cbc",Buffer.from(ce[1],"base64"),Buffer.from(ce[0],"base64")),n=t.update(Buffer.from(e,"base64"));return n=Buffer.concat([n,t.final()]),n.toString("utf8")}catch(e){return"{}"}}(A.getSettingGroup("PluginCertifierHashes")))}catch(e){A.setSettingGroup("PluginCertifierHashes",ue("{}")),Ce={}}Object.keys(Ce).forEach(e=>{let t=Ce[e];if(!t||"object"!=typeof t||Array.isArray(t))return delete Ce[e];let n=[{key:"timestamp",type:"number"},{key:"result",type:"object"},{key:"hash",type:"string"}];for(let s of n)if(!(s.key in t)||typeof t[s.key]!==s.type)return void delete Ce[e];t.hash===e?t.result.suspect&&delete Ce[e]:delete Ce[e]}),this.saveAddonCache()}saveAddonCache(){A.setSettingGroup("PluginCertifierHashes",ue(JSON.stringify(Ce)))}watchContent(e){if(this.watchers[e])return;const t="plugin"===e,n=t?this.pluginsFolder:this.themesFolder,s=t?".plugin.js":".theme.css";this.watchers[e]=me.watch(n,{persistent:!1},async(e,r)=>{if(!e||!r||!r.endsWith(s))return;await new Promise(e=>setTimeout(e,50));try{me.statSync(pe.resolve(n,r))}catch(e){if("ENOENT"!==e.code)return;return delete this.timeCache[r],t?O.unloadPlugin(r):De.unloadTheme(r)}if(!me.statSync(pe.resolve(n,r)).isFile())return;const i=me.statSync(pe.resolve(n,r));i&&i.mtime&&i.mtime.getTime()&&"number"==typeof i.mtime.getTime()&&this.timeCache[r]!=i.mtime.getTime()&&(this.timeCache[r]=i.mtime.getTime(),"rename"==e&&(t?await O.loadPlugin(r):await De.loadTheme(r)),"change"==e&&(t?await O.reloadPlugin(r):await De.reloadTheme(r)))})}unwatchContent(e){this.watchers[e]&&(this.watchers[e].close(),delete this.watchers[e])}extractMeta(e){const t=e.split("\n")[0];if(t.includes("//META"))return this.parseOldMeta(e);if(t.includes("/**"))return this.parseNewMeta(e);throw new fe("META was not found.")}parseOldMeta(e){const t=e.split("\n")[0],n=t.substring(t.lastIndexOf("//META")+6,t.lastIndexOf("*//"));if(t.indexOf("META")<0)throw new fe("META was not found.");const s=Be.testJSON(n);if(!s)throw new fe("META could not be parsed.");if(!s.name)throw new fe("META missing name data.");return s.format="json",s}parseNewMeta(e){const t=e.split("/**",2)[1].split("*/",1)[0],n={};let s="",r="";for(const e of t.split(ve))if(0!==e.length)if("@"===e.charAt(0)&&" "!==e.charAt(1)){n[s]=r;const t=e.indexOf(" ");s=e.substr(1,t-1),r=e.substr(t+1)}else r+=" "+e.replace("\\n","\n").replace(we,"@");return n[s]=r.trim(),delete n[""],n.format="jsdoc",n}getContentRequire(e){const t="plugin"===e,n=this,s=t?be:ye;return function(e,r){const i=t?n.pluginsFolder:n.themesFolder,o=pe.resolve(i,pe.basename(r));if(!me.existsSync(o)||r!==me.realpathSync(o))return Reflect.apply(s,this,arguments);let a=me.readFileSync(r,"utf8");a=Be.stripBOM(a);const l=me.statSync(r),c=n.extractMeta(a);if(c.filename=pe.basename(r),c.added=l.atimeMs,c.modified=l.mtimeMs,c.size=l.size,t||(c.css=a,"json"==c.format&&(c.css=c.css.split("\n").slice(1).join("\n")),a=`module.exports = ${JSON.stringify(c)};`),t){e._compile(a,e.filename);!Be.isEmpty(e.exports)?(c.type=e.exports,e.exports=c,a=""):(Be.warn("Module Not Exported",c.name+", please start setting module.exports"),a+=`\nmodule.exports = ${JSON.stringify(c)};\nmodule.exports.type = ${c.exports||c.name};`)}e._compile(a,r)}}makePlaceholderPlugin(e){return{plugin:{start:()=>{},getName:()=>e.name||e.filename,getAuthor:()=>"???",getDescription:()=>e.message?e.message:"This plugin was unable to be loaded. Check the author's page for updates.",getVersion:()=>"???"},name:e.name||e.filename,filename:e.filename,source:e.source?e.source:"",website:e.website?e.website:""}}async loadContent(e,t){if(void 0===e||void 0===t)return;const n="plugin"===t,s=n?this.pluginsFolder:this.themesFolder;if(h["fork-ps-6"]){let t=await new Promise(t=>{ie(pe.resolve(s,e),e=>{console.log(e),t(e)},n=>{t({suspect:!1,hash:n,filename:e,name:e})},!0)});if(t&&(Ce[t.hash]={timestamp:Date.now(),hash:t.hash,result:t},this.saveAddonCache(),t.suspect))return{name:e,file:e,message:"This plugin might be dangerous ("+t.harm+").",error:new Error("This plugin might be dangerous ("+t.harm+").")}}try{require(pe.resolve(s,e))}catch(t){return{name:e,file:e,message:"Could not be compiled.",error:{message:t.message,stack:t.stack}}}const r=require(pe.resolve(s,e));if(!r.name)return{name:e,file:e,message:"Cannot escape the ID.",error:new Error("Cannot read property 'replace' of undefined")};if(r.id=Be.escapeID(r.name),n){if(!r.type)return;try{r.plugin=new r.type,delete w[r.plugin.getName()],w[r.plugin.getName()]=r}catch(t){return{name:e,file:e,message:"Could not be constructed.",error:{message:t.message,stack:t.stack}}}}else delete v[r.name],v[r.name]=r}unloadContent(e,t){if(void 0===e||void 0===t)return;const n="plugin"===t?this.pluginsFolder:this.themesFolder;try{delete require.cache[require.resolve(pe.resolve(n,e))]}catch(t){return{name:e,file:e,message:"Could not be unloaded.",error:{message:t.message,stack:t.stack}}}}isLoaded(e,t){const n="plugin"===t?this.pluginsFolder:this.themesFolder;try{require.cache[require.resolve(pe.resolve(n,e))]}catch(e){return!1}return!0}async reloadContent(e,t){const n=this.unloadContent(e,t);return n||await this.loadContent(e,t)}loadNewContent(e){const t="plugin"===e,n=t?".plugin.js":".theme.css",s=t?this.pluginsFolder:this.themesFolder,r=me.readdirSync(s),i=Object.values(t?w:v),o=i.filter(e=>!r.includes(e.filename)).map(e=>t?e.plugin.getName():e.name);return{added:r.filter(e=>!i.find(t=>t.filename==e)&&e.endsWith(n)&&me.statSync(pe.resolve(s,e)).isFile()),removed:o}}async loadAllContent(e){this.patchExtensions();const t="plugin"===e,n=t?".plugin.js":".theme.css",s=t?this.pluginsFolder:this.themesFolder,r=[],i=me.readdirSync(s);for(const t of i){if(!me.statSync(pe.resolve(s,t)).isFile()||!t.endsWith(n))continue;const i=await this.loadContent(t,e);i&&r.push(i)}return r}loadPlugins(){return this.loadAllContent("plugin")}loadThemes(){return this.loadAllContent("theme")}};class xe{static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static addStyle(e,t){document.head.append(xe.createElement(``))}static removeStyle(e){const t=document.getElementById(e);t&&t.remove()}static addScript(e,t){return new Promise(n=>{const s=document.createElement("script");s.id=e,s.src=t,s.type="text/javascript",s.onload=n,document.head.append(s)})}static removeScript(e){e=this.escapeID(e);const t=document.getElementById(e);t&&t.remove()}static animate({timing:e=(e=>e),update:t,duration:n}){const s=performance.now();requestAnimationFrame((function r(i){let o=(i-s)/n;o>1&&(o=1);const a=e(o);t(a),o<1&&requestAnimationFrame(r)}))}static Q(e){const t=this.parseHTML(e);return(t instanceof NodeList?Array.from(t).some(e=>1===e.nodeType):1===t.nodeType)?t:this.query(e)}static query(e,t=document){return t.querySelector(e)}static queryAll(e,t=document){return t.querySelectorAll(e)}static parseHTML(e,t=!1){const n=document.createElement("template");n.innerHTML=e;const s=n.content.cloneNode(!0);return t?s:s.childNodes.length>1?s.childNodes:s.childNodes[0]}static createElement(e,t=!1){return this.parseHTML(e,t)}static escapeHTML(e){const t=document.createTextNode(""),n=document.createElement("span");return n.append(t),t.nodeValue=e,n.innerHTML}static addClass(e,...t){t=t.flat().filter(e=>e);for(let e=0;ee),e.classList.add(...t),e}static removeClass(e,...t){for(let e=0;ee),e.classList.remove(...t),e}static toggleClass(e,t,n){return t=t.toString().split(" ").filter(e=>e),void 0!==n?t.forEach(t=>e.classList.toggle(t,n)):t.forEach(t=>e.classList.toggle(t)),e}static hasClass(e,t){return t.toString().split(" ").filter(e=>e).every(t=>e.classList.contains(t))}static replaceClass(e,t,n){return e.classList.replace(t,n),e}static appendTo(e,t){return"string"==typeof t&&(t=this.query(t)),t?(t.append(e),e):null}static prependTo(e,t){return"string"==typeof t&&(t=this.query(t)),t?(t.prepend(e),e):null}static insertAfter(e,t){return t.parentNode.insertBefore(e,t.nextSibling),e}static after(e,t){return e.parentNode.insertBefore(t,e.nextSibling),e}static next(e,t=""){return t?e.querySelector("+ "+t):e.nextElementSibling}static nextAll(e){return e.querySelectorAll("~ *")}static nextUntil(e,t){const n=[];for(;e.nextElementSibling&&!e.nextElementSibling.matches(t);)n.push(e=e.nextElementSibling);return n}static previous(e,t=""){const n=e.previousElementSibling;return t?n&&n.matches(t)?n:null:n}static previousAll(e){const t=[];for(;e.previousElementSibling;)t.push(e=e.previousElementSibling);return t}static previousUntil(e,t){const n=[];for(;e.previousElementSibling&&!e.previousElementSibling.matches(t);)n.push(e=e.previousElementSibling);return n}static indexInParent(e){const t=e.parentNode.childNodes;let n=0;for(let s=0;s "+t)}static findChildren(e,t){return e.querySelectorAll(":scope > "+t)}static parents(e,t=""){const n=[];if(t)for(;e.parentElement&&e.parentElement.closest(t);)n.push(e=e.parentElement.closest(t));else for(;e.parentElement;)n.push(e=e.parentElement);return n}static parentsUntil(e,t){const n=[];for(;e.parentElement&&!e.parentElement.matches(t);)n.push(e=e.parentElement);return n}static siblings(e,t="*"){return Array.from(e.parentElement.children).filter(n=>n!=e&&n.matches(t))}static css(e,t,n){return void 0===n?global.getComputedStyle(e)[t]:(e.style[t]=n,e)}static width(e,t){return void 0===t?parseInt(getComputedStyle(e).width):(e.style.width=t,e)}static height(e,t){return void 0===t?parseInt(getComputedStyle(e).height):(e.style.height=t,e)}static text(e,t){return void 0===t?e.textContent:e.textContent=t}static innerWidth(e){return e.clientWidth}static innerHeight(e){return e.clientHeight}static outerWidth(e){return e.offsetWidth}static outerHeight(e){return e.offsetHeight}static offset(e){return e.getBoundingClientRect()}static get listeners(){return this._listeners||(this._listeners={})}static on(e,t,n,s){const[r,i]=t.split("."),o=n&&s;s||(s=n);const a=o?function(e){e.target.matches(n)&&s(e)}:s;e.addEventListener(r,a);const l=()=>{e.removeEventListener(r,a)};if(i){this.listeners[i]||(this.listeners[i]=[]);const t=()=>{l(),this.listeners[i].splice(this.listeners[i].findIndex(t=>t.event==r&&t.element==e),1)};return this.listeners[i].push({event:r,element:e,cancel:t}),t}return l}static once(e,t,n,s){const[r,i]=t.split("."),o=n&&s;s||(s=n);const a=o?function(t){t.target.matches(n)&&(s(t),e.removeEventListener(r,a))}:function(t){s(t),e.removeEventListener(r,a)};e.addEventListener(r,a);const l=()=>{e.removeEventListener(r,a)};if(i){this.listeners[i]||(this.listeners[i]=[]);const t=()=>{l(),this.listeners[i].splice(this.listeners[i].findIndex(t=>t.event==r&&t.element==e),1)};return this.listeners[i].push({event:r,element:e,cancel:t}),t}return l}static __offAll(e,t){const[n,s]=e.split(".");let r=e=>e.event==n,i=e=>e;t&&(r=e=>e.event==n&&e.element==t,i=e=>e.element==t);const o=this.listeners[s]||[],a=n?o.filter(r):o.filter(i);for(let e=0;e{this.observer.unsubscribe(s),t()};return this.observer.subscribe(s,t=>{const s=Array.from(n?t.addedNodes:t.removedNodes),r=s.indexOf(e)>-1,i=s.some(t=>t.contains(e));return r||i}),e}static onMount(e,t){return this.onMountChange(e,t)}static onUnmount(e,t){return this.onMountChange(e,t,!1)}static onAdded(e,t){return this.onMount(e,t)}static onRemoved(e,t){return this.onUnmount(e,t,!1)}static wrap(e){const t=this.parseHTML('
');for(let n=0;nsetTimeout(e,10))}for(const e in E)v[e]||delete E[e];this.saveThemeData()},ke.prototype.enableTheme=function(e,t=!1){E[e]=!0,this.saveThemeData();const n=v[e];xe.addStyle(xe.escapeID(n.id),unescape(n.css)),T.dispatch("theme-enabled"),h["fork-ps-2"]&&!t&&Be.showToast(`${n.name} v${n.version} has been applied.`)},ke.prototype.enable=function(e,t=!1){return this.enableTheme(e,t)},ke.prototype.disableTheme=function(e,t=!1){E[e]=!1,this.saveThemeData();const n=v[e];xe.removeStyle(xe.escapeID(n.id)),T.dispatch("theme-disabled"),h["fork-ps-2"]&&!t&&Be.showToast(`${n.name} v${n.version} has been disabled.`)},ke.prototype.disable=function(e,t=!1){return this.disableTheme(e,t)},ke.prototype.toggleTheme=function(e){E[e]?this.disableTheme(e):this.enableTheme(e)},ke.prototype.toggle=function(e){return this.toggleTheme(e)},ke.prototype.loadTheme=async function(e){const t=await Se.loadContent(e,"theme");if(t)return h["fork-ps-1"]&&Be.showContentErrors({themes:[t]}),h["fork-ps-2"]&&Be.showToast(e+" could not be loaded. It may not have been loaded.",{type:"error"}),Be.err("ContentManager",e+" could not be loaded.",t);const n=Object.values(v).find(t=>t.filename==e);Be.log("ContentManager",`${n.name} v${n.version} was loaded.`),h["fork-ps-2"]&&Be.showToast(`${n.name} v${n.version} was loaded.`,{type:"success"}),T.dispatch("theme-loaded",n.name)},ke.prototype.unloadTheme=function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return;const n=t.name;E[n]&&this.disableTheme(n,!0);const s=Se.unloadContent(v[n].filename,"theme");if(delete v[n],s)return h["fork-ps-1"]&&Be.showContentErrors({themes:[s]}),h["fork-ps-2"]&&Be.showToast(n+" could not be unloaded. It may have not been loaded yet.",{type:"error"}),Be.err("ContentManager",n+" could not be unloaded. It may have not been loaded yet.",s);Be.log("ContentManager",n+" was unloaded."),h["fork-ps-2"]&&Be.showToast(n+" was unloaded.",{type:"success"}),T.dispatch("theme-unloaded",n)},ke.prototype.delete=function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return;this.unloadTheme(t.filename);const s=n(1).resolve(Se.themesFolder,t.filename);n(2).unlinkSync(s)},ke.prototype.reloadTheme=async function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return this.loadTheme(e);const n=t.name,s=await Se.reloadContent(v[n].filename,"theme");if(E[n]&&(this.disableTheme(n,!0),this.enableTheme(n,!0)),s)return h["fork-ps-1"]&&Be.showContentErrors({themes:[s]}),h["fork-ps-2"]&&Be.showToast(n+" could not be reloaded.",{type:"error"}),Be.err("ContentManager",n+" could not be reloaded.",s);Be.log("ContentManager",`${n} v${v[n].version} was reloaded.`),h["fork-ps-2"]&&Be.showToast(`${n} v${v[n].version} was reloaded.`,{type:"success"}),T.dispatch("theme-reloaded",n)},ke.prototype.reload=function(e){return this.reloadTheme(e)},ke.prototype.edit=function(e){const t=Object.values(v).find(t=>t.filename==e)||v[e];if(!t)return;const s=n(1).resolve(Se.themesFolder,t.filename);n(0).shell.openExternal(""+s)},ke.prototype.updateThemeList=function(){const e=Se.loadNewContent("theme");for(const t of e.added)this.loadTheme(t);for(const t of e.removed)this.unloadTheme(t)},ke.prototype.loadThemeData=function(){const e=A.getSettingGroup("themes");e&&Object.assign(E,e)},ke.prototype.saveThemeData=function(){A.setSettingGroup("themes",E)};var De=new ke,Me=new class{constructor(){this.editorDetached=!1,this.WebpackModules=(()=>{const e=webpackJsonp.push([[],{__extra_id__:(e,t,n)=>e.exports=n},[["__extra_id__"]]]);delete e.m.__extra_id__,delete e.c.__extra_id__;const t=(e,t)=>{let n=t?e:e.default;if(!n)return e;if(n.remove&&n.set&&n.clear&&n.get&&!n.sort)return null;if(!n.getToken&&!n.getEmail&&!n.showToken)return e;const s=new Proxy(n,{getOwnPropertyDescriptor:function(e,t){if("getToken"!==t&&"getEmail"!==t&&"showToken"!==t)return Object.getOwnPropertyDescriptor(e,t)},get:function(e,t){return"getToken"==t&&e.getToken?()=>"mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa":"getEmail"==t&&e.getEmail?()=>"puppet11112@gmail.com":"showToken"==t&&e.showToken?()=>!0:"__proto__"==t&&e.__proto__?s:e[t]}});return t?s:Object.assign({},e,{default:s})},n=n=>{for(const s in e.c)if(e.c.hasOwnProperty(s)){const r=e.c[s].exports;if(r&&r.__esModule&&r.default&&n(r.default))return t(r.default,!0);if(r&&n(r))return t(r,!1)}return null};return{find:n,findAll:n=>{const s=[];for(const r in e.c)if(e.c.hasOwnProperty(r)){const i=e.c[r].exports;i&&i.__esModule&&i.default&&n(i.default)?s.push(t(i.default,!0)):i&&n(i)&&s.push(t(i,!1))}return s},findByUniqueProperties:e=>n(t=>e.every(e=>void 0!==t[e])),findByPrototypes:e=>n(t=>t.prototype&&e.every(e=>void 0!==t.prototype[e])),findByDisplayName:e=>n(t=>t.displayName===e)}})(),this.internal={react:this.WebpackModules.findByUniqueProperties(["Component","PureComponent","Children","createElement","cloneElement"]),reactDom:this.WebpackModules.findByUniqueProperties(["findDOMNode"])},this.getInternalInstance=e=>e[Object.keys(e).find(e=>e.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")}get react(){return this.internal.react}get React(){return this.internal.react}get reactDom(){return this.internal.reactDom}get ReactDom(){return this.internal.reactDom}get reactComponent(){return this.internal.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 e=BDModules.get(e=>e.wrapper&&e.unreadMentionsBar)[0],t=BDModules.get(e=>e.guildsError&&e.selected)[0],n=BDModules.get(e=>e.blobContainer)[0];return Object.assign({},e,t,n)}get MessageContentComponent(){return this.WebpackModules.find(e=>e.defaultProps&&e.defaultProps.hasOwnProperty("disableButtons"))}get MessageComponent(){return this.WebpackModules.find(e=>e.default&&e.default.displayName&&"Message"==e.default.displayName)}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(e=>e.hide&&e.show&&!e.search&&!e.submit&&!e.search&&!e.activateRagingDemon&&!e.dismiss)}get KeyGenerator(){return this.WebpackModules.find(e=>e.toString&&/"binary"/.test(e.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(e){const t=this.UserStore.getCurrentUser().id;if(t==e)return;const n=this.ChannelStore.getDMFromUserId(e);if(n)return this.PrivateChannelActions.selectPrivateChannel(n);this.ChannelActions.openPrivateChannel(t,e)}parseSettings(e){return Object.keys(c).reduce((t,n)=>{const s=c[n];return s.cat===e&&s.implemented&&!s.hidden&&(s.text=n,t.push(s)),t},[])}};class Be{static get screenWidth(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)}static get screenHeight(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)}static get WindowConfigFile(){return this._windowConfigFile=null}static getAllWindowPreferences(){return{transparent:!0,frame:!1}}static getWindowPreference(e){return"transparent"===e||"frame"!==e&&null}static setWindowPreference(e,t){return"transparent"===e||"frame"!==e&&null}static stripBOM(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}static getTextArea(){return xe.query("."+Le(BDModules.get(e=>e.channelTextArea&&e.titleWrapper)[0].channelTextArea)+" textarea")}static insertText(e,t){e.focus(),e.selectionStart=0,e.selectionEnd=e.value.length,document.execCommand("insertText",!1,t)}static escapeID(e){return e.replace(/^[^a-z]+|[^\w-]+/gi,"-")}static log(e,t){console.log(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: #3a71c1; font-weight: 700;","color: #3a71c1;","")}static warn(e,t){console.warn(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: #E8A400; font-weight: 700;","color: #E8A400;","")}static err(e,t,n){console.log(`%c[BandagedBD]%c [${e}]%c ${t}`,"color: red; font-weight: 700;","color: red;",""),n&&(console.groupCollapsed("%cError: "+n.message,"color: red;"),console.error(n.stack),console.groupEnd())}static formatString(e,t){for(const n in t){let s=t[n];Array.isArray(s)&&(s=JSON.stringify(s)),"object"==typeof s&&null!==s&&(s=s.toString()),e=e.replace(new RegExp(`{{${n}}}`,"g"),s)}return e}static escape(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}static testJSON(e){try{return JSON.parse(e)}catch(e){return!1}}static isEmpty(e){if(null==e||null==e||""==e)return!0;if("object"!=typeof e)return!1;if(Array.isArray(e))return 0==e.length;for(const t in e)if(e.hasOwnProperty(t))return!1;return!0}static suppressErrors(e,t){return(...n)=>{try{return e(...n)}catch(e){this.err("SuppressedError","Error occurred in "+t,e)}}}static monkeyPatch(e,t,n){const{before:s,after:r,instead:i,once:o=!1,silent:a=!1,force:l=!1}=n,c=n.displayName||e.displayName||e[t].displayName||e.name||e.constructor.displayName||e.constructor.name;if(a||console.log("patch",t,"of",c),!e[t]){if(!l)return console.error(t,"does not exist for",c);e[t]=function(){}}const d=e[t];let h=!1;const u=()=>{a||console.log("unpatch",t,"of",c),h=!0};return e[t]=function(){if(h)return d.call(this,...arguments);const n={thisObject:this,methodArguments:arguments,cancelPatch:u,originalMethod:d,callOriginalMethod:()=>n.returnValue=n.originalMethod.apply(n.thisObject,n.methodArguments)};if(i){const s=Be.suppressErrors(i,"`instead` callback of "+e[t].displayName)(n);void 0!==s&&(n.returnValue=s)}else s&&Be.suppressErrors(s,"`before` callback of "+e[t].displayName)(n),n.callOriginalMethod(),r&&Be.suppressErrors(r,"`after` callback of "+e[t].displayName)(n);return o&&u(),n.returnValue},Object.assign(e[t],d),e[t].__monkeyPatched=!0,e[t].displayName=c,e[t].__originalMethod||(e[t].__originalMethod=d,e[t].toString=function(){return d.toString()}),u}static onRemoved(e,t){const n=new MutationObserver(s=>{for(let r=0;r-1,l=o.some(t=>t.contains(e));(a||l)&&(n.disconnect(),t())}});n.observe(document.body,{subtree:!0,childList:!0})}static getNestedProp(e,t){return t.split(/\s?\.\s?/).reduce((function(e,t){return e&&e[t]}),e)}static showToast(e,t={}){if(!document.querySelector(".bd-toasts")){const e=document.querySelector("."+Le(BDModules.get(e=>e.sidebar&&e.hasNotice)[0].sidebar)+" + div")||null,t=e?e.querySelector("form"):null,n=t?t.offsetHeight:80,s=document.createElement("div");s.classList.add("bd-toasts"),s.style.setProperty("bottom",n+"px"),document.querySelector("#app-mount").appendChild(s)}const n=document.querySelector(".bd-toasts"),{type:s="",icon:r=!0,timeout:i=3e3}=t,o=document.createElement("div");o.classList.add("bd-toast"),s&&o.classList.add("toast-"+s),s&&r&&o.classList.add("icon"),o.innerText=e,n.appendChild(o),n.style.setProperty("left",`calc(50% - ${n.offsetWidth/2}px)`),setTimeout(()=>{o.classList.add("closing"),setTimeout(()=>{o.remove(),document.querySelectorAll(".bd-toasts .bd-toast").length||document.querySelector(".bd-toasts").remove()},300)},i)}static alert(e,t){let n=BDModules.get(e=>e.modal&&e.inner&&!e.hideOnFullscreen)[0],s=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.hideOnFullscreen)[0],r=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.focusLock)[0];const i=xe.createElement(`
\n
\n
\n
\n
\n
${e}
\n
\n
\n
\n
\n ${t}\n
\n
\n
\n \n
\n
\n
`);i.querySelector(".footer button").addEventListener("click",()=>{xe.addClass(i,"closing"),setTimeout(()=>{i.remove(),o.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)}),i.querySelector(".bd-backdrop").addEventListener("click",()=>{xe.addClass(i,"closing"),setTimeout(()=>{i.remove(),o.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)}),xe.query("#app-mount").append(i);const o=[];return{close:()=>{xe.addClass(i,"closing"),setTimeout(()=>{i.remove(),o.forEach(e=>{try{e()}catch(e){console.error(e)}})},300)},onClose:e=>{o.push(e)}}}static showContentErrors({plugins:e=[],themes:t=[]}){if(!e||!t)return;if(!e.length&&!t.length)return;let n=BDModules.get(e=>e.modal&&e.inner&&!e.hideOnFullscreen)[0],s=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.hideOnFullscreen)[0],r=BDModules.get(e=>e.header&&e.responsiveWidthMobile&&e.focusLock)[0];const i=xe.createElement(`
\n
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
`);function o(e){const t=xe.createElement('
');for(const n of e){const e=xe.createElement(`
\n
${n.name?n.name:n.file}
\n
${n.message}
\n \n
`);t.append(e),n.error&&e.querySelectorAll("a").forEach(e=>e.addEventListener("click",e=>{e.preventDefault(),Be.err("ContentManager",`Error details for ${n.name?n.name:n.file}.`,n.error)}))}return t}const a=[o(e),o(t)];i.querySelectorAll(".tab-bar-item").forEach(e=>e.addEventListener("click",e=>{e.preventDefault();const t=i.querySelector(".tab-bar-item.selected");t&&xe.removeClass(t,"selected"),xe.addClass(e.target,"selected");const n=i.querySelector(".scroller");n.innerHTML="",n.append(a[xe.index(e.target)])})),i.querySelector(".footer button").addEventListener("click",()=>{xe.addClass(i,"closing"),setTimeout(()=>{i.remove()},300)}),i.querySelector(".bd-backdrop").addEventListener("click",()=>{xe.addClass(i,"closing"),setTimeout(()=>{i.remove()},300)}),xe.query("#app-mount").append(i),e.length?i.querySelector(".tab-bar-item").click():i.querySelectorAll(".tab-bar-item")[1].click()}static showChangelogModal(e={}){const t=D.findByProps("push","update","pop","popWithKey"),n=D.findByProps("fixed","improved"),s=D.findByDisplayName("Text"),r=D.findByProps("Child"),i=D.findByProps("Tags","default"),o=D.find(e=>e.defaultProps&&0==e.defaultProps.selectable),l=D.findByProps("defaultRules","parse");if(!(o&&t&&n&&s&&r&&i&&l))return;const{image:c="https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5",description:d="",changes:h=[],title:u="BandagedBD",subtitle:p="v"+a,footer:m}=e,g=Me.React.createElement,f=[g("img",{src:c})];d&&f.push(g("p",null,l.parse(d)));for(let e=0;eg("li",null,l.parse(e))));f.push(i)}const b=function(){return g(r.Child,{grow:1,shrink:1},g(i.default,{tag:i.Tags.H4},u),g(s,{size:s.Sizes.SMALL,color:s.Colors.STANDARD,className:n.date},p))},y=()=>{const e=D.find(e=>"Anchor"==e.displayName),n=D.findByProps("anchorUnderlineOnHover")||{anchor:"anchor-3Z-8Bb",anchorUnderlineOnHover:"anchorUnderlineOnHover-2ESHQB"},i=e=>{e.preventDefault(),e.stopPropagation(),t.pop(),Me.joinBD2()},o=e?g(e,{onClick:i},"Join our Discord Server."):g("a",{className:`${n.anchor} ${n.anchorUnderlineOnHover}`,onClick:i},"Join our Discord Server."),a=g(s,{size:s.Sizes.SMALL,color:s.Colors.STANDARD},"Need support? ",o);return g(r.Child,{grow:1,shrink:1},m||a)};return t.push((function(e){return g(o,Object.assign({className:n.container,selectable:!0,onScroll:e=>e,onClose:e=>e,renderHeader:b,renderFooter:y,children:f},e))}))}static showConfirmationModal(e,t,n={}){const s=D.findByProps("openModal","updateModal"),r=D.findByDisplayName("Markdown"),i=D.findByDisplayName("ConfirmModal");if(!s||!i||!r)return Be.alert(e,t);const o=()=>{},{onConfirm:a=o,onCancel:l=o,confirmText:c="Okay",cancelText:d="Cancel",danger:h=!1,key:u}=n;return Array.isArray(t)||(t=[t]),t=t.map(e=>"string"==typeof e?Me.React.createElement(r,null,e):e),s.openModal(n=>Me.React.createElement(i,Object.assign({header:e,red:h,confirmText:c,cancelText:d,onConfirm:a,onCancel:l},n),t),{modalKey:u})}static get removeDa(){return Le}}function Le(e){return e?e.split(" ").filter(e=>!e.startsWith("da-")).join(" "):e}Be.showToast=Be.suppressErrors(Be.showToast,"Could not show toast."),window.Lightcord.BetterDiscord.Utils=Be;class Ne{constructor(){this.panels={}}register(e,t){this.panels[e]=t}getComponent(e,t){return this.panels[e](t)}get items(){return[{text:"BetterDiscord Settings",id:"core"},{text:"Plugins",id:"plugins"},{text:"Themes",id:"themes"},{text:"Custom CSS",id:"customcss"}]}get LCitems(){return[{text:"Lightcord Settings",id:"lightcord"},{text:"RichPresence",id:"status"},{text:"Account Info",id:"accountinfo"}]}get LCDevItems(){let e=[];return window.Lightcord.Settings.devMode?(e.push({section:"DIVIDER"},{section:"HEADER",label:"Lightcord Api"},{text:"Components Preview",id:"lcapipreview"}),e):e}render(e){return[{section:"HEADER",label:"Lightcord"},...this.LCitems.map(t=>({section:t.id,label:t.text,element:this.getComponent(t.id,e)})),...this.LCDevItems.map(t=>t.section?t:{section:t.id,label:t.text,element:this.getComponent(t.id,e)}),{section:"DIVIDER"},{section:"CUSTOM",element:this.getComponent("BDChangelogTitle")},...this.items.map(t=>({section:t.id,label:t.text,element:this.getComponent(t.id,e)})),{section:"DIVIDER"}]}}var Ae=new class{injectColoredText(){this.cancelColoredText||Me.MessageComponent&&(this.cancelColoredText=Be.monkeyPatch(Me.MessageComponent,"default",{before:e=>{const t=e.methodArguments[0];if(!t||!t.childrenMessageContent)return;const n=t.childrenMessageContent;if(!n.type||!n.type.type||"MessageContent"!=n.type.type.displayName)return;const s=n.type.type;s.__originalMethod||(n.type.type=function(e){const t=s(e),n=h["bda-gs-7"]&&e.message.colorString||"";return t.props.style={color:n},t},n.type.type.__originalMethod=s,Object.assign(n.type.type,s))}}))}removeColoredText(){let e=BDModules.get(e=>e.markup)[0].markup;document.querySelectorAll("."+e.split(" ")[0]).forEach(e=>{e.style.setProperty("color","")})}},Pe=new class{inject24Hour(){if(this.cancel24Hour)return;const e=new RegExp("([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)"),t=t=>{if(!h["bda-gs-6"])return;const n=t.returnValue.match(e);return n&&4===n.length?"AM"===n[3]?t.returnValue=t.returnValue.replace(n[0],`${"12"===n[1]?"00":n[1].padStart(2,"0")}:${n[2]}`):t.returnValue=t.returnValue.replace(n[0],`${"12"===n[1]?"12":parseInt(n[1])+12}:${n[2]}`):void 0},n=Be.monkeyPatch(Me.TimeFormatter,"calendarFormat",{after:t}),s=Be.monkeyPatch(Me.TimeFormatter,"dateFormat",{after:t});this.cancel24Hour=()=>{n(),s()}}remove24Hour(){this.cancel24Hour&&this.cancel24Hour()}};class Te extends Me.reactComponent{constructor(e){super(e)}render(){return Me.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.text)}}class Re extends Me.reactComponent{constructor(e){super(e)}render(){return Me.react.createElement("div",{className:"ui-tab-bar-separator margin-top-8 margin-bottom-8"})}}class Oe extends Me.reactComponent{constructor(e){super(e),this.props.server.iconUrl||(this.props.server.iconUrl=this.props.fallback),this.state={imageError:!1,joined:this.props.guildList.includes(this.props.server.identifier)}}render(){const{server:e}=this.props;let t=BDModules.get(e=>e.card&&e.cardPrimary)[0],n=BDModules.get(e=>e.flexChild&&e._horizontalReverse)[0],s=BDModules.get(e=>e.noWrap&&!e.streamerModeEnabled)[0];return Me.react.createElement("div",{className:`${t.card} ${t.cardPrimary} ${BDModules.get(e=>e.marginBottom8)[0].marginBottom8} bd-server-card${e.pinned?" bd-server-card-pinned":""}`},Me.react.createElement("img",{ref:"img",className:"bd-server-image",src:e.iconUrl,onError:this.handleError.bind(this),draggable:!1}),Me.react.createElement("div",{className:n.flexChild+" bd-server-content"},Me.react.createElement("div",{className:n.horizontal+" "+s.noWrap+" bd-server-header"},Me.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"},e.name),Me.react.createElement("h5",{className:"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"},e.members," Members")),Me.react.createElement("div",{className:n.horizontal+" "+s.noWrap},Me.react.createElement("div",{className:"scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"},Me.react.createElement("div",{className:"scroller-2FKFPG scroller bd-server-description"},e.description))),Me.react.createElement("div",{className:"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"},Me.react.createElement("div",{className:"flexChild-faoVW3 bd-server-tags",style:{flex:"1 1 auto"}},e.categories.join(", ")),this.state.joined&&Me.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"}},Me.react.createElement("div",{className:"ui-button-contents"},"Joined")),e.error&&Me.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"}},Me.react.createElement("div",{className:"ui-button-contents"},"Error")),!e.error&&!this.state.joined&&Me.react.createElement("button",{type:"button",className:"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",style:{minHeight:"12px",marginTop:"4px"},onClick:()=>{this.join()}},Me.react.createElement("div",{className:"ui-button-contents"},"Join")))))}handleError(){this.props.server.iconUrl=this.props.fallback,this.setState({imageError:!0})}join(){this.props.join(this)}}const{useState:_e}=Me.react;let je;class Ie extends Me.reactComponent{constructor(e){super(e),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=Me.WebpackModules.findByUniqueProperties(["getGuilds"]),this.AvatarDefaults=Me.WebpackModules.findByUniqueProperties(["getUserAvatarURL","DEFAULT_AVATARS"]),this.InviteActions=Me.WebpackModules.findByUniqueProperties(["acceptInvite"]),this.SortedGuildStore=Me.WebpackModules.findByUniqueProperties(["getSortedGuilds"]),this.hooks=[]}componentDidMount(){this.checkConnection()}setInitialState(){this.state={selectedCategory:-1,title:"Loading...",loading:!0,servers:[],next:null,connection:{state:0,user:null},section:this.categorySlugs[0],theme:"dark"}}close(){this.props.close()}search(e,t){const n=this;fetch(`${n.searchEndPoint}${e}${e?"&schema=new":"?schema=new"}`,{method:"get"}).then(async e=>{if(200!==e.status)throw await e.text();let s=await e.json(),r=s.results.reduce((e,t)=>(t.joined=!1,e.push(t),e),[]);t||(r=n.state.servers.concat(r));let i=s.size+s.from;s.next="?from="+i,n.state.term&&(s.next+="&term="+n.state.term),n.state.selectedCategory&&(s.next+="&category="+n.categoryButtons[n.state.selectedCategory]),i>=s.total&&(i=s.total,s.next=null);let o=`Showing 1-${i} of ${s.total} results in ${n.categoryButtons[n.state.selectedCategory]}`;n.state.term&&(o+=" for "+n.state.term),n.setState({loading:!1,title:o,servers:r,next:s.next})}).catch(e=>(console.error(e),n.setState({loading:!1,title:"Failed to load servers. Check console for details"})))}async join(e){if(e.props.pinned)return this.InviteActions.acceptInvite(e.props.invite_code);await fetch(`${this.joinEndPoint}/${e.props.server.identifier}`,{method:"GET",credentials:"include",mode:"cors",headers:{Accept:"application/json","Content-Type":"application/json"}}),e.setState({joined:!0})}connect(){const e=this,t=e.windowOptions;t.x=Math.round(window.screenX+window.innerWidth/2-t.width/2),t.y=Math.round(window.screenY+window.innerHeight/2-t.height/2);const s=e.joinWindow=new(n(0).remote.BrowserWindow)(t);s.webContents.on("did-navigate",(t,n)=>{"https://auth.discordservers.com/info"==n&&(s.close(),e.checkConnection())}),s.loadURL("https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info"),s.setMenuBarVisibility(!1)}get windowOptions(){return{width:500,height:550,backgroundColor:"#282b30",show:!0,resizable:!1,maximizable:!1,minimizable:!1,alwaysOnTop:!0,frame:!0,center:!1,webPreferences:{nodeIntegration:!1}}}get bdServer(){const e=this.SortedGuildStore.getFlattenedGuildIds(),t=this.AvatarDefaults.DEFAULT_AVATARS;return[Me.react.createElement(Oe,{server:{name:"Lightcord",online:"100+",members:"300+",categories:["community","programming","support"],description:"Official Lightcord server for support etc",identifier:"705908350218666117",iconUrl:"https://github.com/lightcord.png",nativejoin:!0,invite_code:"7eFff2A",pinned:!0},pinned:!0,join:this.join,guildList:e,fallback:t[Math.floor(5*Math.random())]}),Me.react.createElement(Oe,{server:{name:"BetterDiscord",online:"30000+",members:"70000+",categories:["community","programming","support"],description:"Official BetterDiscord server for support etc",identifier:"86004744966914048",iconUrl:"https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",nativejoin:!0,invite_code:"0Tmfo5ZbORCRqbAd",pinned:!0},pinned:!0,join:this.join,guildList:e,fallback:t[Math.floor(5*Math.random())]})]}get searchEndPoint(){return"https://search.discordservers.com"}get joinEndPoint(){return"https://j.discordservers.com"}get connectEndPoint(){return"https://join.discordservers.com/connect"}async checkConnection(){const e=this;try{const t=await fetch("https://auth.discordservers.com/info",{method:"GET",credentials:"include",mode:"cors",headers:{Accept:"application/json","Content-Type":"application/json"}}),n=await t.text();if(!n)return void e.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}});const s=JSON.parse(n);e.setState({selectedCategory:0,connection:{state:2,user:s}}),e.search("",!0)}catch(t){console.error(t),e.setState({title:"Not connected to discordservers.com!",loading:!0,selectedCategory:-1,connection:{state:1,user:null}})}}render(){return this.hooks.forEach(e=>e()),je=je||Me.WebpackModules.findByDisplayName("SettingsView"),Me.react.createElement("div",{id:"pubslayerroot"},Me.react.createElement("div",{id:"pubslayer"},Me.react.createElement(je,{onSetSection:e=>{this.changeCategory(this.categorySlugs.indexOf(e))},sections:this.sections,onClose:this.close,section:this.state.section})))}get sections(){let e=[];return e.push({section:"HEADER",label:"Public Servers"},{section:"DIVIDER"},{section:"CUSTOM",element:this.searchInput.bind(null,()=>this,this.searchKeyDown)},{section:"DIVIDER"},{section:"HEADER",label:"Categories"},...this.categoryButtons.map((e,t)=>({section:this.categorySlugs[t],label:e,element:this.content.bind(null,()=>this)})),{section:"DIVIDER"},{section:"CUSTOM",element:this.footer},{section:"CUSTOM",element:this.connection.bind(null,()=>this)}),e}searchInput(e,t){const[n,s]=Me.react.useState("");return Me.react.createElement("div",{className:"ui-form-item"},Me.react.createElement("div",{className:"ui-text-input flex-vertical",style:{width:"172px",marginLeft:"10px"}},Me.react.createElement("input",{ref:t=>e().refs.searchinput=t,onKeyDown:t,onChange:e=>{s(e.target.value)},type:"text",className:"input default",placeholder:"Search...",maxLength:"50",value:n})))}searchKeyDown(e){const t=this;if(t.state.loading||13!==e.which)return;t.setState({loading:!0,title:"Loading...",term:e.target.value});let n="?term="+e.target.value;0!==t.state.selectedCategory&&(n+="&category="+t.categoryButtons[t.state.selectedCategory]),t.search(n,!0)}get categorySlugs(){return this.categoryButtons.map(e=>e.toLowerCase().replace(/[^\w\d]+/g,"_"))}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(e){const t=this;t.state.loading||(t.setState({loading:!0,selectedCategory:e,title:"Loading...",term:null,section:t.categorySlugs[e]}),0!==e?t.search("?category="+t.categoryButtons[e],!0):t.search("",!0))}content(e){const t=e();t.useState();const n=t.SortedGuildStore.getFlattenedGuildIds(),s=t.AvatarDefaults.DEFAULT_AVATARS;if(1===t.state.connection.state)return Me.react.createElement(t.notConnected.bind(null,e));let r=BDModules.get(e=>e.contentColumnDefault)[0];return[Me.react.createElement("div",{ref:e=>{t.refs.content=e},key:"pc",className:r.contentColumn+" "+r.contentColumn+" content-column default"},Me.react.createElement(Te,{text:t.state.title}),t.bdServer,t.state.servers.map(e=>Me.react.createElement(Oe,{key:e.identifier,server:e,join:t.join,guildList:n,fallback:s[Math.floor(5*Math.random())]})),t.state.next&&Me.react.createElement("button",{type:"button",onClick:()=>{t.state.loading||(t.setState({loading:!0}),t.search(t.state.next,!1))},className:"ui-button filled brand small grow",style:{width:"100%",marginTop:"10px",marginBottom:"10px"}},Me.react.createElement("div",{className:"ui-button-contents"},t.state.loading?"Loading":"Load More")),t.state.servers.length>0&&Me.react.createElement(Te,{text:t.state.title}))]}notConnected(e){const t=e();let n=BDModules.get(e=>e.contentColumnDefault)[0];return[Me.react.createElement("div",{key:"ncc",ref:e=>t.refs.content=e,className:n.contentColumn+" "+n.contentColumn+" content-column default"},Me.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},"Not connected to discordservers.com!",Me.react.createElement("button",{onClick:t.connect,type:"button",className:"ui-button filled brand small grow",style:{display:"inline-block",minHeight:"18px",marginLeft:"10px",lineHeight:"14px"}},Me.react.createElement("div",{className:"ui-button-contents"},"Connect"))),t.bdServer)]}footer(){return Me.react.createElement("div",{className:"ui-tab-bar-header"},Me.react.createElement("a",{href:"https://discordservers.com",target:"_blank"},"Discordservers.com"))}useState(){const e=_e()[1];Me.React.useEffect(()=>{const t=()=>{e()};return this.hooks.push(t),()=>{const e=this.hooks.findIndex(e=>e===t);e<0||this.hooks.splice(e,1)}},[])}connection(e){const t=e();t.useState();const{connection:n}=t.state;return 2!==n.state?Me.react.createElement("span",null):Me.react.createElement("span",null,Me.react.createElement(Re,null),Me.react.createElement("span",{style:{color:"#b9bbbe",fontSize:"10px",marginLeft:"10px"}},"Connected as: ",`${n.user.username}#${n.user.discriminator}`),Me.react.createElement("div",{style:{padding:"5px 10px 0 10px"}},Me.react.createElement("button",{style:{width:"100%",minHeight:"20px"},type:"button",className:"ui-button filled brand small grow"},Me.react.createElement("div",{className:"ui-button-contents",onClick:t.connect},"Reconnect"))))}}function $e(){return($e=Object.assign||function(e){for(var t=1;tt=e);ze[e]=n;const s=[];for(let t of Ye.badges)t.defaultUsers.includes(e)&&s.push(t);const r=await new Promise(t=>{if(!h["lightcord-5"])return t([]);Ge.push([e,t]),setTimeout(()=>{let e=Ge;0!==e.length&&(Ge=[],Ve(Ze.badges,"POST",JSON.stringify(e.map(e=>e[0]))).then(async t=>{200!==t.status&&e.forEach(e=>{e[1]([])});const n=await t.json();for(let t of n){e.find(e=>e[0]===t.user_id)[1](t.badges)}}).catch(t=>{t instanceof Je||console.error(t),e.forEach(e=>{e[1]([])})}))},0)});for(let e of r)Ye.badges.find(t=>t.id===e)&&(s.find(t=>t.id===e)||s.push(Ye.badges.find(t=>t.id===e)));return this.cache={badges:Object.assign(this.cache.badges,{[e]:s})},setTimeout(()=>{delete this.cache.badges[e]},6e5),t(s),delete ze[e],s}};const Ve=function(e,t,n){return h["lightcord-5"]?j()(`${Ye.SERVER_URL}/api/v1${e}`,{method:t,headers:{CLIENT:"Lightcord",Authorization:window.Lightcord.Api.Authorization||"None::Anonymous"},...n?{body:n}:{}}):Promise.reject(new Je("The current settings blocked the request."))};class Je extends Error{constructor(){super(...arguments),this.name="LightcordError"}}const Ye={SERVER_URL:"https://lightcord.org",badges:[{name:"Lightcord Bug Hunter",id:"f04698f5-816b-41e3-bd01-92291193d7a5",defaultUsers:["696481194443014174","696003456611385396"],scopes:[],component:We,href:"https://github.com/lightcord/lightcord/wiki/badges#bug_hunter"},{name:"Buffoon",id:"06904d31-65b4-41ec-a50c-8658bbd1af96",defaultUsers:["389016895543705602","664600134528663565","625350657829896224"],scopes:[],component:He,href:"https://youtu.be/EJtb6z-dlT8?t=145"}]},Ze={badges:"/users/badges"};function Ke(){return(Ke=Object.assign||function(e){for(var t=1;te.layers&&e.layer).layers)];const t=document.querySelector("."+e);if(!t)return!1;const n=Lightcord.Api.Utils.FindReact(t,1);if(!n)return t;this.ReactInstance=n;let s=n.render;n.render=()=>{let e=s.call(n),t=e.props.children[1].props.className.split(" ");return t.push("Layers"),t.push("injected"),e.props.children[1].props.className=t.join(" "),this.layers.forEach(t=>{e.props.children[1].props.children.push(t[1])}),e},n.forceUpdate()}createLayer(e,t={}){let n=Ue(),s=null;return this.layers.push([n,React.createElement(et,Ke({},t,{getLayer:e=>{s=e},key:n,id:n,remove:()=>{let e=this.layers.findIndex(e=>e[0]===n);-1!==e&&(this.layers.splice(e,1),s=null,this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject())}}),e)]),this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject(),{remove:()=>{if(s)s.remove();else{let e=this.layers.findIndex(e=>e[0]===n);if(-1===e)return;this.layers.splice(e,1),s=null,this.ReactInstance&&this.ReactInstance.forceUpdate(),this.inject()}}}}};let Qe;class et extends React.Component{constructor(){super(...arguments),this.state={animation:new this.modules[0].default.Value(0)},this.props.getLayer(this),this.keydown=this.keydown.bind(this)}keydown(e){27===e.which&&this.remove()}get modules(){return Qe||(Qe=[Me.WebpackModules.find(e=>e.default&&e.default.Value&&e.default.div)])}componentWillUnmount(){window.removeEventListener("keydown",this.keydown)}componentDidMount(e){window.addEventListener("keydown",this.keydown)}remove(){this.props.remove()}componentWillEnter(e){this.modules[0].default.timing(this.state.animation,{toValue:1,duration:100}).start(e)}componentWillLeave(e){this.modules[0].default.timing(this.state.animation,{toValue:0,duration:100}).start(e)}render(){let e=this.state.animation.interpolate({inputRange:[0,1],outputRange:[1.07,1]}),t={opacity:this.state.animation,transform:[{scale:e}]},n=this.modules[0].default.div;return React.createElement(n,{className:[__SECRET_EMOTION__.css({backgroundColor:"var(--background-primary)",position:"absolute",top:0,right:0,bottom:0,left:0,display:"flex",overflow:"hidden",WebkitBoxOrient:"vertical",WebkitBoxDirection:"normal",msFlexDirection:"column",flexDirection:"column",zIndex:101}),"win32"===process.platform?__SECRET_EMOTION__.css({top:"-22px",paddingTop:"22px"}):null,...this.props.className?this.props.className.split(" "):[]].filter(e=>e).join(" ")||null,style:t},this.props.children(()=>{this.remove()}))}}et.defaultProps={id:null,children:null};var tt=new class{constructor(){this._appendButton=this._appendButton.bind(this),window.Lightcord.BetterDiscord.V2_PublicServers=this}render(){Xe.createLayer(e=>Me.react.createElement(Ie,{rootId:"pubslayerroot",close:e}))}get button(){const e=xe.createElement(`
`);h["bda-gs-1"]||(e.style.display="none");const t=xe.createElement(`
public
`);return t.addEventListener("click",()=>{this.render()}),e.append(t),e}_appendButton(){let[e]=[Be.removeDa(BDModules.get(e=>e.downloadProgress&&e.tutorialContainer)[0].tutorialContainer)];if(xe.query("#bd-pub-li"))return;const t=xe.query(`div.${e} > div`);xe.after(t,this.button)}addButton(){if(this.guildPatch)return;const e=D.find(e=>e.default&&"NavigableGuilds"==e.default.displayName),t=D.findByDisplayName("Guilds");e||t||Be.warn("PublicServer","Can't find GuildList component"),this.guildPatch=Be.monkeyPatch(e||t.prototype,e?"default":"render",{after:this._appendButton}),this._appendButton()}removeButton(){this.guildPatch(),delete this.guildPatch;const e=xe.query("#bd-pub-li");e&&e.remove()}};var nt=new class{start(){xe.addStyle("VoiceMode","\n .container-2Rl01u {\n display: none!important;\n }\n\n .chat-3bRxxu {\n display: none!important;\n }\n\n .sidebar-2K8pFh {\n flex-grow: 1!important;\n }\n")}stop(){xe.removeStyle("VoiceMode")}};const st=new RegExp("^(?!da-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$");var rt=new class{constructor(){window.Lightcord.BetterDiscord.ClassNormalizer=this}stop(){this.hasPatched&&(this.unpatchClassModules(D.findAll(this.moduleFilter.bind(this))),this.revertElement(document.querySelector("#app-mount")),this.hasPatched=!1)}start(){this.hasPatched||(this.patchClassModules(D.findAll(this.moduleFilter.bind(this))),this.normalizeElement(document.querySelector("#app-mount")),this.hasPatched=!0,this.patchDOMMethods())}patchClassModules(e){for(const t of e)this.patchClassModule("da",t)}unpatchClassModules(e){for(const t of e)this.unpatchClassModule("da",t)}shouldIgnore(e){return!isNaN(e)||(!!(e.endsWith("px")||e.endsWith("ch")||e.endsWith("em")||e.endsWith("ms"))||(!!e.startsWith("layerContainer-")||(!(!e.startsWith("#")||7!=e.length&&4!=e.length)||!(!e.includes("calc(")&&!e.includes("rgba")))))}moduleFilter(e){if("object"!=typeof e||Array.isArray(e))return!1;if(e.__esModule)return!1;if(!Object.keys(e).length)return!1;for(const t in e){const n=e[t];if("string"!=typeof n)return!1;if(!this.shouldIgnore(n)){if(1===n.split("-").length)return!1;if(!st.test(n.split(" ")[0]))return!1}}return!0}patchClassModule(e,t){for(const n in t){const s=t[n];if(this.shouldIgnore(s))continue;const r=s.split(" ");for(const s of r){const r=s.match(st);if(!r||!r.length||r.length<2)continue;const i=r[1].split("-").map((e,t)=>t?e[0].toUpperCase()+e.slice(1):e).join("");t[n]+=` ${e}-${i}`}}}unpatchClassModule(e,t){for(const n in t){const s=t[n];if(this.shouldIgnore(s))continue;let r="";const i=s.split(" ");for(const t of i)t.startsWith(e+"-")||(r+=" "+t);t[n]=r.trim()}}normalizeElement(e){if(!(e instanceof Element))return;const t=e.classList;for(let n=0,s=t.length;nt?e[0].toUpperCase()+e.slice(1):e).join("");e.classList.add("da-"+s)}for(const t of e.children)this.normalizeElement(t)}revertElement(e){if(!(e instanceof Element))return;e.children&&e.children.length&&this.revertElement(e.children[0]),e.nextElementSibling&&this.revertElement(e.nextElementSibling);const t=e.classList,n=[];for(let e=0;ee.layer&&"string"==typeof e.layer&&e.disabledPointerEvents)[0],BDModules.get(e=>e.menu)[0]];setTimeout((function(){if(!s||!n.layer)return console.log(s,n.layer);let r=xe.query("."+Be.removeDa(s.menu));if(!r){const t=xe.query("#app-mount > ."+Be.removeDa(n.layerContainer)),i=xe.createElement(`
`);r=xe.createElement(`
`),i.append(r),t.append(i),i.style.top=e.clientY+"px",i.style.left=e.clientX+"px",i.setAttribute("role","menu"),i.setAttribute("tabindex","-1"),i.id="bd-copy-selector-context",i.setAttribute("aria-label","Copy Selector Actions");const o=BDModules.get(e=>e.scrollerWrap)[0],a=xe.createElement(`
`),l=xe.createElement(`
`);a.append(l),r.append(a);const c=function(e){e.keyCode&&27!==e.keyCode||(i.remove(),document.removeEventListener("click",c),document.removeEventListener("contextmenu",c),document.removeEventListener("keyup",c))};document.addEventListener("click",c),document.addEventListener("contextmenu",c),document.addEventListener("keyup",c)}const i=r.parentElement,o=r.childNodes[0].childNodes[0],a=xe.createElement('
'),l=xe.createElement(``);if(l.append(xe.createElement(`
Copy Selector
`)),l.addEventListener("click",()=>{Me.NativeModule.copy(t),i.style.display="none"}),l.addEventListener("mouseover",e=>{let t=xe.queryAll("div[role=menuitem]."+Be.removeDa(s.focused));t&&t.forEach(e=>e.classList.remove(s.focused)),l.classList.add(s.focused)}),l.addEventListener("mouseout",e=>{l.classList.remove(s.focused)}),a.append(l),o.childNodes.length){const e=xe.createElement(``);o.append(e)}o.append(a),i.clientHeight"."+e).join(""));else{for(var n=1,s=e;s.previousElementSibling;s=s.previousElementSibling,n++);t.unshift(e.tagName.toLowerCase()+("string"==typeof e.className&&e.className||"").split(" ").filter(e=>!!e).map(e=>"."+e).join("")+":nth-child("+n+")")}e=e.parentNode}return t.join(" > ")}(e)}};const ot=Me.React;class at extends ot.Component{constructor(e){super(e),this.state={checked:this.props.checked},this.onChange=this.onChange.bind(this),this.switch=ot.createElement(Lightcord.Api.Components.inputs.Switch,{onChange:this.onChange,value:this.state.checked})}onChange(e){this.props.disabled||(this.props.onChange(e),this.setState({checked:e}))}render(){return this.switch}}let lt=[];function ct(e){let t=lt.find(t=>t.startsWith(e+"-"));return t||(t=BDModules.get(t=>t[e])[0][e],lt.push(t),t)}class dt extends Me.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this)}onChange(){this.props.checked=!this.props.checked,this.props.onChange(this.props.id,this.props.checked)}render(){let{text:e,info:t}=this.props.data;return this.props.data.experimental&&(lt.find(e=>e.startsWith("beta-"))||lt.push(BDModules.get(e=>e.beta&&!e.container&&!e.userSettingsVoice)[0].beta),t=[t,React.createElement("sup",{className:ct("beta")},"(EXPERIMENTAL)")]),Me.react.createElement("div",{className:"ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"},Me.react.createElement("div",{className:"ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"},Me.react.createElement("h3",{key:"title",className:"ui-form-title h3 margin-reset margin-reset ui-flex-child"},e),Me.react.createElement(at,{key:"switch",onChange:this.onChange,checked:this.props.checked})),Me.react.createElement("div",{className:"ui-form-text style-description margin-top-4",style:{flex:"1 1 auto"}},t))}}let ht,ut,pt,mt=BDModules.get(e=>e.marginTop60)[0];class gt extends React.Component{render(){return mt||(mt=BDModules.get(e=>e.marginTop60)[0]),React.createElement("div",{className:mt.marginTop60})}}class ft extends Me.reactComponent{constructor(e){super(e),this.state={error:!1}}renderOldSettings(){const{title:e,settings:t,button:n}=this.props,s=n?Me.react.createElement("button",{key:"title-button",className:"bd-pfbtn",onClick:n.onClick},n.title):null;return[Me.react.createElement(Te,{text:e}),s,t.map(e=>Me.react.createElement(dt,{id:e.id,key:e.id,data:e,checked:h[e.id],onChange:(e,t)=>{this.props.onChange(e,t),this.forceUpdate()}}))]}componentDidCatch(e,t){console.log(e,t),this.setState({error:!0})}render(){if(this.state.error)try{return this.renderOldSettings()}catch(e){return console.error(e),null}else try{ht||(ht=Me.WebpackModules.find(e=>e.FormSection)),ut||(ut=Me.WebpackModules.find(e=>e.default&&"SwitchItem"===e.default.displayName)),pt||(pt=Me.WebpackModules.find(e=>e.beta&&!e.container&&!e.userSettingsVoice));let e=[];return this.props.description&&e.push(React.createElement(ht.FormText,{type:"description",selectable:!1},this.props.description),React.createElement(gt,null)),e.push(...this.props.settings.map(e=>{let t=[e.text];return e.experimental&&t.push(React.createElement("sup",{className:pt.beta},"(EXPERIMENTAL)")),React.createElement(ut.default,{onChange:t=>{this.props.onChange(e.id,t.target.checked),this.forceUpdate()},key:e.id,value:h[e.id],className:__SECRET_EMOTION__.css({marginBottom:"20px"}),disabled:!1,hideBorder:!1,note:e.info,tooltipNote:null},t)})),React.createElement(ht.FormSection,{tag:"h2",title:this.props.title},e)}catch(e){return console.error(e),setImmediate(()=>{this.setState({error:!0})}),null}}}class bt extends Me.reactComponent{constructor(e){super(e)}render(){return this.props.sections.map((e,t)=>[0!==t?Me.react.createElement(gt,{}):null,Me.react.createElement(ft,Object.assign({},e,{onChange:this.props.onChange}))])}}class yt extends Me.reactComponent{constructor(e){super(e),this.onClick=this.onClick.bind(this),this.setInitialState()}setInitialState(){this.state={checked:this.props.checked||!1}}render(){return Me.react.createElement("li",null,Me.react.createElement("div",{className:"checkbox "+BDModules.get(e=>e.checkboxElement)[0].checkbox,onClick:this.onClick},Me.react.createElement("div",{className:"checkbox-inner "+BDModules.get(e=>e.checkboxInner)[0].checkboxInner},Me.react.createElement("input",{className:BDModules.get(e=>e.checkboxElement)[0].checkboxElement,checked:this.state.checked,onChange:()=>{},type:"checkbox"}),Me.react.createElement("span",null)),Me.react.createElement("span",null,this.props.text)))}onClick(){this.props.onChange(this.props.id,!this.state.checked),this.setState({checked:!this.state.checked})}}class vt extends Me.reactComponent{constructor(e){super(e);this.onClick=this.onClick.bind(this),this.updateCss=this.updateCss.bind(this),this.saveCss=this.saveCss.bind(this),this.onChange=this.onChange.bind(this)}componentDidMount(){xe.addClass(xe.query("#app-mount"),"bd-detached-editor"),Me.editorDetached=!0,this.editor=ace.edit("bd-customcss-editor-detached"),this.editor.setTheme("ace/theme/discord"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{h["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){xe.removeClass(xe.query("#app-mount"),"bd-detached-editor"),Me.editorDetached=!1,this.editor.destroy()}updateLineCount(){const e=this.refs.editor.value.split("\n").length;e!=this.props.lines&&(this.refs.lines.textContent=Array.from(new Array(e),(e,t)=>t+1).join(".\n")+".",this.props.lines=e)}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){const e=A.getBDData("bdcustomcss");let t="";return e&&""!==e&&(t=Buffer.from(e,"base64").toString("utf8")),t}get root(){const e=xe.query("#bd-customcss-detach-container");return e||(this.injectRoot()?this.detachedRoot:null)}injectRoot(){const e=xe.query(".app, ."+Be.removeDa(BDModules.get(e=>e.app&&e.layers)[0].app));return!!e&&(xe.insertAfter(xe.createElement('
'),e),!0)}render(){const e=this;return Me.react.createElement("div",{className:"bd-detached-css-editor",id:"bd-customcss-detach-editor"},Me.react.createElement("div",{id:"bd-customcss-innerpane"},Me.react.createElement("div",{className:"editor-wrapper"},Me.react.createElement("div",{id:"bd-customcss-editor-detached",className:"editor",ref:"editor"},e.css)),Me.react.createElement("div",{id:"bd-customcss-attach-controls"},Me.react.createElement("ul",{className:"checkbox-group"},Me.react.createElement(yt,{id:"live-update",text:"Live Update",onChange:e.onChange,checked:h["bda-css-0"]})),Me.react.createElement("div",{id:"bd-customcss-detach-controls-button"},Me.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("update")}},"Update"),Me.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{e.onClick("save")}},"Save"),Me.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("attach")}},"Attach"),Me.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on attach")))))}onChange(e,t){switch(e){case"live-update":h["bda-css-0"]=t,ls.saveSettings()}}onClick(e){const t=this;switch(e){case"attach":xe.query("#editor-detached")&&t.props.attach(),Me.reactDom.unmountComponentAtNode(t.root),t.root.remove();break;case"update":t.updateCss();break;case"save":t.saveCss()}}updateCss(){xe.removeStyle("customcss"),xe.addStyle("customcss",this.editor.session.getValue())}saveCss(){A.setBDData("bdcustomcss",Buffer.from(this.editor.session.getValue(),"utf-8").toString("base64"))}}class wt extends Me.reactComponent{constructor(e){super(e);this.props.lines=0,this.setInitialState(),this.attach=this.attach.bind(this),this.detachedEditor=Me.react.createElement(vt,{attach:this.attach}),this.onClick=this.onClick.bind(this),this.updateCss=this.updateCss.bind(this),this.saveCss=this.saveCss.bind(this),this.detach=this.detach.bind(this)}setInitialState(){this.state={detached:this.props.detached||Me.editorDetached}}componentDidMount(){this.editor=ace.edit("bd-customcss-editor"),this.editor.setTheme("ace/theme/discord"),this.editor.session.setMode("ace/mode/css"),this.editor.setShowPrintMargin(!1),this.editor.setFontSize(14),this.editor.on("change",()=>{h["bda-css-0"]&&(this.saveCss(),this.updateCss())})}componentWillUnmount(){this.editor.destroy()}componentDidUpdate(e,t){const n=this;t.detached&&!n.state.detached&&Me.reactDom.unmountComponentAtNode(n.detachedRoot)}codeMirror(){}get options(){return{lineNumbers:!0,mode:"css",indentUnit:4,theme:"material",scrollbarStyle:"simple"}}get css(){const e=A.getBDData("bdcustomcss");let t="";return e&&""!==e&&(t=Buffer.from(e,"base64").toString("utf8")),t}updateLineCount(){const e=this.refs.editor.value.split("\n").length;e!=this.props.lines&&(this.refs.lines.textContent=Array.from(new Array(e),(e,t)=>t+1).join(".\n")+".",this.props.lines=e)}render(){const e=this,{detached:t}=e.state;return[t&&Me.react.createElement("div",{id:"editor-detached"},Me.react.createElement(Te,{text:"Custom CSS Editor"}),Me.react.createElement("h3",null,"Editor Detached"),Me.react.createElement("button",{className:"btn btn-primary",onClick:()=>{e.attach()}},"Attach")),!t&&Me.react.createElement("div",null,Me.react.createElement(Te,{text:"Custom CSS Editor"}),Me.react.createElement("div",{className:"editor-wrapper"},Me.react.createElement("div",{id:"bd-customcss-editor",className:"editor",ref:"editor"},e.css)),Me.react.createElement("div",{id:"bd-customcss-attach-controls"},Me.react.createElement("ul",{className:"checkbox-group"},Me.react.createElement(yt,{id:"live-update",text:"Live Update",onChange:this.onChange,checked:h["bda-css-0"]})),Me.react.createElement("div",{id:"bd-customcss-detach-controls-button"},Me.react.createElement("button",{style:{borderRadius:"3px 0 0 3px",borderRight:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("update")}},"Update"),Me.react.createElement("button",{style:{borderRadius:"0",borderLeft:"1px solid #2d2d2d",borderRight:"1px solid #2d2d2d"},className:"btn btn-primary",onClick:()=>{e.onClick("save")}},"Save"),Me.react.createElement("button",{style:{borderRadius:"0 3px 3px 0",borderLeft:"1px solid #3f4146"},className:"btn btn-primary",onClick:()=>{e.onClick("detach")}},"Detach"),Me.react.createElement("span",{style:{fontSize:"10px",marginLeft:"5px"}},"Unsaved changes are lost on detach"),Me.react.createElement("div",{className:"help-text"},"Press ",Me.react.createElement("code",{className:"inline"},"ctrl"),"+",Me.react.createElement("span",{className:"inline"},",")," with the editor focused to access the editor's settings."))))]}onClick(e){const t=this;switch(e){case"update":t.updateCss();break;case"save":t.saveCss();break;case"detach":t.detach()}}onChange(e,t){switch(e){case"live-update":h["bda-css-0"]=t,ls.saveSettings()}}updateCss(){xe.removeStyle("customcss"),xe.addStyle("customcss",this.editor.session.getValue())}saveCss(){A.setBDData("bdcustomcss",Buffer.from(this.editor.session.getValue(),"utf-8").toString("base64"))}detach(){this.setState({detached:!0});const e=this.detachedRoot;e?Me.reactDom.render(this.detachedEditor,e):console.log("FAILED TO INJECT ROOT: .app")}get detachedRoot(){const e=xe.query("#bd-customcss-detach-container");return e||(this.injectDetachedRoot()?this.detachedRoot:null)}injectDetachedRoot(){const e=xe.query(".app, ."+Be.removeDa(BDModules.get(e=>e.app&&e.layers)[0].app));return!!e&&(xe.insertAfter(xe.createElement('
'),e),!0)}attach(){this.setState({detached:!1})}}class Ct extends Me.reactComponent{constructor(e){super(e),this.state={hasError:!1}}componentDidCatch(){this.setState({hasError:!0})}render(){return this.state.hasError?Me.react.createElement("div",{className:"react-error"},"Component Error"):this.props.children}}const Et=Ct.prototype.render;Object.defineProperty(Ct.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>Et});class St extends Me.reactComponent{constructor(e){super(e)}static get displayName(){return"ContentColumn"}render(){let e=this.props.title?Me.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},this.props.title):null;return[e,this.props.children]}}class xt extends Me.reactComponent{constructor(e){super(e)}render(){return Me.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"}},Me.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"}),Me.react.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}))}}class kt extends Me.reactComponent{constructor(e){super(e)}render(){return Me.react.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 12 12",style:{width:"18px",height:"18px"}},Me.react.createElement("g",{className:"background",fill:"none",fillRule:"evenodd"},Me.react.createElement("path",{d:"M0 0h12v12H0"}),Me.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"})))}}const Dt=Me.React;class Mt extends Dt.Component{render(){const e=this.props.size||"24px";return Dt.createElement("svg",{className:this.props.className||"",viewBox:"0 0 24 24",fill:"var(--text-normal)",style:{width:e,height:e},onClick:this.props.onClick},Dt.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"}),Dt.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}))}}const Bt=Me.React;class Lt extends Bt.Component{render(){const e=this.props.size||"24px";return Bt.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e},onClick:this.props.onClick},Bt.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),Bt.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"}),Bt.createElement("path",{fill:"none",d:"M0 0h24v24H0z"}))}}const Nt=Me.React,At=Me.anchorClasses;class Pt extends Me.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this),this.showSettings=this.showSettings.bind(this),this.setInitialState(),this.hasSettings=this.props.addon.plugin&&"function"==typeof this.props.addon.plugin.getSettingsPanel,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:!1,reloads:0,trusted:!1}}showSettings(){this.hasSettings&&this.setState({settings:!0})}closeSettings(){this.panelRef.current.innerHTML="",this.setState({settingsOpen:!1})}componentDidUpdate(){this.state.settings&&("object"==typeof this.settingsPanel&&this.refs.settingspanel.appendChild(this.settingsPanel),h["fork-ps-3"]&&setImmediate(()=>{const e=this.refs.cardNode,t=e.closest('div[class*="contentRegionScroller-"]');if(!((e,t)=>{if(!e)return console.error(new Error("Container is undefined.")),!1;const n=e.scrollTop,s=n+e.clientHeight,r=t.offsetTop,i=r+t.clientHeight;return rs})(t,e))return;const n=xe.offset(e),s=xe.offset(t),r=t.scrollTop,i=n.top-s.top+t.scrollTop-30;xe.animate({duration:300,update:function(e){t.scrollTop=i>r?r+e*(i-r):r-e*(r-i)}})}))}getString(e){return e?"string"==typeof e?e:e.toString():"???"}get settingsComponent(){try{this.settingsPanel=this.props.addon.plugin.getSettingsPanel()}catch(e){Be.err("Plugins","Unable to get settings panel for "+this.name+".",e)}return Me.react.createElement("div",{className:"bd-card bd-addon-card settings-open ui-switch-item",ref:"cardNode"},Me.react.createElement("div",{style:{float:"right",cursor:"pointer"},onClick:()=>{this.refs.settingspanel.innerHTML="",this.setState({settings:!1})}},Me.react.createElement(kt,null)),"object"==typeof this.settingsPanel&&Me.react.createElement("div",{id:"plugin-settings-"+this.name,className:"plugin-settings",ref:"settingspanel"}),"object"!=typeof this.settingsPanel&&Me.react.createElement("div",{id:"plugin-settings-"+this.name,className:"plugin-settings",ref:"settingspanel",dangerouslySetInnerHTML:{__html:this.settingsPanel}}))}buildTitle(e,t,n){const s="{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/),r=s.findIndex(e=>"{{name}}"==e);r&&(s[r]=Nt.createElement("span",{className:"name bda-name"},e));const i=s.findIndex(e=>"{{version}}"==e);r&&(s[i]=Nt.createElement("span",{className:"version bda-version"},t));const o=s.findIndex(e=>"{{author}}"==e);if(r){const e={className:"author bda-author"};(n.link||n.id)&&(e.className+=` ${At.anchor} ${At.anchorUnderlineOnHover}`,e.target="_blank",n.link&&(e.href=n.link),n.id&&(e.onClick=()=>{Me.LayerStack.popLayer(),Me.openDM(n.id)})),s[o]=Nt.createElement(n.link||n.id?"a":"span",e,n.name)}return s.flat()}makeLink(e,t){const n={className:"bda-link bda-link-website",target:"_blank"};return"string"==typeof t&&(n.href=t),"function"==typeof t&&(n.onClick=e=>{e.preventDefault(),e.stopPropagation(),t()}),Me.react.createElement("a",n,e)}makeButton(e,t,n){return Nt.createElement(J,{color:"black",side:"top",text:e},Nt.createElement("div",{className:"bd-addon-button",onClick:n},t))}componentWillUnmount(){this.unmounted=!0}get links(){const e=[],t=this.props.addon;return t.website&&e.push(this.makeLink("Website",t.website)),t.source&&e.push(this.makeLink("Source",t.source)),t.invite&&e.push(this.makeLink("Support Server",()=>{const e=/\.gg\/(.*)$/;let n=t.invite;e.test(n)&&(n=n.match(e)[1]),Me.LayerStack.popLayer(),Me.InviteActions.acceptInviteAndTransitionToInviteChannel(n)})),t.donate&&e.push(this.makeLink("Donate",t.donate)),t.patreon&&e.push(this.makeLink("Patreon",t.patreon)),e}get footer(){const e=this.links;return(e.length||this.hasSettings)&&Me.react.createElement("div",{className:"bd-card-footer bda-footer"},Me.react.createElement("span",{className:"bd-addon-links bda-links"},...e.map((t,n)=>n{this.unmounted||this.setState({isTrusted:!e.suspect||"suspect"})},()=>{}))),Me.react.createElement("div",{className:"bd-card bd-addon-card settings-closed ui-switch-item",style:n},Me.react.createElement("div",{className:"bd-addon-header bda-header"},Me.react.createElement("div",{className:"bd-card-title bda-header-title"},this.buildTitle(this.name,this.version,{name:this.author,id:e,link:t})),Me.react.createElement("div",{className:"bd-addon-controls bda-controls"},this.props.edit&&this.makeButton("Edit",Nt.createElement(Mt,{className:"bd-icon"}),this.edit),this.props.remove&&this.makeButton("Delete",Nt.createElement(Lt,{className:"bd-icon"}),this.delete),this.props.reload&&this.makeButton("Reload",Nt.createElement(xt,{className:"bd-icon"}),this.reload),Nt.createElement(at,{onChange:this.onChange,checked:this.state.checked}))),Me.react.createElement("div",{className:"bd-scroller-wrap bda-description-wrap scroller-wrap fade"},Me.react.createElement("div",{className:"bd-scroller bd-addon-description bda-description scroller"},this.description)),this.footer)}}const Tt=Pt.prototype.render;Object.defineProperty(Pt.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>Tt});const Rt=Me.React;class Ot extends Rt.Component{render(){const e=this.props.size||"16px";return Rt.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e}},Rt.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"}))}}const _t=Me.React;class jt extends _t.Component{constructor(e){super(e),this.state={open:!1,value:this.props.value||this.props.options[0].value},this.dropdown=_t.createRef(),this.onChange=this.onChange.bind(this),this.showMenu=this.showMenu.bind(this),this.hideMenu=this.hideMenu.bind(this)}showMenu(e){e.preventDefault(),this.setState({open:!0},()=>{document.addEventListener("click",this.hideMenu)})}hideMenu(){this.setState({open:!1},()=>{document.removeEventListener("click",this.hideMenu)})}onChange(e){this.setState({value:e}),this.props.onChange&&this.props.onChange(e)}get selected(){return this.props.options.find(e=>e.value==this.state.value)}get options(){const e=this.selected;return _t.createElement("div",{className:"bd-select-options"},this.props.options.map(t=>_t.createElement("div",{className:"bd-select-option"+(e.value==t.value?" selected":""),onClick:this.onChange.bind(this,t.value)},t.label)))}render(){const e="transparent"==this.props.style?" bd-select-transparent":"",t=this.state.open?" menu-open":"";return _t.createElement("div",{className:`bd-select${e}${t}`,onClick:this.showMenu,ref:this.dropdown},_t.createElement("div",{className:"bd-select-value"},this.selected.label),_t.createElement(Ot,{className:"bd-select-arrow"}),this.state.open&&this.options)}}const It=Me.React;class $t extends It.Component{render(){const e=this.props.size||"16px";return It.createElement("svg",{className:this.props.className||"",fill:"var(--text-normal)",viewBox:"0 0 24 24",style:{width:e,height:e}},It.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),It.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"}))}}const Wt=Me.React;class Ft extends Wt.Component{constructor(e){super(e),this.state={focused:!1}}render(){const e=["bd-search-wrapper"];return this.state.focused&&e.push("focused"),Wt.createElement("div",{className:e.join(" ")},Wt.createElement("input",{onChange:this.props.onChange,onKeyDown:this.props.onKeyDown,type:"text",className:"bd-search",placeholder:this.props.placeholder,maxLength:"50",onFocus:()=>{this.setState({focused:!0})},onBlur:()=>{this.setState({focused:!1})}}),Wt.createElement($t,null))}}function Ht(){return(Ht=Object.assign||function(e){for(var t=1;t{Ws.showConfirmationModal("Are You Sure?",`Are you sure you want to delete ${e}?`,{danger:!0,confirmText:"Delete",onConfirm:()=>{t(!0)},onCancel:()=>{t(!1)}})})}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:!0},{label:"Descending",value:!1}]}reverse(e){this.setState({ascending:e})}sort(e){this.setState({sort:e})}search(e){this.setState({query:e.target.value.toLocaleLowerCase()})}getProps(e){return{key:this.getName(e),enabled:this.cookie[this.getName(e)],toggle:this.manager.toggle.bind(this.manager),edit:h["fork-ps-7"]?this.edit.bind(this):null,remove:this.delete.bind(this),addon:e,hash:e.hash}}getString(e){return e?"string"==typeof e?e:e.toString():"???"}get list(){return"plugins"===this.props.type?Object.values(w):Object.values(v)}getAddons(){const e=this.list.sort((e,t)=>{const n=this.state.sort.charAt(0).toUpperCase()+this.state.sort.slice(1),s=e.plugin&&e.plugin["get"+n]?this.getString(e.plugin["get"+n]()):this.getString(e[this.state.sort]),r=t.plugin&&t.plugin["get"+n]?this.getString(t.plugin["get"+n]()):this.getString(t[this.state.sort]);return"string"==typeof s?s.toLocaleLowerCase().localeCompare(r.toLocaleLowerCase()):s>r?1:r>s?-1:0});this.state.ascending||e.reverse();const t=[];for(let n=0;n{t=!1,e.hide()}},zt.createElement(Lightcord.Api.Components.inputs.Button,{ref:"checkUpdateButton",color:"brand",look:"filled",size:"min",hoverColor:"default",onClick:()=>{try{Be.showToast("Plugin update check in progress.",{type:"info"}),window.PluginUpdates.checkAll().then(()=>{Be.showToast("Plugin update check complete.",{type:"success"})}).catch(e=>{console.error(e),Be.showToast("An error occured while checking update.",{type:"error"})})}catch(e){console.error(e),Be.showToast("An error occured while checking update.",{type:"error"})}},wrapper:!1,disabled:!1,onRightClick:()=>{this.refs.checkUpdateButton&&window.PluginUpdates&&window.PluginUpdates.plugins&&(t||(e=new V(this.refs.checkUpdateButton.refs.original.refs.button,Object.values(window.PluginUpdates.plugins).map(e=>e.name).join(", "),{side:"bottom",attachEvents:!1}),e.show(),t=!0))}},"Check for Updates")))}render(){const e=zt.createElement(Ut,{color:"black",position:"top",text:"Reload List"},e=>zt.createElement(xt,Ht({},e,{className:"bd-icon bd-reload bd-reload-header",size:"18px",onClick:async()=>{this.isPlugins?O.updatePluginList():De.updateThemeList(),this.forceUpdate()}}))),t=this.getAddons();return zt.createElement(St,{title:`${this.props.type.toUpperCase()}—${t.length}`},zt.createElement(Lightcord.Api.Components.inputs.Button,{key:"folder-button",color:"brand",look:"filled",size:"min",hoverColor:"default",onClick:this.openFolder.bind(this),wrapper:!1,style:{marginLeft:"10px"}},"Open ",this.isPlugins?"Plugin":"Theme"," Folder"),this.renderCheckUpdates(),!h["fork-ps-5"]&&e,zt.createElement("div",{className:"bd-controls bd-addon-controls"},zt.createElement(Ft,{onChange:this.search,placeholder:`Search ${this.props.type}...`}),zt.createElement("div",{className:"bd-addon-dropdowns"},zt.createElement("div",{className:"bd-select-wrapper"},zt.createElement("label",{className:"bd-label"},"Sort by:"),zt.createElement(jt,{options:this.sortOptions,onChange:this.sort,style:"transparent"})),zt.createElement("div",{className:"bd-select-wrapper"},zt.createElement("label",{className:"bd-label"},"Order:"),zt.createElement(jt,{options:this.directions,onChange:this.reverse,style:"transparent"})))),zt.createElement("div",{className:"bda-slist bd-addon-list"},t))}}const qt=Gt.prototype.render;Object.defineProperty(Gt.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>qt});const Vt=BDModules.get(e=>e.Dispatcher&&e.default&&e.default.dispatch)[0].default,Jt=BDModules.get(e=>e.ActionTypes)[0].ActionTypes,Yt=process.pid;var Zt=new class{constructor(){this.enabled=!1,this.game=u}get formatedGame(){if(!this.game)return null;if(!1===this.enabled)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0}}sendGame(){Vt.dispatch({type:Jt.LOCAL_ACTIVITY_UPDATE,socketId:"lightcord-spoof-socket",pid:Yt,activity:this.formatedGame})}enable(){this.enabled||(this.enabled=!0,console.log("Enabling custom RichPresence"),this.set(u||Object.create(p)),this.sendGame())}disable(){this.enabled&&(this.enabled=!1,console.log("Disabling custom RichPresence"),this.sendGame())}async fetchAssets(e){let t=await BDModules.get(e=>e.getAssets)[0].getAssets(e);if(t.undefined&&"number"==typeof t.undefined)throw new Error("Unknown Application");return t}set(e){this.game=e,this.sendGame()}};const Kt=Me.React;let Xt;class Qt extends Kt.Component{constructor(e){super(e),this.state={data:A.getSettingGroup("rpc")||p,assets:[]},this.preview=null,this.isfetching=!1,this.state.data.application_id&&this.fetchAssets(),this.assetComponents=new Set}updateWhenFetched(e){this.assetComponents.add(e)}onChange(e,t){let n=en.find(t=>t.id===e.props.id);this.setState({data:Object.assign(u,this.state.data,{[n.id]:t||null}),assets:this.state.assets}),"application_id"===e.props.id&&this.fetchAssets(),A.setSettingGroup("rpc",u),this.preview.forceUpdate(),Zt.set(u)}fetchAssets(){if(!0===this.isfetching){let e=this.state.data.application_id;setTimeout(()=>{this.state.data.application_id===e&&this.fetchAssets()},5e3)}if(!this.state.data.application_id)return this.setState({data:this.state.data,assets:[]}),this.forceUpdate(),void this.assetComponents.forEach(e=>e.forceUpdate());this.isfetching=!0,Zt.fetchAssets(this.state.data.application_id).then(e=>{this.isfetching=!1,this.setState({data:this.state.data,assets:Object.keys(e).map(t=>{let n=e[t];return{id:n.id,name:n.name,type:n.type}})}),this.forceUpdate(),this.assetComponents.forEach(e=>e.forceUpdate())}).catch(()=>{this.isfetching=!1,this.setState({data:this.state.data,assets:[]}),this.forceUpdate(),this.assetComponents.forEach(e=>e.forceUpdate())})}updatePreview(e){this.setState({data:e})}get modules(){return Xt||(Xt=[BDModules.get(e=>e.marginBottom20)[0]])}render(){let[e]=this.modules;return[Kt.createElement(ft,{title:"RichPresence Settings",settings:this.props.settings,onChange:this.props.onChange}),Kt.createElement(gt,null),Kt.createElement(Te,{text:"RichPresence"}),Kt.createElement("div",null,this.optionsComponents),Kt.createElement("div",null,Kt.createElement(gt,null),Kt.createElement(Te,{text:"Preview"}),Kt.createElement(yn,{settings:this})),Kt.createElement("div",{className:e.marginBottom20}),Kt.createElement("button",{style:{opacity:.01},onClick:window.ohgodohfuck},"Oh god Oh fuck"),Kt.createElement("button",{style:{opacity:.01},onClick:()=>{I.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=en.map(e=>{if("text"===e.type)return Kt.createElement(rn,{setting:e,manager:this,id:e.id});if("number"===e.type){return[Kt.createElement(on,{setting:e,manager:this,id:e.id})]}return"choice"===e.type?["assets.small","assets.large"].includes(e.id)?Kt.createElement(an,{setting:e,manager:this,id:e.id,choices:[{value:"none",label:"No assets"}].concat(this.state.assets.map(e=>({value:"asset-"+e.id,label:e.name})))}):"Unknown choice.":void 0}))}}const en=[{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 tn,nn,sn;class rn extends Kt.PureComponent{get modules(){return tn&&tn[0]?tn:tn=[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(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]},this.input=Kt.createElement(window.Lightcord.Api.Components.inputs.TextInput,{placeholder:t.placeholder,name:t.id,value:this.state.data,onChange:e=>{this.setState({data:e}),!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,this.state.data),this.isTiming=null,this.lastEdited=Date.now()},500))},type:"text"})}render(){let e=this.props.setting,[t,n,s,r,i,o,a,l]=this.modules;return Kt.createElement("div",{className:t.row+" "+n.marginBottom20},Kt.createElement("div",{className:`${t.item} ${o.flexChild}`},Kt.createElement("h5",{className:r.colorStandard+" "+i.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),this.input),Kt.createElement(bn,null))}}class on extends Kt.PureComponent{get modules(){return nn||(nn=[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(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]},this.input=Kt.createElement(window.Lightcord.Api.Components.inputs.TextInput,{placeholder:t.placeholder,name:t.id,value:this.state.data,type:"number",onChange:(e,t,n)=>{(e=e.replace(/[^\d]+/g,""))!=this.state.data?(!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,this.state.data),this.isTiming=null,this.lastEdited=Date.now()},500)),this.setState({data:e})):n.setValue(e)},type:"text"})}render(){let e=this.props.setting,[t,n,s,r,i,o]=this.modules;return Kt.createElement("div",{className:t.row+" "+n.marginBottom20},Kt.createElement("div",{className:`${t.item} ${o.flexChild}`},Kt.createElement("h5",{className:r.colorStandard+" "+i.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),this.input,"timestamps.start"===e.id?Kt.createElement(Lightcord.Api.Components.inputs.Button,{onClick:()=>{DiscordNative.clipboard.copy(Date.now()+"")},color:"brand"},"Copy current timestamp"):null),Kt.createElement(bn,null))}}class an extends Kt.PureComponent{constructor(e){super(e);let t=this.props.setting;this.state={data:this.props.manager.state.data[t.id]?"asset-"+this.props.manager.state.data[t.id]:"none"},this.props.manager.updateWhenFetched(this)}onChange(e){!this.lastEdited||this.lastEdited{this.props.manager.onChange(this,"none"===this.state.data?null:this.state.data.replace("asset-","")),this.isTiming=null,this.lastEdited=Date.now()},500)),this.setState({data:e}),this.forceUpdate()}get modules(){return sn||(sn=[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 e=this.props.setting,[t,n,s,r,i,o]=this.modules,a=this.props.manager.state.assets.map(e=>({value:"asset-"+e.id,label:e.name}));return a.unshift({value:"none",label:"No assets"}),Kt.createElement("div",{className:t.row+" "+n.marginBottom20},Kt.createElement("div",{className:`${t.item} ${o.flexChild}`},Kt.createElement("h5",{className:r.colorStandard+" "+i.size14+" "+s.h5+" "+s.defaultMarginh5},e.title),Kt.createElement(window.Lightcord.Api.Components.inputs.Dropdown,{value:this.state.data,options:a,onChange:this.onChange.bind(this)})),Kt.createElement(bn,null))}}let ln,cn,dn,hn,un,pn,mn,gn,fn=[];class bn extends Kt.PureComponent{get modules(){return fn&&fn[0]?fn:fn=[BDModules.get(e=>e.divider&&1===Object.keys(e).length)[0],BDModules.get(e=>e.dividerDefault)[0]]}render(){let[e,t]=this.modules;return Kt.createElement("div",{class:`${e.divider} ${t.dividerDefault}`})}}Kt.Component;class yn extends Kt.Component{constructor(e={}){super(e),this.state={active:"profile"},this.tabs=[],this.props.settings.preview=this}changeTab(e){this.state.active!==e.props.id&&(this.tabs.forEach(e=>{e.setActive(!1)}),e.setActive(!0),this.setState({active:e.props.id}))}render(){return Kt.createElement("div",{className:"lc-tabWrapper"},Kt.createElement("div",{className:"lc-tabnav",style:{flex:"0 1 auto"}},Kt.createElement(vn,{preview:this,title:"Full Profile",id:"profile"}),Kt.createElement(vn,{preview:this,title:"User Popout",id:"popout"})),Kt.createElement(wn,{preview:this.preview,state:this.state.rpc,props:{preview:this},key:this.state.active}))}isActive(e){return this.state.active===e}get preview(){return"profile"===this.state.active?En:Cn}}class vn extends Kt.Component{constructor(e){super(e),this.state={active:e.preview.isActive(e.id)},e.preview.tabs.push(this)}setActive(e){this.setState({active:!!e})}render(){let e="lc-navItem";return this.state.active?e+=" lc-navItemActive":e+=" lc-navItemInactive",Kt.createElement("div",{className:e,onClick:()=>{this.props.preview.changeTab(this)}},this.props.title)}}class wn extends Kt.Component{componentDidCatch(e,t){console.error(e,t),this.setState({error:!0})}render(){if(this.state||(this.state={error:!1}),this.state.error)return ln=ln||Me.WebpackModules.find(e=>e.emptyStateImage&&e.emptyState),ln?Kt.createElement("div",{style:{margin:"20px"}},Kt.createElement("div",{style:{backgroundColor:"var(--background-primary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow "+ln.emptyState},Kt.createElement("div",{className:ln.emptyStateImage,style:{marginTop:"20px"}}),Kt.createElement("div",{className:ln.emptyStateHeader},"An error occured"),Kt.createElement("p",{className:ln.emptyStateSubtext},"Please check the console for more informations. Join our ­",Kt.createElement("a",{className:`${Me.anchorClasses.anchor} ${Me.anchorClasses.anchorUnderlineOnHover}`,role:"button",tabindex:0,onClick:()=>{Me.joinLC()}},"support server"),"­ for help."))):(Be.showToast("An error occured. Please check the console for more informations."),null);try{const e=new this.props.preview(this.props.props);return e.setState(this.props.state),e.render()}catch(e){return console.error(e),this.state.error=!0,this.render()}}}class Cn extends Kt.Component{get modules(){return cn||(cn=[Me.WebpackModules.find(e=>e.default&&"UserPopout"===e.default.displayName),Me.WebpackModules.find(e=>e.default&&e.default.getCurrentUser)])}getComponent(){let[e,t]=this.modules;const n=t.default.getCurrentUser();return Kt.createElement(()=>{let t=e.default({userId:n.id,guildId:null,channelId:null,disableUserProfileLink:!0});return dn=t.type,hn=t.props,this.render()},null)}render(){if(!dn)return this.getComponent();let[e,t]=this.modules;const n=t.default.getCurrentUser();let s=Object.assign({},p,this.props.preview.props.settings.state.data);const r=function(){if(!this.game)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0,type:0}}.call({game:s}),i=new dn(Object.assign({},hn,{activity:r,userId:n.id})).render().props.children,o=Kt.createElement("div",window.Lightcord.Api._.excludeProperties(i.props,["onClick","onContextMenu"]));return Kt.createElement("div",{className:"lc-userPopout lc-tab-box-shadow"},o)}}class En extends Kt.Component{get modules(){return un||(un=[Me.WebpackModules.find(e=>e.default&&"UserProfile"===e.default.displayName),Me.WebpackModules.find(e=>e.default&&e.default.getCurrentUser)])}render(){let[e,t]=this.modules;const n=t.default.getCurrentUser();if(!pn){const t=new e.default({user:n}).render();gn=t.type;const s=new t.type(t.props).render(),r=s.type.render(s.props,null),i=new r.type(r.props).render();pn=i.type}if(!pn)throw new Error("Couldn't find the UserProfileComponent component.");let s=Object.assign({},p,this.props.preview.props.settings.state.data);const r=function(){if(!this.game)return null;return{name:this.game.name||p.name,application_id:this.game.application_id||p.application_id,details:this.game.details||void 0,state:this.game.state||void 0,timestamps:this.game["timestamps.start"]?{start:this.game["timestamps.start"]}:void 0,assets:this.game["assets.large"]?{large_image:this.game["assets.large"],small_image:this.game["assets.small"]||void 0}:void 0,type:0}}.call({game:s});mn=new gn({user:n,close:()=>{}}).render().props;const i=new pn(Object.assign({},mn,{activity:r})).render().props.children;return i.props.style={width:"auto"},Kt.createElement("div",{className:"lc-tab lc-tab-box-shadow"},i)}}const Sn=Me.React;let xn=BDModules.get(e=>e.defaultMarginh5)[0],kn=BDModules.get(e=>e.colorStandard)[0],Dn=BDModules.get(e=>e.size32)[0],Mn=BDModules.get(e=>e.scrollbarGhostHairline)[0];const Bn=BDModules.get(e=>e.default&&e.default.getGuilds)[0].default,Ln=BDModules.get(e=>e.default&&e.default.getRelationships)[0].default,Nn=BDModules.get(e=>e.default&&e.default.getSessions)[0].default,An=BDModules.get(e=>e.default&&e.default.getCurrentUser)[0].default;class Pn extends Sn.Component{constructor(e){super(e)}render(){return xn||(xn=BDModules.get(e=>e.defaultMarginh5)[0]),kn||(kn=BDModules.get(e=>e.colorStandard)[0]),Dn||(Dn=BDModules.get(e=>e.size32)[0]),[Sn.createElement(Te,{text:"Account Infos"}),Sn.createElement("div",null,Sn.createElement("h5",{className:kn.colorStandard+" "+Dn.size14+" "+xn.h5+" "+xn.defaultMarginh5},"Profile"),Sn.createElement(_n,{content:this.getProfileValue(),language:"diff"}),Sn.createElement("h5",{className:kn.colorStandard+" "+Dn.size14+" "+xn.h5+" "+xn.defaultMarginh5},"Statistics"),Sn.createElement(_n,{content:this.getStatistics(),language:"diff"}),Sn.createElement("h5",{className:kn.colorStandard+" "+Dn.size14+" "+xn.h5+" "+xn.defaultMarginh5},"Connected Sessions"),Sn.createElement(_n,{content:this.getSessionValue(),language:"diff"})),Sn.createElement("div",{className:BDModules.get(e=>e.marginBottom20)[0].marginBottom20})]}getSessionValue(){const e=Nn.getSessions(),t=Object.keys(e).filter(e=>"all"!==e).map(t=>e[t]);return 0===t.length?"- No session detected. Please try in a few seconds":t.map(e=>`+ id: ${e.sessionId}\n+ os: ${e.clientInfo.os[0].toUpperCase()+e.clientInfo.os.slice(1)}\n+ client: ${e.clientInfo.client}\n+ status: ${e.status}\n+ Activities: ${e.activities.length}`).join("\n"+"-".repeat(38)+"\n")}getProfileValue(){const e=An.getCurrentUser(),t=e.createdAt;let n=e.avatarURL;return e.avatar&&e.avatar.startsWith("a_")&&(n=e.getAvatarURL("gif")),n.startsWith("/")&&(n="https://discord.com"+n),n.endsWith("?size=128")&&(n=n.replace("?size=128","?size=4096")),`+ Username: ${e.username}\n+ Discriminator: ${e.discriminator}\n+ Tag: ${e.tag}\n+ ID: ${e.id}\n+ Avatar: ${e.avatar}\n+ Avatar URL: ${n}\n+ Creation Date: ${t.getDate().toString().padStart(2,"0")}/${(t.getMonth()+1).toString().padStart(2,"0")}/${t.getFullYear().toString().padStart(2,"0")} ${t.getHours().toString().padStart(2,"0")}h ${t.getMinutes().toString().padStart(2,"0")}min ${t.getSeconds()}s\n+ Flags: ${e.flags}\n+ Has Nitro: ${e.hasPremiumSubscription?"Yes":"No"}\n- Email: ${e.email}\n- 2FA: ${e.mfaEnabled?"Yes":"No"}\n- Has Been On Mobile: ${e.mobile?"Yes":"No"}\n- Phone: ${e.phone||"None"}\n- Verified: ${e.verified}\n- Can See NSFW Channels: ${e.nsfwAllowed}`}getStatistics(){const e=Object.values(Bn.getGuilds()),t=Object.keys(Ln.getRelationships()),n=t.filter(e=>Ln.isFriend(e)),s=t.filter(e=>Ln.isBlocked(e));return`+ Server Count: ${e.length} servers\n+ Relations: ${t.length} relations\n+ Friends Count: ${n.length} friends\n- Blocked Users Count: ${s.length} blocked users`}}let Tn=BDModules.get(e=>e.highlight)[0],Rn=BDModules.get(e=>e.markup)[0],On=BDModules.get(e=>e.messageContent)[0];class _n extends Sn.Component{render(){return Rn||(Rn=BDModules.get(e=>e.markup)[0]),On||(On=BDModules.get(e=>e.messageContent)[0]),Mn||(Mn=BDModules.get(e=>e.scrollbarGhostHairline)[0]),Tn||(Tn=BDModules.get(e=>e.listLanguages)[0]),Sn.createElement("div",{class:`${Rn.markup} ${On.messageContent}`},Sn.createElement("pre",null,Sn.createElement("code",{class:Mn.scrollbarGhostHairline+" hljs",dangerouslySetInnerHTML:{__html:Tn.highlight(this.props.language,this.props.content).value}})),Sn.createElement("div",{className:BDModules.get(e=>e.marginBottom8)[0].marginBottom8}))}}const jn=window.Lightcord.DiscordModules.dispatcher,In=BDModules.get(e=>e.default&&e.default.getChannel&&e.default.hasChannel)[0].default;let $n=BDModules.get(e=>e.default&&e.default.addRelationship)[0],Wn=BDModules.get(e=>e.default&&e.default.closePrivateChannel)[0];const Fn={};let Hn=BDModules.get(e=>e.default&&e.default.getCurrentUser)[0];var Un=new class{constructor(){this.antiDM=this.antiDM.bind(this),this.enabled=!1}enable(){this.enabled||(this.enabled=!0,jn.subscribe("MESSAGE_CREATE",this.antiDM))}disable(){this.enabled&&(this.enabled=!1,jn.unsubscribe("MESSAGE_CREATE",this.antiDM))}antiDM(e){if(!e.message.author.bot)return;if(e.message.author.id===(Hn?Hn.default.getCurrentUser():null).id&&e.message.guild_id)return;const t=In.getChannel(e.message.channel_id);var n;t&&(1===t.type&&(Fn[e.message.author.id]||(n=e.message,(/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(n.content)||zn(n,"discord.gg/")||zn(n,"discord.com/invite/")||zn(n,"discordapp.com/invite/"))&&(Fn[e.message.author.id]=!0,Be.showToast(`[AdBlock]: Blocked ${e.message.author.username}#${e.message.author.discriminator}`,{type:"warning"}),$n||($n=BDModules.get(e=>e.default&&e.default.addRelationship)[0]),$n.default.addRelationship(e.message.author.id,{location:"ContextMenu"},2),Wn||(Wn=BDModules.get(e=>e.default&&e.default.closePrivateChannel)[0]),Wn.default.closePrivateChannel(t.id,!1)))))}};function zn(e,t){let n=e.embeds||[];return 0!==n.length&&n.map(e=>"rich"===e.type&&(!!(e.title||"").includes(t)||(!!(e.description||"").includes(t)||(!!((e.footer?e.footer.text:"")||"").includes(t)||!!(e.fields||[]).map(e=>e.value.includes(t)||e.name.includes(t)).includes(!0))))).includes(!0)}let Gn;const qn=Be.removeDa;var Vn=new class{constructor(){this.enabled=!1}enable(){this.enabled||(this.enabled=!0,Gn=Gn||function(){let e=BDModules.get(e=>e.standardSidebarView)[0];if(!e)return null;let t=qn(e.standardSidebarView),n=[],s=BDModules.get(e=>e.userSettingsAccount)[0];const r=BDModules.get(e=>"string"==typeof e.children)[0];return n.push(`#app-mount .${t} .payment-info .${qn(BDModules.get(e=>e.description&&"string"==typeof e.description&&e.description.includes("formText"))[0].description)}`),n.push(`#app-mount .${t} .${qn(BDModules.get(e=>e.paymentSourceRow)[0].paymentSourceRow)} .${qn(BDModules.get(e=>e.subText&&e.descriptionWrapper)[0].subText)}`),s&&(n.push(`#app-mount .${t} .${qn(s.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${qn(BDModules.get(e=>e.viewBody)[0].viewBody)}`),n.push(`.${qn(s.userSettingsSecurity)} .${qn(r.children)} > div:nth-child(2)`)),n}(),Gn||console.error(new Error("Couldn't find selectors to blur personnal informations.")),xe.addStyle("blurPrivate",`\n${Gn.join(", ")} {\n transition: all 150ms cubic-bezier(.55,.085,.68,.53);\n filter: blur(4px);\n opacity: .8;\n}\n\n${Gn.map(e=>e+":hover").join(", ")} {\n transition: all 150ms cubic-bezier(.55,.09,.68,.53);\n filter: none;\n opacity: 1;\n}`))}disable(){this.enabled&&(this.enabled=!1,xe.removeStyle("blurPrivate"))}},Jn=new class{constructor(){window.Lightcord.Api.ensureExported(e=>e.default&&e.default.startTyping).then(e=>{let t=this;const n=e.default.startTyping;e.default.startTyping=function(){if(t.disabled)return n.call(this,...arguments)};const s=e.default.stopTyping;e.default.stopTyping=function(){if(t.disabled)return s.call(this,...arguments)},this.disabled=!0}),window.Lightcord.BetterDiscord.DisableTyping=this}disable(){this.disabled=!0}enable(){this.disabled=!1}};let Yn;class Zn extends React.PureComponent{constructor(){super(...arguments),this.state={states:[]}}render(){Yn||(Yn=D.find(e=>e.FormSection));const e=[...new Set(Object.keys(window.Lightcord.Api.Components).map(e=>Object.keys(window.Lightcord.Api.Components[e]).map(t=>window.Lightcord.Api.Components[e][t])).flat())];return[React.createElement(Yn.FormSection,{tag:"h2",title:"Lightcord's Api Availlable components"},React.createElement(Yn.FormText,{type:"description",className:"",selectable:!1},"These components are here for the plugin devs. They can quickly embed any component below with this panel.",React.createElement("div",{style:{marginTop:"20px"}}),React.createElement(Lightcord.Api.Components.general.AlertBox,{type:"info"},"All these components have error handling. If you want none, add `.original` after the component path."),React.createElement(Lightcord.Api.Components.general.AlertBox,{type:"warn"},"We do not recommend modifying these component with plugins. Only do this if you know what you are doing.")),React.createElement(gt,null),React.createElement(Lightcord.Api.Components.inputs.Button,{color:"brand",look:"outlined",size:"medium",hoverColor:"green",onClick:()=>{I.remote.shell.openExternal("https://lightcord.org/LightcordApi/")},wrapper:!1},"Documentation")),e.map(e=>{const t=e.displayName||e.name,n=`Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e=>window.Lightcord.Api.Components[e][t])}.${t}`;return React.createElement(Kn,{key:n,comp:e})})]}get renders(){}}class Kn extends React.Component{constructor(e){super(e),this.state={tab:"preview",elem:e.comp,options:{}}}render(){const e=this.props.comp;let t=[];e.AllPreviews&&(t=e.AllPreviews);let n=this.state,s=()=>{let e={};return t.forEach(t=>{e[Object.keys(t[0])[0]]=t[0][Object.keys(t[0])[0]]}),Object.keys(n.options).forEach(s=>{e[s]=t.find(e=>e.find(e=>e[s]))[n.options[s]][s]}),e},r=(e,t,n)=>{if("string"==typeof e)return e;if("boolean"==typeof e)return String(e);if("function"==typeof e)return e.toString();if("object"==typeof e){if(e&&e.$$typeof&&(e.$$typeof===Symbol.for("react.element")||60103===e.$$typeof)){if("Lightcord.Api.Components.general.Tabs"===t){if("react"===n)return'React.createElement("div", {style: {\nmarginTop: "20px", marginBottom: "20px"\n}},\nReact.createElement("div", {style: {\nbackgroundColor: "var(--background-secondary)",\npadding: "30px 30px",\nborderRadius: "8px"\n}, className: "lc-tab-box-shadow" },\nReact.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs")\n)\n)';if("jsx"===n)return'
\n
\n Preview tabs\n
\n
'}return"Your components here."}return JSON.stringify(e,null," ")}return String(e)},i=function(t){const n=e.displayName||e.name;const i=`Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e=>window.Lightcord.Api.Components[e][n])}.${n}`,o=s();if("jsx"===t){let e,n=[],s=null;if(Object.keys(o).forEach(e=>{if("children"==e)s=r(o[e],i,t);else{let s=e+"=";"string"==typeof o[e]?s+=JSON.stringify(o[e]):s+=`{${r(o[e],i,t)}}`,n.push(s)}}),s){return e=`<${i} ${n.join(" ")}>`,`${e}\n ${s}\n${``}`}return e=`<${i} ${n.join(" ")}/>`,e}if("react"===t){let e=o.children||null;delete o.children,e&&e.$$typeof&&(e.$$typeof===Symbol.for("react.element")||60103===e.$$typeof)&&(e=r(e,i,t));let n=[];Object.keys(o).forEach(e=>{let s=(/[^\w\d_]/g.test(e)?JSON.stringify(e):e)+": ";"string"==typeof o[e]?s+=JSON.stringify(o[e]):s+=r(o[e],i,t).split("\n").map((e,t)=>0===t?e:" "+e).join("\n"),n.push(s)});let s="{";n.length?n.forEach((e,t)=>{let r=t===n.length-1;0===t||(s+=","),s+="\n ",s+=e,r&&(s+="\n}")}):s+="}";let a="string"==typeof e&&e.startsWith("React.createElement")?e:JSON.stringify(e);return`React.createElement(${i}, ${s}, ${a})`}},o=e.help||{},a=o.info?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"info"},o.info):null,l=o.warn?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"warn"},o.warn):null,c=o.danger?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"danger"},o.danger):null,d=o.error?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"error"},o.error):null,h=o.success?React.createElement(window.Lightcord.Api.Components.general.AlertBox,{type:"success"},o.success):null;return React.createElement("div",null,React.createElement(window.Lightcord.Api.Components.general.SettingsTitle,null,e.displayName||e.name),a,h,l,d,c,t.map(e=>{if(e[0].onClick)return null;if(e[0].text)return null;if(e[0].children)return null;if(1===e.length)return null;let t=Object.keys(e[0])[0];return[React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,t),React.createElement(window.Lightcord.Api.Components.inputs.Dropdown,{options:e.map((e,t)=>({value:"opt-"+t,label:JSON.stringify(e[Object.keys(e)[0]])})),value:"opt-"+(n.options[t]||"0"),onChange:e=>{this.setState({options:Object.assign({},n.options,{[t]:(e.value||"0").replace("opt-","")})})},searchable:!0}),React.createElement("div",{style:{marginBottom:"8px"}})]}),React.createElement(window.Lightcord.Api.Components.general.Tabs,{tabs:[{label:"Preview",id:"preview"},{label:"Code",id:"code"}],active:n.tab,children:"preview"===n.tab?React.createElement("div",{style:{margin:"20px"}},React.createElement("div",{style:{backgroundColor:"var(--background-secondary)",padding:"30px 30px",borderRadius:"8px"},className:"lc-tab-box-shadow"},React.createElement(e,s()))):React.createElement("div",{style:{margin:"20px"}},React.createElement("div",{style:{backgroundColor:"var(--background-secondary)",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.ErrorCatcher,null,React.createElement(()=>React.createElement(window.Lightcord.Api.Components.general.CodeBlock,{language:"jsx",content:i("jsx")}))),React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle,null,"React"),React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher,null,React.createElement(()=>React.createElement(window.Lightcord.Api.Components.general.CodeBlock,{language:"js",content:i("react")}))))),onChange:e=>{this.setState({tab:e})}}))}}const Xn=Me.React;class Qn extends Xn.Component{render(){const e=this.props.size||"18px";return Xn.createElement("svg",{viewBox:"0 0 24 24",fill:"var(--text-normal)",className:this.props.className||"",style:{width:e,height:e},onClick:this.props.onClick},Xn.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),Xn.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"}))}}var es=new class{constructor(){this.windows=new Map,this.enabled=!1,this.init()}async init(){let e=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getWindow);window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN",t=>{setImmediate(()=>{const n=e.default.getWindow(t.key);this.windows.set(t.key,n);let s=n.document.body.classList;s.add("window-popout"),s.add("lightcord"),s.add("lightcord"),this.update(t.key)})}),window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE",e=>{setImmediate(()=>{this.windows.delete(e.key)})}),T.on("theme-enabled",()=>{this.update()}),T.on("theme-disabled",()=>{this.update()}),T.on("theme-reloaded",()=>{this.update()}),T.on("theme-unloaded",()=>{this.update()}),T.on("theme-loaded",()=>{this.update()})}enable(){this.enabled=!0,this.update()}disable(){this.enabled=!1,this.update()}update(e){if(this.windows.size)return this.enabled?this.applyThemes(e):this.removeThemes(e)}removeThemes(e){if(!this.enabled)if(e){let t=this.windows.get(e);if(!t)return;let n=t.document;for(let e of n.querySelectorAll("style[data-lightcord-theme=true]"))e.remove()}else for(let e of this.windows.keys())this.removeThemes(e)}applyThemes(e){if(this.enabled)if(e){let t=this.windows.get(e);if(!t)return;let n=t.document;for(let e of n.querySelectorAll("style[data-lightcord-theme=true]"))e.setAttribute("will-remove","true");Object.keys(bdthemes).forEach(e=>{if(!E[e])return;const t=bdthemes[e];if(!t)return;let s=n.querySelector("style[data-lightcord-theme=true]#"+xe.escapeID(t.id));if(s)s.innerHTML=unescape(t.css),s.removeAttribute("will-remove");else{const e=n.createElement("style");e.id=xe.escapeID(t.id),e.innerHTML=unescape(t.css),e.setAttribute("data-lightcord-theme","true"),n.head.append(e)}});for(let e of n.querySelectorAll("style[will-remove=true]"))e.remove()}else for(let e of this.windows.keys())this.applyThemes(e)}};const ts=Me.React;class ns extends ts.Component{constructor(e){super(e),this.state={value:this.props.value},this.onChange=this.onChange.bind(this),this.emitChange=this.emitChange.bind(this),this.input=ts.createElement(Lightcord.Api.Components.inputs.TextInput.original,{ref:console.log,onChange:this.onChange,value:this.state.value,placeholder:this.props.placeholder,onBlur:this.emitChange})}onChange(e){console.log(e,this.props),this.props.disabled||(this.props.onChange(e),this.setState({value:e}))}emitChange(){console.log("Should emit changes.")}render(){return this.input}}let ss=[];function rs(e){let t=ss.find(t=>t.startsWith(e+"-"));return t||(t=BDModules.get(t=>t[e])[0][e],ss.push(t),t)}class is extends Me.reactComponent{constructor(e){super(e),this.onChange=this.onChange.bind(this)}onChange(e){this.props.onChange(this.props.id,e)}render(){let{text:e,info:t}=this.props.data;return this.props.data.experimental&&(ss.find(e=>e.startsWith("beta-"))||ss.push(BDModules.get(e=>e.beta&&!e.container&&!e.userSettingsVoice)[0].beta),t=[t,React.createElement("sup",{className:rs("beta")},"(EXPERIMENTAL)")]),React.createElement("div",{className:"ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"},React.createElement("div",{className:"ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"},React.createElement("h3",{key:"title",className:"ui-form-title h3 margin-reset margin-reset ui-flex-child"},e),React.createElement(ns,{key:"input",onChange:this.onChange,value:this.props.value,placeholder:this.props.placeholder||null})),React.createElement("div",{className:"ui-form-text style-description margin-top-4",style:{flex:"1 1 auto"}},t))}}class os extends React.PureComponent{render(){let e=D.find(e=>e.Separator&&e.Header&&e.Item);const t=React.createElement(J,{color:"black",side:"top",text:"Changelog"},React.createElement("span",{style:{float:"right",cursor:"pointer"},className:"bd-changelog-button",onClick:()=>{Be.showChangelogModal(bbdChangelog)}},React.createElement(Qn,{className:"bd-icon",size:"16px"})));return new e.Header({children:React.createElement("span",null,"Bandaged BD",t),className:"ui-tab-bar-header"})}}let as=!1;var ls=new class{constructor(){this.onChange=this.onChange.bind(this),this.updateSettings=this.updateSettings.bind(this),this.sidebar=new Ne,this.registerComponents()}registerComponents(){this.sidebar.register("lightcord",cs(this.lightcordComponent.bind(this))),this.sidebar.register("status",cs(this.PresenceComponent.bind(this))),this.sidebar.register("accountinfo",cs(this.AccountInfosComponent.bind(this))),this.sidebar.register("lcapipreview",cs(this.ApiPreviewComponent.bind(this))),this.sidebar.register("BDChangelogTitle",cs(()=>(new os).render())),this.sidebar.register("core",cs(this.coreComponent.bind(this))),this.sidebar.register("customcss",cs(this.customCssComponent.bind(this))),this.sidebar.register("plugins",cs(this.renderAddonPane("plugins"))),this.sidebar.register("themes",cs(this.renderAddonPane("themes")))}get coreSettings(){const e=this.getSettings("core");return[...new Set(e.map(e=>e.category))].map(t=>({title:t,settings:e.filter(e=>e.category==t)}))}get lightcordSettings(){const e=this.getSettings("lightcord");return[...new Set(e.map(e=>e.category))].map(t=>({title:t,settings:e.filter(e=>e.category==t)}))}get PresenceSettings(){return this.getSettings("status")}getSettings(e){return Object.keys(c).reduce((t,n)=>{const s=c[n];return s.cat===e&&s.implemented&&!s.hidden&&(s.text=n,t.push(s)),t},[])}onChange(e,t,n){this.updateSettings(e,t,n)}updateSettings(e,t,n){if(["lightcord-8","no_window_bound","enable_glasstron","lightcord-10","lightcord-11"].includes(e)||(h[e]=t),"bda-gs-2"==e&&(t?xe.addClass(document.body,"bd-minimal"):xe.removeClass(document.body,"bd-minimal")),"bda-gs-3"==e&&(t?xe.addClass(document.body,"bd-minimal-chan"):xe.removeClass(document.body,"bd-minimal-chan")),"bda-gs-1"==e&&(t?tt.addButton():tt.removeButton()),"bda-gs-4"==e&&(t?nt.start():nt.stop()),"bda-gs-5"==e&&(t?xe.addClass(xe.query("#app-mount"),"bda-dark"):xe.removeClass(xe.query("#app-mount"),"bda-dark")),t&&"bda-gs-6"==e&&Pe.inject24Hour(),"bda-gs-7"==e&&(t?Ae.injectColoredText():Ae.removeColoredText()),"fork-ps-4"==e&&(t?rt.start():rt.stop()),"fork-ps-5"==e&&(t?(Se.watchContent("plugin"),Se.watchContent("theme")):(Se.unwatchContent("plugin"),Se.unwatchContent("theme"))),"fork-wp-1"==e&&(Be.setWindowPreference("transparent",t),t?Be.setWindowPreference("backgroundColor",null):Be.setWindowPreference("backgroundColor","#2f3136")),"bda-gs-8"==e&&(t?it.startDebugListener():it.stopDebugListener()),"fork-dm-1"==e&&(t?it.startCopySelector():it.stopCopySelector()),"lightcord-1"===e&&(window.Lightcord.Settings.devMode=!!t,n.forceUpdate()),"lightcord-2"===e&&(window.Lightcord.Settings.callRingingBeat=!!t),"lightcord-presence-1"===e)if(t){Zt.enable();const e=BDModules.get(e=>e.default&&"object"==typeof e.default&&"showCurrentGame"in e.default)[0];e&&!e.default.showCurrentGame&&BDModules.get(e=>e.default&&e.default.updateRemoteSettings)[0].default.updateRemoteSettings({showCurrentGame:!0})}else Zt.disable();if("lightcord-3"===e&&I.ipcRenderer.sendSync("LIGHTCORD_SET_ALWAYS_ON_TOP",t),"lightcord-4"===e&&(t?Un.enable():Un.disable()),"lightcord-6"===e&&(t?Vn.enable():Vn.disable()),"lightcord-7"===e&&(t?Jn.enable():Jn.disable()),"lightcord-8"===e){let e=window.Lightcord.Api.settings;e.set("isTabs",t),e.save(),DiscordNative.app.relaunch()}if("lightcord-9"===e&&es[t?"enable":"disable"](),"lightcord-10"!==e){if("no_window_bound"===e){let e=window.Lightcord.Api.settings;e.set("NO_WINDOWS_BOUND",t),e.delete("IS_MAXIMIZED"),e.delete("IS_MINIMIZED"),e.delete("WINDOW_BOUNDS"),e.save(),DiscordNative.app.relaunch()}if("enable_glasstron"===e){let e=window.Lightcord.Api.settings;e.set("GLASSTRON",t),e.save(),DiscordNative.app.relaunch()}if("lightcord-11"===e){let n=window.Lightcord.Api.settings;return t?(n.set("BD_"+e,t),void n.save()):(n.delete("BD_"+e),void n.save())}this.saveSettings()}else js.methods.NotificationsUseShim(t)}async initializeSettings(){h["bda-gs-2"]&&xe.addClass(document.body,"bd-minimal"),h["bda-gs-3"]&&xe.addClass(document.body,"bd-minimal-chan"),h["bda-gs-1"]&&tt.addButton(),h["bda-gs-4"]&&nt.start(),h["bda-gs-5"]&&xe.addClass(xe.query("#app-mount"),"bda-dark"),h["bda-gs-6"]&&Pe.inject24Hour(),h["bda-gs-7"]&&Ae.injectColoredText(),h["fork-ps-4"]&&rt.start(),h["lightcord-1"]&&(window.Lightcord.Settings.devMode=!0),h["lightcord-2"]&&(window.Lightcord.Settings.callRingingBeat=!0),h["lightcord-presence-1"]&&Zt.enable(),h["lightcord-3"]&&I.ipcRenderer.sendSync("LIGHTCORD_SET_ALWAYS_ON_TOP",!0),h["lightcord-4"]&&Un.enable(),h["lightcord-6"]&&Vn.enable(),h["lightcord-7"]&&Jn.enable(),h["lightcord-9"]&&es.enable(),h["fork-ps-5"]&&(Se.watchContent("plugin"),Se.watchContent("theme")),h["bda-gs-8"]&&it.startDebugListener(),h["fork-dm-1"]&&it.startCopySelector(),this.saveSettings()}saveSettings(){A.setSettingGroup("settings",h),A.setSettingGroup("rpc",u)}loadSettings(){Object.assign(h,A.getSettingGroup("settings")),Object.assign(u,A.getSettingGroup("rpc"))}renderSidebar(e){return this.sidebar.render(e)}coreComponent(){return Me.react.createElement(bt,{key:"cspanel",onChange:this.onChange,sections:this.coreSettings})}lightcordComponent(e,t){let n=window.Lightcord.Api.settings;return[this.lightcordSettings.map((t,s)=>[0===s?null:Me.react.createElement(gt),Me.react.createElement("h2",{className:"ui-form-title h2 margin-reset margin-bottom-20"},t.title),t.settings.map(t=>{let s,r=h[t.id],i=n.get("BD_"+t.id,t.default||"");if("lightcord-8"===t.id&&(r=n.get("isTabs",!1)),"no_window_bound"===t.id&&(r=n.get("NO_WINDOWS_BOUND",!1)),"enable_glasstron"===t.id&&(r=n.get("GLASSTRON",!0)),"lightcord-10"===t.id&&(r=!n.get("DEFAULT_NOTIFICATIONS",!0)),s=["lightcord-11"].includes(t.id)?Me.react.createElement(is,{id:t.id,key:t.id,data:t,value:i,placeholder:t.default||null,onChange:(t,n)=>{this.onChange(t,n,e)}}):Me.react.createElement(dt,{id:t.id,key:t.id,data:t,checked:r,onChange:(t,n)=>{this.onChange(t,n,e)}}),"lightcord-8"==t.id&&r)return[s,React.createElement(Lightcord.Api.Components.inputs.Button,{color:"green",look:"outlined",size:"small",hoverColor:"brand",onClick:()=>{DiscordNative.ipc.send("NEW_TAB")},wrapper:!1,disabled:!1},"Open a new Tab")];if("enable_glasstron"===t.id&&r&&"linux"!==process.platform){let e=[],t=null;return"win32"===process.platform?(e.push("blurbehind","acrylic","transparent"),t=n.get("GLASSTRON_BLUR","blurbehind")):"darwin"===process.platform&&(e.push("titlebar","selection","menu","popover","sidebar","header","sheet","window","hud","fullscreen-ui","tooltip","content","under-window","under-page","none"),t=n.get("GLASSTRON_VIBRANCY","fullscreen-ui")),[s,React.createElement(Lightcord.Api.Components.general.SettingSubTitle,{},"Glasstron Blur"),React.createElement(Lightcord.Api.Components.inputs.Dropdown,{options:e.map(e=>({value:e,label:e})),value:t,disabled:!1,searchable:!0,clearable:!1,onChange:e=>{"win32"===process.platform?I.ipcRenderer.invoke("LIGHTCORD_SET_BLUR_TYPE",e):I.ipcRenderer.invoke("LIGHTCORD_SET_VIBRANCY",e)}},null)]}return s})]),Me.react.createElement(window.Lightcord.Api.Components.inputs.Button,{color:"yellow",look:"ghost",size:"medium",hoverColor:"red",onClick(){I.ipcRenderer.sendSync("LIGHTCORD_RELAUNCH_APP",{args:I.remote.process.argv.slice(1).concat(["--disable-betterdiscord"])})},wrapper:!0},"Relaunch without BetterDiscord"),React.createElement(Lightcord.Api.Components.inputs.Button,{color:"yellow",look:"ghost",size:"medium",hoverColor:"red",onClick:()=>{as||(as=!0,Be.showToast("Clearing cache...",{type:"info"}),t(),I.remote.getCurrentWebContents().session.clearCache().then(()=>{Be.showToast("Cache is cleared !",{type:"success"}),as=!1,t()}).catch(e=>{console.error(e),Be.showToast("An error occured. Check console for more informations.",{type:"error"}),as=!1,t()}))},wrapper:!0,disabled:as},"Clear cache")]}PresenceComponent(){return Me.react.createElement(Qt,{key:"lppannel",onChange:this.onChange,settings:this.PresenceSettings})}AccountInfosComponent(){return Me.react.createElement(Pn,{key:"lapannel"})}ApiPreviewComponent(){return Me.react.createElement(Zn,{key:"lapipannel"})}customCssComponent(){return Me.react.createElement(wt,{key:"csseditor"})}renderAddonPane(e){class t extends Me.react.Component{constructor(e){super(e),this.prefix=this.props.type.replace("s","")}onChange(){this.props.onChange(this.props.type)}render(){return this.props.children}}const n=t.prototype.render;return Object.defineProperty(t.prototype,"render",{enumerable:!1,configurable:!1,set:function(){console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins")},get:()=>n}),function(){return Me.react.createElement(t,{type:e},Me.react.createElement(Gt,{type:e}))}}};function cs(e){class t extends React.Component{render(){return e(n,()=>this.forceUpdate())}}let n;return e=>(n=e,t)}class ds extends Me.reactComponent{render(){return Me.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"},Me.react.createElement("metadata",null),Me.react.createElement("defs",null,Me.react.createElement("filter",{id:"shadow1"},Me.react.createElement("feDropShadow",{dx:"20",dy:"0",stdDeviation:"20","flood-color":"rgba(0,0,0,0.35)"})),Me.react.createElement("filter",{id:"shadow2"},Me.react.createElement("feDropShadow",{dx:"15",dy:"0",stdDeviation:"20","flood-color":"rgba(255,255,255,0.15)"})),Me.react.createElement("filter",{id:"shadow3"},Me.react.createElement("feDropShadow",{dx:"10",dy:"0",stdDeviation:"20","flood-color":"rgba(0,0,0,0.35)"}))),Me.react.createElement("g",null,Me.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"}),Me.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"}),Me.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"})))}}function hs(){return(hs=Object.assign||function(e){for(var t=1;t/g};let ms=BDModules.get(e=>e.CustomEmoji)[0],gs=BDModules.get(e=>e.default&&e.default.getCustomEmojiById)[0],fs=BDModules.get(e=>e.default&&"Autocomplete"===e.default.displayName)[0],bs=BDModules.get(e=>e.getAutocompleteOptions)[0],ys=BDModules.get(e=>e.default&&e.default.queryEmojiResults)[0],vs=BDModules.get(e=>e.default&&e.default.Messages&&e.default.Messages.EMOJI_MATCHING)[0],ws=BDModules.get(e=>e.default&&e.default.getGuild&&e.default.getGuilds&&!e.default.isFetching)[0],Cs=BDModules.get(e=>e.default&&e.default.getDisambiguatedEmojiContext);const Es=Lightcord.Api.settings;var Ss=new class{constructor(){this.init().catch(e=>Be.err("EmojiModule","An error occured",e))}async init(){fs||(fs=await window.Lightcord.Api.ensureExported(e=>e.default&&"Autocomplete"===e.default.displayName)),bs||(bs=await window.Lightcord.Api.ensureExported(e=>e.getAutocompleteOptions)),ys||(ys=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.queryEmojiResults)),vs||(vs=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.Messages&&e.default.Messages.EMOJI_MATCHING)),ws||(ws=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getGuild&&e.default.getGuilds&&!e.default.isFetching)),Cs||(Cs=await window.Lightcord.Api.ensureExported(e=>e.default&&e.default.getDisambiguatedEmojiContext));const e=c["Emoji Prefix"],t=()=>{const t=Es.get("BD_"+e.id,e.default);return"string"!=typeof t?e.default:t};if(fs&&bs&&ys&&vs&&ws&&Cs){console.log("Patching getAutocompleteOptions of AutoCompletionTemplates",bs);const e=bs.getAutocompleteOptions;bs.getAutocompleteOptions=function(n,s,r,i,o){const a=e.call(this,...arguments);return a.LIGHTCORD_EMOJIS={matches(e,n){let s=n.length>1&&t()===e;return Rs(s),s},queryResults:e=>ys.default.queryEmojiResults(e,n),renderResults:(e,n,s,r,i)=>xs(e,n,i.emojis,s,r,vs.default.Messages.EMOJI_MATCHING,vs.default.Messages.EMOJI,fs.default.Emoji,(function(e){return{emoji:e,key:e.id||e.uniqueName||e.name,sentinel:t(),guild:null!=e.guildId?ws.default.getGuild(e.guildId):null}}),(function(e){return t()+e+t()})),getPlainText(e,t){var n=t.emojis;if(null==n||null==n[e])return"";var s=n[e],r=s.animated?"a":"";return s.managed||null==s.id?"."+s.name+".":"<"+r+"."+(s.originalName||s.name)+"."+s.id+">"},getRawText(e,t){var n=t.emojis;if(null==n||null==n[e])return"";var s=n[e],r=s.animated?"a":"";return s.managed||null==s.id?"."+s.name+".":"<"+r+"."+(s.originalName||s.name)+"."+s.id+">"}},a}}else console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));for(;!Me.MessageComponent;)await new Promise(e=>setTimeout(e,100));this.cancelEmojiRender||(this.cancelEmoteRender=Be.monkeyPatch(Me.MessageComponent,"default",{before:e=>{if(!Be.getNestedProp(e.methodArguments[0],"childrenMessageContent.props.message"))return;const n=Be.getNestedProp(e.methodArguments[0],"childrenMessageContent.props.content");if(!n||!n.length)return;let s=[];const r=[];for(let e of n){if("string"!=typeof e){r.push(e);continue}let i,o=!1;do{if(i=ps.EmojiRegex.exec(e),i){o=!0,gs||(gs=BDModules.get(e=>e.default&&e.default.getCustomEmojiById)[0]);const e=gs.default.getCustomEmojiById(i[2]);e?s.push({animated:e.animated,name:e.name,id:e.id,raw:i[0]}):s.push({animated:i[0].startsWith("{if(!e)return"";const o=s.find(t=>t.raw==e);return o?(ms||(ms=BDModules.get(e=>e.CustomEmoji)[0]),React.createElement(ms.CustomEmoji,{emoji:{name:`${t()}${o.name}${t()}`,emojiId:o.id,animated:o.animated,jumboable:1===i.length&&1===n.length}})):e}).reduce((e,t)=>0===e.length?[t]:"string"==typeof t?"string"==typeof e[e.length-1]?(e[e.length-1]+=" "+t,e):(e.push(" "+t),e):(e.push(" ",t),e),[]);r.push(...i)}else r.push(e)}for(;e.methodArguments[0].childrenMessageContent.props.content[0];)e.methodArguments[0].childrenMessageContent.props.content.shift();for(;r[0];)e.methodArguments[0].childrenMessageContent.props.content.push(r.shift())}}))}disable(){this.cancelEmoteRender&&(this.cancelEmoteRender(),this.cancelEmoteRender=null)}start(){}};function xs(e,t,n,s,r,i,o,a,l,c){if(null==n||0===n.length)return null;var d=n.map((function(e,n){return React.createElement(a,Object.assign({onClick:r,onHover:s,selected:t===n,index:n},l(e,n)))}));return[ks(i,o,e,c),d]}function ks(e,t,n,s){var r=n.length>0?e.format({prefix:s(n)}):t;return Array.isArray(r)?r.unshift(React.createElement("strong",{},"[Lightcord] ")):r="[LIGHTCORD] "+r,React.createElement(fs.default.Title,{title:r},r)}ks.displayName="renderHeader";let Ds,Ms,Bs,Ls,Ns=BDModules.get(e=>e.default&&e.default.isEmojiDisabled)[0],As=Ns&&Ns.default.isEmojiDisabled,Ps=!1,Ts=!1;function Rs(e){Ps=e,Ts||(Ns||(Ns=BDModules.get(e=>e.default&&e.default.isEmojiDisabled)[0]),Ns&&(As||(As=Ns.default.isEmojiDisabled),Ts=!0,Ns.default.isEmojiDisabled=function(e){return Ps?!(!e.surrogates&&!e.diversity):As.call(this,...arguments)}))}function Os(){}Os.prototype.setConfig=function(e){this.hasStarted||Object.assign(y,e)},Object.defineProperty(Os.prototype,"methods",{get:()=>Ds}),Os.prototype.setMethods=function(e){this.hasStarted||(Ds=e)},Os.prototype.init=async function(){if(this.hasStarted)return;if(this.hasStarted=!0,!Array.prototype.flat)return void Be.alert("Not Supported","BetterDiscord v"+a+" does not support this old version ("+i+") of Discord. Please update your Discord installation before proceeding.");if(y.version
Please download the latest version from GitHub");if(window.ED)return void Be.alert("Not Supported","BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");if(window.WebSocket&&window.WebSocket.name&&window.WebSocket.name.includes("Patched"))return void Be.alert("Not Supported","BandagedBD does not work with Powercord. Please uninstall one of them.");Be.suppressErrors(this.patchAttributes.bind(this),"LC Plugin Certifier Patch")(),Be.log("Startup","Initializing Settings"),this.initSettings(),await this.checkForGuilds(),Me.initialize(),Be.log("Startup","Updating Settings"),ls.initializeSettings(),Be.log("Startup","Loading Addons Cache"),await Se.loadAddonCertifierCache(),Be.log("Startup","Loading Plugins"),await O.loadPlugins(),Be.log("Startup","Loading Themes"),await De.loadThemes(),xe.addStyle("customcss",Buffer.from(A.getBDData("bdcustomcss"),"base64").toString("utf8")),window.addEventListener("beforeunload",(function(){h["bda-dc-0"]&&document.querySelector(".btn.btn-disconnect").click()})),Q.start(),Be.log("Startup","Removing Loading Icon"),document.getElementsByClassName("bd-loaderv2").length&&document.getElementsByClassName("bd-loaderv2")[0].remove(),Be.log("Startup","Initializing Main Observer"),this.initObserver(),h["fork-ps-1"]&&(Be.log("Startup","Collecting Startup Errors"),Be.showContentErrors({plugins:f,themes:b}));const e=A.getBDData("version");if(a>e&&(l&&this.showChangelogModal(l),A.setBDData("version",a)),Ss.start(),Be.suppressErrors(this.patchSocial.bind(this),"BD Social Patch")(),Be.suppressErrors(this.patchGuildPills.bind(this),"BD Guild Pills Patch")(),Be.suppressErrors(this.patchGuildListItems.bind(this),"BD Guild List Items Patch")(),Be.suppressErrors(this.patchGuildSeparator.bind(this),"BD Guild Separator Patch")(),Be.suppressErrors(this.patchMessageHeader.bind(this),"BD Badge Chat Patch")(),Be.suppressErrors(this.patchMemberList.bind(this),"BD Badge Member List Patch")(),Be.suppressErrors(this.patchAttachment.bind(this),"LC Plugin Certifier Patch")(),y.haveInstalledDefault){let e=Be.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(t=>{e.onClose(t)})}const t=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");t&&(t.style.top="3px",t.innerHTML='\n \n \n \n')},Os.prototype.patchAttributes=async function(){let e=[];for(this.cancelPatchAttributes=function(){e.forEach(e=>e())};!Me.MessageComponent;)await new Promise(e=>setTimeout(e,100));const t=D.find(e=>"Anchor"==e.displayName);window.Lightcord.Api.ensureExported(e=>e.default&&"DiscordTag"===e.default.displayName).then(e=>{let n=e.default;e.default=function(e){let s=n(e),r=Ue(),i=Me.React.createElement("div",{style:{display:"inline",marginTop:"5px"}},Me.React.createElement("span",{id:"badges-"+r,key:"badges-"+r,style:{display:"inherit"}})),o=[s];"249746236008169473"===e.user.id?o.push(Me.React.createElement(J,{color:"black",side:"top",text:"BandagedBD Developer"},Me.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Me.React.createElement(ds,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==e.user.id&&"696003456611385396"!==e.user.id||o.push(Me.React.createElement(J,{color:"black",side:"top",text:"Lightcord Developer"},Me.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Me.React.createElement(us,{size:"16px",className:"bd-logo"})))),o.push(i);let a=Me.React.createElement("div",{style:{display:"block"}},o);return _s(r,e.user,!1),a},e.default.displayName=n.displayName}),e.push(Be.monkeyPatch(Me.MessageComponent,"default",{after:e=>{e.methodArguments[0].childrenMessageContent.props.message&&(e.returnValue.props["data-message-id"]=e.methodArguments[0].childrenMessageContent.props.message.id)}}))},Os.prototype.checkForGuilds=function(){let e=0;return new Promise(t=>{const n=function(){const s=Me.guildClasses.wrapper.split(" ")[0];document.querySelectorAll("."+s).length>0&&e++;const r=Me.guildClasses.listItem.split(" ")[0],i=Me.guildClasses.blobContainer.split(" ")[0];return document.querySelectorAll(`.${s} .${r} .${i}`).length>0||e>=50?t(y.deferLoaded=!0):void setTimeout(n,100)};"loading"!=document.readyState&&setTimeout(n,100),document.addEventListener("DOMContentLoaded",()=>{setTimeout(n,100)})})},Os.prototype.injectExternals=async function(){},Os.prototype.initSettings=function(){if(A.initialize(),A.getSettingGroup("rpc")||Object.assign(u,p),A.getSettingGroup("settings")){ls.loadSettings();for(const e in d)null==h[e]&&(h[e]=d[e],ls.saveSettings())}else Object.assign(h,d),ls.saveSettings();window.Lightcord.Api.ensureExported(e=>e.default&&e.default.prototype&&e.default.prototype.getPredicateSections).then(e=>{let t=e.default.prototype.getPredicateSections;e.default.prototype.getPredicateSections=function(){let e=t.call(this,...arguments);if(!e[1])return e;if("My Account"===e[1].section){let t=[];for(t.push(e.pop()),t.push(e.pop()),t.push(e.pop()),t.push(e.pop()),e.push(...ls.renderSidebar(this));t[0];)e.push(t.pop())}return console.log(e),e}})},Os.prototype.initObserver=function(){new MutationObserver(e=>{for(let t=0,n=e.length;te.layer&&"string"==typeof e.layer&&e.animating)[0].layer),Bs||(Bs=BDModules.get(e=>e.socialLinks&&"string"==typeof e.socialLinks)[0].socialLinks),Ls||(Ls=BDModules.get(e=>e.modal&&"string"==typeof e.modal&&e.inner&&"string"==typeof e.inner&&!e.responsiveWidthMobile)[0].modal),s.classList.contains(Ms)&&("GUILD_SETTINGS"===s.getAttribute("aria-label")&&(s.setAttribute("layer-id","server-settings"),s.setAttribute("id","server-settings")),s.getElementsByClassName(Bs).length&&(s.setAttribute("layer-id","user-settings"),s.setAttribute("id","user-settings"))),s.parentElement==document.body&&s.querySelector("#ace_settingsmenu")&&(s.id="ace_settingsmenu_container")}}).observe(document,{childList:!0,subtree:!0})},Os.prototype.showChangelogModal=function(e={}){return Be.showChangelogModal(e)},Os.prototype.alert=function(e,t){return Be.alert(e,t)},Os.prototype.patchSocial=function(){if(this.socialPatch)return;const e=D.find(e=>"TabBar"==e.displayName),t=D.find(e=>"Anchor"==e.displayName);e&&(this.socialPatch=Be.monkeyPatch(e.prototype,"render",{after:e=>{const n=e.returnValue.props.children;if(!n||!n.length||n.length<3)return;if("Separator"!==n[n.length-3].type.displayName)return;if(!n[n.length-2].type.toString().includes("socialLinks"))return;if(t){let e=BDModules.get(e=>e.socialLinks)[0];const s=n[n.length-2].type,r=function(){const n=s(...arguments);return n.props.children.push(Me.React.createElement(J,{color:"black",side:"top",text:"Lightcord"},Me.React.createElement(t,{className:"bd-social-link "+e.link,href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Me.React.createElement(us,{size:"16px",className:"bd-social-logo"})))),n.props.children.push(Me.React.createElement(J,{color:"black",side:"top",text:"BandagedBD"},Me.React.createElement(t,{className:"bd-social-link "+e.link,href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Me.React.createElement(ds,{size:"16px",className:"bd-social-logo"})))),n};n[n.length-2].type=r}let[s,r,i]=[BDModules.get(e=>e.colorMuted)[0].colorMuted,BDModules.get(e=>e.size32)[0],BDModules.get(e=>e.versionHash)[0].versionHash];const o=`(${y.hash?y.hash.substring(0,7):y.branch})`,l=I.ipcRenderer.sendSync("LIGHTCORD_GET_BUILD_INFOS"),c=[Me.react.createElement("div",{className:`${s} ${r.size12}`},`Lightcord ${l.version} `,Me.react.createElement("span",{className:i+" da-versionHash"},`(${(l.commit||"Unknown").slice(0,7)})`)),Me.react.createElement("div",{className:`${s} ${r.size12}`},`BBD ${a} `,Me.react.createElement("span",{className:i+" da-versionHash"},o))],d=n[n.length-1].type;n[n.length-1].type=function(){const e=d(...arguments);return e.props.children.splice(1,0,c),e}}}))};function _s(e,t,n){process.nextTick(()=>{const s=document.getElementById("badges-"+e);if(!s||s.childNodes.length>0)return;if(s.childNodes.length)return;let r=document.createElement("div");r.style.display="none",s.appendChild(r);const i=D.find(e=>"Anchor"==e.displayName);qe.getBadges(t.id).then(e=>{e.forEach(e=>{const r={svg:{size:"16px",className:"bd-logo",width:"16px"}};e.scopes.forEach(e=>{"user"===e&&(r.user=t)}),e.href||(r.Anchor=i,r.href={className:n?"bd-chat-badge":"bd-member-badge",title:e.name,target:"_blank"});const o=Me.React.createElement(J,{color:"black",side:"top",text:e.name},e.href?Me.react.createElement(i,{href:e.href,className:n?"bd-chat-badge":"bd-member-badge",title:e.name,target:"_blank"},Me.React.createElement(e.component,r)):Me.React.createElement(e.component,r)),a=document.createElement("div");Me.reactDom.render(o,a),a.childNodes.forEach(e=>{s.appendChild(e)})})})})}Os.prototype.patchGuildListItems=function(){if(this.guildListItemsPatch)return;const e=function(){const e=D.findByProps("wrapper","unreadMentionsBar"),t=D.findByProps("guildsError","selected"),n=D.findByProps("blobContainer");return Object.assign({},e,t,n)}(),t=e.listItem.split(" ")[0],n=e.blobContainer.split(" ")[0],s=Me.getInternalInstance(document.querySelector(`.${t} .${n}`).parentElement).return.type;s&&(this.guildListItemsPatch=Be.monkeyPatch(s.prototype,"render",{after:e=>{if(e.returnValue&&e.thisObject){const t=e.returnValue,n=e.thisObject.props;let s=t.props.className;return s+=" bd-guild",n.unread&&(s+=" bd-unread"),n.selected&&(s+=" bd-selected"),n.audio&&(s+=" bd-audio"),n.video&&(s+=" bd-video"),n.badge&&(s+=" bd-badge"),n.animatable&&(s+=" bd-animatable"),t.props.className=s,t}}}))},Os.prototype.patchGuildPills=function(){if(this.guildPillPatch)return;const e=D.find(e=>e.default&&!e.default.displayName&&e.default.toString&&e.default.toString().includes("translate3d"));e&&(this.guildPillPatch=Be.monkeyPatch(e,"default",{after:e=>{const t=e.methodArguments[0];return t.unread&&(e.returnValue.props.className+=" bd-unread"),t.selected&&(e.returnValue.props.className+=" bd-selected"),t.hovered&&(e.returnValue.props.className+=" bd-hovered"),e.returnValue}}))},Os.prototype.patchGuildSeparator=function(){if(this.guildSeparatorPatch)return;const e=D.findByDisplayName("Guilds"),t=D.findByProps("renderListItem");if(!t||!e)return;const n=function(){const e=t.Separator(...arguments);return e.props.className+=" bd-guild-separator",e};this.guildSeparatorPatch=Be.monkeyPatch(e.prototype,"render",{after:e=>{e.returnValue.props.children[1].props.children[3].type=n}})},Os.prototype.patchAttachment=function(){if(this.AttachmentPatch)return;const e=BDModules.get(e=>e.default&&"Attachment"===e.default.displayName)[0];D.find(e=>"Anchor"==e.displayName)&&e&&e.default&&(this.AttachmentPatch=Be.monkeyPatch(e,"default",{after:e=>{if(!h["fork-ps-6"])return;const t=e.methodArguments[0]||null,n=Be.getNestedProp(e.returnValue,"props.children");if(!n||!t||!t.url)return;if(!Array.isArray(n))return;const s=Ue();n.push(Me.react.createElement("span",{id:"certified-"+s})),Q.patch(t,"certified-"+s)}}))},Os.prototype.patchMessageHeader=function(){if(this.messageHeaderPatch)return;const e=D.findByProps("MessageTimestamp"),t=D.find(e=>"Anchor"==e.displayName);t&&e&&e.default&&(this.messageHeaderPatch=Be.monkeyPatch(e,"default",{after:e=>{const n=Be.getNestedProp(e.methodArguments[0],"message.author"),s=Be.getNestedProp(e.returnValue,"props.children.1.props.children.1.props.children");if(!s||!n||!n.id)return;if(!Array.isArray(s))return;"249746236008169473"===n.id?s.push(Me.React.createElement(J,{color:"black",side:"top",text:"BandagedBD Developer"},Me.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Me.React.createElement(ds,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==n.id&&"696003456611385396"!==n.id||s.push(Me.React.createElement(J,{color:"black",side:"top",text:"Lightcord Developer"},Me.React.createElement(t,{className:"bd-chat-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Me.React.createElement(us,{size:"16px",className:"bd-logo"}))));const r=Ue();s.push(Me.React.createElement("div",{id:"badges-"+r,style:{display:"inline"}})),_s(r,n,!0)}}))},Os.prototype.patchMemberList=function(){if(this.memberListPatch)return;const e=D.findByDisplayName("MemberListItem"),t=D.find(e=>"Anchor"==e.displayName);t&&e&&e.prototype&&e.prototype.renderDecorators&&(this.memberListPatch=Be.monkeyPatch(e.prototype,"renderDecorators",{after:e=>{const n=Be.getNestedProp(e.thisObject,"props.user"),s=Be.getNestedProp(e.returnValue,"props.children");if(!s||!n||!n.id)return;if(!Array.isArray(s))return;"249746236008169473"===n.id?s.push(Me.React.createElement(J,{color:"black",side:"top",text:"BandagedBD Developer"},Me.React.createElement(t,{className:"bd-member-badge",href:"https://github.com/rauenzi/BetterDiscordApp",title:"BandagedBD",target:"_blank"},Me.React.createElement(ds,{size:"16px",className:"bd-logo"})))):"696481194443014174"!==n.id&&"696003456611385396"!==n.id||s.push(Me.React.createElement(J,{color:"black",side:"top",text:"Lightcord Developer"},Me.React.createElement(t,{className:"bd-member-badge",href:"https://github.com/Lightcord/Lightcord",title:"Lightcord",target:"_blank"},Me.React.createElement(us,{size:"16px",className:"bd-logo"}))));const r=Ue();s.push(Me.React.createElement("div",{id:"badges-"+r})),_s(r,n,!1)}}))},Os.prototype.updateInjector=async function(){if(!A.injectionPath)return!1};var js=new Os;const Is={get React(){return Me.React},get ReactDOM(){return Me.ReactDom},get ReactComponent(){return Me.ReactComponent},get WindowConfigFile(){return Be.WindowConfigFile},get settings(){return c},get emotes(){return null},get screenWidth(){return Math.max(document.documentElement.clientWidth,window.innerWidth||0)},get screenHeight(){return Math.max(document.documentElement.clientHeight,window.innerHeight||0)},getAllWindowPreferences:function(){return Be.getAllWindowPreferences()},getWindowPreference:function(e){return Be.getWindowPreference(e)},setWindowPreference:function(e,t){return Be.setWindowPreference(e,t)},injectCSS:function(e,t){xe.addStyle(xe.escapeID(e),t)},clearCSS:function(e){xe.removeStyle(xe.escapeID(e))},linkJS:function(e,t){xe.addScript(xe.escapeID(e),t)},unlinkJS:function(e){xe.removeScript(xe.escapeID(e))},getPlugin:function(e){return w.hasOwnProperty(e)?w[e].plugin:null},getCore:function(){return Be.warn("Deprecation Notice","BdApi.getCore() will be removed in future versions."),js},alert:function(e,t){return Be.showConfirmationModal(e,t,{cancelText:null})},showConfirmationModal:function(e,t,n={}){return Be.showConfirmationModal(e,t,n)},showToast:function(e,t={}){Be.showToast(e,t)},findModule:function(e){return Me.WebpackModules.find(e)},findAllModules:function(e){return Me.WebpackModules.findAll(e)},findModuleByProps:function(...e){return Me.WebpackModules.findByUniqueProperties(e)},findModuleByPrototypes:function(...e){return Me.WebpackModules.findByPrototypes(e)},findModuleByDisplayName:function(e){return Me.WebpackModules.findByDisplayName(e)},getInternalInstance:function(e){if(e instanceof window.jQuery||e instanceof Element)return e instanceof jQuery&&(e=e[0]),Me.getInternalInstance(e)},loadData:function(e,t){return A.getPluginData(e,t)}};Is.getData=Is.loadData,Is.saveData=function(e,t,n){return A.setPluginData(e,t,n)},Is.setData=Is.saveData,Is.deleteData=function(e,t){return A.deletePluginData(e,t)},Is.monkeyPatch=function(e,t,n){return Be.monkeyPatch(e,t,n)},Is.onRemoved=function(e,t){return Be.onRemoved(e,t)},Is.suppressErrors=function(e,t){return Be.suppressErrors(e,t)},Is.testJSON=function(e){return Be.testJSON(e)},Is.isPluginEnabled=function(e){return!!C[e]},Is.isThemeEnabled=function(e){return!!E[e]},Is.isSettingEnabled=function(e){return!!h[e]},Is.enableSetting=function(e){return ls.onChange(e,!0)},Is.disableSetting=function(e){return ls.onChange(e,!1)},Is.toggleSetting=function(e){return ls.onChange(e,!h[e])},Is.getBDData=function(e){return A.getBDData(e)},Is.setBDData=function(e,t){return A.setBDData(e,t)};const $s=(e,t,n)=>new class{get folder(){return n.folder}isEnabled(t){return!!e[t]}enable(e){return n.enable(e)}disable(e){return n.disable(e)}toggle(t){e[t]?this.disable(t):this.enable(t)}reload(e){return n.reload(e)}get(e){return t.hasOwnProperty(e)?t[e].plugin?t[e].plugin:t[e]:null}getAll(){return Object.keys(t).map(e=>this.get(e)).filter(e=>e)}};Is.Plugins=$s(C,w,O),Is.Themes=$s(E,v,De);var Ws=Is;window.Lightcord.BetterDiscord.BdApi=Is,function(){const e=Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype,"contentWindow").get;Object.defineProperty(HTMLIFrameElement.prototype,"contentWindow",{get:function(){const t=Reflect.apply(e,this,arguments);return new Proxy(t,{getOwnPropertyDescriptor:function(e,t){if("localStorage"!==t)return Object.getOwnPropertyDescriptor(e,t)},get:function(e,t){if("localStorage"===t)return null;const n=e[t];return"function"==typeof n?n.bind(e):n}})}}),Object.defineProperty(Reflect,"apply",{value:Reflect.apply,writable:!1,configurable:!1}),Object.defineProperty(Function.prototype,"bind",{value:Function.prototype.bind,writable:!1,configurable:!1});const t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(){const e=arguments[1];return e.toLowerCase().includes("api/webhooks")?null:Reflect.apply(t,this,arguments)}}(),(()=>{const e=document.createElement("div");e.className="bd-loaderv2",e.title="BandagedBD is loading...",document.body.appendChild(e)})();const Fs=(e,t)=>{Object.defineProperty(window,e,{get:()=>(Be.warn("Deprecated Global",`"${e}" will be removed in future versions. Please only use BdApi.`),t)})},Hs=Object.keys(s);for(const e of Hs)Fs(e,s[e]);Fs("BDV2",Me),Fs("pluginModule",O),Fs("themeModule",De),Fs("Utils",Be),Fs("BDEvents",T),Fs("settingsPanel",ls),Fs("DataStore",A),Fs("ContentManager",Se),Fs("ClassNormalizer",rt),window.BdApi=Ws,Fs("mainCore",js);class Us{constructor(e,t){js.setConfig(e),js.setMethods(t)}init(){js.init()}}}]); -//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/BetterDiscordApp/dist/index.min.js.map b/BetterDiscordApp/dist/index.min.js.map deleted file mode 100644 index ace9650..0000000 --- a/BetterDiscordApp/dist/index.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://BetterDiscord/webpack/bootstrap","webpack://BetterDiscord/external \"electron\"","webpack://BetterDiscord/external \"path\"","webpack://BetterDiscord/external \"fs\"","webpack://BetterDiscord/external \"crypto\"","webpack://BetterDiscord/external \"node-fetch\"","webpack://BetterDiscord/external \"events\"","webpack://BetterDiscord/external \"module\"","webpack://BetterDiscord/./src/0globals.js","webpack://BetterDiscord/./src/modules/webpackModules.js","webpack://BetterDiscord/./src/modules/dataStore.js","webpack://BetterDiscord/./src/modules/bdEvents.js","webpack://BetterDiscord/./src/modules/pluginModule.js","webpack://BetterDiscord/./src/ui/tooltip.js","webpack://BetterDiscord/./src/ui/tooltipWrap.js","webpack://BetterDiscord/./src/modules/pluginCertifier.js","webpack://BetterDiscord/./src/modules/contentManager.js","webpack://BetterDiscord/./src/modules/domtools.js","webpack://BetterDiscord/./src/modules/themeModule.js","webpack://BetterDiscord/./src/modules/v2.js","webpack://BetterDiscord/./src/modules/utils.js","webpack://BetterDiscord/./src/modules/settingsPanelSidebar.js","webpack://BetterDiscord/./src/modules/coloredText.js","webpack://BetterDiscord/./src/modules/24hour.js","webpack://BetterDiscord/./src/ui/settingsTitle.js","webpack://BetterDiscord/./src/ui/tabBarSeparator.js","webpack://BetterDiscord/./src/ui/publicservers/serverCard.js","webpack://BetterDiscord/./src/modules/hooks.js","webpack://BetterDiscord/./src/ui/publicservers/publicServers.js","webpack://BetterDiscord/./src/svg/bug_hunter.jsx","webpack://BetterDiscord/./src/svg/circus.jsx","webpack://BetterDiscord/./src/modules/distant.js","webpack://BetterDiscord/./src/modules/Layers.jsx","webpack://BetterDiscord/./src/modules/publicServers.js","webpack://BetterDiscord/./src/modules/voiceMode.js","webpack://BetterDiscord/./src/modules/classNormalizer.js","webpack://BetterDiscord/./src/modules/devMode.js","webpack://BetterDiscord/./src/ui/components/switch.jsx","webpack://BetterDiscord/./src/ui/switch.js","webpack://BetterDiscord/./src/ui/margintop.jsx","webpack://BetterDiscord/./src/ui/settingsGroup.jsx","webpack://BetterDiscord/./src/ui/sectionedSettingsPanel.js","webpack://BetterDiscord/./src/ui/checkbox.js","webpack://BetterDiscord/./src/ui/cssEditorDetached.js","webpack://BetterDiscord/./src/ui/cssEditor.js","webpack://BetterDiscord/./src/ui/errorBoundary.js","webpack://BetterDiscord/./src/ui/contentColumn.js","webpack://BetterDiscord/./src/ui/reloadIcon.js","webpack://BetterDiscord/./src/ui/xSvg.js","webpack://BetterDiscord/./src/ui/icons/edit.jsx","webpack://BetterDiscord/./src/ui/icons/delete.jsx","webpack://BetterDiscord/./src/ui/addoncard.jsx","webpack://BetterDiscord/./src/ui/icons/downarrow.jsx","webpack://BetterDiscord/./src/ui/components/dropdown.jsx","webpack://BetterDiscord/./src/ui/icons/search.jsx","webpack://BetterDiscord/./src/ui/components/search.jsx","webpack://BetterDiscord/./src/ui/addonlist.jsx","webpack://BetterDiscord/./src/modules/CustomRichPresence.js","webpack://BetterDiscord/./src/ui/presenceSettings.jsx","webpack://BetterDiscord/./src/ui/AccountInfos.jsx","webpack://BetterDiscord/./src/modules/AntiAdDM.js","webpack://BetterDiscord/./src/modules/blurPrivate.js","webpack://BetterDiscord/./src/modules/disableTyping.js","webpack://BetterDiscord/./src/ui/ApiPreview.jsx","webpack://BetterDiscord/./src/ui/icons/history.jsx","webpack://BetterDiscord/./src/modules/popoutWindow.js","webpack://BetterDiscord/./src/ui/components/textinput.jsx","webpack://BetterDiscord/./src/ui/TextInputSetting.jsx","webpack://BetterDiscord/./src/modules/settingsPanel.js","webpack://BetterDiscord/./src/ui/bdLogo.js","webpack://BetterDiscord/./src/svg/Lightcord.jsx","webpack://BetterDiscord/./src/modules/emojiModule.js","webpack://BetterDiscord/./src/modules/core.js","webpack://BetterDiscord/./src/modules/bdApi.js","webpack://BetterDiscord/./src/localStorageFix.js","webpack://BetterDiscord/./src/index.js","webpack://BetterDiscord/./src/loadingIcon.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","minimumDiscordVersion","currentDiscordVersion","window","DiscordNative","remoteApp","getVersion","minSupportedVersion","bbdVersion","bbdChangelog","description","changes","title","type","items","settings","id","info","implemented","hidden","cat","category","experimental","process","platform","default","defaultCookie","settingsCookie","settingsRPC","defaultRPC","Date","now","lightcordSettings","defaultLightcordSettings","bdpluginErrors","bdthemeErrors","bdConfig","BetterDiscordConfig","bdthemes","bdplugins","pluginCookie","themeCookie","req","webpackJsonp","push","__extra_id__","find","filter","mod","findAll","findByProps","propNames","every","prop","undefined","findByPrototypes","protoNames","protoProp","findByDisplayName","displayName","Lightcord","BetterDiscord","WebpackModules","fs","path","releaseChannel","globals","app","getReleaseChannel","dataPath","env","APPDATA","join","HOME","XDG_CONFIG_HOME","constructor","this","data","stable","canary","ptb","pluginData","DataStore","initialize","existsSync","BDFile","writeFileSync","JSON","stringify","parse","readFileSync","settingsFile","__non_webpack_require__","unlinkSync","assign","setBDData","err","console","error","Utils","alert","_injectionPath","_configFile","resolve","injectionPath","_BDFile","_settingsFile","getPluginFile","pluginName","ContentManager","pluginsFolder","getSettingGroup","setSettingGroup","getBDData","getPluginData","setPluginData","deletePluginData","EventEmitter","super","BDEvents","dispatch","eventName","args","emit","off","eventAction","removeListener","PluginModule","loadPlugins","async","loadPluginData","splice","plugins","keys","length","plugin","getName","load","file","filename","message","stack","start","showToast","Promise","setTimeout","savePluginData","remote","getCurrentWebContents","on","channelSwitch","startPlugin","reload","stopPlugin","stop","enablePlugin","enable","disablePlugin","disable","togglePlugin","toggle","loadPlugin","loadContent","showContentErrors","values","log","unloadPlugin","filenameOrName","bdplugin","unloadContent","delete","fullPath","reloadPlugin","enabled","reloadContent","edit","shell","openExternal","updatePluginList","results","loadNewContent","added","removed","saved","newMessage","onMessage","onSwitch","rawObserver","e","observer","TooltipClasses","TooltipLayers","getTooltipClasses","getTooltipLayers","getClass","sideOrColor","upperCase","toUpperCase","slice","tooltipClass","classExists","toPx","EmulatedTooltip","node","text","options","style","side","preventFlip","disabled","attachEvents","jQuery","label","toLowerCase","element","document","createElement","className","layer","disabledPointerEvents","tooltipElement","tooltip","labelElement","tooltipContent","pointerElement","tooltipPointer","append","addEventListener","show","MutationObserver","mutations","forEach","mutation","nodes","Array","from","removedNodes","directMatch","indexOf","parentMatch","some","parent","contains","hide","disconnect","observe","body","subtree","childList","querySelector","removeDa","BDModules","popouts","layerContainer","getBoundingClientRect","top","offsetHeight","screenHeight","left","offsetWidth","screenWidth","remove","_className","textContent","container","canShowAbove","showAbove","showBelow","canShowBelow","canShowLeft","showLeft","showRight","canShowRight","classList","add","setProperty","centerHorizontally","centerVertically","nodecenter","React","Component","props","BDV2","reactDom","findDOMNode","Tooltip","componentWillUnmount","render","children","cache","cache2","PluginCertifier","patch","attachment","nextTick","getElementById","url","startsWith","endsWith","nodeFetch","headers","electron","sendSync","then","res","status","Error","hash","crypto","Buffer","alloc","chunk","concat","update","hashResult","digest","hashToUrl","checkHash","result","div","childNodes","flowerStarModule","flowerStarContainer","childModule","childContainer","suspect","parentNode","borderColor","nextNode","child","tagName","preventDefault","stopImmediatePropagation","showConfirmationModal","harm","confirmText","cancelText","danger","onCancel","onConfirm","href","includes","react","tooltipWrap","width","height","svg","viewBox","x","y","mask","fill","pointerEvents","official","span","display","float","flowerStar","stroke","color","onClick","link","getKeyedArray","content","buffer","installPath","contentManager","_pluginsFolder","_themesFolder","catch","cursor","fill-rule","class","renderToElements","elem","processAttachment","isTrusted","tests","threats","checkViruses","resultCallback","removeCallback","isHarmful","no_comments","toString","replace","trim","test","removeComment","scrpt","exec","split","pop","json","processFile","__path","isFromLoader","createReadStream","addonCache","timestamp","saveAddonCache","basename","obj","arr","k","save","generateKey","encryptSettingsCache","cipher","encrypted","final","Api","ensureExported","ObjectStorage","localStorageModule","localStorage","impl","set","btoa","setInterval","val","safeJSONParse","atob","isArray","Module","globalPaths","MetaError","originalJSRequire","_extensions","originalCSSRequire","splitRegex","escapedAtRegex","hasPatched","timeCache","watchers","patchExtensions","getContentRequire","realpathSync","loadAddonCertifierCache","dataStore","decipher","decrypted","decryptSettingsCache","watchContent","contentType","isPlugin","baseFolder","themesFolder","fileEnding","watch","persistent","eventType","statSync","code","pluginModule","themeModule","unloadTheme","isFile","stats","mtime","getTime","loadTheme","reloadTheme","unwatchContent","close","extractMeta","firstLine","parseOldMeta","parseNewMeta","meta","rawMeta","substring","lastIndexOf","parsed","testJSON","format","block","out","field","accum","line","charAt","substr","self","originalRequire","possiblePath","Reflect","apply","arguments","stripBOM","atimeMs","modified","mtimeMs","size","css","_compile","isEmpty","warn","makePlaceholderPlugin","getAuthor","getDescription","source","website","escapeID","isLoaded","cantUnload","basedir","files","readdirSync","contentList","map","f","errors","loadAllContent","loadThemes","DOMTools","head","script","src","onload","timing","_","duration","performance","requestAnimationFrame","animate","time","timeFraction","progress","selector","parseHTML","NodeList","nodeType","query","baseElement","querySelectorAll","html","fragment","template","innerHTML","cloneNode","textNode","createTextNode","spanElement","nodeValue","classes","flat","classname","indicator","oldName","newName","thisNode","thatNode","prepend","targetNode","insertBefore","nextSibling","newNode","nextElementSibling","next","matches","previous","previousElementSibling","num","indexInParent","parentElement","parents","closest","attribute","global","getComputedStyle","parseInt","clientWidth","clientHeight","_listeners","event","delegate","callback","namespace","hasDelegate","eventFunc","target","cancel","removeEventListener","listeners","newCancel","findIndex","matchFilter","listener","defaultFilter","list","__offAll","onMount","wrappedCallback","unsubscribe","subscribe","addedNodes","onMountChange","onUnmount","elements","domWrapper","appendChild","Element","DOM","ThemeModule","loadThemeData","themes","theme","addStyle","unescape","saveThemeData","enableTheme","bdEvents","version","disableTheme","removeStyle","toggleTheme","bdtheme","updateThemeList","editorDetached","protect","theModule","isDefault","clear","sort","getToken","getEmail","showToken","proxy","Proxy","getOwnPropertyDescriptor","func","__proto__","findByUniqueProperties","internal","getInternalInstance","V2","joinBD1","InviteActions","acceptInviteAndTransitionToInviteChannel","leaveBD1","GuildActions","leaveGuild","joinBD2","leaveBD2","joinLC","leaveLC","anchor","anchorUnderlineOnHover","guildsWrapper","wrapper","unreadMentionsBar","guilds","guildsError","selected","pill","blobContainer","defaultProps","search","submit","activateRagingDemon","dismiss","openDM","userId","selfId","UserStore","getCurrentUser","privateChannelId","ChannelStore","getDMFromUserId","PrivateChannelActions","selectPrivateChannel","ChannelActions","openPrivateChannel","parseSettings","reduce","setting","Math","max","documentElement","innerWidth","innerHeight","_windowConfigFile","transparent","frame","charCodeAt","channelTextArea","titleWrapper","textarea","focus","selectionStart","selectionEnd","execCommand","moduleName","groupCollapsed","groupEnd","string","replacement","RegExp","method","params","what","methodName","before","after","instead","once","silent","force","origMethod","canceled","thisObject","methodArguments","cancelPatch","originalMethod","callOriginalMethod","returnValue","tempRet","suppressErrors","__monkeyPatched","__originalMethod","sidebar","hasNotice","form","bottom","toastWrapper","icon","timeout","toastElem","innerText","modalModule","modal","inner","hideOnFullscreen","headerModule","header","responsiveWidthMobile","footer2Module","focusLock","backdrop","backdropWithLayer","footer","addClass","closingListeners","onClose","pluginErrors","themeErrors","generateTab","el","tabs","removeClass","scroller","index","click","ModalStack","ChangelogClasses","TextElement","FlexChild","Titles","Changelog","selectable","MarkdownParser","image","subtitle","ce","changelogItems","entry","margin","marginTop","renderHeader","Child","grow","shrink","tag","Tags","H4","Sizes","SMALL","Colors","STANDARD","date","renderFooter","Anchor","AnchorClasses","joinSupportServer","stopPropagation","supportLink","defaultFooter","onScroll","ModalActions","Markdown","ConfirmationModal","emptyFunction","openModal","red","modalKey","V2_SettingsPanel_Sidebar","panels","register","panel","component","getComponent","Settings","devMode","section","LCitems","LCDevItems","injectColoredText","cancelColoredText","MessageComponent","monkeyPatch","childrenMessageContent","messageContent","originalType","roleColor","colorString","removeColoredText","classNameMarkup","markup","inject24Hour","cancel24Hour","twelveHour","convert","matched","match","padStart","cancelCozy","TimeFormatter","cancelCompact","remove24Hour","V2C_SettingsTitle","reactComponent","V2C_TabBarSeparator","V2C_ServerCard","server","iconUrl","fallback","state","imageError","joined","guildList","identifier","cardModule","card","cardPrimary","flexModule","flexChild","_horizontalReverse","wrapModule","noWrap","streamerModeEnabled","marginBottom8","pinned","ref","onError","handleError","draggable","horizontal","members","flex","categories","minHeight","backgroundColor","setState","useState","SettingsView","V2C_PublicServers","setInitialState","changeCategory","searchKeyDown","checkConnection","connect","GuildStore","AvatarDefaults","SortedGuildStore","hooks","componentDidMount","selectedCategory","loading","servers","connection","user","categorySlugs","fetch","searchEndPoint","end","term","categoryButtons","total","serverCard","acceptInvite","invite_code","joinEndPoint","credentials","windowOptions","round","screenX","screenY","win","joinWindow","webContents","loadURL","setMenuBarVisibility","resizable","maximizable","minimizable","alwaysOnTop","center","webPreferences","nodeIntegration","getFlattenedGuildIds","defaultList","DEFAULT_AVATARS","ServerCard","online","nativejoin","floor","random","response","onSetSection","sections","searchInput","getThis","setValue","marginLeft","serchinput","refs","searchinput","onKeyDown","onChange","placeholder","maxLength","which","notConnected","columnModule","contentColumnDefault","contentColumn","SettingsTitle","bdServer","marginBottom","lineHeight","forceUpdate","useEffect","TabBarSeparator","fontSize","username","discriminator","padding","BugHunterBadge","Circus","xmlns","cx","cy","uuidv4","awaitingBadgesPromises","badgesToFetch","_cache","badges","DistantServer","newPromise","badge","Constants","defaultUsers","fetchedBadges","users","handleRequest","Routes","responseBody","promise","user_id","LightcordError","route","SERVER_URL","Authorization","reject","scopes","layers","Layers","inject","isInjected","classNameLayers","v2","ReactInstance","FindReact","createLayer","getLayer","lay","LayerModules","Layer","animation","Value","keydown","ev","componentWillEnter","toValue","componentWillLeave","interpolation","interpolate","inputRange","outputRange","opacity","transform","scale","Div","__SECRET_EMOTION__","position","right","overflow","WebkitBoxOrient","WebkitBoxDirection","msFlexDirection","flexDirection","zIndex","paddingTop","_appendButton","V2_PublicServers","rootId","btn","guildClasses","listItem","circleButtonMask","classNametutorialContainer","downloadProgress","tutorialContainer","button","addButton","guildPatch","GuildList","webpackModules","GuildListOld","removeButton","randClass","ClassNormalizer","unpatchClassModules","moduleFilter","revertElement","patchClassModules","normalizeElement","patchDOMMethods","patchClassModule","unpatchClassModule","shouldIgnore","isNaN","baseClassName","componentName","classNames","normalClass","camelCase","newString","clen","newClass","toRemove","DOMTokenList","token","tokens","debugListener","copySelectorListener","startDebugListener","startCopySelector","stopDebugListener","stopCopySelector","getSelector","classLayer","classItems","menu","cm","cmWrap","styleFlexible","accommodateScrollbar","clientY","clientX","setAttribute","scrollerClasses","scrollerWrap","scrollerThemed","themeGhostHairline","removeCM","keyCode","cmg","cmi","item","labelContainer","colorDefault","NativeModule","copy","queryAll","focused","separator","scrollHeight","names","unshift","ownerDocument","entries","Switch","checked","switch","Components","inputs","classnames","getClassName","SwitchItem","beta","userSettingsVoice","formModule","switchItem","betaClassNames","marginModule","marginTop60","MarginTop","V2C_SettingsGroup","renderOldSettings","buttonComponent","componentDidCatch","errInfo","FormSection","FormText","hideBorder","note","tooltipNote","setImmediate","V2C_SectionedSettingsPanel","SettingsGroup","V2C_Checkbox","checkboxElement","checkbox","checkboxInner","V2C_CssEditorDetached","updateCss","saveCss","editor","ace","setTheme","session","setMode","setShowPrintMargin","setFontSize","destroy","updateLineCount","lineCount","lines","lineNumbers","indentUnit","scrollbarStyle","_ccss","ccss","_root","injectRoot","detachedRoot","insertAfter","Checkbox","borderRadius","borderRight","borderLeft","saveSettings","attach","unmountComponentAtNode","root","getValue","V2C_CssEditor","detachedEditor","detach","detached","componentDidUpdate","prevProps","prevState","codeMirror","arg","droot","injectDetachedRoot","BDErrorBoundary","hasError","originalRender","configurable","V2C_ContentColumn","V2C_ReloadIcon","V2C_XSvg","fillRule","Edit","Delete","anchorClasses","V2C_PluginCard","showSettings","hasSettings","addon","getSettingsPanel","settingsPanel","reloads","trusted","closeSettings","panelRef","current","settingsOpen","settingspanel","cardNode","cTop","scrollTop","cBottom","eTop","offsetTop","eBottom","isHidden","thisNodeOffset","offset","containerOffset","original","endPoint","getString","XSvg","dangerouslySetInnerHTML","__html","buildTitle","author","nameIndex","versionIndex","authorIndex","LayerStack","popLayer","makeLink","makeButton","action","unmounted","links","invite","tester","donate","patreon","settingsComponent","authorId","authorLink","isScanning","DownArrow","Select","open","dropdown","createRef","showMenu","hideMenu","opt","isOpen","Search","onFocus","onBlur","CardList","ascending","isPlugins","cookie","manager","reverse","onAddonChanges","openFolder","openPath","openItem","confirmDelete","BdApi","toLocaleLowerCase","getProps","getAddons","sortedAddons","a","b","cap","first","second","localeCompare","rendered","renderCheckUpdates","ZeresPluginLibrary","PluginUpdates","checkAll","tooltipIsShowing","onMouseLeave","Button","look","hoverColor","onRightClick","checkUpdateButton","refreshIcon","addonCards","sortOptions","directions","dispatcher","Dispatcher","ActionTypes","pid","game","application_id","details","timestamps","assets","large_image","small_image","sendGame","LOCAL_ACTIVITY_UPDATE","socketId","activity","formatedGame","applicationId","getAssets","V2C_PresenceSettingsModules","V2C_PresenceSettings","preview","isfetching","fetchAssets","assetComponents","Set","updateWhenFetched","comp","defaultSetting","RPCProps","CustomRichPresence","asset","updatePreview","marginBottom20","optionsComponents","RpcPreview","ohgodohfuck","_optionsComponents","InputText","InputNumber","InputChoice","choices","inputTextModules","InputNumberModules","InputChoiceModules","PureComponent","removeKeybind","defaultMarginh5","colorStandard","size32","_horizontal","inputMini","size16","size20","input","TextInput","lastEdited","isTiming","rowModule","marginModule2","colorModule","sizeModule","inputModule","sizeModule2","row","size14","h5","Divider","colorTransparent","clipboard","Dropdown","emptyClasses","popoutModules","UserPopoutComponent","PopoutProps","profileModules","UserProfileComponent","ProfileProps","connectedProfileStore","DividerModules","divider","dividerDefault","active","changeTab","tab","setActive","Tab","rpc","isActive","Profile","Popout","PresenceErrorCatcher","emptyStateImage","emptyState","emptyStateHeader","emptyStateSubtext","role","tabindex","UserPopout","userModule","render1","guildId","channelId","disableUserProfileLink","_UserPopout","popout","excludeProperties","UserProfile","render2","render3","render4","profile","scrollbarModule1","scrollbarGhostHairline","GuildModule","getGuilds","relationShipModule","getRelationships","sessionModule","getSessions","V2C_AccountInfos","CodeContent","getProfileValue","language","getStatistics","getSessionValue","sessionsRaw","sessions","sessionId","clientInfo","os","client","activities","repeat","createdAt","avatarURL","avatar","getAvatarURL","getDate","getMonth","getFullYear","getHours","getMinutes","getSeconds","flags","hasPremiumSubscription","email","mfaEnabled","mobile","phone","verified","nsfwAllowed","relations","friends","isFriend","blocked","isBlocked","hightlightJS","highlight","messageModule1","messageModule2","listLanguages","DiscordModules","ChannelModule","getChannel","hasChannel","addRelationship","DMModule","closePrivateChannel","antiDM","bot","guild_id","channel","channel_id","EmbedsContains","location","embeds","embed","fields","selectors","standardSidebarView","defaultClassName","selects","userSettingsAccount","paymentSourceRow","subText","descriptionWrapper","viewBody","userSettingsSecurity","getSelectors","startTyping","typingModule","stopTyping","DisableTyping","ApiPreview","states","allComponents","general","AlertBox","compName","compPath","ComponentPreview","AllPreviews","getStrForProp","lang","String","$$typeof","for","generateCode","openTag","propStrings","childrenProp","str","propObject","isLast","childrenData","help","success","SettingSubTitle","searchable","Tabs","ErrorCatcher","CodeBlock","History","windows","Map","init","popoutModule","getWindow","applyThemes","removeThemes","themeName","existing","removeAttribute","emitChange","TextInputSetting","BDSidebarHeader","sidebarComponents","Separator","Header","Item","changelogButton","showChangelogModal","isClearingCache","updateSettings","registerComponents","makeComponent","lightcordComponent","PresenceComponent","AccountInfosComponent","ApiPreviewComponent","coreComponent","customCssComponent","renderAddonPane","getSettings","publicServersModule","voiceMode","tfHour","coloredText","setWindowPreference","dMode","callRingingBeat","settingsStore","showCurrentGame","updateRemoteSettings","ipcRenderer","AntiAdDM","blurPrivate","disableTyping","appSettings","relaunch","popoutWindow","core","methods","NotificationsUseShim","loadSettings","renderSidebar","SectionedSettingsPanel","coreSettings","isChecked","ipc","send","actual","clearable","invoke","argv","clearCache","PresenceSettings","CssEditor","ContentList","prefix","SettingComponent","BDLogo","clipRule","strokeLinecap","strokeLinejoin","LightcordLogo","x1","y1","x2","y2","gradientTransform","gradientUnits","stopColor","EmojiRegex","CustomEmojiModule","CustomEmoji","EmojiModuleApi","getCustomEmojiById","AutocompleteModule","AutoCompletionTemplates","getAutocompleteOptions","EmojiModuleQuery","queryEmojiResults","Messages","EMOJI_MATCHING","guildModule","getGuild","isFetching","emojiSearch","getDisambiguatedEmojiContext","LIGHTCORD_EMOJIS","arg1","arg2","condition","setEmojiUsable","queryResults","renderResults","D","emojis","EMOJI","Emoji","emoji","uniqueName","sentinel","guild","getPlainText","isAnimated","animated","managed","originalName","getRawText","cancelEmojiRender","cancelEmoteRender","getNestedProp","newContent","hasParsed","raw","words","word","emojiId","jumboable","shift","u","onHover","R","Title","classNameLayer","classNameSocialLinks","classNameModal","EmojiFilterModule","isEmojiDisabled","isUsable","usable","surrogates","diversity","Core","setConfig","config","hasStarted","setMethods","ED","WebSocket","patchAttributes","initSettings","checkForGuilds","initializeSettings","getElementsByClassName","initObserver","previousVersion","EmojiModule","patchSocial","patchGuildPills","patchGuildListItems","patchGuildSeparator","patchMessageHeader","patchMemberList","patchAttachment","haveInstalledDefault","logo","attribsPatchs","cancelPatchAttributes","DiscordTag","DiscordTagComp","badgeDiv","TooltipWrap","applyBadges","timesChecked","blob","deferLoaded","readyState","injectExternals","getPredicateSections","settingModule","poped","mlen","animating","socialLinks","getAttribute","socialPatch","TabBar","socialModule1","newOne","returnVal","classNameColorMuted","sizes","classNameVersionHash","colorMuted","versionHash","branch","buildInfo","additional","size12","commit","originalVersions","chat","blockDiv","distant","getBadges","scope","div2","guildListItemsPatch","GuildClasses","getGuildClasses","listItemClass","blobClass","GuildComponent","return","guildData","unread","audio","video","animatable","guildPillPatch","guildPill","hovered","guildSeparatorPatch","Guilds","guildComponents","GuildSeparator","AttachmentPatch","Attachment","messageHeaderPatch","MessageHeader","memberListPatch","MemberListItem","renderDecorators","updateInjector","ReactDom","ReactComponent","WindowConfigFile","getAllWindowPreferences","getWindowPreference","addScript","removeScript","mainCore","protos","getData","loadData","saveData","setData","deleteData","onRemoved","isPluginEnabled","isThemeEnabled","isSettingEnabled","enableSetting","disableSetting","toggleSetting","makeAddonAPI","folder","isEnabled","getAll","Plugins","Themes","contentWindowGetter","HTMLIFrameElement","contentWindow","writable","Function","oOpen","XMLHttpRequest","localStorageFix","v2Loader","loadingIcon","deprecateGlobal","globalKeys","Globals","CoreWrapper"],"mappings":"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","file":"index.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n","module.exports = require(\"electron\");","module.exports = require(\"path\");","module.exports = require(\"fs\");","module.exports = require(\"crypto\");","module.exports = require(\"node-fetch\");","module.exports = require(\"events\");","module.exports = require(\"module\");","export const minimumDiscordVersion = \"0.0.308\";\nexport const currentDiscordVersion = (window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion()) || \"0.0.308\";\nexport const minSupportedVersion = \"0.3.0\";\nexport const bbdVersion = \"0.3.5\";\nexport const bbdChangelog = {\n description: \"Big things are coming.\",\n changes: [\n {\n title: \"Bug Fixes\",\n type: \"fixed\",\n items: [\n \"Some fixes related to showing modals in the `BdApi`.\",\n \"Fixed the open folder buttons for plugins and themes\"\n ]\n }\n ]\n};\n\nexport const settings = {\n \"Custom css live update\": {id: \"bda-css-0\", info: \"\", implemented: true, hidden: true, cat: \"core\"},\n \"Custom css auto udpate\": {id: \"bda-css-1\", info: \"\", implemented: true, hidden: true, cat: \"core\"},\n \"BetterDiscord Blue\": {id: \"bda-gs-b\", info: \"Replace Discord blue with BD Blue\", implemented: false, hidden: false, cat: \"core\"},\n\n /* Core */\n /* ====== */\n \"Public Servers\": {id: \"bda-gs-1\", info: \"Display public servers button\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"Minimal Mode\": {id: \"bda-gs-2\", info: \"Hide elements and reduce the size of elements.\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"Voice Mode\": {id: \"bda-gs-4\", info: \"Only show voice chat\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"Hide Channels\": {id: \"bda-gs-3\", info: \"Hide channels in minimal mode\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"Dark Mode\": {id: \"bda-gs-5\", info: \"Make certain elements dark by default(wip)\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"Voice Disconnect\": {id: \"bda-dc-0\", info: \"Disconnect from voice server when closing Discord\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"24 Hour Timestamps\": {id: \"bda-gs-6\", info: \"Replace 12hr timestamps with proper ones\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"Colored Text\": {id: \"bda-gs-7\", info: \"Make text color the same as role color\", implemented: true, hidden: false, cat: \"core\", category: \"modules\"},\n \"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\"},\n\n /* Content */\n \"Content Error Modal\": {id: \"fork-ps-1\", info: \"Shows a modal with plugin/theme errors\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\n \"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\"},\n \"Show Toasts\": {id: \"fork-ps-2\", info: \"Shows a small notification for important information\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\n \"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\"},\n \"Automatic Loading\": {id: \"fork-ps-5\", info: \"Automatically loads, reloads, and unloads plugins and themes\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\n \"Enable Edit Button\": {id: \"fork-ps-7\", info: \"Enable an Edit Button on the plugin and theme panel.\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\"},\n \"Themes in Popout Window\": {id: \"lightcord-9\", info: \"Enable themes in Popout Window. (For example, when detaching screenshare.)\", implemented: true, hidden: false, cat: \"core\", category: \"content manager\", experimental: true},\n\n /* Developer */\n \"Developer Mode\": \t {id: \"bda-gs-8\", info: \"Developer Mode Toggle\", implemented: true, hidden: false, cat: \"core\", category: \"developer settings\"},\n \"Copy Selector\":\t\t\t {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\"},\n\n /** Lightcord */\n \"Disable BetterDiscord\": {id: \"bd-disable\", info: \"Disable Betterdiscord (plugins, themes, etc) (Not implemented).\", implemented: false, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\n \"Blur Personal Information\": {id: \"lightcord-6\", info: \"Blur sensitive informations like email, payment infos and more.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\n \"Calling Ring Beat\": {id: \"lightcord-2\", info: \"Enable Discord's special calling beat.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\n \"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 \\\"Lightcord Api\\\" section.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\n \"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\"},\n \"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\"},\n \"Disable typing\": {id: \"lightcord-7\", info: \"Don't let other see you're typing.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\"},\n \"Lightcord Tabs\": {id: \"lightcord-8\", info: \"Allows you to launch multiple instances of Lightcord in the same window.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\", experimental: true},\n \"Use Notification Shim\": {id: \"lightcord-10\", info: \"Basically don't use Windows's Notifications.\", implemented: true, hidden: process.platform !== \"win32\", cat: \"lightcord\", category: \"Lightcord\"},\n \"Emoji Prefix\": {id: \"lightcord-11\", info: \"Change the prefix used for free nitros emojis. Please put only one character. Default: .\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Lightcord\", default: \".\"},\n\n /** Lightcord Window */\n \"Always-on-Top\": {id: \"lightcord-3\", info: \"Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Window\"},\n \"No Window Bounds\": {id: \"no_window_bound\", info: \"Disable Window Bounds. Can be useful if you use a window manager.\", implemented: true, hidden: process.platform !== \"linux\", cat: \"lightcord\", category: \"Window\"},\n \"Enable Glasstron\": {id: \"enable_glasstron\", info: \"Enable Glasstron. If you're not using transparent themes, this can reduce lag.\", implemented: true, hidden: false, cat: \"lightcord\", category: \"Window\"},\n \n /** RichPresence */\n \"Enable\": {id: \"lightcord-presence-1\", info: \"Enable RichPresence below.\", implemented: true, hidden: false, cat: \"status\"}\n};\n\nexport const defaultCookie = {\n \"bda-gs-1\": true,\n \"bda-gs-2\": false,\n \"bda-gs-3\": false,\n \"bda-gs-4\": false,\n \"bda-gs-5\": true,\n \"bda-gs-6\": false,\n \"bda-gs-7\": false,\n \"bda-gs-8\": false,\n \"bda-es-0\": true,\n \"bda-es-1\": true,\n \"bda-es-2\": true,\n \"bda-es-4\": false,\n \"bda-es-6\": true,\n \"bda-es-7\": true,\n \"bda-gs-b\": false,\n \"bda-es-8\": true,\n \"bda-dc-0\": false,\n \"bda-css-0\": false,\n \"bda-css-1\": false,\n \"bda-es-9\": true,\n \"fork-dm-1\": false,\n \"fork-ps-1\": true,\n \"fork-ps-2\": true,\n \"fork-ps-3\": true,\n \"fork-ps-4\": true,\n \"fork-ps-5\": true,\n \"fork-ps-6\": true,\n \"fork-ps-7\": false,\n \"fork-es-2\": false,\n \"fork-es-3\": true,\n \"fork-wp-1\": false,\n \"fork-wp-2\": false,\n \"fork-beta\": true,\n \"lightcord-1\": false,\n \"lightcord-2\": true,\n \"lightcord-presence-1\": false,\n \"lightcord-3\": false,\n \"lightcord-4\": false,\n \"lightcord-5\": true,\n \"lightcord-6\": true,\n \"lightcord-7\": false,\n \"lightcord-8\": false,\n \"lightcord-9\": false,\n \"lightcord-10\": false,\n \"no_window_bound\": false,\n};\n\n\nexport const settingsCookie = {};\n\nexport const settingsRPC = {};\nexport const defaultRPC = {\n \"name\": \"Lightcord\",\n \"application_id\": \"711416957718757418\",\n \"state\": \"Lightcord Client\",\n \"details\": \"Browsing Discord\",\n \"timestamps.start\": Date.now(),\n \"assets.small\": null,\n \"assets.large\": \"712323821037682791\"\n}\n\nexport const lightcordSettings = {};\nexport const defaultLightcordSettings = {};\n\nexport const bdpluginErrors = [];\nexport const bdthemeErrors = []; // define for backwards compatibility\n\nexport const bdConfig = Object.create(BetterDiscordConfig);\n\nexport const bdthemes = {};\nexport const bdplugins = {};\n\nexport const pluginCookie = {};\nexport const themeCookie = {};","const req = webpackJsonp.push([[], {__extra_id__: (module, exports, req) => module.exports = req}, [[\"__extra_id__\"]]]);\r\ndelete req.m.__extra_id__;\r\ndelete req.c.__extra_id__;\r\nconst find = (filter) => {\r\n for (const i in req.c) {\r\n if (req.c.hasOwnProperty(i)) {\r\n const m = req.c[i].exports;\r\n if (m && m.__esModule && m.default && filter(m.default)) return m.default;\r\n if (m && filter(m))\treturn m;\r\n }\r\n }\r\n // console.warn(\"Cannot find loaded module in cache\");\r\n return null;\r\n};\r\n\r\nconst findAll = (filter) => {\r\n const modules = [];\r\n for (const i in req.c) {\r\n if (req.c.hasOwnProperty(i)) {\r\n const m = req.c[i].exports;\r\n if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);\r\n else if (m && filter(m)) modules.push(m);\r\n }\r\n }\r\n return modules;\r\n};\r\n\r\nconst findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined));\r\nconst findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));\r\nconst findByDisplayName = (displayName) => find(module => module.displayName === displayName);\r\n\r\nlet mod = {find, findAll, findByProps, findByPrototypes, findByDisplayName};\r\nexport default mod\r\n\r\nwindow.Lightcord.BetterDiscord.WebpackModules = mod","import Utils from \"./utils\";\nimport ContentManager from \"./contentManager\";\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : \"stable\";\n\nlet dataPath = \"\";\nif (process.platform === \"win32\") dataPath = process.env.APPDATA;\nelse if (process.platform === \"darwin\") dataPath = path.join(process.env.HOME, \"Library\", \"Preferences\");\nelse dataPath = process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, \".config\");\ndataPath = path.join(dataPath, \"BetterDiscord\");\n\nexport default new class DataStore {\n constructor() {\n this.data = {settings: {stable: {}, canary: {}, ptb: {}}};\n this.pluginData = {};\n window.Lightcord.BetterDiscord.DataStore = this\n }\n\n initialize() {\n try {\n if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), \"utf-8\");\n const data = JSON.parse(fs.readFileSync(this.BDFile, \"utf-8\"))\n if (data.hasOwnProperty(\"settings\")) this.data = data;\n if (!fs.existsSync(this.settingsFile)) return;\n let settings = __non_webpack_require__(this.settingsFile);\n fs.unlinkSync(this.settingsFile);\n if (settings.hasOwnProperty(\"settings\")) settings = Object.assign({stable: {}, canary: {}, ptb: {}}, {[releaseChannel]: settings});\n else settings = Object.assign({stable: {}, canary: {}, ptb: {}}, settings);\n this.setBDData(\"settings\", settings);\n }\n catch (err) {\n console.error(err);\n Utils.alert(\"Corrupt Storage\", \"The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.\");\n }\n }\n\n get injectionPath() {\n return this._injectionPath = null;\n }\n\n get configFile() {return this._configFile || (this._configFile = path.resolve(this.injectionPath, \"betterdiscord\", \"config.json\"));}\n get BDFile() {return this._BDFile || (this._BDFile = path.resolve(dataPath, \"bdstorage.json\"));}\n get settingsFile() {return this._settingsFile || (this._settingsFile = path.resolve(dataPath, \"bdsettings.json\"));}\n getPluginFile(pluginName) {return path.resolve(ContentManager.pluginsFolder, pluginName + \".config.json\");}\n\n getSettingGroup(key) {\n return this.data.settings[releaseChannel][key] || null;\n }\n\n setSettingGroup(key, data) {\n this.data.settings[releaseChannel][key] = data;\n fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), \"utf-8\");\n }\n\n getBDData(key) {\n return this.data[key] || \"\";\n }\n\n setBDData(key, value) {\n this.data[key] = value;\n fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), \"utf-8\");\n }\n\n getPluginData(pluginName, key) {\n if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key];\n if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;\n this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));\n return this.pluginData[pluginName][key];\n }\n\n setPluginData(pluginName, key, value) {\n if (value === undefined) return;\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\n this.pluginData[pluginName][key] = value;\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), \"utf-8\");\n }\n\n deletePluginData(pluginName, key) {\n if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};\n delete this.pluginData[pluginName][key];\n fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), \"utf-8\");\n }\n};","/* BDEvents */\nconst EventEmitter = require(\"events\");\nexport default new class BDEvents extends EventEmitter {\n constructor(){\n super()\n window.Lightcord.BetterDiscord.BDEvents = this\n }\n dispatch(eventName, ...args) {this.emit(eventName, ...args);}\n off(eventName, eventAction) {this.removeListener(eventName, eventAction);}\n};","import {bdpluginErrors, pluginCookie, settingsCookie, bdplugins} from \"../0globals\";\nimport ContentManager from \"./contentManager\";\nimport DataStore from \"./dataStore\";\nimport BDEvents from \"./bdEvents\";\nimport Utils from \"./utils\";\n\nclass PluginModule {\n constructor(){\n window.Lightcord.BetterDiscord.PluginModule = this\n }\n get folder() {return ContentManager.pluginsFolder;}\n}\n\nPluginModule.prototype.loadPlugins = async function () {\n this.loadPluginData();\n bdpluginErrors.splice(0, 0, ...(await ContentManager.loadPlugins()));\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n let plugin, name;\n\n try {\n plugin = bdplugins[plugins[i]].plugin;\n name = plugin.getName();\n if (plugin.load && typeof(plugin.load) == \"function\") plugin.load();\n } catch (err) {\n pluginCookie[name] = false;\n Utils.err(\"Plugins\", name + \" could not be loaded.\", err);\n bdpluginErrors.push({name: name, file: bdplugins[plugins[i]].filename, message: \"load() could not be fired.\", error: {message: err.message, stack: err.stack}});\n continue;\n }\n\n if (!pluginCookie[name]) pluginCookie[name] = false;\n\n if (pluginCookie[name]) {\n try {\n plugin.start();\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);\n } catch (err) {\n pluginCookie[name] = false;\n Utils.err(\"Plugins\", name + \" could not be started.\", err);\n bdpluginErrors.push({name: name, file: bdplugins[plugins[i]].filename, message: \"start() could not be fired.\", error: {message: err.message, stack: err.stack}});\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n }\n this.savePluginData();\n\n require(\"electron\").remote.getCurrentWebContents().on(\"did-navigate-in-page\", this.channelSwitch.bind(this));\n // if (settingsCookie[\"fork-ps-5\"]) ContentManager.watchContent(\"plugin\");\n};\n\nPluginModule.prototype.startPlugin = function(plugin, reload = false) {\n try {\n bdplugins[plugin].plugin.start();\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} has started.`);\n }\n catch (err) {\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} could not be started.`, {type: \"error\"});\n pluginCookie[plugin] = false;\n this.savePluginData();\n Utils.err(\"Plugins\", plugin + \" could not be started.\", err);\n }\n};\n\nPluginModule.prototype.stopPlugin = function(plugin, reload = false) {\n try {\n bdplugins[plugin].plugin.stop();\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} has stopped.`);\n }\n catch (err) {\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${bdplugins[plugin].plugin.getName()} v${bdplugins[plugin].plugin.getVersion()} could not be stopped.`, {type: \"error\"});\n Utils.err(\"Plugins\", bdplugins[plugin].plugin.getName() + \" could not be stopped.\", err);\n }\n};\n\nPluginModule.prototype.enablePlugin = function (plugin, reload = false) {\n if (pluginCookie[plugin]) return;\n pluginCookie[plugin] = true;\n this.savePluginData();\n this.startPlugin(plugin, reload);\n};\n\nPluginModule.prototype.enable = function (plugin, reload = false) {\n return this.enablePlugin(plugin, reload);\n};\n\nPluginModule.prototype.disablePlugin = function (plugin, reload = false) {\n if (!pluginCookie[plugin]) return;\n pluginCookie[plugin] = false;\n this.savePluginData();\n this.stopPlugin(plugin, reload);\n};\n\nPluginModule.prototype.disable = function (plugin, reload = false) {\n return this.disablePlugin(plugin, reload);\n};\n\nPluginModule.prototype.togglePlugin = function (plugin) {\n if (pluginCookie[plugin]) this.disablePlugin(plugin);\n else this.enablePlugin(plugin);\n};\n\nPluginModule.prototype.toggle = function (plugin, reload = false) {\n return this.togglePlugin(plugin, reload);\n};\n\nPluginModule.prototype.loadPlugin = async function(filename) {\n const error = await ContentManager.loadContent(filename, \"plugin\");\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${filename} could not be loaded.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${filename} could not be loaded.`, error);\n }\n const plugin = Object.values(bdplugins).find(p => (console.log(p.filename, filename)) || p.filename == filename).plugin;\n try { if (plugin.load && typeof(plugin.load) == \"function\") plugin.load();}\n catch (err) {if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [err]});}\n Utils.log(\"ContentManager\", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {type: \"success\"});\n BDEvents.dispatch(\"plugin-loaded\", plugin.getName());\n};\n\nPluginModule.prototype.unloadPlugin = function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return;\n const plugin = bdplugin.plugin.getName();\n if (pluginCookie[plugin]) this.disablePlugin(plugin, true);\n const error = ContentManager.unloadContent(bdplugins[plugin].filename, \"plugin\");\n delete bdplugins[plugin];\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);\n }\n Utils.log(\"ContentManager\", `${plugin} was unloaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} was unloaded.`, {type: \"success\"});\n BDEvents.dispatch(\"plugin-unloaded\", plugin);\n};\n\nPluginModule.prototype.delete = function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return;\n this.unloadPlugin(bdplugin.filename);\n const fullPath = require(\"path\").resolve(ContentManager.pluginsFolder, bdplugin.filename);\n require(\"fs\").unlinkSync(fullPath);\n};\n\nPluginModule.prototype.reloadPlugin = async function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return this.loadPlugin(filenameOrName);\n const plugin = bdplugin.plugin.getName();\n const enabled = pluginCookie[plugin];\n if (enabled) this.stopPlugin(plugin, true);\n const error = await ContentManager.reloadContent(bdplugins[plugin].filename, \"plugin\");\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({plugins: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} could not be reloaded.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${plugin} could not be reloaded.`, error);\n }\n if (bdplugins[plugin].plugin.load && typeof(bdplugins[plugin].plugin.load) == \"function\") bdplugins[plugin].plugin.load();\n if (enabled) this.startPlugin(plugin, true);\n Utils.log(\"ContentManager\", `${plugin} v${bdplugins[plugin].plugin.getVersion()} was reloaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${plugin} v${bdplugins[plugin].plugin.getVersion()} was reloaded.`, {type: \"success\"});\n BDEvents.dispatch(\"plugin-reloaded\", plugin);\n};\n\nPluginModule.prototype.reload = function(name) {\n return this.reloadPlugin(name);\n};\n\nPluginModule.prototype.edit = function(filenameOrName) {\n const bdplugin = Object.values(bdplugins).find(p => p.filename == filenameOrName) || bdplugins[filenameOrName];\n if (!bdplugin) return;\n const fullPath = require(\"path\").resolve(ContentManager.pluginsFolder, bdplugin.filename);\n require(\"electron\").shell.openExternal(`${fullPath}`);\n};\n\nPluginModule.prototype.updatePluginList = function() {\n const results = ContentManager.loadNewContent(\"plugin\");\n for (const filename of results.added) this.loadPlugin(filename);\n for (const name of results.removed) this.unloadPlugin(name);\n};\n\nPluginModule.prototype.loadPluginData = function () {\n const saved = DataStore.getSettingGroup(\"plugins\");\n if (saved) {\n Object.assign(pluginCookie, saved);\n }\n};\n\nPluginModule.prototype.savePluginData = function () {\n DataStore.setSettingGroup(\"plugins\", pluginCookie);\n};\n\nPluginModule.prototype.newMessage = function () {\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n const plugin = bdplugins[plugins[i]].plugin;\n if (!pluginCookie[plugin.getName()]) continue;\n if (typeof plugin.onMessage === \"function\") {\n try { plugin.onMessage(); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to fire onMessage for \" + plugin.getName() + \".\", err); }\n }\n }\n};\n\nPluginModule.prototype.channelSwitch = function () {\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n const plugin = bdplugins[plugins[i]].plugin;\n if (!pluginCookie[plugin.getName()]) continue;\n if (typeof plugin.onSwitch === \"function\") {\n try { plugin.onSwitch(); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to fire onSwitch for \" + plugin.getName() + \".\", err); }\n }\n }\n};\n\nPluginModule.prototype.rawObserver = function(e) {\n const plugins = Object.keys(bdplugins);\n for (let i = 0; i < plugins.length; i++) {\n const plugin = bdplugins[plugins[i]].plugin;\n if (!pluginCookie[plugin.getName()]) continue;\n if (typeof plugin.observer === \"function\") {\n try { plugin.observer(e); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to fire observer for \" + plugin.getName() + \".\", err); }\n }\n }\n};\n\nexport default new PluginModule();","/**\n * Tooltip that automatically show and hide themselves on mouseenter and mouseleave events.\n * Will also remove themselves if the node to watch is removed from DOM through\n * a MutationObserver.\n *\n * Note this is not using Discord's internals but normal DOM manipulation and emulates\n * Discord's own tooltips as closely as possible.\n *\n * @module EmulatedTooltip\n * @version 0.0.1\n */\n\nimport Utils from \"../modules/utils\";\nimport WebpackModules from \"../modules/webpackModules\";\nlet TooltipClasses\nfunction getTooltipClasses(){\n\tif(TooltipClasses)return TooltipClasses\n\treturn TooltipClasses = WebpackModules.findByProps(\"tooltip\", \"tooltipBlack\");\n}\nlet TooltipLayers\nfunction getTooltipLayers(){\n\tif(TooltipLayers)return TooltipLayers\n\treturn TooltipLayers = WebpackModules.findByProps(\"layer\", \"layerContainer\");\n}\n\nconst getClass = function(sideOrColor) {\n const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1);\n const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`];\n if (tooltipClass) return tooltipClass;\n return null;\n};\n\nconst classExists = function(sideOrColor) {\n return getClass(sideOrColor) ? true : false;\n};\n\nconst toPx = function(value) {\n return `${value}px`;\n};\n\nexport default class EmulatedTooltip {\n\t/**\n\t *\n\t * @constructor\n\t * @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on\n\t * @param {string} tip - string to show in the tooltip\n\t * @param {object} options - additional options for the tooltip\n\t * @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow)\n\t * @param {string} [options.side=top] - can be any of top, right, bottom, left\n\t * @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen\n * @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover\n * @param {boolean} [options.attachEvents=true] - whether the tooltip should listen to mouseenter and mouseleave events.\n\t */\n\tconstructor(node, text, options = {}) {\n\t\tconst {style = \"black\", side = \"top\", preventFlip = false, disabled = false, attachEvents = true} = options;\n\t\tthis.node = node instanceof jQuery ? node[0] : node;\n this.label = text;\n this.style = style.toLowerCase();\n\t\tthis.side = side.toLowerCase();\n this.preventFlip = preventFlip;\n this.disabled = disabled;\n\n if (!classExists(this.side)) return Utils.err(\"EmulatedTooltip\", `Side ${this.side} does not exist.`);\n\t\tif (!classExists(this.style)) return Utils.err(\"EmulatedTooltip\", `Style ${this.style} does not exist.`);\n\t\t\n\t\tthis.element = document.createElement(\"div\");\n\t\tthis.element.className = getTooltipLayers().layer + \" \" + getTooltipLayers().disabledPointerEvents;\n\n\t\tthis.tooltipElement = document.createElement(\"div\");\n\t\tthis.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;\n\n\t\tthis.labelElement = document.createElement(\"div\");\n\t\tthis.labelElement.className = getTooltipClasses().tooltipContent\n\n\t\tconst pointerElement = document.createElement(\"div\");\n\t\tpointerElement.className = getTooltipClasses().tooltipPointer;\n\n\t\tthis.tooltipElement.append(pointerElement);\n\t\tthis.tooltipElement.append(this.labelElement);\n\t\tthis.element.append(this.tooltipElement);\n\n\t\tif(attachEvents){\n\t\t\tthis.node.addEventListener(\"mouseenter\", () => {\n\t\t\t\tif (this.disabled) return;\n\t\t\t\tthis.show();\n\t\n\t\t\t\tconst observer = new MutationObserver((mutations) => {\n\t\t\t\t\tmutations.forEach((mutation) => {\n\t\t\t\t\t\tconst nodes = Array.from(mutation.removedNodes);\n\t\t\t\t\t\tconst directMatch = nodes.indexOf(this.node) > -1;\n\t\t\t\t\t\tconst parentMatch = nodes.some(parent => parent.contains(this.node));\n\t\t\t\t\t\tif (directMatch || parentMatch) {\n\t\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\n\t\t\t\tobserver.observe(document.body, {subtree: true, childList: true});\n\t\t\t});\n\t\n\t\t\tthis.node.addEventListener(\"mouseleave\", () => {\n\t\t\t\tthis.hide();\n\t\t\t});\n\t\t}\n }\n\n /** Container where the tooltip will be appended. */\n get container() { \n\t\treturn document.querySelector(\".\"+Utils.removeDa(BDModules.get(e => e.popouts)[0].popouts)+\" ~ .\"+Utils.removeDa(BDModules.get(e => e.layerContainer)[0].layerContainer)); \n\t}\n /** Boolean representing if the tooltip will fit on screen above the element */\n get canShowAbove() { return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0; }\n /** Boolean representing if the tooltip will fit on screen below the element */\n get canShowBelow() { return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= Utils.screenHeight; }\n /** Boolean representing if the tooltip will fit on screen to the left of the element */\n get canShowLeft() { return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0; }\n /** Boolean representing if the tooltip will fit on screen to the right of the element */\n\tget canShowRight() { return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= Utils.screenWidth; }\n\n /** Hides the tooltip. Automatically called on mouseleave. */\n\thide() {\n this.element.remove();\n this.tooltipElement.className = this._className;\n\t}\n\n /** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */\n\tshow() {\n this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;\n\t\tthis.labelElement.textContent = this.label;\n\t\tthis.container.append(this.element);\n\n\t\tif (this.side == \"top\") {\n\t\t\tif (this.canShowAbove || (!this.canShowAbove && this.preventFlip)) this.showAbove();\n\t\t\telse this.showBelow();\n\t\t}\n\n\t\tif (this.side == \"bottom\") {\n\t\t\tif (this.canShowBelow || (!this.canShowBelow && this.preventFlip)) this.showBelow();\n\t\t\telse this.showAbove();\n\t\t}\n\n\t\tif (this.side == \"left\") {\n\t\t\tif (this.canShowLeft || (!this.canShowLeft && this.preventFlip)) this.showLeft();\n\t\t\telse this.showRight();\n\t\t}\n\n\t\tif (this.side == \"right\") {\n\t\t\tif (this.canShowRight || (!this.canShowRight && this.preventFlip)) this.showRight();\n\t\t\telse this.showLeft();\n\t\t}\n\t}\n\n /** Force showing the tooltip above the node. */\n\tshowAbove() {\n\t\tthis.tooltipElement.classList.add(getClass(\"top\"));\n\t\tthis.element.style.setProperty(\"top\", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10));\n\t\tthis.centerHorizontally();\n\t}\n\n /** Force showing the tooltip below the node. */\n\tshowBelow() {\n\t\tthis.tooltipElement.classList.add(getClass(\"bottom\"));\n\t\tthis.element.style.setProperty(\"top\", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10));\n\t\tthis.centerHorizontally();\n\t}\n\n /** Force showing the tooltip to the left of the node. */\n\tshowLeft() {\n\t\tthis.tooltipElement.classList.add(getClass(\"left\"));\n\t\tthis.element.style.setProperty(\"left\", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10));\n\t\tthis.centerVertically();\n\t}\n\n /** Force showing the tooltip to the right of the node. */\n\tshowRight() {\n\t\tthis.tooltipElement.classList.add(getClass(\"right\"));\n\t\tthis.element.style.setProperty(\"left\", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10));\n\t\tthis.centerVertically();\n\t}\n\n\tcenterHorizontally() {\n const nodecenter = this.node.getBoundingClientRect().left + (this.node.offsetWidth / 2);\n this.element.style.setProperty(\"left\", toPx(nodecenter - (this.element.offsetWidth / 2)));\n\t}\n\n\tcenterVertically() {\n\t\tconst nodecenter = this.node.getBoundingClientRect().top + (this.node.offsetHeight / 2);\n\t\tthis.element.style.setProperty(\"top\", toPx(nodecenter - (this.element.offsetHeight / 2)));\n\t}\n}","import BDV2 from \"../modules/v2\";\nimport Tooltip from \"./tooltip\";\n\nexport default class extends React.Component {\n constructor(props) {\n super(props);\n }\n\n async componentDidMount() {\n const {style = \"black\", side = \"top\", text = \"\"} = this.props;\n this.node = BDV2.reactDom.findDOMNode(this);\n this.tooltip = new Tooltip(this.node, text, {style, side});\n }\n\n componentWillUnmount() {\n this.tooltip.hide();\n delete this.tooltip;\n }\n\n render() {\n return this.props.children;\n }\n}","import nodeFetch from \"node-fetch\"\nimport * as electron from \"electron\"\nimport * as crypto from \"crypto\"\nimport BDV2 from \"./v2\"\nimport tooltipWrap from \"../ui/tooltipWrap\"\nimport Utils from \"./utils\"\nimport { createReadStream, writeFileSync } from \"fs\"\nimport { basename, join } from \"path\"\nimport contentManager from \"./contentManager\"\nimport { addonCache } from \"./contentManager\"\n\nconst cache = {}\nconst cache2 = {}\n\nexport default new class PluginCertifier {\n constructor(){\n window.Lightcord.BetterDiscord.PluginCertifier = this\n }\n\n patch(attachment, id){\n process.nextTick(() => {\n processAttachment(attachment, id)\n })\n }\n\n start(){\n\n }\n\n isTrusted(hash){\n return cache[hash] && !cache[hash].suspect\n }\n}\n\nconst tests = [\n [/token/gi, 0, 0],\n [/email/gi, 0, 0],\n [/mfa\\./gi, 0, 0],\n [/2fa/gi, 0, 0],\n [/phone/gi, 0, 0],\n [/child_process/gi, 0, 0],\n [/localStorage/gi, 0, 0],\n [/getGlobal/gi, 0, 0],\n [/BrowserWindow/gi, 0, 0],\n [/system32/gi, 0, 0],\n [/password/gi, 0, 0],\n [/eval/gi, 0, 0],\n [/WebAssembly/gi, 0, 0],\n [/XMLHttpRequest(\\.|\\[[\"'`])prototype/gi, 0, 0],\n [/window\\.fetch( +)?=/gi, 0, 0],\n /** Obfuscation / hidden / workarounds */\n [/([\"'`]\\+)[\"'`]\\w[\"'`]/gi, 1, 1],\n [/[\"'`]\\w[\"'`](\\+[\"'`])/gi, 1, 1],\n [/\\${[\"'`]\\w+[\"'`]}/gi, 1, 1],\n /** hexadecimal */\n [/_0x\\w{4}\\('0x[\\dabcdef]+'\\)/g, 1, 1],\n [/_0x\\w{4}\\('0x[\\dabcdef]+'( +)?,( +)?'[^']{4}'\\)/g, 1, 1], // _0x8db7('0x0', 'x1]f')\n /** mangled */\n [/\\w+\\('0x[\\dabcdef]+'\\)/g, 1, 1], // b('0x0')\n [/\\w+\\('0x[\\dabcdef]+'( +)?,( +)?'[^']{4}'\\)/g, 1, 1], // b('0x0', 'x1]f')\n /** string array at start */\n [/^var [\\w\\d_$]+=\\[\"/gi, 1, 1]\n]\n\nconst threats = [\n \"Account Stealer/Virus\",\n \"Obfuscation/Hidden code\"\n]\n\nexport function checkViruses(hash, data, resultCallback, removeCallback, filename){\n data = data.toString(\"utf8\")\n let isHarmful = false\n /**\n * @type {string}\n */\n const no_comments = data.replace(/\\/\\*[\\s\\S]*?\\*\\/|([^\\\\:]|^)\\/\\/.*$/gm, \"\").trim()// removing all comments from plugins (remove meta and other.)\n\n for(const [test, type, removeComment] of tests){\n const scrpt = removeComment === 1 ? no_comments : data\n if(test.exec(scrpt)){\n isHarmful = threats[type]\n console.log(`${hashToUrl[hash].split(\"/\").pop()} failed at test`, test, \". Marked as\", threats[type])\n break\n }\n }\n\n if(!isHarmful)return removeCallback(hash)\n cache[hash] = {\n suspect: true,\n name: hashToUrl[hash].split(\"/\").pop(),\n type: hashToUrl[hash].endsWith(\".js\") ? \"Plugin\" : \"Theme\",\n harm: isHarmful,\n hash: hash,\n filename\n }\n \n console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`)\n\n resultCallback(cache[hash])\n}\n\nconst hashToUrl = {}\n\nexport function checkHash(hash, data, filename, resultCallback, removeCallback){\n console.log(`File: ${filename} hash: ${hash}`)\n if(!cache[hash]){\n nodeFetch(\"https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/\"+hash, { // Using node-fetch to bypass cors\n headers: {\n \"User-Agent\": electron.ipcRenderer.sendSync(\"LIGHTCORD_GET_USER_AGENT\") // have to set user-agent\n }\n }).then(async res => {\n if(res.status !== 200){\n if(filename.endsWith(\".theme.css\"))return removeCallback(hash)\n try{\n checkViruses(hash, data, resultCallback, removeCallback, filename)\n }catch(e){\n console.error(e)\n removeCallback()\n }\n return\n }\n const result = await res.json()\n result.hash = hash\n result.filename = filename\n\n cache[hash] = result\n\n resultCallback(result)\n }).catch((err) => {\n console.error(`Could not read from github. ${err}`)\n if(filename.endsWith(\".theme.css\"))return removeCallback(hash)\n checkViruses(hash, data, resultCallback, removeCallback, filename)\n })\n }else{\n const result = cache[hash]\n\n resultCallback(result)\n }\n}\n\nexport function processFile(__path, resultCallback, removeCallback = (hash) => {}, isFromLoader = false){ \n const hash = crypto.createHash(\"sha256\")\n let data = Buffer.alloc(0)\n\n createReadStream(__path).on(\"data\", chunk => {\n data = Buffer.concat([data, chunk])\n hash.update(chunk)\n }).on(\"end\", () => {\n const hashResult = hash.digest(\"hex\")\n\n hashToUrl[hashResult] = __path\n\n if(isFromLoader && addonCache[hashResult]){\n let value = addonCache[hashResult]\n if(value.timestamp < (Date.now() - 6.048e+8)){\n delete addonCache[hashResult]\n contentManager.saveAddonCache()\n }else{\n resultCallback(value.result)\n return\n }\n }\n\n checkHash(hashResult, data, basename(__path), resultCallback, removeCallback)\n })\n}\n\nexport function processAttachment(attachment, id){\n if(!document.getElementById(id))return\n if(!attachment.url.startsWith(\"https://cdn.discordapp.com/\"))return document.getElementById(id).remove()\n if(!attachment.filename.endsWith(\".plugin.js\") && !attachment.filename.endsWith(\".theme.css\"))return document.getElementById(id).remove()\n\n nodeFetch(attachment.url, {\n headers: {\n \"User-Agent\": electron.ipcRenderer.sendSync(\"LIGHTCORD_GET_USER_AGENT\")\n }\n }).then(res => {\n if(res.status !== 200)throw new Error(\"File doesn't exist.\")\n const hash = crypto.createHash(\"sha256\")\n let data = Buffer.alloc(0)\n res.body.on(\"data\", chunk => {\n data = Buffer.concat([data, chunk])\n hash.update(chunk)\n })\n res.body.on(\"end\", () => {\n const hashResult = hash.digest(\"hex\")\n\n cache2[attachment.url] = hashResult\n hashToUrl[hashResult] = attachment.url\n\n checkHash(hashResult, data, attachment.filename, (result) => {\n renderToElements(id, result, attachment.filename)\n }, () => {\n let elem = document.getElementById(id)\n if(elem)elem.remove()\n })\n })\n }).catch(()=>{})\n}\n\nlet flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]\nlet childModule = BDModules.get(e => e.childContainer)[0]\n\n/**\n * \n * @param {HTMLDivElement[]} elements \n * @param {{type: \"Theme\"|\"Plugin\", name: string, official?: boolean}|{suspect:true, type: \"Theme\"|\"Plugin\", name: string, harm: string}} result\n */\nfunction renderToElements(id, result, filename){\n const div = document.getElementById(id)\n if(!div || div.childNodes.length > 0)return // already certified/div does not exist anymore.\n\n if(!flowerStarModule)flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0]\n if(!childModule)childModule = BDModules.get(e => e.childContainer)[0]\n \n if(result.suspect){\n try{\n div.parentNode.style.borderColor = \"rgb(240, 71, 71)\"\n /**\n * \n * @param {HTMLElement} node \n */\n let nextNode = (node) => {\n for(let child of node.children){\n if(child.tagName === \"A\"){\n child.addEventListener(\"click\", (e) => {\n e.preventDefault()\n e.stopImmediatePropagation()\n\n Utils.showConfirmationModal(\n \"Are you sure you want to download this ?\", \n \"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.\", \n {\n confirmText: \"Download Anyway\",\n cancelText: \"Don't !\",\n danger: true,\n onCancel: () => {},\n onConfirm: () => {\n electron.ipcRenderer.sendSync(\"LIGHTCORD_OPEN_EXTERNAL\", child.href)\n }\n }\n )\n })\n }else if([\"div\"].includes(child.tagName.toLowerCase())){\n nextNode(child)\n }\n }\n }\n nextNode(div.parentNode)\n }catch(e){\n console.error(e)\n }\n BDV2.reactDom.render(BDV2.react.createElement(tooltipWrap, {text: result.type+\" \"+result.name+\" is potentially dangerous.\"}, \n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\"}},\n BDV2.react.createElement(\"svg\", {className: BDModules.get(e => e.svg)[0].svg, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 40 32\"},\n BDV2.react.createElement(\"rect\", {\n x:\"0\",\n y:\"0\",\n width:\"32\",\n height:\"32\",\n mask:\"url(#svg-mask-avatar-status-round-32)\",\n fill:\"#f04747\",\n mask:\"url(#svg-mask-status-dnd)\",\n className:BDModules.get(e => e.pointerEvents)[0].pointerEvents\n })\n )\n )\n ), div)\n }else if(!result.official){\n div.parentNode.style.borderColor = \"#4087ed\"\n let span = BDV2.react.createElement(\"span\", {style: {display: \"inherit\"}}, [\n BDV2.react.createElement(tooltipWrap, {text: result.type+\" \"+result.name+\" is certified by Lightcord.\"}, \n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\", float: \"left\"}},\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\"},\n BDV2.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\"})\n ),\n BDV2.react.createElement(\"div\", {className: childModule.childContainer}, \n BDV2.react.createElement(\"svg\", {\"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\"}, \n BDV2.react.createElement(\"path\", {fill:\"#ffffff\",d:\"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z\"})\n )\n )\n )\n ),\n BDV2.react.createElement(tooltipWrap, {text: \"Install this \"+result.type.toLowerCase()+\" on Lightcord.\"}, \n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\"}, onClick(){\n Utils.showConfirmationModal(\n \"Are you sure you want to download this \"+result.type.toLowerCase()+\" ?\", \n \"Lightcord will automatically install and launch this \"+result.type.toLowerCase()+\". You don't have anything to do.\", \n {\n confirmText: \"Download and Install\",\n cancelText: \"I've changed my mind\",\n danger: false,\n onCancel: () => {},\n onConfirm: () => {\n let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]\n console.log(link)\n nodeFetch(link)\n .then(async res => {\n if(res.status !== 200)throw new Error(\"Status was not 200\")\n let content = await res.buffer()\n let installPath = join(result.type === \"Plugin\" ? contentManager._pluginsFolder : contentManager._themesFolder, result.filename)\n console.log(installPath)\n writeFileSync(installPath, content)\n Utils.showToast(result.type+\" succesfully installed.\")\n }).catch(err => {\n err = err instanceof Error ? err : new Error(err)\n Utils.showToast(err.message, {\n type: \"error\"\n })\n })\n }\n }\n )\n }},\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 24 24\",style:{\n color: \"rgb(67, 181, 129)\",\n cursor: \"pointer\"\n }},\n \n \n \n \n )\n )\n )\n ])\n BDV2.reactDom.render(span, div)\n }else{\n div.parentNode.style.borderColor = \"#4087ed\"\n let span = BDV2.react.createElement(\"span\", {style: {display: \"inherit\"}}, [\n BDV2.react.createElement(tooltipWrap, {text: result.type+\" \"+result.name+\" was made by the developers of Lightcord.\", style:\"brand\"}, \n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\", float: \"left\"}},\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\",stroke:\"#36393f\",style:{color:\"#4087ed\"}},\n BDV2.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\"})\n ),\n BDV2.react.createElement(\"div\", {className: childModule.childContainer}, \n BDV2.react.createElement(\"svg\", {\"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 16 15.2\"}, \n BDV2.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\"})\n )\n )\n )\n ),\n BDV2.react.createElement(tooltipWrap, {text: \"Install this \"+result.type.toLowerCase()+\" on Lightcord.\"}, \n BDV2.react.createElement(\"div\", {className: flowerStarModule.flowerStarContainer, style: {width: \"20px\", height: \"20px\"}, onClick(){\n Utils.showConfirmationModal(\n \"Are you sure you want to download this \"+result.type.toLowerCase()+\" ?\", \n \"Lightcord will automatically download and load this \"+result.type.toLowerCase()+\". You must enable it in the settings.\", \n {\n confirmText: \"Download and Install\",\n cancelText: \"I've changed my mind\",\n danger: false,\n onCancel: () => {},\n onConfirm: () => {\n let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0]\n \n nodeFetch(link)\n .then(async res => {\n if(res.status !== 200)throw new Error(\"Status was not 200\")\n let content = await res.buffer()\n let installPath = join(result.type === \"Plugin\" ? contentManager._pluginsFolder : contentManager._themesFolder, result.filename)\n \n writeFileSync(installPath, content)\n Utils.showToast(result.type+\" succesfully installed.\")\n }).catch(err => {\n err = err instanceof Error ? err : new Error(err)\n Utils.showToast(err.message, {\n type: \"error\"\n })\n })\n }\n }\n )\n }},\n BDV2.react.createElement(\"svg\", {className: flowerStarModule.flowerStar, \"aria-hidden\":\"false\",width:\"20px\",height:\"20px\",viewBox:\"0 0 24 24\",style:{\n color: \"rgb(67, 181, 129)\",\n cursor: \"pointer\"\n }},\n \n \n \n \n )\n )\n )\n ])\n BDV2.reactDom.render(span, div)\n }\n}\n\nfunction getKeyedArray(obj){\n let arr = []\n Object.keys(obj).forEach(k => {\n arr.push([k, obj[k]])\n })\n return arr\n}\n\nlet key = null\nlet save = null\n\nwindow.Lightcord.Api.ensureExported(m=>m.ObjectStorage)\n.then(localStorageModule => {\n let localStorage = localStorageModule.impl\n save = function(){\n localStorage.set(\"PluginCertifierKeyEncryption__\", btoa(JSON.stringify(key)))\n }\n setInterval(() => {\n save()\n }, 100000);\n try{\n let val = safeJSONParse(atob(localStorage.get(\"PluginCertifierKeyEncryption__\")))\n 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){\n generateKey()\n save()\n return\n }\n key = val\n }catch(e){\n generateKey()\n save()\n }\n})\n\nfunction generateKey(){\n key = [crypto.randomBytes(16).toString(\"base64\"), crypto.randomBytes(32).toString(\"base64\")]\n}\n\nfunction safeJSONParse(json){\n try{\n return JSON.parse(json)\n }catch(e){\n return e instanceof Error ? new Error(e) : e\n }\n}\n\nexport function decryptSettingsCache(data){\n try{\n let decipher = crypto.createDecipheriv(\"aes-256-cbc\", Buffer.from(key[1], \"base64\"), Buffer.from(key[0], \"base64\"))\n let decrypted = decipher.update(Buffer.from(data, \"base64\"));\n decrypted = Buffer.concat([decrypted, decipher.final()]);\n return decrypted.toString(\"utf8\")\n }catch(e){\n return \"{}\"\n }\n}\nexport function encryptSettingsCache(data){\n let args = [Buffer.from(key[1], \"base64\"), Buffer.from(key[0], \"base64\")]\n \n let cipher = crypto.createCipheriv('aes-256-cbc', ...args);\n let encrypted = cipher.update(Buffer.from(data, \"utf8\"));\n encrypted = Buffer.concat([encrypted, cipher.final()]);\n return encrypted.toString(\"base64\")\n}","import {bdConfig, bdplugins, bdthemes, settingsCookie} from \"../0globals\";\nimport pluginModule from \"./pluginModule\";\nimport themeModule from \"./themeModule\";\nimport Utils from \"./utils\";\nimport dataStore from \"./dataStore\";\nimport { encryptSettingsCache, decryptSettingsCache, processFile } from \"./pluginCertifier\";\nimport * as electron from \"electron\"\n\nconst path = require(\"path\");\nconst fs = require(\"fs\");\nconst Module = require(\"module\").Module;\nModule.globalPaths.push(path.resolve(electron.ipcRenderer.sendSync(\"LIGHTCORD_GET_APP_PATH\"), \"node_modules\"));\nclass MetaError extends Error {\n constructor(message) {\n super(message);\n this.name = \"MetaError\";\n }\n}\nconst originalJSRequire = Module._extensions[\".js\"];\nconst originalCSSRequire = Module._extensions[\".css\"] ? Module._extensions[\".css\"] : () => {return null;};\nconst splitRegex = /[^\\S\\r\\n]*?(?:\\r\\n|\\n)[^\\S\\r\\n]*?\\*[^\\S\\r\\n]?/;\nconst escapedAtRegex = /^\\\\@/;\n\nexport let addonCache = {}\n\nlet hasPatched = false\nexport default new class ContentManager {\n\n constructor() {\n this.timeCache = {};\n this.watchers = {};\n }\n\n patchExtensions(){\n if(hasPatched)return\n hasPatched = true\n Module._extensions[\".js\"] = this.getContentRequire(\"plugin\");\n Module._extensions[\".css\"] = this.getContentRequire(\"theme\");\n }\n\n get pluginsFolder() {return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(bdConfig.dataPath + \"plugins/\")));}\n get themesFolder() {return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(bdConfig.dataPath + \"themes/\")));}\n\n loadAddonCertifierCache(){\n if(typeof dataStore.getSettingGroup(\"PluginCertifierHashes\") !== \"string\"){\n dataStore.setSettingGroup(\"PluginCertifierHashes\", encryptSettingsCache(\"{}\"))\n }else{\n try{\n addonCache = JSON.parse(decryptSettingsCache(dataStore.getSettingGroup(\"PluginCertifierHashes\")))\n }catch(e){\n dataStore.setSettingGroup(\"PluginCertifierHashes\", encryptSettingsCache(\"{}\"))\n addonCache = {}\n }\n }\n Object.keys(addonCache)\n .forEach(key => {\n let value = addonCache[key]\n if(!value || typeof value !== \"object\" || Array.isArray(value))return delete addonCache[key]\n\n let props = [{\n key: \"timestamp\",\n type: \"number\"\n }, {\n key: \"result\",\n type: \"object\"\n }, {\n key: \"hash\",\n type: \"string\"\n }]\n for(let prop of props){\n if(!(prop.key in value) || typeof value[prop.key] !== prop.type){\n delete addonCache[key]\n return\n }\n }\n if(value.hash !== key){\n delete addonCache[key]\n return\n }\n if(value.result.suspect){ // refetch from remote to be sure you're up to date.\n delete addonCache[key]\n return\n }\n })\n this.saveAddonCache()\n }\n\n saveAddonCache(){\n dataStore.setSettingGroup(\"PluginCertifierHashes\", encryptSettingsCache(JSON.stringify(addonCache)))\n }\n\n watchContent(contentType) {\n if (this.watchers[contentType]) return;\n const isPlugin = contentType === \"plugin\";\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\n const fileEnding = isPlugin ? \".plugin.js\" : \".theme.css\";\n this.watchers[contentType] = fs.watch(baseFolder, {persistent: false}, async (eventType, filename) => {\n if (!eventType || !filename || !filename.endsWith(fileEnding)) return;\n await new Promise(r => setTimeout(r, 50));\n try {fs.statSync(path.resolve(baseFolder, filename));}\n catch (err) {\n if (err.code !== \"ENOENT\") return;\n delete this.timeCache[filename];\n if (isPlugin) return pluginModule.unloadPlugin(filename);\n return themeModule.unloadTheme(filename);\n }\n if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;\n const stats = fs.statSync(path.resolve(baseFolder, filename));\n if (!stats || !stats.mtime || !stats.mtime.getTime()) return;\n if (typeof(stats.mtime.getTime()) !== \"number\") return;\n if (this.timeCache[filename] == stats.mtime.getTime()) return;\n this.timeCache[filename] = stats.mtime.getTime();\n if (eventType == \"rename\") {\n if (isPlugin) await pluginModule.loadPlugin(filename);\n else await themeModule.loadTheme(filename);\n }\n if (eventType == \"change\") {\n if (isPlugin) await pluginModule.reloadPlugin(filename);\n else await themeModule.reloadTheme(filename);\n }\n });\n }\n\n unwatchContent(contentType) {\n if (!this.watchers[contentType]) return;\n this.watchers[contentType].close();\n delete this.watchers[contentType];\n }\n\n extractMeta(content) {\n const firstLine = content.split(\"\\n\")[0];\n const hasOldMeta = firstLine.includes(\"//META\");\n if (hasOldMeta) return this.parseOldMeta(content);\n const hasNewMeta = firstLine.includes(\"/**\");\n if (hasNewMeta) return this.parseNewMeta(content);\n throw new MetaError(\"META was not found.\");\n }\n\n parseOldMeta(content) {\n const meta = content.split(\"\\n\")[0];\n const rawMeta = meta.substring(meta.lastIndexOf(\"//META\") + 6, meta.lastIndexOf(\"*//\"));\n if (meta.indexOf(\"META\") < 0) throw new MetaError(\"META was not found.\");\n const parsed = Utils.testJSON(rawMeta);\n if (!parsed) throw new MetaError(\"META could not be parsed.\");\n if (!parsed.name) throw new MetaError(\"META missing name data.\");\n parsed.format = \"json\";\n return parsed;\n }\n\n parseNewMeta(content) {\n const block = content.split(\"/**\", 2)[1].split(\"*/\", 1)[0];\n const out = {};\n let field = \"\";\n let accum = \"\";\n for (const line of block.split(splitRegex)) {\n if (line.length === 0) continue;\n if (line.charAt(0) === \"@\" && line.charAt(1) !== \" \") {\n out[field] = accum;\n const l = line.indexOf(\" \");\n field = line.substr(1, l - 1);\n accum = line.substr(l + 1);\n }\n else {\n accum += \" \" + line.replace(\"\\\\n\", \"\\n\").replace(escapedAtRegex, \"@\");\n }\n }\n out[field] = accum.trim();\n delete out[\"\"];\n out.format = \"jsdoc\";\n return out;\n }\n\n getContentRequire(type) {\n const isPlugin = type === \"plugin\";\n const self = this;\n const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;\n return function(module, filename) {\n const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;\n const possiblePath = path.resolve(baseFolder, path.basename(filename));\n if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);\n let content = fs.readFileSync(filename, \"utf8\");\n content = Utils.stripBOM(content);\n\n const stats = fs.statSync(filename);\n const meta = self.extractMeta(content);\n meta.filename = path.basename(filename);\n meta.added = stats.atimeMs;\n meta.modified = stats.mtimeMs;\n meta.size = stats.size;\n if (!isPlugin) {\n meta.css = content;\n if (meta.format == \"json\") meta.css = meta.css.split(\"\\n\").slice(1).join(\"\\n\");\n content = `module.exports = ${JSON.stringify(meta)};`;\n }\n if (isPlugin) {\n module._compile(content, module.filename);\n const didExport = !Utils.isEmpty(module.exports);\n if (didExport) {\n meta.type = module.exports;\n module.exports = meta;\n content = \"\";\n }\n else {\n Utils.warn(\"Module Not Exported\", `${meta.name}, please start setting module.exports`);\n content += `\\nmodule.exports = ${JSON.stringify(meta)};\\nmodule.exports.type = ${meta.exports || meta.name};`;\n }\n }\n module._compile(content, filename);\n };\n }\n\n makePlaceholderPlugin(data) {\n return {plugin: {\n start: () => {},\n getName: () => {return data.name || data.filename;},\n getAuthor: () => {return \"???\";},\n getDescription: () => {return data.message ? data.message : \"This plugin was unable to be loaded. Check the author's page for updates.\";},\n getVersion: () => {return \"???\";}\n },\n name: data.name || data.filename,\n filename: data.filename,\n source: data.source ? data.source : \"\",\n website: data.website ? data.website : \"\"\n };\n }\n\n async loadContent(filename, type) {\n if (typeof(filename) === \"undefined\" || typeof(type) === \"undefined\") return;\n const isPlugin = type === \"plugin\";\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\n\n if(settingsCookie[\"fork-ps-6\"]){\n let result = await new Promise(resolve => {\n processFile(path.resolve(baseFolder, filename), (result) => {\n console.log(result)\n resolve(result)\n }, (hash) => {\n resolve({\n suspect: false,\n hash: hash,\n filename: filename,\n name: filename\n })\n }, true)\n })\n if(result){\n addonCache[result.hash] = {\n timestamp: Date.now(),\n hash: result.hash,\n result: result\n }\n this.saveAddonCache()\n if(result.suspect){\n return {\n name: filename,\n file: filename,\n message: \"This plugin might be dangerous (\"+result.harm+\").\",\n error: new Error(\"This plugin might be dangerous (\"+result.harm+\").\")\n }\n }\n }\n }\n\n try {__non_webpack_require__(path.resolve(baseFolder, filename));}\n catch (error) {return {name: filename, file: filename, message: \"Could not be compiled.\", error: {message: error.message, stack: error.stack}};}\n const content = __non_webpack_require__(path.resolve(baseFolder, filename));\n if(!content.name)return {name: filename, file: filename, message: \"Cannot escape the ID.\", error: new Error(\"Cannot read property 'replace' of undefined\")}\n content.id = Utils.escapeID(content.name);\n //if(!id)return {name: filename, file: filename, message: \"Invalid ID\", error: new Error(\"Please fix the name of \"+filename+\". BetterDiscord can't escape an ID.\")}\n if (isPlugin) {\n if (!content.type) return;\n try {\n content.plugin = new content.type();\n delete bdplugins[content.plugin.getName()];\n bdplugins[content.plugin.getName()] = content;\n }\n catch (error) {return {name: filename, file: filename, message: \"Could not be constructed.\", error: {message: error.message, stack: error.stack}};}\n }\n else {\n delete bdthemes[content.name];\n bdthemes[content.name] = content;\n }\n } \n\n unloadContent(filename, type) {\n if (typeof(filename) === \"undefined\" || typeof(type) === \"undefined\") return;\n const isPlugin = type === \"plugin\";\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\n try {\n delete __non_webpack_require__.cache[__non_webpack_require__.resolve(path.resolve(baseFolder, filename))];\n }\n catch (err) {return {name: filename, file: filename, message: \"Could not be unloaded.\", error: {message: err.message, stack: err.stack}};}\n }\n\n isLoaded(filename, type) {\n const isPlugin = type === \"plugin\";\n const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;\n try {__non_webpack_require__.cache[__non_webpack_require__.resolve(path.resolve(baseFolder, filename))];}\n catch (err) {return false;}\n return true;\n }\n\n async reloadContent(filename, type) {\n const cantUnload = this.unloadContent(filename, type);\n if (cantUnload) return cantUnload;\n return await this.loadContent(filename, type);\n }\n\n loadNewContent(type) {\n const isPlugin = type === \"plugin\";\n const fileEnding = isPlugin ? \".plugin.js\" : \".theme.css\";\n const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;\n const files = fs.readdirSync(basedir);\n const contentList = Object.values(isPlugin ? bdplugins : bdthemes);\n const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name);\n const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile());\n return {added, removed};\n }\n\n async loadAllContent(type) {\n this.patchExtensions()\n const isPlugin = type === \"plugin\";\n const fileEnding = isPlugin ? \".plugin.js\" : \".theme.css\";\n const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;\n const errors = [];\n const files = fs.readdirSync(basedir);\n\n for (const filename of files) {\n if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;\n const error = await this.loadContent(filename, type);\n if (error) errors.push(error);\n }\n\n return errors;\n }\n\n loadPlugins() {return this.loadAllContent(\"plugin\");}\n loadThemes() {return this.loadAllContent(\"theme\");}\n};\n\n/**\n * Don't expose contentManager - could be dangerous for now\n */","/**\n * Copyright 2018 Zachary Rauen\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is furnished\n * to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n * \n * From: https://github.com/rauenzi/BDPluginLibrary\n */\n\n/**\n * @interface\n * @name Offset\n * @property {number} top - Top offset of the target element.\n * @property {number} right - Right offset of the target element.\n * @property {number} bottom - Bottom offset of the target element.\n * @property {number} left - Left offset of the target element.\n * @property {number} height - Outer height of the target element.\n * @property {number} width - Outer width of the target element.\n */\n\n /**\n * Function that automatically removes added listener.\n * @callback module:DOMTools~CancelListener\n */\n \nexport default class DOMTools {\n\n static escapeID(id) {\n return id.replace(/^[^a-z]+|[^\\w-]+/gi, \"-\");\n }\n\n /**\n\t * Adds a style to the document.\n\t * @param {string} id - identifier to use as the element id\n\t * @param {string} css - css to add to the document\n\t */\n\tstatic addStyle(id, css) {\n\t\tdocument.head.append(DOMTools.createElement(``));\n\t}\n\n\t/**\n\t * Removes a style from the document.\n\t * @param {string} id - original identifier used\n\t */\n\tstatic removeStyle(id) {\n\t\tconst element = document.getElementById(id);\n\t\tif (element) element.remove();\n\t}\n\n\t/**\n\t * Adds/requires a remote script to be loaded\n\t * @param {string} id - identifier to use for this script\n\t * @param {string} url - url from which to load the script\n\t * @returns {Promise} promise that resolves when the script is loaded\n\t */\n\tstatic addScript(id, url) {\n\t\treturn new Promise(resolve => {\n\t\t\tconst script = document.createElement(\"script\");\n\t\t\tscript.id = id;\n\t\t\tscript.src = url;\n\t\t\tscript.type = \"text/javascript\";\n\t\t\tscript.onload = resolve;\n\t\t\tdocument.head.append(script);\n\t\t});\n\t}\n\n\t/**\n\t * Removes a remote script from the document.\n\t * @param {string} id - original identifier used\n\t */\n\tstatic removeScript(id) {\n id = this.escapeID(id);\n\t\tconst element = document.getElementById(id);\n\t\tif (element) element.remove();\n }\n \n // https://javascript.info/js-animation\n static animate({timing = _ => _, update, duration}) {\n const start = performance.now();\n \n requestAnimationFrame(function animate(time) {\n // timeFraction goes from 0 to 1\n let timeFraction = (time - start) / duration;\n if (timeFraction > 1) timeFraction = 1;\n \n // calculate the current animation state\n const progress = timing(timeFraction);\n \n update(progress); // draw it\n \n if (timeFraction < 1) {\n requestAnimationFrame(animate);\n }\n \n });\n }\n\n /**\n * This is my shit version of not having to use `$` from jQuery. Meaning\n * that you can pass a selector and it will automatically run {@link module:DOMTools.query}.\n * It also means that you can pass a string of html and it will perform and return `parseHTML`.\n * @see module:DOMTools.parseHTML\n * @see module:DOMTools.query\n * @param {string} selector - Selector to query or HTML to parse\n * @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query`\n */\n static Q(selector) {\n const element = this.parseHTML(selector);\n const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1;\n if (isHTML) return element;\n return this.query(selector);\n }\n\n /**\n * Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided\n * `document` is used by default.\n * @param {string} selector - Selector to query\n * @param {Element} [baseElement] - Element to base the query from\n * @returns {(Element|null)} - The found element or null if not found\n */\n static query(selector, baseElement = document) {\n return baseElement.querySelector(selector);\n }\n\n /**\n * Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided\n * `document` is used by default.\n * @param {string} selector - Selector to query\n * @param {Element} [baseElement] - Element to base the query from\n * @returns {Array} - Array of all found elements\n */\n static queryAll(selector, baseElement = document) {\n return baseElement.querySelectorAll(selector);\n }\n\n /**\n * Parses a string of HTML and returns the results. If the second parameter is true,\n * the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.\n * 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.\n * \n * If the second parameter is false, then the return value will be the list of parsed\n * nodes and there were multiple top level nodes, otherwise the single node is returned.\n * @param {string} html - HTML to be parsed\n * @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`\n * @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing\n */\n static parseHTML(html, fragment = false) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const node = template.content.cloneNode(true);\n if (fragment) return node;\n return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];\n }\n\n /** Alternate name for {@link module:DOMTools.parseHTML} */\n static createElement(html, fragment = false) {return this.parseHTML(html, fragment);}\n \n /**\n * Takes a string of html and escapes it using the brower's own escaping mechanism.\n * @param {String} html - html to be escaped\n */\n static escapeHTML(html) {\n const textNode = document.createTextNode(\"\");\n const spanElement = document.createElement(\"span\");\n spanElement.append(textNode);\n textNode.nodeValue = html;\n return spanElement.innerHTML;\n }\n\n /**\n * Adds a list of classes from the target element.\n * @param {Element} element - Element to edit classes of\n * @param {...string} classes - Names of classes to add\n * @returns {Element} - `element` to allow for chaining\n */\n static addClass(element, ...classes) {\n classes = classes.flat().filter(c => c);\n for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(\" \");\n classes = classes.flat().filter(c => c);\n element.classList.add(...classes);\n return element;\n }\n\n /**\n * Removes a list of classes from the target element.\n * @param {Element} element - Element to edit classes of\n * @param {...string} classes - Names of classes to remove\n * @returns {Element} - `element` to allow for chaining\n */\n static removeClass(element, ...classes) {\n for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(\" \");\n classes = classes.flat().filter(c => c);\n element.classList.remove(...classes);\n return element;\n }\n\n /**\n * When only one argument is present: Toggle class value;\n * i.e., if class exists then remove it and return false, if not, then add it and return true.\n * When a second argument is present:\n * If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.\n * @param {Element} element - Element to edit classes of\n * @param {string} classname - Name of class to toggle\n * @param {boolean} [indicator] - Optional indicator for if the class should be toggled\n * @returns {Element} - `element` to allow for chaining\n */\n static toggleClass(element, classname, indicator) {\n classname = classname.toString().split(\" \").filter(c => c);\n if (typeof(indicator) !== \"undefined\") classname.forEach(c => element.classList.toggle(c, indicator));\n else classname.forEach(c => element.classList.toggle(c));\n return element;\n }\n\n /**\n * Checks if an element has a specific class\n * @param {Element} element - Element to edit classes of\n * @param {string} classname - Name of class to check\n * @returns {boolean} - `true` if the element has the class, `false` otherwise.\n */\n static hasClass(element, classname) {\n return classname.toString().split(\" \").filter(c => c).every(c => element.classList.contains(c));\n }\n\n /**\n * Replaces one class with another\n * @param {Element} element - Element to edit classes of\n * @param {string} oldName - Name of class to replace\n * @param {string} newName - New name for the class\n * @returns {Element} - `element` to allow for chaining\n */\n static replaceClass(element, oldName, newName) {\n element.classList.replace(oldName, newName);\n return element;\n }\n\n /**\n * Appends `thisNode` to `thatNode`\n * @param {Node} thisNode - Node to be appended to another node\n * @param {Node} thatNode - Node for `thisNode` to be appended to\n * @returns {Node} - `thisNode` to allow for chaining\n */\n static appendTo(thisNode, thatNode) {\n if (typeof(thatNode) == \"string\") thatNode = this.query(thatNode);\n if (!thatNode) return null;\n thatNode.append(thisNode);\n return thisNode;\n }\n\n /**\n * Prepends `thisNode` to `thatNode`\n * @param {Node} thisNode - Node to be prepended to another node\n * @param {Node} thatNode - Node for `thisNode` to be prepended to\n * @returns {Node} - `thisNode` to allow for chaining\n */\n static prependTo(thisNode, thatNode) {\n if (typeof(thatNode) == \"string\") thatNode = this.query(thatNode);\n if (!thatNode) return null;\n thatNode.prepend(thisNode);\n return thisNode;\n }\n\n /**\n * Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.\n * @param {Node} thisNode - The node to insert\n * @param {Node} targetNode - Node to insert after in the tree\n * @returns {Node} - `thisNode` to allow for chaining\n */\n static insertAfter(thisNode, targetNode) {\n targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);\n return thisNode;\n }\n\n /**\n * Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.\n * @param {Node} thisNode - The node to insert\n * @param {Node} newNode - Node to insert after in the tree\n * @returns {Node} - `thisNode` to allow for chaining\n */\n static after(thisNode, newNode) {\n thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);\n return thisNode;\n }\n\n /**\n * Gets the next sibling element that matches the selector.\n * @param {Element} element - Element to get the next sibling of\n * @param {string} [selector=\"\"] - Optional selector\n * @returns {Element} - The sibling element\n */\n static next(element, selector = \"\") {\n return selector ? element.querySelector(\"+ \" + selector) : element.nextElementSibling;\n }\n\n /**\n * Gets all subsequent siblings.\n * @param {Element} element - Element to get next siblings of\n * @returns {NodeList} - The list of siblings\n */\n static nextAll(element) {\n return element.querySelectorAll(\"~ *\");\n }\n\n /**\n * Gets the subsequent siblings until an element matches the selector.\n * @param {Element} element - Element to get the following siblings of\n * @param {string} selector - Selector to stop at\n * @returns {Array} - The list of siblings\n */\n static nextUntil(element, selector) {\n const next = []; \n while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling);\n return next;\n }\n\n /**\n * Gets the previous sibling element that matches the selector.\n * @param {Element} element - Element to get the previous sibling of\n * @param {string} [selector=\"\"] - Optional selector\n * @returns {Element} - The sibling element\n */\n static previous(element, selector = \"\") {\n const previous = element.previousElementSibling;\n if (selector) return previous && previous.matches(selector) ? previous : null;\n return previous;\n }\n\n /**\n * Gets all preceeding siblings.\n * @param {Element} element - Element to get preceeding siblings of\n * @returns {NodeList} - The list of siblings\n */\n static previousAll(element) {\n const previous = [];\n while (element.previousElementSibling) previous.push(element = element.previousElementSibling);\n return previous;\n }\n\n /**\n * Gets the preceeding siblings until an element matches the selector.\n * @param {Element} element - Element to get the preceeding siblings of\n * @param {string} selector - Selector to stop at\n * @returns {Array} - The list of siblings\n */\n static previousUntil(element, selector) {\n const previous = []; \n while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling);\n return previous;\n }\n\n /**\n * Find which index in children a certain node is. Similar to jQuery's `$.index()`\n * @param {HTMLElement} node - The node to find its index in parent\n * @returns {number} Index of the node\n */\n static indexInParent(node) {\n const children = node.parentNode.childNodes;\n let num = 0;\n for (let i = 0; i < children.length; i++) {\n if (children[i] == node) return num;\n if (children[i].nodeType == 1) num++;\n }\n return -1;\n }\n\n /** Shorthand for {@link module:DOMTools.indexInParent} */\n static index(node) {return this.indexInParent(node);}\n\n /**\n * Gets the parent of the element if it matches the selector,\n * otherwise returns null.\n * @param {Element} element - Element to get parent of\n * @param {string} [selector=\"\"] - Selector to match parent\n * @returns {(Element|null)} - The sibling element or null\n */\n static parent(element, selector = \"\") {\n return !selector || element.parentElement.matches(selector) ? element.parentElement : null;\n }\n\n /**\n * Gets all children of Element that match the selector if provided.\n * @param {Element} element - Element to get all children of\n * @param {string} selector - Selector to match the children to\n * @returns {Array} - The list of children\n */\n static findChild(element, selector) {\n return element.querySelector(\":scope > \" + selector);\n }\n\n /**\n * Gets all children of Element that match the selector if provided.\n * @param {Element} element - Element to get all children of\n * @param {string} selector - Selector to match the children to\n * @returns {Array} - The list of children\n */\n static findChildren(element, selector) {\n return element.querySelectorAll(\":scope > \" + selector);\n }\n\n /**\n * Gets all ancestors of Element that match the selector if provided.\n * @param {Element} element - Element to get all parents of\n * @param {string} [selector=\"\"] - Selector to match the parents to\n * @returns {Array} - The list of parents\n */\n static parents(element, selector = \"\") {\n const parents = [];\n if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));\n else while (element.parentElement) parents.push(element = element.parentElement);\n return parents;\n }\n\n /**\n * Gets the ancestors until an element matches the selector.\n * @param {Element} element - Element to get the ancestors of\n * @param {string} selector - Selector to stop at\n * @returns {Array} - The list of parents\n */\n static parentsUntil(element, selector) {\n const parents = [];\n while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement);\n return parents;\n }\n\n /**\n * Gets all siblings of the element that match the selector.\n * @param {Element} element - Element to get all siblings of\n * @param {string} [selector=\"*\"] - Selector to match the siblings to\n * @returns {Array} - The list of siblings\n */\n static siblings(element, selector = \"*\") {\n return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector));\n }\n\n /**\n * Sets or gets css styles for a specific element. If `value` is provided\n * then it sets the style and returns the element to allow for chaining,\n * otherwise returns the style. \n * @param {Element} element - Element to set the CSS of\n * @param {string} attribute - Attribute to get or set\n * @param {string} [value] - Value to set for attribute\n * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.\n */\n static css(element, attribute, value) {\n if (typeof(value) == \"undefined\") return global.getComputedStyle(element)[attribute];\n element.style[attribute] = value;\n return element;\n }\n\n /**\n * Sets or gets the width for a specific element. If `value` is provided\n * then it sets the width and returns the element to allow for chaining,\n * otherwise returns the width. \n * @param {Element} element - Element to set the CSS of\n * @param {string} [value] - Width to set\n * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.\n */\n static width(element, value) {\n if (typeof(value) == \"undefined\") return parseInt(getComputedStyle(element).width);\n element.style.width = value;\n return element;\n }\n\n /**\n * Sets or gets the height for a specific element. If `value` is provided\n * then it sets the height and returns the element to allow for chaining,\n * otherwise returns the height. \n * @param {Element} element - Element to set the CSS of\n * @param {string} [value] - Height to set\n * @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.\n */\n static height(element, value) {\n if (typeof(value) == \"undefined\") return parseInt(getComputedStyle(element).height);\n element.style.height = value;\n return element;\n }\n\n /**\n * Sets the inner text of an element if given a value, otherwise returns it.\n * @param {Element} element - Element to set the text of\n * @param {string} [text] - Content to set\n * @returns {string} - Either the string set by this call or the current text content of the node.\n */\n static text(element, text) {\n if (typeof(text) == \"undefined\") return element.textContent;\n return element.textContent = text;\n }\n\n /**\n * Returns the innerWidth of the element.\n * @param {Element} element - Element to retrieve inner width of\n * @return {number} - The inner width of the element.\n */\n static innerWidth(element) {\n return element.clientWidth;\n }\n\n /**\n * Returns the innerHeight of the element.\n * @param {Element} element - Element to retrieve inner height of\n * @return {number} - The inner height of the element.\n */\n static innerHeight(element) {\n return element.clientHeight;\n }\n\n /**\n * Returns the outerWidth of the element.\n * @param {Element} element - Element to retrieve outer width of\n * @return {number} - The outer width of the element.\n */\n static outerWidth(element) {\n return element.offsetWidth;\n }\n\n /**\n * Returns the outerHeight of the element.\n * @param {Element} element - Element to retrieve outer height of\n * @return {number} - The outer height of the element.\n */\n static outerHeight(element) {\n return element.offsetHeight;\n }\n\n /**\n * Gets the offset of the element in the page.\n * @param {Element} element - Element to get offset of\n * @return {Offset} - The offset of the element\n */\n static offset(element) {\n return element.getBoundingClientRect();\n }\n\n static get listeners() { return this._listeners || (this._listeners = {}); }\n\n /**\n * This is similar to jQuery's `on` function and can *hopefully* be used in the same way.\n * \n * Rather than attempt to explain, I'll show some example usages.\n * \n * The following will add a click listener (in the `myPlugin` namespace) to `element`.\n * `DOMTools.on(element, \"click.myPlugin\", () => {console.log(\"clicked!\");});`\n * \n * The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element.\n * `DOMTools.on(element, \"click.myPlugin\", \".block\", () => {console.log(\"clicked!\");});`\n * \n * The following will add a click listener (without namespace) to `element`.\n * `DOMTools.on(element, \"click\", () => {console.log(\"clicked!\");});`\n * \n * The following will add a click listener (without namespace) to `element` that only fires once.\n * `const cancel = DOMTools.on(element, \"click\", () => {console.log(\"fired!\"); cancel();});`\n * \n * @param {Element} element - Element to add listener to\n * @param {string} event - Event to listen to with option namespace (e.g. \"event.namespace\")\n * @param {(string|callable)} delegate - Selector to run on element to listen to\n * @param {callable} [callback] - Function to fire on event\n * @returns {module:DOMTools~CancelListener} - A function that will undo the listener\n */\n static on(element, event, delegate, callback) {\n const [type, namespace] = event.split(\".\");\n const hasDelegate = delegate && callback;\n if (!callback) callback = delegate;\n const eventFunc = !hasDelegate ? callback : function(event) {\n if (event.target.matches(delegate)) {\n callback(event);\n }\n };\n\n element.addEventListener(type, eventFunc);\n const cancel = () => {\n element.removeEventListener(type, eventFunc);\n };\n if (namespace) {\n if (!this.listeners[namespace]) this.listeners[namespace] = [];\n const newCancel = () => {\n cancel();\n this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);\n };\n this.listeners[namespace].push({\n event: type,\n element: element,\n cancel: newCancel\n });\n return newCancel;\n }\n return cancel;\n }\n\n /**\n * Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself\n * and removes the listener upon the first firing of the desired event.\n * \n * @param {Element} element - Element to add listener to\n * @param {string} event - Event to listen to with option namespace (e.g. \"event.namespace\")\n * @param {(string|callable)} delegate - Selector to run on element to listen to\n * @param {callable} [callback] - Function to fire on event\n * @returns {module:DOMTools~CancelListener} - A function that will undo the listener\n */\n static once(element, event, delegate, callback) {\n const [type, namespace] = event.split(\".\");\n const hasDelegate = delegate && callback;\n if (!callback) callback = delegate;\n const eventFunc = !hasDelegate ? function(event) {\n callback(event);\n element.removeEventListener(type, eventFunc);\n } : function(event) {\n if (!event.target.matches(delegate)) return;\n callback(event);\n element.removeEventListener(type, eventFunc);\n };\n\n element.addEventListener(type, eventFunc);\n const cancel = () => {\n element.removeEventListener(type, eventFunc);\n };\n if (namespace) {\n if (!this.listeners[namespace]) this.listeners[namespace] = [];\n const newCancel = () => {\n cancel();\n this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);\n };\n this.listeners[namespace].push({\n event: type,\n element: element,\n cancel: newCancel\n });\n return newCancel;\n }\n return cancel;\n }\n\n static __offAll(event, element) {\n const [type, namespace] = event.split(\".\");\n let matchFilter = listener => listener.event == type, defaultFilter = _ => _;\n if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element;\n const listeners = this.listeners[namespace] || [];\n const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter);\n for (let c = 0; c < list.length; c++) list[c].cancel();\n }\n \n /**\n * This is similar to jQuery's `off` function and can *hopefully* be used in the same way.\n * \n * Rather than attempt to explain, I'll show some example usages.\n * \n * The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`.\n * `DOMTools.off(element, \"click.myPlugin\", onClick);`\n * \n * 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.\n * `DOMTools.off(element, \"click.myPlugin\", \".block\", onClick);`\n * \n * The following will remove a click listener (without namespace) from `element`.\n * `DOMTools.off(element, \"click\", onClick);`\n * \n * The following will remove all listeners in namespace `myPlugin` from `element`.\n * `DOMTools.off(element, \".myPlugin\");`\n * \n * The following will remove all click listeners in namespace `myPlugin` from *all elements*.\n * `DOMTools.off(\"click.myPlugin\");`\n * \n * The following will remove all listeners in namespace `myPlugin` from *all elements*.\n * `DOMTools.off(\".myPlugin\");`\n * \n * @param {(Element|string)} element - Element to remove listener from\n * @param {string} [event] - Event to listen to with option namespace (e.g. \"event.namespace\")\n * @param {(string|callable)} [delegate] - Selector to run on element to listen to\n * @param {callable} [callback] - Function to fire on event\n * @returns {Element} - The original element to allow for chaining\n */\n static off(element, event, delegate, callback) {\n if (typeof(element) == \"string\") return this.__offAll(element);\n const [type, namespace] = event.split(\".\");\n if (namespace) return this.__offAll(event, element);\n\n const hasDelegate = delegate && callback;\n if (!callback) callback = delegate;\n const eventFunc = !hasDelegate ? callback : function(event) {\n if (event.target.matches(delegate)) {\n callback(event);\n }\n };\n\n element.removeEventListener(type, eventFunc);\n return element;\n }\n\n /**\n * Adds a listener for when the node is added/removed from the document body.\n * The listener is automatically removed upon firing.\n * @param {HTMLElement} node - node to wait for\n * @param {callable} callback - function to be performed on event\n * @param {boolean} onMount - determines if it should fire on Mount or on Unmount\n */\n static onMountChange(node, callback, onMount = true) {\n const wrappedCallback = () => {\n this.observer.unsubscribe(wrappedCallback);\n callback();\n };\n this.observer.subscribe(wrappedCallback, mutation => {\n const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n return directMatch || parentMatch;\n });\n return node;\n }\n\n /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */\n static onMount(node, callback) { return this.onMountChange(node, callback); }\n\n /** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */\n static onUnmount(node, callback) { return this.onMountChange(node, callback, false); }\n\n /** Alias for {@link module:DOMTools.onMount} */\n static onAdded(node, callback) { return this.onMount(node, callback); }\n\n /** Alias for {@link module:DOMTools.onUnmount} */\n static onRemoved(node, callback) { return this.onUnmount(node, callback, false); }\n\n /**\n * Helper function which combines multiple elements into one parent element\n * @param {Array} elements - array of elements to put into a single parent\n */\n static wrap(elements) {\n const domWrapper = this.parseHTML(`
`);\n for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);\n return domWrapper;\n }\n\n /**\n * Resolves the node to an HTMLElement. This is mainly used by library modules.\n * @param {(jQuery|Element)} node - node to resolve\n */\n static resolveElement(node) {\n if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;\n return node instanceof jQuery ? node[0] : node;\n }\n}\n\nwindow.Lightcord.BetterDiscord.DOM = DOMTools","import {bdthemeErrors, themeCookie, settingsCookie, bdthemes} from \"../0globals\";\nimport ContentManager from \"./contentManager\";\nimport DataStore from \"./dataStore\";\nimport BDEvents from \"./bdEvents\";\nimport Utils from \"./utils\";\nimport DOM from \"./domtools\";\nimport bdEvents from \"./bdEvents\";\n\nclass ThemeModule {\n constructor(){\n window.Lightcord.BetterDiscord.ThemeModule = this\n }\n get folder() {return ContentManager.themesFolder;}\n}\n\nThemeModule.prototype.loadThemes = async function () {\n this.loadThemeData();\n bdthemeErrors.splice(0, 0, ...(await ContentManager.loadThemes()));\n const themes = Object.keys(bdthemes);\n\n for (let i = 0; i < themes.length; i++) {\n const theme = bdthemes[themes[i]];\n if (!themeCookie[theme.name]) themeCookie[theme.name] = false;\n if (themeCookie[theme.name]) DOM.addStyle(DOM.escapeID(theme.id), unescape(theme.css));\n\n await new Promise((resolve) => setTimeout(resolve, 10))\n }\n for (const theme in themeCookie) {\n if (!bdthemes[theme]) delete themeCookie[theme];\n }\n this.saveThemeData();\n // if (settingsCookie[\"fork-ps-5\"]) ContentManager.watchContent(\"theme\");\n};\n\nThemeModule.prototype.enableTheme = function(name, reload = false) {\n themeCookie[name] = true;\n this.saveThemeData();\n const theme = bdthemes[name];\n DOM.addStyle(DOM.escapeID(theme.id), unescape(theme.css));\n bdEvents.dispatch(\"theme-enabled\")\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${theme.name} v${theme.version} has been applied.`);\n};\n\nThemeModule.prototype.enable = function (name, reload = false) {\n return this.enableTheme(name, reload);\n};\n\nThemeModule.prototype.disableTheme = function(name, reload = false) {\n themeCookie[name] = false;\n this.saveThemeData();\n const theme = bdthemes[name];\n DOM.removeStyle(DOM.escapeID(theme.id));\n bdEvents.dispatch(\"theme-disabled\")\n if (settingsCookie[\"fork-ps-2\"] && !reload) Utils.showToast(`${theme.name} v${theme.version} has been disabled.`);\n};\n\nThemeModule.prototype.disable = function (name, reload = false) {\n return this.disableTheme(name, reload);\n};\n\nThemeModule.prototype.toggleTheme = function(theme) {\n if (themeCookie[theme]) this.disableTheme(theme);\n else this.enableTheme(theme);\n};\n\nThemeModule.prototype.toggle = function (name) {\n return this.toggleTheme(name);\n};\n\nThemeModule.prototype.loadTheme = async function(filename) {\n const error = await ContentManager.loadContent(filename, \"theme\");\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({themes: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${filename} could not be loaded. It may not have been loaded.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${filename} could not be loaded.`, error);\n }\n const theme = Object.values(bdthemes).find(p => p.filename == filename);\n Utils.log(\"ContentManager\", `${theme.name} v${theme.version} was loaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme.name} v${theme.version} was loaded.`, {type: \"success\"});\n BDEvents.dispatch(\"theme-loaded\", theme.name);\n};\n\nThemeModule.prototype.unloadTheme = function(filenameOrName) {\n const bdtheme = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\n if (!bdtheme) return;\n const theme = bdtheme.name;\n if (themeCookie[theme]) this.disableTheme(theme, true);\n const error = ContentManager.unloadContent(bdthemes[theme].filename, \"theme\");\n delete bdthemes[theme];\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({themes: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${theme} could not be unloaded. It may have not been loaded yet.`, error);\n }\n Utils.log(\"ContentManager\", `${theme} was unloaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} was unloaded.`, {type: \"success\"});\n BDEvents.dispatch(\"theme-unloaded\", theme);\n};\n\nThemeModule.prototype.delete = function(filenameOrName) {\n const bdtheme = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\n if (!bdtheme) return;\n this.unloadTheme(bdtheme.filename);\n const fullPath = require(\"path\").resolve(ContentManager.themesFolder, bdtheme.filename);\n require(\"fs\").unlinkSync(fullPath);\n};\n\nThemeModule.prototype.reloadTheme = async function(filenameOrName) {\n const bdtheme = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\n if (!bdtheme) return this.loadTheme(filenameOrName);\n const theme = bdtheme.name;\n const error = await ContentManager.reloadContent(bdthemes[theme].filename, \"theme\");\n if (themeCookie[theme]) this.disableTheme(theme, true), this.enableTheme(theme, true);\n if (error) {\n if (settingsCookie[\"fork-ps-1\"]) Utils.showContentErrors({themes: [error]});\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} could not be reloaded.`, {type: \"error\"});\n return Utils.err(\"ContentManager\", `${theme} could not be reloaded.`, error);\n }\n Utils.log(\"ContentManager\", `${theme} v${bdthemes[theme].version} was reloaded.`);\n if (settingsCookie[\"fork-ps-2\"]) Utils.showToast(`${theme} v${bdthemes[theme].version} was reloaded.`, {type: \"success\"});\n BDEvents.dispatch(\"theme-reloaded\", theme);\n};\n\nThemeModule.prototype.reload = function(name) {\n return this.reloadTheme(name);\n};\n\nThemeModule.prototype.edit = function(filenameOrName) {\n const bdplugin = Object.values(bdthemes).find(p => p.filename == filenameOrName) || bdthemes[filenameOrName];\n if (!bdplugin) return;\n const fullPath = require(\"path\").resolve(ContentManager.themesFolder, bdplugin.filename);\n require(\"electron\").shell.openExternal(`${fullPath}`);\n};\n\nThemeModule.prototype.updateThemeList = function() {\n const results = ContentManager.loadNewContent(\"theme\");\n for (const filename of results.added) this.loadTheme(filename);\n for (const name of results.removed) this.unloadTheme(name);\n};\n\nThemeModule.prototype.loadThemeData = function() {\n const saved = DataStore.getSettingGroup(\"themes\");\n if (saved) {\n Object.assign(themeCookie, saved);\n }\n};\n\nThemeModule.prototype.saveThemeData = function () {\n DataStore.setSettingGroup(\"themes\", themeCookie);\n};\n\nexport default new ThemeModule();","import {settings} from \"../0globals\";\nimport themeModule from \"./themeModule\";\n\nexport default new class V2 {\n\n constructor() {\n this.editorDetached = false;\n this.WebpackModules = (() => {\n const req = webpackJsonp.push([[], {__extra_id__: (module, exports, req) => module.exports = req}, [[\"__extra_id__\"]]]);\n delete req.m.__extra_id__;\n delete req.c.__extra_id__;\n\n const shouldProtect = theModule => {\n if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true;\n if (theModule.getToken || theModule.getEmail || theModule.showToken) return true;\n return false;\n };\n\n const protect = (theModule, isDefault) => {\n let mod = !isDefault ? theModule.default : theModule\n if(!mod)return theModule\n if (mod.remove && mod.set && mod.clear && mod.get && !mod.sort) return null;\n if (!mod.getToken && !mod.getEmail && !mod.showToken)return theModule\n\n const proxy = new Proxy(mod, {\n getOwnPropertyDescriptor: function(obj, prop) {\n if (prop === \"getToken\" || prop === \"getEmail\" || prop === \"showToken\") return undefined;\n return Object.getOwnPropertyDescriptor(obj, prop);\n },\n get: function(obj, func) {\n if (func == \"getToken\" && obj.getToken) return () => \"mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa\";\n if (func == \"getEmail\" && obj.getEmail) return () => \"puppet11112@gmail.com\";\n if (func == \"showToken\" && obj.showToken) return () => true;\n if (func == \"__proto__\" && obj.__proto__) return proxy;\n \n return obj[func];\n }\n });\n\n if(!isDefault){\n return Object.assign({}, theModule, {default: proxy})\n }\n\n return proxy;\n };\n\n const find = (filter) => {\n for (const i in req.c) {\n if (req.c.hasOwnProperty(i)) {\n const m = req.c[i].exports;\n if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default, true);\n if (m && filter(m))\treturn protect(m, false);\n }\n }\n // console.warn(\"Cannot find loaded module in cache\");\n return null;\n };\n\n const findAll = (filter) => {\n const modules = [];\n for (const i in req.c) {\n if (req.c.hasOwnProperty(i)) {\n const m = req.c[i].exports;\n if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default, true));\n else if (m && filter(m)) modules.push(protect(m, false));\n }\n }\n return modules;\n };\n\n const findByUniqueProperties = (propNames) => find(module => propNames.every(prop => module[prop] !== undefined));\n const findByPrototypes = (protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));\n const findByDisplayName = (displayName) => find(module => module.displayName === displayName);\n\n return {find, findAll, findByUniqueProperties, findByPrototypes, findByDisplayName};\n })();\n\n this.internal = {\n react: this.WebpackModules.findByUniqueProperties([\"Component\", \"PureComponent\", \"Children\", \"createElement\", \"cloneElement\"]),\n reactDom: this.WebpackModules.findByUniqueProperties([\"findDOMNode\"])\n };\n this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith(\"__reactInternalInstance\"))];\n window.Lightcord.BetterDiscord.V2 = this\n }\n\n initialize() {\n\n }\n\n joinBD1() {this.InviteActions.acceptInviteAndTransitionToInviteChannel(\"0Tmfo5ZbORCRqbAd\");}\n leaveBD1() {this.GuildActions.leaveGuild(\"86004744966914048\");}\n\n joinBD2() {this.InviteActions.acceptInviteAndTransitionToInviteChannel(\"2HScm8j\");}\n leaveBD2() {this.GuildActions.leaveGuild(\"280806472928198656\");}\n\n joinLC() {this.InviteActions.acceptInviteAndTransitionToInviteChannel(\"7eFff2A\");}\n leaveLC() {this.GuildActions.leaveGuild(\"705908350218666117\");}\n\n /**\n * @type {typeof React}\n */\n get react() {return this.internal.react;}\n /**\n * @type {typeof React}\n */\n get React() {return this.internal.react;}\n /**\n * @type {typeof import(\"react-dom\")}\n */\n get reactDom() {return this.internal.reactDom;}\n /**\n * @type {typeof import(\"react-dom\")}\n */\n get ReactDom() {return this.internal.reactDom;}\n /**\n * @type {typeof React.Component}\n */\n get reactComponent() {return this.internal.react.Component;}\n /**\n * @type {typeof React.Component}\n */\n get ReactComponent() {return this.internal.react.Component;}\n\n get anchorClasses() {return this.WebpackModules.findByUniqueProperties([\"anchorUnderlineOnHover\"]) || {anchor: \"anchor-3Z-8Bb\", anchorUnderlineOnHover: \"anchorUnderlineOnHover-2ESHQB\"};}\n get slateEditorClasses() {return this.WebpackModules.findByUniqueProperties([\"slateTextArea\"]);}\n get messageClasses() {return this.WebpackModules.findByUniqueProperties([\"message\", \"containerCozy\"]);}\n get guildClasses() {\n\t\tconst guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0];\n const guilds = BDModules.get(e => e.guildsError && e.selected)[0]\n const pill = BDModules.get(e => e.blobContainer)[0]\n return Object.assign({}, guildsWrapper, guilds, pill);\n\t}\n\n get MessageContentComponent() {return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty(\"disableButtons\"));}\n get MessageComponent() {return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == \"Message\");}\n get TimeFormatter() {return this.WebpackModules.findByUniqueProperties([\"dateFormat\"]);}\n get TooltipWrapper() {return this.WebpackModules.findByDisplayName(\"Tooltip\");}\n get NativeModule() {return this.WebpackModules.findByUniqueProperties([\"setBadge\"]);}\n get InviteActions() {return this.WebpackModules.findByUniqueProperties([\"acceptInvite\"]);}\n get GuildActions() {return this.WebpackModules.findByUniqueProperties([\"leaveGuild\"]);}\n get Tooltips() {return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss);}\n get KeyGenerator() {return this.WebpackModules.find(m => m.toString && /\"binary\"/.test(m.toString()));}\n get LayerStack() {return this.WebpackModules.findByUniqueProperties([\"popLayer\"]);}\n get UserStore() {return this.WebpackModules.findByUniqueProperties([\"getCurrentUser\"]);}\n get ChannelStore() {return this.WebpackModules.findByUniqueProperties([\"getChannel\"]);}\n get ChannelActions() {return this.WebpackModules.findByUniqueProperties([\"openPrivateChannel\"]);}\n get PrivateChannelActions() {return this.WebpackModules.findByUniqueProperties([\"selectPrivateChannel\"]);}\n\n openDM(userId) {\n const selfId = this.UserStore.getCurrentUser().id;\n if (selfId == userId) return;\n const privateChannelId = this.ChannelStore.getDMFromUserId(userId);\n if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId);\n this.ChannelActions.openPrivateChannel(selfId, userId);\n }\n\n parseSettings(cat) {\n return Object.keys(settings).reduce((arr, key) => {\n const setting = settings[key];\n if (setting.cat === cat && setting.implemented && !setting.hidden) {\n setting.text = key;\n arr.push(setting);\n } return arr;\n }, []);\n }\n\n};","import {bbdVersion} from \"../0globals\";\nimport WebpackModules from \"./webpackModules\";\nimport BDV2 from \"./v2\";\nimport DOM from \"./domtools\";\nexport default class Utils {\n /** Document/window width */\n static get screenWidth() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0); }\n /** Document/window height */\n static get screenHeight() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); }\n\n static get WindowConfigFile() {\n return this._windowConfigFile = null;\n }\n\n static getAllWindowPreferences() {\n return {\n transparent: true,\n frame: false\n };\n }\n \n static getWindowPreference(key) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return false;\n return null;\n }\n \n static setWindowPreference(key, value) {\n if (key === \"transparent\") return true;\n if (key === \"frame\") return false;\n return null;\n }\n\n static stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n }\n\n static getTextArea() {\n return DOM.query(\".\"+removeDa(BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea)+\" textarea\");\n }\n\n static insertText(textarea, text) {\n textarea.focus();\n textarea.selectionStart = 0;\n textarea.selectionEnd = textarea.value.length;\n document.execCommand(\"insertText\", false, text);\n }\n\n static escapeID(id) {\n return id.replace(/^[^a-z]+|[^\\w-]+/gi, \"-\");\n }\n\n static log(moduleName, message) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #3a71c1; font-weight: 700;\", \"color: #3a71c1;\", \"\");\n }\n\n static warn(moduleName, message) {\n console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: #E8A400; font-weight: 700;\", \"color: #E8A400;\", \"\");\n }\n\n static err(moduleName, message, error) {\n console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, \"color: red; font-weight: 700;\", \"color: red;\", \"\");\n if (error) {\n console.groupCollapsed(\"%cError: \" + error.message, \"color: red;\");\n console.error(error.stack);\n console.groupEnd();\n }\n }\n\n /**\n * Format strings with placeholders (`{{placeholder}}`) into full strings.\n * Quick example: `PluginUtilities.formatString(\"Hello, {{user}}\", {user: \"Zerebos\"})`\n * would return \"Hello, Zerebos\".\n * @param {string} string - string to format\n * @param {object} values - object literal of placeholders to replacements\n * @returns {string} the properly formatted string\n */\n static formatString(string, values) {\n for (const val in values) {\n let replacement = values[val];\n if (Array.isArray(replacement)) replacement = JSON.stringify(replacement);\n if (typeof(replacement) === \"object\" && replacement !== null) replacement = replacement.toString();\n string = string.replace(new RegExp(`{{${val}}}`, \"g\"), replacement);\n }\n return string;\n }\n\n static escape(s) {\n return s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n }\n\n static testJSON(data) {\n try {\n return JSON.parse(data);\n }\n catch (err) {\n return false;\n }\n }\n\n static isEmpty(obj) {\n if (obj == null || obj == undefined || obj == \"\") return true;\n if (typeof(obj) !== \"object\") return false;\n if (Array.isArray(obj)) return obj.length == 0;\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) return false;\n }\n return true;\n }\n\n static suppressErrors(method, message) {\n return (...params) => {\n try { return method(...params);\t}\n catch (e) { this.err(\"SuppressedError\", \"Error occurred in \" + message, e); }\n };\n }\n\n static monkeyPatch(what, methodName, options) {\n const {before, after, instead, once = false, silent = false, force = false} = options;\n const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;\n if (!silent) console.log(\"patch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n if (!what[methodName]) {\n if (force) what[methodName] = function() {};\n else return console.error(methodName, \"does not exist for\", displayName); // eslint-disable-line no-console\n }\n const origMethod = what[methodName];\n let canceled = false\n const cancel = () => {\n if (!silent) console.log(\"unpatch\", methodName, \"of\", displayName); // eslint-disable-line no-console\n //what[methodName] = origMethod;\n canceled = true // this allow to monkeypatch more than one time.\n };\n what[methodName] = function() {\n if(canceled){\n return origMethod.call(this, ...arguments)\n }\n const data = {\n thisObject: this,\n methodArguments: arguments,\n cancelPatch: cancel,\n originalMethod: origMethod,\n callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)\n };\n if (instead) {\n const tempRet = Utils.suppressErrors(instead, \"`instead` callback of \" + what[methodName].displayName)(data);\n if (tempRet !== undefined) data.returnValue = tempRet;\n }\n else {\n if (before) Utils.suppressErrors(before, \"`before` callback of \" + what[methodName].displayName)(data);\n data.callOriginalMethod();\n if (after) Utils.suppressErrors(after, \"`after` callback of \" + what[methodName].displayName)(data);\n }\n if (once) cancel();\n return data.returnValue;\n };\n Object.assign(what[methodName], origMethod);\n what[methodName].__monkeyPatched = true;\n what[methodName].displayName = displayName;\n if (!what[methodName].__originalMethod) {\n what[methodName].__originalMethod = origMethod;\n what[methodName].toString = function() {return origMethod.toString();};\n }\n return cancel;\n }\n\n static onRemoved(node, callback) {\n const observer = new MutationObserver((mutations) => {\n for (let m = 0; m < mutations.length; m++) {\n const mutation = mutations[m];\n const nodes = Array.from(mutation.removedNodes);\n const directMatch = nodes.indexOf(node) > -1;\n const parentMatch = nodes.some(parent => parent.contains(node));\n if (directMatch || parentMatch) {\n observer.disconnect();\n callback();\n }\n }\n });\n\n observer.observe(document.body, {subtree: true, childList: true});\n }\n\n static getNestedProp(obj, path) {\n return path.split(/\\s?\\.\\s?/).reduce(function(obj, prop) {\n return obj && obj[prop];\n }, obj);\n }\n\n /**\n * This shows a toast similar to android towards the bottom of the screen.\n *\n * @param {string} content The string to show in the toast.\n * @param {object} options Options object. Optional parameter.\n * @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: \"\", \"info\", \"success\", \"danger\"/\"error\", \"warning\"/\"warn\". Default: \"\"\n * @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\n * @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000\n */\n static showToast(content, options = {}) {\n if (!document.querySelector(\".bd-toasts\")) {\n const container = document.querySelector(\".\"+removeDa(BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar)+\" + div\") || null;\n const form = container ? container.querySelector(\"form\") : null;\n const bottom = form ? form.offsetHeight : 80;\n const toastWrapper = document.createElement(\"div\");\n toastWrapper.classList.add(\"bd-toasts\");\n toastWrapper.style.setProperty(\"bottom\", bottom+\"px\");\n document.querySelector(\"#app-mount\").appendChild(toastWrapper);\n }\n const toastWrapper = document.querySelector(\".bd-toasts\")\n const {type = \"\", icon = true, timeout = 3000} = options;\n const toastElem = document.createElement(\"div\");\n toastElem.classList.add(\"bd-toast\");\n if (type) toastElem.classList.add(\"toast-\" + type);\n if (type && icon) toastElem.classList.add(\"icon\");\n toastElem.innerText = content;\n toastWrapper.appendChild(toastElem);\n toastWrapper.style.setProperty(\"left\", `calc(50% - ${toastWrapper.offsetWidth / 2}px)`);\n setTimeout(() => {\n toastElem.classList.add(\"closing\");\n setTimeout(() => {\n toastElem.remove();\n if (!document.querySelectorAll(\".bd-toasts .bd-toast\").length) document.querySelector(\".bd-toasts\").remove();\n }, 300);\n }, timeout);\n }\n\n static alert(title, content) {\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]\n const modal = DOM.createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
\n
${title}
\n
\n
\n
\n
\n ${content}\n
\n
\n
\n
\n \n
\n
\n
\n
`);\n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { \n modal.remove(); \n closingListeners.forEach((listener) => {\n try{\n listener()\n }catch(e){\n console.error(e)\n }\n })\n }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { \n modal.remove(); \n closingListeners.forEach((listener) => {\n try{\n listener()\n }catch(e){\n console.error(e)\n }\n })\n }, 300);\n });\n DOM.query(\"#app-mount\").append(modal);\n const closingListeners = []\n return {\n close: () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { \n modal.remove(); \n closingListeners.forEach((listener) => {\n try{\n listener()\n }catch(e){\n console.error(e)\n }\n })\n }, 300);\n },\n onClose: (listener) => {\n closingListeners.push(listener)\n }\n }\n }\n\n static showContentErrors({plugins: pluginErrors = [], themes: themeErrors = []}) {\n if (!pluginErrors || !themeErrors) return;\n if (!pluginErrors.length && !themeErrors.length) return;\n let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0]\n let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0]\n let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0]\n const modal = DOM.createElement(`
\n
e.backdrop && e.backdropWithLayer)[0].backdrop}\">
\n
\n
\n
Content Errors
\n
\n
\n
\n
Plugins
\n
Themes
\n
\n
\n
\n
Name
\n
Message
\n
Error
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n
`);\n \n function generateTab(errors) {\n const container = DOM.createElement(`
`);\n for (const err of errors) {\n const error = DOM.createElement(`
\n
${err.name ? err.name : err.file}
\n
${err.message}
\n \n
`);\n container.append(error);\n if (err.error) {\n error.querySelectorAll(\"a\").forEach(el => el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n Utils.err(\"ContentManager\", `Error details for ${err.name ? err.name : err.file}.`, err.error);\n }));\n }\n }\n return container;\n }\n \n const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];\n \n modal.querySelectorAll(\".tab-bar-item\").forEach(el => el.addEventListener(\"click\", (e) => {\n e.preventDefault();\n const selected = modal.querySelector(\".tab-bar-item.selected\");\n if (selected) DOM.removeClass(selected, \"selected\");\n DOM.addClass(e.target, \"selected\");\n const scroller = modal.querySelector(\".scroller\");\n scroller.innerHTML = \"\";\n scroller.append(tabs[DOM.index(e.target)]);\n }));\n \n modal.querySelector(\".footer button\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { modal.remove(); }, 300);\n });\n modal.querySelector(\".bd-backdrop\").addEventListener(\"click\", () => {\n DOM.addClass(modal, \"closing\");\n setTimeout(() => { modal.remove(); }, 300);\n });\n DOM.query(\"#app-mount\").append(modal);\n if (pluginErrors.length) modal.querySelector(\".tab-bar-item\").click();\n else modal.querySelectorAll(\".tab-bar-item\")[1].click();\n }\n\n static showChangelogModal(options = {}) {\n const ModalStack = WebpackModules.findByProps(\"push\", \"update\", \"pop\", \"popWithKey\");\n const ChangelogClasses = WebpackModules.findByProps(\"fixed\", \"improved\");\n const TextElement = WebpackModules.findByDisplayName(\"Text\");\n const FlexChild = WebpackModules.findByProps(\"Child\");\n const Titles = WebpackModules.findByProps(\"Tags\", \"default\");\n const Changelog = WebpackModules.find(m => m.defaultProps && m.defaultProps.selectable == false);\n const MarkdownParser = WebpackModules.findByProps(\"defaultRules\", \"parse\");\n if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;\n \n const {\n image = \"https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5\", \n description = \"\", \n changes = [], \n title = \"BandagedBD\", \n subtitle = `v${bbdVersion}`, \n footer\n } = options;\n const ce = BDV2.React.createElement;\n const changelogItems = [ce(\"img\", {src: image})];\n if (description) changelogItems.push(ce(\"p\", null, MarkdownParser.parse(description)));\n for (let c = 0; c < changes.length; c++) {\n const entry = changes[c];\n const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;\n const margin = c == 0 ? ChangelogClasses.marginTop : \"\";\n changelogItems.push(ce(\"h1\", {className: `${type} ${margin}`,}, entry.title));\n const list = ce(\"ul\", null, entry.items.map(i => ce(\"li\", null, MarkdownParser.parse(i))));\n changelogItems.push(list);\n }\n const renderHeader = function() {\n return ce(FlexChild.Child, {grow: 1, shrink: 1},\n ce(Titles.default, {tag: Titles.Tags.H4}, title),\n ce(TextElement,{size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD, className: ChangelogClasses.date}, subtitle)\n );\n };\n \n const renderFooter = () => {\n const Anchor = WebpackModules.find(m => m.displayName == \"Anchor\");\n const AnchorClasses = WebpackModules.findByProps(\"anchorUnderlineOnHover\") || {anchor: \"anchor-3Z-8Bb\", anchorUnderlineOnHover: \"anchorUnderlineOnHover-2ESHQB\"};\n const joinSupportServer = (click) => {\n click.preventDefault();\n click.stopPropagation();\n ModalStack.pop();\n BDV2.joinBD2();\n };\n const supportLink = Anchor ? ce(Anchor, {onClick: joinSupportServer}, \"Join our Discord Server.\") : ce(\"a\", {className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`, onClick: joinSupportServer}, \"Join our Discord Server.\");\n const defaultFooter = ce(TextElement,{size: TextElement.Sizes.SMALL, color: TextElement.Colors.STANDARD}, \"Need support? \", supportLink);\n return ce(FlexChild.Child, {grow: 1, shrink: 1}, footer ? footer : defaultFooter);\n };\n\n return ModalStack.push(function(props) {\n return ce(Changelog, Object.assign({\n className: ChangelogClasses.container,\n selectable: true,\n onScroll: _ => _,\n onClose: _ => _,\n renderHeader: renderHeader,\n renderFooter: renderFooter,\n children: changelogItems\n }, props));\n });\n }\n\n /**\n * Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.\n * @param {string} title - title of the modal\n * @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.\n * @param {object} [options] - options to modify the modal\n * @param {boolean} [options.danger=false] - whether the main button should be red or not\n * @param {string} [options.confirmText=Okay] - text for the confirmation/submit button\n * @param {string} [options.cancelText=Cancel] - text for the cancel button\n * @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button\n * @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button\n * @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned\n * @returns {string} - the key used for this modal\n */\n static showConfirmationModal(title, content, options = {}) {\n const ModalActions = WebpackModules.findByProps(\"openModal\", \"updateModal\");\n const Markdown = WebpackModules.findByDisplayName(\"Markdown\");\n const ConfirmationModal = WebpackModules.findByDisplayName(\"ConfirmModal\");\n if (!ModalActions || !ConfirmationModal || !Markdown) return Utils.alert(title, content);\n\n const emptyFunction = () => {};\n const {onConfirm = emptyFunction, onCancel = emptyFunction, confirmText = \"Okay\", cancelText = \"Cancel\", danger = false, key = undefined} = options;\n\n if (!Array.isArray(content)) content = [content];\n content = content.map(c => typeof(c) === \"string\" ? BDV2.React.createElement(Markdown, null, c) : c);\n return ModalActions.openModal(props => {\n return BDV2.React.createElement(ConfirmationModal, Object.assign({\n header: title,\n red: danger,\n confirmText: confirmText,\n cancelText: cancelText,\n onConfirm: onConfirm,\n onCancel: onCancel\n }, props), content);\n }, {modalKey: key});\n }\n\n static get removeDa(){\n return removeDa\n }\n}\n\nfunction removeDa(className){\n if(!className)return className\n return className.split(\" \").filter(e => !e.startsWith(\"da-\")).join(\" \")\n}\n\nUtils.showToast = Utils.suppressErrors(Utils.showToast, \"Could not show toast.\");\n\nwindow.Lightcord.BetterDiscord.Utils = Utils","export default class V2_SettingsPanel_Sidebar {\n\n constructor() {\n this.panels = {}\n }\n\n register(panel, component){\n this.panels[panel] = component\n }\n\n getComponent(panel, sidebar){\n return this.panels[panel](sidebar)\n }\n\n get items() {\n return [{\n text: \"BetterDiscord Settings\", \n id: \"core\"\n }, {\n text: \"Plugins\", \n id: \"plugins\"\n }, {\n text: \"Themes\", \n id: \"themes\"\n }, {\n text: \"Custom CSS\", \n id: \"customcss\"\n }];\n }\n\n get LCitems(){\n let items = [\n {\n text: \"Lightcord Settings\",\n id: \"lightcord\"\n }, {\n text: \"RichPresence\", \n id: \"status\"\n }, {\n text: \"Account Info\",\n id: \"accountinfo\"\n }\n ]\n return items\n }\n\n get LCDevItems(){\n let items = []\n if(!window.Lightcord.Settings.devMode)return items\n items.push(...[\n {\n section: \"DIVIDER\"\n },\n {\n section: \"HEADER\",\n label: \"Lightcord Api\"\n },\n {\n text: \"Components Preview\",\n id: \"lcapipreview\"\n }\n ])\n return items\n }\n\n render(sidebar) {\n return [\n {\n section: \"HEADER\",\n label: \"Lightcord\"\n },\n ...this.LCitems.map(e => {\n return {\n section: e.id,\n label: e.text,\n element: this.getComponent(e.id, sidebar)\n }\n }),\n ...this.LCDevItems.map(e => {\n if(e.section)return e\n return {\n section: e.id,\n label: e.text,\n element: this.getComponent(e.id, sidebar)\n }\n }),\n {\n section: \"DIVIDER\"\n },\n {\n section: \"CUSTOM\",\n element: this.getComponent(\"BDChangelogTitle\")\n },\n ...this.items.map(e => {\n return {\n section: e.id,\n label: e.text,\n element: this.getComponent(e.id, sidebar)\n }\n }),\n {\n section: \"DIVIDER\"\n }\n ]\n }\n}\n\n/**\n * No need to export settingsPanelSidebar on window\n */","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"./v2\";\r\nimport Utils from \"./utils\";\r\n\r\nexport default new class ColoredText {\r\n injectColoredText() {\r\n if (this.cancelColoredText) return;\r\n if (!BDV2.MessageComponent) return;\r\n\r\n this.cancelColoredText = Utils.monkeyPatch(BDV2.MessageComponent, \"default\", {before: (data) => {\r\n const props = data.methodArguments[0];\r\n if (!props || !props.childrenMessageContent) return;\r\n const messageContent = props.childrenMessageContent;\r\n\r\n if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != \"MessageContent\") return;\r\n const originalType = messageContent.type.type;\r\n if (originalType.__originalMethod) return; // Don't patch again\r\n messageContent.type.type = function(props) {\r\n const returnValue = originalType(props);\r\n const roleColor = settingsCookie[\"bda-gs-7\"] ? props.message.colorString || \"\" : \"\";\r\n returnValue.props.style = {color: roleColor};\r\n return returnValue;\r\n };\r\n\r\n messageContent.type.type.__originalMethod = originalType;\r\n Object.assign(messageContent.type.type, originalType);\r\n }});\r\n }\r\n\r\n removeColoredText() {\r\n let classNameMarkup = BDModules.get(e => e.markup)[0].markup\r\n document.querySelectorAll(\".\"+classNameMarkup.split(\" \")[0]).forEach(elem => {\r\n elem.style.setProperty(\"color\", \"\");\r\n });\r\n }\r\n};","import {settingsCookie} from \"../0globals\";\r\nimport BDV2 from \"./v2\";\r\nimport Utils from \"./utils\";\r\n\r\nexport default new class TFHour {\r\n inject24Hour() {\r\n if (this.cancel24Hour) return;\r\n\r\n const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\\\s(AM|PM)`);\r\n const convert = (data) => {\r\n if (!settingsCookie[\"bda-gs-6\"]) return;\r\n const matched = data.returnValue.match(twelveHour);\r\n if (!matched || matched.length !== 4) return;\r\n if (matched[3] === \"AM\") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === \"12\" ? \"00\" : matched[1].padStart(2, \"0\")}:${matched[2]}`);\r\n return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === \"12\" ? \"12\" : parseInt(matched[1]) + 12}:${matched[2]}`);\r\n };\r\n\r\n const cancelCozy = Utils.monkeyPatch(BDV2.TimeFormatter, \"calendarFormat\", {after: convert}); // Called in Cozy mode\r\n const cancelCompact = Utils.monkeyPatch(BDV2.TimeFormatter, \"dateFormat\", {after: convert}); // Called in Compact mode\r\n this.cancel24Hour = () => {cancelCozy(); cancelCompact();}; // Cancel both\r\n }\r\n\r\n remove24Hour() {\r\n if (this.cancel24Hour) this.cancel24Hour();\r\n }\r\n};","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_SettingsTitle extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n//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\r\n render() {\r\n return BDV2.react.createElement(\r\n \"h2\",\r\n {className: \"ui-form-title h2 margin-reset margin-bottom-20\"},\r\n this.props.text\r\n );\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_TabBarSeparator extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\"div\", {className: \"ui-tab-bar-separator margin-top-8 margin-bottom-8\"});\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\r\n\r\nexport default class V2C_ServerCard extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;\r\n this.state = {\r\n imageError: false,\r\n joined: this.props.guildList.includes(this.props.server.identifier)\r\n };\r\n }\r\n\r\n render() {\r\n const {server} = this.props;\r\n let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0]\r\n let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0]\r\n let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0]\r\n return BDV2.react.createElement(\r\n \"div\", // cardPrimary-1Hv-to\r\n {className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? \" bd-server-card-pinned\" : \"\"}`},\r\n // BDV2.react.createElement(\r\n // \"div\",\r\n // { className: \"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6\" },\r\n BDV2.react.createElement(\"img\", {ref: \"img\", className: \"bd-server-image\", src: server.iconUrl, onError: this.handleError.bind(this), draggable: false}),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: flexModule.flexChild+\" bd-server-content\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: flexModule.horizontal+\" \"+wrapModule.noWrap+\" bd-server-header\"},\r\n BDV2.react.createElement(\r\n \"h5\",\r\n {className: \"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name\"},\r\n server.name\r\n ),\r\n BDV2.react.createElement(\r\n \"h5\",\r\n {className: \"h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count\"},\r\n server.members,\r\n \" Members\"\r\n )\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: flexModule.horizontal+\" \"+wrapModule.noWrap},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"scroller-2FKFPG scroller bd-server-description\"},\r\n server.description\r\n )\r\n )\r\n ),\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer\"},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"flexChild-faoVW3 bd-server-tags\", style: {flex: \"1 1 auto\"}},\r\n server.categories.join(\", \")\r\n ),\r\n this.state.joined && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", className: \"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY\", style: {minHeight: \"12px\", marginTop: \"4px\", backgroundColor: \"#3ac15c\"}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Joined\"\r\n )\r\n ),\r\n server.error && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", className: \"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug\", style: {minHeight: \"12px\", marginTop: \"4px\", backgroundColor: \"#c13a3a\"}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Error\"\r\n )\r\n ),\r\n !server.error && !this.state.joined && BDV2.react.createElement(\r\n \"button\",\r\n {type: \"button\", className: \"button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN\", style: {minHeight: \"12px\", marginTop: \"4px\"}, onClick: () => {this.join();}},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"ui-button-contents\"},\r\n \"Join\"\r\n )\r\n )\r\n )\r\n )\r\n // )\r\n );\r\n }\r\n\r\n handleError() {\r\n this.props.server.iconUrl = this.props.fallback;\r\n this.setState({imageError: true});\r\n }\r\n\r\n join() {\r\n this.props.join(this);\r\n //this.setState({joined: true});\r\n }\r\n}","import BDV2 from \"./v2\"\nconst {useState} = BDV2.react\n\n\nexport function useForceUpdate(){\n return useState()[1];\n}","import BDV2 from \"../../modules/v2\";\n\nimport SettingsTitle from \"../settingsTitle\";\nimport TabBarSeparator from \"../tabBarSeparator\";\n\nimport ServerCard from \"./serverCard\";\nimport { useForceUpdate } from \"../../modules/hooks\";\n\nlet SettingsView\nexport default class V2C_PublicServers extends BDV2.reactComponent {\n\n constructor(props) {\n super(props);\n this.setInitialState();\n this.close = this.close.bind(this);\n this.changeCategory = this.changeCategory.bind(this);\n this.search = this.search.bind(this);\n this.searchKeyDown = this.searchKeyDown.bind(this);\n this.checkConnection = this.checkConnection.bind(this);\n this.join = this.join.bind(this);\n this.connect = this.connect.bind(this);\n\n this.GuildStore = BDV2.WebpackModules.findByUniqueProperties([\"getGuilds\"]);\n this.AvatarDefaults = BDV2.WebpackModules.findByUniqueProperties([\"getUserAvatarURL\", \"DEFAULT_AVATARS\"]);\n this.InviteActions = BDV2.WebpackModules.findByUniqueProperties([\"acceptInvite\"]);\n this.SortedGuildStore = BDV2.WebpackModules.findByUniqueProperties([\"getSortedGuilds\"]);\n\n this.hooks = []\n }\n\n componentDidMount() {\n this.checkConnection();\n }\n\n setInitialState() {\n this.state = {\n selectedCategory: -1,\n title: \"Loading...\",\n loading: true,\n servers: [],\n next: null,\n connection: {\n state: 0,\n user: null\n },\n section: this.categorySlugs[0],\n theme: \"dark\"\n };\n }\n\n close() {\n this.props.close()\n }\n\n search(query, clear) {\n const self = this;\n fetch(`${self.searchEndPoint}${query}${query ? \"&schema=new\" : \"?schema=new\"}`, {\n method: \"get\"\n }).then(async res => {\n if(res.status !== 200)throw await res.text()\n let data = await res.json()\n \n let servers = data.results.reduce((arr, server) => {\n server.joined = false;\n arr.push(server);\n // arr.push();\n return arr;\n }, []);\n\n if (!clear) {\n servers = self.state.servers.concat(servers);\n }\n else {\n //servers.unshift(self.bdServer);\n }\n\n let end = data.size + data.from;\n data.next = `?from=${end}`;\n if (self.state.term) data.next += `&term=${self.state.term}`;\n if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;\n if (end >= data.total) {\n end = data.total;\n data.next = null;\n }\n\n let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;\n if (self.state.term) title += ` for ${self.state.term}`;\n\n self.setState({\n loading: false,\n title: title,\n servers: servers,\n next: data.next\n });\n }).catch((err) => {\n console.error(err)\n return self.setState({\n loading: false,\n title: \"Failed to load servers. Check console for details\"\n });\n })\n }\n\n async join(serverCard) {\n if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);\n\n await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`,{\n method: \"GET\",\n credentials: \"include\",\n mode: \"cors\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n\n serverCard.setState({joined: true});\n }\n\n connect() {\n const self = this;\n const options = self.windowOptions;\n options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);\n options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);\n\n const win = self.joinWindow = new (require(\"electron\").remote.BrowserWindow)(options);\n const url = \"https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info\";\n win.webContents.on(\"did-navigate\", (event, url) => {\n if (url != \"https://auth.discordservers.com/info\") return;\n win.close();\n self.checkConnection();\n });\n win.loadURL(url);\n win.setMenuBarVisibility(false)\n }\n\n get windowOptions() {\n return {\n width: 500,\n height: 550,\n backgroundColor: \"#282b30\",\n show: true,\n resizable: false,\n maximizable: false,\n minimizable: false,\n alwaysOnTop: true,\n frame: true,\n center: false,\n webPreferences: {\n nodeIntegration: false\n }\n };\n }\n\n get bdServer() {\n const server = {\n name: \"BetterDiscord\",\n online: \"30000+\",\n members: \"70000+\",\n categories: [\"community\", \"programming\", \"support\"],\n description: \"Official BetterDiscord server for support etc\",\n identifier: \"86004744966914048\",\n iconUrl: \"https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp\",\n nativejoin: true,\n invite_code: \"0Tmfo5ZbORCRqbAd\",\n pinned: true\n };\n const server2 = {\n name: \"Lightcord\",\n online: \"100+\",\n members: \"300+\",\n categories: [\"community\", \"programming\", \"support\"],\n description: \"Official Lightcord server for support etc\",\n identifier: \"705908350218666117\",\n iconUrl: \"https://github.com/lightcord.png\",\n nativejoin: true,\n invite_code: \"7eFff2A\",\n pinned: true\n };\n const guildList = this.SortedGuildStore.getFlattenedGuildIds();\n const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;\n return [\n BDV2.react.createElement(ServerCard, {server: server2, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]}),\n BDV2.react.createElement(ServerCard, {server: server, pinned: true, join: this.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]})\n ]\n }\n\n get searchEndPoint() {\n return \"https://search.discordservers.com\";\n }\n\n get joinEndPoint() {\n return \"https://j.discordservers.com\";\n }\n\n get connectEndPoint() {\n return \"https://join.discordservers.com/connect\";\n }\n\n async checkConnection() {\n const self = this;\n try {\n const response = await fetch(`https://auth.discordservers.com/info`,{\n method: \"GET\",\n credentials: \"include\",\n mode: \"cors\",\n headers: {\n \"Accept\": \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n const text = await response.text()\n if(!text){\n self.setState({\n title: \"Not connected to discordservers.com!\",\n loading: true,\n selectedCategory: -1,\n connection: {\n state: 1,\n user: null\n }\n });\n return\n }\n const data = JSON.parse(text)\n self.setState({\n selectedCategory: 0,\n connection: {\n state: 2,\n user: data\n }\n });\n self.search(\"\", true);\n }\n catch (error) {\n console.error(error)\n self.setState({\n title: \"Not connected to discordservers.com!\",\n loading: true,\n selectedCategory: -1,\n connection: {\n state: 1,\n user: null\n }\n });\n }\n }\n\n render() {\n this.hooks.forEach((e) => e())\n SettingsView = SettingsView || BDV2.WebpackModules.findByDisplayName(\"SettingsView\")\n return BDV2.react.createElement(\"div\", {id: \"pubslayerroot\"}, \n BDV2.react.createElement(\"div\", {id: \"pubslayer\"}, BDV2.react.createElement(SettingsView, {\n onSetSection: (section) => {\n this.changeCategory(this.categorySlugs.indexOf(section))\n },\n sections: this.sections,\n onClose: this.close,\n section: this.state.section\n }))\n );\n }\n\n get sections(){\n let sections = []\n sections.push({\n section: \"HEADER\",\n label: \"Public Servers\"\n }, {\n section: \"DIVIDER\"\n }, {\n section: \"CUSTOM\",\n element: this.searchInput.bind(null, () => this, this.searchKeyDown)\n }, {\n section: \"DIVIDER\"\n }, {\n section: \"HEADER\",\n label: \"Categories\"\n }, ...this.categoryButtons.map((value, index) => {\n return {\n section: this.categorySlugs[index],\n label: value,\n element: this.content.bind(null, () => this)\n }\n }), {\n section: \"DIVIDER\"\n }, {\n section: \"CUSTOM\",\n element: this.footer\n }, {\n section: \"CUSTOM\",\n element: this.connection.bind(null, () => this)\n })\n return sections\n }\n \n searchInput(getThis, searchKeyDown) {\n const [value, setValue] = BDV2.react.useState(\"\")\n return BDV2.react.createElement(\n \"div\",\n {className: \"ui-form-item\"},\n BDV2.react.createElement(\n \"div\",\n {className: \"ui-text-input flex-vertical\", style: {width: \"172px\", marginLeft: \"10px\"}},\n BDV2.react.createElement(\"input\", {\n ref: (serchinput) => (getThis().refs.searchinput = serchinput), \n onKeyDown: searchKeyDown, \n onChange: (e) => {\n setValue(e.target.value)\n }, \n type: \"text\", \n className: \"input default\", \n placeholder: \"Search...\", \n maxLength: \"50\",\n value: value\n })\n )\n );\n }\n\n searchKeyDown(e) {\n const self = this;\n if (self.state.loading || e.which !== 13) return;\n self.setState({\n loading: true,\n title: \"Loading...\",\n term: e.target.value\n });\n let query = `?term=${e.target.value}`;\n if (self.state.selectedCategory !== 0) {\n query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;\n }\n self.search(query, true);\n }\n\n get categorySlugs(){\n return this.categoryButtons.map(e => e.toLowerCase().replace(/[^\\w\\d]+/g, \"_\"))\n }\n\n get categoryButtons() {\n return [\"All\", \"FPS Games\", \"MMO Games\", \"Strategy Games\", \"MOBA Games\", \"RPG Games\", \"Tabletop Games\", \"Sandbox Games\", \"Simulation Games\", \"Music\", \"Community\", \"Language\", \"Programming\", \"Other\"];\n }\n\n changeCategory(id) {\n const self = this;\n if (self.state.loading) return;\n self.setState({\n loading: true,\n selectedCategory: id,\n title: \"Loading...\",\n term: null,\n section: self.categorySlugs[id]\n });\n if (id === 0) {\n self.search(\"\", true);\n return;\n }\n self.search(`?category=${self.categoryButtons[id]}`, true);\n }\n\n content(getThis) {\n const self = getThis();\n self.useState()\n const guildList = self.SortedGuildStore.getFlattenedGuildIds();\n const defaultList = self.AvatarDefaults.DEFAULT_AVATARS;\n if (self.state.connection.state === 1) return BDV2.react.createElement(self.notConnected.bind(null, getThis));\n let columnModule = BDModules.get(e => e.contentColumnDefault)[0]\n return [BDV2.react.createElement(\n \"div\",\n {ref: (ref) => {\n (self.refs.content = ref)\n }, key: \"pc\", className: columnModule.contentColumn+\" \"+columnModule.contentColumn+\" content-column default\"},\n BDV2.react.createElement(SettingsTitle, {text: self.state.title}),\n self.bdServer,\n self.state.servers.map((server) => {\n return BDV2.react.createElement(ServerCard, {key: server.identifier, server: server, join: self.join, guildList: guildList, fallback: defaultList[Math.floor(Math.random() * 5)]});\n }),\n self.state.next && BDV2.react.createElement(\n \"button\",\n {type: \"button\", onClick: () => {\n if (self.state.loading) return;self.setState({loading: true}); self.search(self.state.next, false);\n }, className: \"ui-button filled brand small grow\", style: {width: \"100%\", marginTop: \"10px\", marginBottom: \"10px\"}},\n BDV2.react.createElement(\n \"div\",\n {className: \"ui-button-contents\"},\n self.state.loading ? \"Loading\" : \"Load More\"\n )\n ),\n self.state.servers.length > 0 && BDV2.react.createElement(SettingsTitle, {text: self.state.title})\n )];\n }\n\n notConnected(getThis) {\n const self = getThis();\n //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });\n let columnModule = BDModules.get(e => e.contentColumnDefault)[0]\n return [BDV2.react.createElement(\n \"div\",\n {key: \"ncc\", ref: (ref) => (self.refs.content = ref), className: columnModule.contentColumn+\" \"+columnModule.contentColumn+\" content-column default\"},\n BDV2.react.createElement(\n \"h2\",\n {className: \"ui-form-title h2 margin-reset margin-bottom-20\"},\n \"Not connected to discordservers.com!\",\n BDV2.react.createElement(\n \"button\",\n {\n onClick: self.connect,\n type: \"button\",\n className: \"ui-button filled brand small grow\",\n style: {\n display: \"inline-block\",\n minHeight: \"18px\",\n marginLeft: \"10px\",\n lineHeight: \"14px\"\n }\n },\n BDV2.react.createElement(\n \"div\",\n {className: \"ui-button-contents\"},\n \"Connect\"\n )\n )\n ), self.bdServer\n )];\n }\n\n footer() {\n return BDV2.react.createElement(\n \"div\",\n {className: \"ui-tab-bar-header\"},\n BDV2.react.createElement(\n \"a\",\n {href: \"https://discordservers.com\", target: \"_blank\"},\n \"Discordservers.com\"\n )\n );\n }\n\n useState(){\n const forceUpdate = useForceUpdate()\n BDV2.React.useEffect(() => {\n const listener = () => {\n forceUpdate()\n }\n this.hooks.push(listener)\n return () => {\n const index = this.hooks.findIndex(e => e===listener)\n if(index < 0)return\n this.hooks.splice(index, 1)\n }\n }, [])\n }\n\n connection(getThis) {\n const self = getThis();\n self.useState()\n const {connection} = self.state;\n if (connection.state !== 2) return BDV2.react.createElement(\"span\", null);\n\n return BDV2.react.createElement(\n \"span\",\n null,\n BDV2.react.createElement(TabBarSeparator, null),\n BDV2.react.createElement(\n \"span\",\n {style: {color: \"#b9bbbe\", fontSize: \"10px\", marginLeft: \"10px\"}},\n \"Connected as: \",\n `${connection.user.username}#${connection.user.discriminator}`\n ),\n BDV2.react.createElement(\n \"div\",\n {style: {padding: \"5px 10px 0 10px\"}},\n BDV2.react.createElement(\n \"button\",\n {style: {width: \"100%\", minHeight: \"20px\"}, type: \"button\", className: \"ui-button filled brand small grow\"},\n BDV2.react.createElement(\n \"div\",\n {className: \"ui-button-contents\", onClick: self.connect},\n \"Reconnect\"\n )\n )\n )\n );\n }\n}","export default class BugHunterBadge extends React.Component {\r\n render(){\r\n const props = this.props\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n } \r\n}","export default class Circus extends React.Component {\r\n render(){\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n } \r\n}","import BugHunterBadge from \"../svg/bug_hunter\"\nimport nodeFetch from \"node-fetch\"\nimport { settingsCookie } from \"../0globals\";\nimport Circus from \"../svg/circus\";\n\nexport function uuidv4() { // Generate UUID (No crypto rng)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n} \n\nconst awaitingBadgesPromises = {}\nlet badgesToFetch = []\n\nexport default new class DistantServer {\n constructor(){\n this._cache = {\n badges: {\n\n }\n }\n window.Lightcord.BetterDiscord.DistantServer = this\n }\n\n get cache(){\n return this._cache\n }\n\n set cache(data){\n if(typeof data !== \"object\" || typeof this._cache !== \"object\")return this._cache = data\n return this._cache = Object.assign(this._cache, data)\n }\n\n /**\n * Get custom badges from the user ID.\n * @param {string} user The user ID \n * @returns {Promise}\n */\n async getBadges(user){\n if(this.cache.badges[user])return this.cache.badges[user]\n if(awaitingBadgesPromises[user])return awaitingBadgesPromises[user]\n\n let resolve\n const newPromise = new Promise((res) => (resolve = res))\n awaitingBadgesPromises[user] = newPromise\n\n const badges = []\n for(let badge of Constants.badges){\n if(badge.defaultUsers.includes(user))badges.push(badge)\n }\n const fetchedBadges = await new Promise((resolve) => {\n if(!settingsCookie[\"lightcord-5\"])return resolve([])\n badgesToFetch.push([user, resolve])\n setTimeout(() => {\n let users = badgesToFetch\n if(users.length === 0)return\n badgesToFetch = []\n handleRequest(Routes.badges, \"POST\", JSON.stringify(users.map(e => e[0])))\n .then(async res => {\n if(res.status !== 200){// Couldn't fetch badges: server error\n users.forEach(data => {\n data[1]([])// resolve no badge fetched\n })\n }\n const responseBody = await res.json()\n \n for(let user of responseBody){\n let promise = users.find(promise => promise[0] === user.user_id)\n promise[1](user.badges)\n }\n }).catch((err) => {// Couldn't fetch badges: error\n if(!(err instanceof LightcordError))console.error(err)\n users.forEach(data => {\n data[1]([])// resolve no badge fetched\n })\n })\n }, 0)\n })\n for(let badge of fetchedBadges){\n if(!Constants.badges.find(e => e.id === badge))continue // We do not have the Component, skip it.\n if(badges.find(e => e.id === badge))continue // Already inserted.\n badges.push(Constants.badges.find(e => e.id === badge))\n }\n this.cache = {\n badges: Object.assign(this.cache.badges, {[user]: badges})\n }\n setTimeout(() => {\n delete this.cache.badges[user]\n }, 600000);\n\n resolve(badges)\n delete awaitingBadgesPromises[user]\n return badges\n }\n}\n\nconst handleRequest = function(route, method, data){\n if(!settingsCookie[\"lightcord-5\"]){\n return Promise.reject(new LightcordError(\"The current settings blocked the request.\"))\n }\n return nodeFetch(`${Constants.SERVER_URL}/api/v1${route}`, {\n method,\n headers: {\n \"CLIENT\": \"Lightcord\",\n \"Authorization\": window.Lightcord.Api.Authorization || \"None::Anonymous\"\n },\n ...(data ? {\n body: data\n } : {})\n })\n}\n\nclass LightcordError extends Error {\n constructor(){\n super(...arguments)\n this.name = \"LightcordError\"\n }\n}\n\nexport const Constants = {\n SERVER_URL: \"https://lightcord.org\",\n badges: [ // TODO: Add more badges + server side svg\n {\n name: \"Lightcord Bug Hunter\",\n id: \"f04698f5-816b-41e3-bd01-92291193d7a5\",\n defaultUsers: [\n \"696481194443014174\",\n \"696003456611385396\"\n ],\n scopes: [],\n component: BugHunterBadge,\n href: \"https://github.com/lightcord/lightcord/wiki/badges#bug_hunter\"\n }, {\n name: \"Buffoon\",\n id: \"06904d31-65b4-41ec-a50c-8658bbd1af96\",\n defaultUsers: [\n \"389016895543705602\",\n \"664600134528663565\",\n \"625350657829896224\"\n ],\n scopes: [],\n component: Circus,\n href: \"https://youtu.be/EJtb6z-dlT8?t=145\"\n }\n ]\n}\n\nexport const Routes = {\n badges: `/users/badges`\n}","import Utils from \"./utils\";\nimport v2 from \"./v2\";\nimport { uuidv4 } from \"./distant\";\nimport { timingSafeEqual } from \"crypto\";\n\nexport default new class Layers {\n constructor(){\n this.layers = []\n window.Lightcord.BetterDiscord.Layers = this\n }\n\n get isInjected(){\n return !!document.querySelector(\"div.Layers.injected\")\n }\n\n inject(){\n if(this.isInjected)return\n let [\n classNameLayers\n ] = [\n Utils.removeDa(v2.WebpackModules.find(e => e.layers && e.layer).layers)\n ]\n const layers = document.querySelector(\".\"+classNameLayers);\n if (!layers) return false;\n const ReactInstance = Lightcord.Api.Utils.FindReact(layers, 1)\n if(!ReactInstance)return layers\n this.ReactInstance = ReactInstance\n let render = ReactInstance.render\n ReactInstance.render = () => {\n let returnValue = render.call(ReactInstance)\n let classList = returnValue.props.children[1].props.className.split(\" \")\n classList.push(\"Layers\")\n classList.push(\"injected\")\n returnValue.props.children[1].props.className = classList.join(\" \")\n\n this.layers.forEach(layer => {\n returnValue.props.children[1].props.children.push(layer[1])\n })\n\n return returnValue\n }\n ReactInstance.forceUpdate()\n }\n\n createLayer(children, props = {}){\n let id = uuidv4()\n let layer = null\n this.layers.push([id, {\n layer = lay\n }} key={id} id={id} remove={() => {\n let index = this.layers.findIndex(e => e[0] === id)\n if(index === -1)return\n this.layers.splice(index, 1)\n layer = null\n if(this.ReactInstance)this.ReactInstance.forceUpdate()\n this.inject()\n }}>{children}])\n if(this.ReactInstance)this.ReactInstance.forceUpdate()\n this.inject()\n return {\n remove: () => {\n if(!layer){\n let index = this.layers.findIndex(e => e[0] === id)\n if(index === -1)return\n this.layers.splice(index, 1)\n layer = null\n if(this.ReactInstance)this.ReactInstance.forceUpdate()\n this.inject()\n }else{\n layer.remove()\n }\n }\n }\n }\n}\n\n\nlet LayerModules\nexport class Layer extends React.Component {\n constructor(){\n super(...arguments)\n this.state = {\n animation: new this.modules[0].default.Value(0)\n } \n this.props.getLayer(this)\n this.keydown = this.keydown.bind(this)\n }\n\n keydown(e){\n if (e.which === 27) {\n this.remove()\n }\n }\n\n get modules(){\n return LayerModules || (LayerModules = [\n v2.WebpackModules.find(e => e.default && e.default.Value && e.default.div)\n ])\n }\n\n componentWillUnmount(){\n window.removeEventListener(\"keydown\", this.keydown)\n }\n\n componentDidMount(ev){\n window.addEventListener(\"keydown\", this.keydown)\n }\n\n remove(){\n this.props.remove()\n }\n\n componentWillEnter(ev){\n this.modules[0].default.timing(this.state.animation, {\n toValue: 1,\n duration: 100\n }).start(ev)\n }\n\n componentWillLeave(ev){\n this.modules[0].default.timing(this.state.animation, {\n toValue: 0,\n duration: 100\n }).start(ev)\n }\n\n render(){\n let interpolation = this.state.animation.interpolate({\n inputRange: [0, 1],\n outputRange: [1.07, 1]\n })\n let style = {\n opacity: this.state.animation,\n transform: [{\n scale: interpolation\n }]\n }\n let Div = this.modules[0].default.div\n return
e).join(\" \") || null} style={style}>\n {this.props.children(() => {\n this.remove()\n })}\n
\n }\n}\nLayer.defaultProps = {\n id: null,\n children: null\n}","import {settingsCookie} from \"../0globals\";\nimport BDV2 from \"./v2\";\nimport webpackModules from \"./webpackModules\";\nimport Utils from \"./utils\";\nimport DOM from \"./domtools\";\n\nimport V2C_PublicServers from \"../ui/publicservers/publicServers\";\nimport Layers from \"./Layers\";\n\nexport default new class V2_PublicServers {\n\n constructor() {\n this._appendButton = this._appendButton.bind(this);\n window.Lightcord.BetterDiscord.V2_PublicServers = this\n }\n\n render() {\n Layers.createLayer((close) => {\n return BDV2.react.createElement(V2C_PublicServers, {rootId: \"pubslayerroot\", close})\n })\n }\n\n get button() {\n const btn = DOM.createElement(`
`);\n if (!settingsCookie[\"bda-gs-1\"]) btn.style.display = \"none\";\n const label = DOM.createElement(`
public
`);\n label.addEventListener(\"click\", () => {this.render();});\n btn.append(label);\n return btn;\n }\n\n _appendButton() {\n let [\n classNametutorialContainer\n ] = [\n Utils.removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)\n ]\n if (DOM.query(\"#bd-pub-li\")) return;\n const guilds = DOM.query(`div.${classNametutorialContainer} > div`);\n DOM.after(guilds, this.button);\n }\n\n addButton() {\n if (this.guildPatch) return;\n const GuildList = webpackModules.find(m => m.default && m.default.displayName == \"NavigableGuilds\");\n const GuildListOld = webpackModules.findByDisplayName(\"Guilds\");\n if (!GuildList && !GuildListOld) Utils.warn(\"PublicServer\", \"Can't find GuildList component\");\n this.guildPatch = Utils.monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? \"default\" : \"render\", {after: this._appendButton});\n this._appendButton();\n }\n\n removeButton() {\n this.guildPatch();\n delete this.guildPatch;\n const button = DOM.query(\"#bd-pub-li\");\n if (button) button.remove();\n }\n};","import DOM from \"./domtools\";\r\n\r\nconst style = `\r\n .container-2Rl01u {\r\n display: none!important;\r\n }\r\n\r\n .chat-3bRxxu {\r\n display: none!important;\r\n }\r\n\r\n .sidebar-2K8pFh {\r\n flex-grow: 1!important;\r\n }\r\n`;\r\n\r\nexport default new class VoiceMode {\r\n start() {\r\n DOM.addStyle(\"VoiceMode\", style);\r\n }\r\n\r\n stop() {\r\n DOM.removeStyle(\"VoiceMode\");\r\n }\r\n};","import WebpackModules from \"./webpackModules\";\n\nconst normalizedPrefix = \"da\";\nconst randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);\n\nexport default new class ClassNormalizer {\n constructor(){\n window.Lightcord.BetterDiscord.ClassNormalizer = this\n }\n stop() {\n if (!this.hasPatched) return;\n this.unpatchClassModules(WebpackModules.findAll(this.moduleFilter.bind(this)));\n this.revertElement(document.querySelector(\"#app-mount\"));\n this.hasPatched = false;\n }\n\n start() {\n if (this.hasPatched) return;\n this.patchClassModules(WebpackModules.findAll(this.moduleFilter.bind(this)));\n this.normalizeElement(document.querySelector(\"#app-mount\"));\n this.hasPatched = true;\n this.patchDOMMethods();\n }\n\n patchClassModules(modules) {\n for (const module of modules) {\n this.patchClassModule(normalizedPrefix, module);\n }\n }\n\n unpatchClassModules(modules) {\n for (const module of modules) {\n this.unpatchClassModule(normalizedPrefix, module);\n }\n }\n\n shouldIgnore(value) {\n if (!isNaN(value)) return true;\n if (value.endsWith(\"px\") || value.endsWith(\"ch\") || value.endsWith(\"em\") || value.endsWith(\"ms\")) return true;\n if (value.startsWith(\"layerContainer-\")) return true;\n if (value.startsWith(\"#\") && (value.length == 7 || value.length == 4)) return true;\n if (value.includes(\"calc(\") || value.includes(\"rgba\")) return true;\n return false;\n }\n\n moduleFilter(module) {\n if (typeof module !== \"object\" || Array.isArray(module)) return false;\n if (module.__esModule) return false;\n if (!Object.keys(module).length) return false;\n for (const baseClassName in module) {\n const value = module[baseClassName];\n if (typeof value !== \"string\") return false;\n if (this.shouldIgnore(value)) continue;\n if (value.split(\"-\").length === 1) return false;\n if (!randClass.test(value.split(\" \")[0])) return false;\n }\n\n return true;\n }\n\n patchClassModule(componentName, classNames) {\n for (const baseClassName in classNames) {\n const value = classNames[baseClassName];\n if (this.shouldIgnore(value)) continue;\n const classList = value.split(\" \");\n for (const normalClass of classList) {\n const match = normalClass.match(randClass);\n if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know\n const camelCase = match[1].split(\"-\").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(\"\");\n classNames[baseClassName] += ` ${componentName}-${camelCase}`;\n }\n }\n }\n\n unpatchClassModule(componentName, classNames) {\n for (const baseClassName in classNames) {\n const value = classNames[baseClassName];\n if (this.shouldIgnore(value)) continue;\n let newString = \"\";\n const classList = value.split(\" \");\n for (const normalClass of classList) {\n if (normalClass.startsWith(`${componentName}-`)) continue;\n newString += ` ${normalClass}`;\n }\n classNames[baseClassName] = newString.trim();\n }\n }\n\n normalizeElement(element) {\n if (!(element instanceof Element)) return;\n const classes = element.classList;\n for (let c = 0, clen = classes.length; c < clen; c++) {\n if (!randClass.test(classes[c])) continue;\n const match = classes[c].match(randClass)[1];\n const newClass = match.split(\"-\").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join(\"\");\n element.classList.add(`${normalizedPrefix}-${newClass}`);\n }\n for (const child of element.children) this.normalizeElement(child);\n }\n\n revertElement(element) {\n if (!(element instanceof Element)) return;\n if (element.children && element.children.length) this.revertElement(element.children[0]);\n if (element.nextElementSibling) this.revertElement(element.nextElementSibling);\n const classes = element.classList;\n const toRemove = [];\n for (let c = 0; c < classes.length; c++) {\n if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]);\n }\n element.classList.remove(...toRemove);\n }\n\n patchDOMMethods() {\n const contains = DOMTokenList.prototype.contains;\n DOMTokenList.prototype.contains = function(token) {\n // const tokens = token.split(\" \");\n return Reflect.apply(contains, this, [token.split(\" \")[0]]);\n // return tokens.every(t => contains.call(this, t));\n };\n\n const add = DOMTokenList.prototype.add;\n DOMTokenList.prototype.add = function(...tokens) {\n for (let t = 0; t < tokens.length; t++) {\n tokens[t] = tokens[t].split(\" \")[0];\n }\n return Reflect.apply(add, this, tokens);\n };\n\n const remove = DOMTokenList.prototype.remove;\n DOMTokenList.prototype.remove = function(...tokens) {\n for (let t = 0; t < tokens.length; t++) {\n tokens[t] = tokens[t].split(\" \")[0];\n }\n return Reflect.apply(remove, this, tokens);\n };\n }\n\n};","import {settingsCookie} from \"../0globals\";\nimport BDV2 from \"./v2\";\nimport DOM from \"./domtools\";\nimport Utils from \"./utils\";\n\nexport default new class DevMode {\n constructor() {\n this.debugListener = this.debugListener.bind(this);\n this.copySelectorListener = this.copySelectorListener.bind(this);\n }\n\n start() {\n this.startDebugListener();\n if (settingsCookie[\"fork-dm-1\"]) this.startCopySelector();\n }\n \n stop() {\n this.stopDebugListener();\n this.stopCopySelector();\n }\n\n startDebugListener() {\n this.stopDebugListener();\n document.addEventListener(\"keydown\", this.debugListener);\n }\n\n stopDebugListener() {\n document.removeEventListener(\"keydown\", this.debugListener);\n }\n\n startCopySelector() {\n this.stopCopySelector();\n document.addEventListener(\"contextmenu\", this.copySelectorListener);\n }\n\n stopCopySelector() {\n document.removeEventListener(\"contextmenu\", this.copySelectorListener);\n }\n\n debugListener(e) {\n if (e.which === 119 || e.which == 118) {//F8\n console.log(\"%c[%cDevMode%c] %cBreak/Resume\", \"color: red;\", \"color: #303030; font-weight:700;\", \"color:red;\", \"\");\n debugger; // eslint-disable-line no-debugger\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n }\n\n copySelectorListener(e) {\n try{\n e.stopPropagation();\n const selector = this.getSelector(e.target);\n \n let [\n classLayer, \n classItems\n ] = [\n BDModules.get((e) => e.layer && typeof e.layer === \"string\" && e.disabledPointerEvents)[0],\n BDModules.get((e) => e.menu)[0]\n ]\n \n function attach() {\n if(!classItems || !classLayer.layer)return console.log(classItems, classLayer.layer)\n\n let cm = DOM.query(\".\"+Utils.removeDa(classItems.menu));\n if (!cm) {\n const container = DOM.query(\"#app-mount > .\"+Utils.removeDa(classLayer.layerContainer));\n const cmWrap = DOM.createElement(`
`);\n cm = DOM.createElement(`
`);\n cmWrap.append(cm);\n container.append(cmWrap);\n cmWrap.style.top = e.clientY + \"px\";\n cmWrap.style.left = e.clientX + \"px\";\n cmWrap.setAttribute(\"role\", \"menu\")\n cmWrap.setAttribute(\"tabindex\", \"-1\")\n cmWrap.id = \"bd-copy-selector-context\"\n cmWrap.setAttribute(\"aria-label\", \"Copy Selector Actions\")\n\n const scrollerClasses = BDModules.get((e) => e.scrollerWrap)[0]\n const scrollerWrap = DOM.createElement(`
`)\n const scroller = DOM.createElement(`
e.scroller)[0].scroller} ${classItems.scroller}\">
`)\n scrollerWrap.append(scroller)\n cm.append(scrollerWrap)\n\n const removeCM = function(e) {\n if (e.keyCode && e.keyCode !== 27) return;\n cmWrap.remove();\n document.removeEventListener(\"click\", removeCM);\n document.removeEventListener(\"contextmenu\", removeCM);\n document.removeEventListener(\"keyup\", removeCM);\n };\n document.addEventListener(\"click\", removeCM);\n document.addEventListener(\"contextmenu\", removeCM);\n document.addEventListener(\"keyup\", removeCM);\n }\n const cmWrap = cm.parentElement\n \n const scroller = cm.childNodes[0].childNodes[0]\n const cmg = DOM.createElement(`
`);\n /**\n * @type {HTMLElement}\n */\n const cmi = DOM.createElement(`
`);\n cmi.append(DOM.createElement(`
Copy Selector
`));\n cmi.addEventListener(\"click\", () => {\n BDV2.NativeModule.copy(selector);\n cmWrap.style.display = \"none\"\n });\n cmi.addEventListener(\"mouseover\", (e) => {\n let elements = DOM.queryAll(\"div[role=menuitem].\"+Utils.removeDa(classItems.focused))\n elements && elements.forEach(elem => elem.classList.remove(classItems.focused))\n cmi.classList.add(classItems.focused)\n })\n cmi.addEventListener(\"mouseout\", (e) => {\n cmi.classList.remove(classItems.focused)\n })\n cmg.append(cmi);\n if(scroller.childNodes.length){ // apend a separator\n const separator = DOM.createElement(`
`)\n scroller.append(separator)\n }\n scroller.append(cmg);\n if(cmWrap.clientHeight < cmWrap.scrollHeight){\n console.log(\"overflowing \"+cmWrap.style.top)\n cmWrap.style.top = (cmWrap.style.top - cmg.clientHeight) + \"px\";\n console.log(\"overflowing\"+cmWrap.style.top)\n }\n }\n \n setTimeout(attach, 1);\n }catch(e){\n console.error(e)\n }\n }\n\n getSelector(element) {\n if (element.id) return `#${element.id}`;\n /**\n * \n * @param {HTMLElement} el \n */\n function fullPath(el){\n var names = [];\n while (el.parentNode){\n if (el.id){\n names.unshift('#'+el.id);\n break;\n }else{\n if (el==el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase()+Array.from(el.classList.entries()).map(e => \".\"+e).join(\"\"));\n else{\n for (var c=1,e=el;e.previousElementSibling;e=e.previousElementSibling,c++);\n names.unshift(el.tagName.toLowerCase()+((typeof el.className === \"string\" && el.className) || \"\").split(\" \").filter(e => !!e).map(e => \".\"+e).join(\"\")+\":nth-child(\"+c+\")\");\n }\n el=el.parentNode;\n }\n }\n return names.join(\" > \");\n }\n return fullPath(element)\n }\n};","import BDV2 from \"../../modules/v2\";\n\nconst React = BDV2.React;\n\nexport default class Switch extends React.Component {\n constructor(props) {\n super(props);\n this.state = {checked: this.props.checked};\n this.onChange = this.onChange.bind(this);\n this.switch = \n }\n\n onChange(value) {\n if (this.props.disabled) return;\n this.props.onChange(value);\n this.setState({checked: value});\n }\n\n render() {\n return this.switch\n }\n}","import BDV2 from \"../modules/v2\";\nimport Switch from \"./components/switch\";\n\nlet classnames = []\nfunction getClassName(name){\n let className = classnames.find(e => e.startsWith(name+\"-\"))\n if(className)return className\n className = BDModules.get(e => e[name])[0][name]\n classnames.push(className)\n return className\n}\n\nexport default class SwitchItem extends BDV2.reactComponent {\n\n constructor(props) {\n super(props);\n this.onChange = this.onChange.bind(this);\n }\n\n onChange() {\n this.props.checked = !this.props.checked;\n this.props.onChange(this.props.id, this.props.checked);\n }\n\n render() {\n let {text, info} = this.props.data;\n if(this.props.data.experimental){\n if(!classnames.find(e => e.startsWith(\"beta-\"))){\n classnames.push(BDModules.get(e => e.beta && (!e.container && !e.userSettingsVoice))[0].beta)\n }\n info = [\n info,\n React.createElement(\"sup\", {className: getClassName(\"beta\")}, \"(EXPERIMENTAL)\")\n ]\n }\n return BDV2.react.createElement(\"div\", {className: \"ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item\"},\n BDV2.react.createElement(\"div\", {className: \"ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap\"},\n BDV2.react.createElement(\"h3\", {key: \"title\", className: \"ui-form-title h3 margin-reset margin-reset ui-flex-child\"}, text),\n BDV2.react.createElement(Switch, {key: \"switch\", onChange: this.onChange, checked: this.props.checked})\n ),\n BDV2.react.createElement(\"div\", {className: \"ui-form-text style-description margin-top-4\", style: {flex: \"1 1 auto\"}}, info)\n );\n }\n}","let marginModule = BDModules.get(e => e.marginTop60)[0]\r\n\r\nexport default class MarginTop extends React.Component {\r\n render(){\r\n if(!marginModule)marginModule = BDModules.get(e => e.marginTop60)[0]\r\n return
\r\n }\r\n}","import {settingsCookie} from \"../0globals\";\nimport BDV2 from \"../modules/v2\";\n\nimport SettingsTitle from \"./settingsTitle\";\nimport Switch from \"./switch\";\nimport MarginTop from \"./margintop\";\n\nlet formModule\nlet switchItem\nlet betaClassNames\nexport default class V2C_SettingsGroup extends BDV2.reactComponent {\n\n constructor(props) {\n super(props);\n\n this.state = {\n error: false\n }\n }\n\n renderOldSettings() {\n const {title, settings, button} = this.props;\n const buttonComponent = button ? BDV2.react.createElement(\"button\", {key: \"title-button\", className: \"bd-pfbtn\", onClick: button.onClick}, button.title) : null;\n return [BDV2.react.createElement(SettingsTitle, {text: title}),\n buttonComponent,\n settings.map(setting => {\n return BDV2.react.createElement(Switch, {id: setting.id, key: setting.id, data: setting, checked: settingsCookie[setting.id], onChange: (id, checked) => {\n this.props.onChange(id, checked);\n this.forceUpdate()\n }});\n })];\n }\n\n componentDidCatch(err, errInfo){\n console.log(err, errInfo)\n this.setState({\n error: true\n })\n }\n\n render(){\n if(this.state.error){\n try{\n return this.renderOldSettings()\n }catch(e){\n console.error(e)\n return null\n }\n }else{\n try{\n if(!formModule)formModule = BDV2.WebpackModules.find(e => e.FormSection)\n if(!switchItem)switchItem = BDV2.WebpackModules.find(e => e.default && e.default.displayName === \"SwitchItem\")\n if(!betaClassNames)betaClassNames = BDV2.WebpackModules.find(e => e.beta && (!e.container && !e.userSettingsVoice))\n \n let children = []\n if(this.props.description){\n children.push(\n {this.props.description}\n , )\n }\n children.push(...this.props.settings.map(setting => {\n let info = [\n setting.text\n ]\n if(setting.experimental){\n info.push((EXPERIMENTAL))\n }\n return {\n this.props.onChange(setting.id, ev.target.checked);\n this.forceUpdate()\n }} key={setting.id} value={settingsCookie[setting.id]} className={__SECRET_EMOTION__.css({\n marginBottom: \"20px\"\n })} disabled={false} hideBorder={false}\n note={setting.info} tooltipNote={null}>\n {info}\n \n }))\n return \n {children}\n \n }catch(e){\n console.error(e)\n setImmediate(()=>{\n this.setState({\n error: true\n })\n })\n return null\n }\n }\n }\n}","import BDV2 from \"../modules/v2\";\r\n\r\nimport SettingsGroup from \"./settingsGroup\";\r\nimport MarginTop from \"./margintop\";\r\n\r\nexport default class V2C_SectionedSettingsPanel extends BDV2.reactComponent {\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return this.props.sections.map((section, i) => {\r\n return [\r\n i !== 0 ? BDV2.react.createElement(MarginTop, {}) : null,\r\n BDV2.react.createElement(SettingsGroup, Object.assign({}, section, {onChange: this.props.onChange}))\r\n ]\r\n })\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_Checkbox extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n this.onClick = this.onClick.bind(this);\r\n this.setInitialState();\r\n }\r\n\r\n setInitialState() {\r\n this.state = {\r\n checked: this.props.checked || false\r\n };\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\r\n \"li\",\r\n null,\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"checkbox \"+BDModules.get(e => e.checkboxElement)[0].checkbox, onClick: this.onClick},\r\n BDV2.react.createElement(\r\n \"div\",\r\n {className: \"checkbox-inner \"+BDModules.get(e => e.checkboxInner)[0].checkboxInner},\r\n BDV2.react.createElement(\"input\", {className: BDModules.get(e => e.checkboxElement)[0].checkboxElement, checked: this.state.checked, onChange: () => {}, type: \"checkbox\"}),\r\n BDV2.react.createElement(\"span\", null)\r\n ),\r\n BDV2.react.createElement(\r\n \"span\",\r\n null,\r\n this.props.text\r\n )\r\n )\r\n );\r\n }\r\n\r\n onClick() {\r\n this.props.onChange(this.props.id, !this.state.checked);\r\n this.setState({\r\n checked: !this.state.checked\r\n });\r\n }\r\n}","import {settingsCookie} from \"../0globals\";\nimport Settings from \"../modules/settingsPanel\";\nimport BDV2 from \"../modules/v2\";\nimport DataStore from \"../modules/dataStore\";\nimport DOM from \"../modules/domtools\";\nimport Utils from \"../modules/utils\"\n\nimport Checkbox from \"./checkbox\";\n\nexport default class V2C_CssEditorDetached extends BDV2.reactComponent {\n\n constructor(props) {\n super(props);\n const self = this;\n self.onClick = self.onClick.bind(self);\n self.updateCss = self.updateCss.bind(self);\n self.saveCss = self.saveCss.bind(self);\n self.onChange = self.onChange.bind(self);\n }\n\n componentDidMount() {\n DOM.addClass(DOM.query(\"#app-mount\"), \"bd-detached-editor\");\n BDV2.editorDetached = true;\n // this.updateLineCount();\n this.editor = ace.edit(\"bd-customcss-editor-detached\");\n this.editor.setTheme(\"ace/theme/discord\");\n this.editor.session.setMode(\"ace/mode/css\");\n this.editor.setShowPrintMargin(false);\n this.editor.setFontSize(14);\n this.editor.on(\"change\", () => {\n if (!settingsCookie[\"bda-css-0\"]) return;\n this.saveCss();\n this.updateCss();\n });\n\n }\n\n componentWillUnmount() {\n DOM.removeClass(DOM.query(\"#app-mount\"), \"bd-detached-editor\");\n BDV2.editorDetached = false;\n this.editor.destroy();\n }\n\n updateLineCount() {\n const lineCount = this.refs.editor.value.split(\"\\n\").length;\n if (lineCount == this.props.lines) return;\n this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(\".\\n\") + \".\";\n this.props.lines = lineCount;\n }\n\n get options() {\n return {\n lineNumbers: true,\n mode: \"css\",\n indentUnit: 4,\n theme: \"material\",\n scrollbarStyle: \"simple\"\n };\n }\n\n get css() {\n const _ccss = DataStore.getBDData(\"bdcustomcss\");\n let ccss = \"\";\n if (_ccss && _ccss !== \"\") {\n ccss = Buffer.from(_ccss, \"base64\").toString(\"utf8\");\n }\n return ccss;\n }\n\n get root() {\n const _root = DOM.query(\"#bd-customcss-detach-container\");\n if (!_root) {\n if (!this.injectRoot()) return null;\n return this.detachedRoot;\n }\n return _root;\n }\n\n injectRoot() {\n const app = DOM.query(\".app, .\"+Utils.removeDa(BDModules.get(e => e.app && e.layers)[0].app));\n if (!app) return false;\n DOM.insertAfter(DOM.createElement(`
`), app);\n return true;\n }\n\n render() {\n const self = this;\n return BDV2.react.createElement(\n \"div\",\n {className: \"bd-detached-css-editor\", id: \"bd-customcss-detach-editor\"},\n BDV2.react.createElement(\n \"div\",\n {id: \"bd-customcss-innerpane\"},\n BDV2.react.createElement(\"div\", {className: \"editor-wrapper\"},\n BDV2.react.createElement(\"div\", {id: \"bd-customcss-editor-detached\", className: \"editor\", ref: \"editor\"}, self.css)\n ),\n BDV2.react.createElement(\n \"div\",\n {id: \"bd-customcss-attach-controls\"},\n BDV2.react.createElement(\n \"ul\",\n {className: \"checkbox-group\"},\n BDV2.react.createElement(Checkbox, {id: \"live-update\", text: \"Live Update\", onChange: self.onChange, checked: settingsCookie[\"bda-css-0\"]})\n ),\n BDV2.react.createElement(\n \"div\",\n {id: \"bd-customcss-detach-controls-button\"},\n BDV2.react.createElement(\n \"button\",\n {style: {borderRadius: \"3px 0 0 3px\", borderRight: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\n self.onClick(\"update\");\n }},\n \"Update\"\n ),\n BDV2.react.createElement(\n \"button\",\n {style: {borderRadius: \"0\", borderLeft: \"1px solid #2d2d2d\", borderRight: \"1px solid #2d2d2d\"}, className: \"btn btn-primary\", onClick: () => {\n self.onClick(\"save\");\n }},\n \"Save\"\n ),\n BDV2.react.createElement(\n \"button\",\n {style: {borderRadius: \"0 3px 3px 0\", borderLeft: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\n self.onClick(\"attach\");\n }},\n \"Attach\"\n ),\n BDV2.react.createElement(\n \"span\",\n {style: {fontSize: \"10px\", marginLeft: \"5px\"}},\n \"Unsaved changes are lost on attach\"\n )\n )\n )\n )\n );\n }\n\n onChange(id, checked) {\n switch (id) {\n case \"live-update\":\n settingsCookie[\"bda-css-0\"] = checked;\n Settings.saveSettings();\n break;\n }\n }\n\n onClick(id) {\n const self = this;\n switch (id) {\n case \"attach\":\n if (DOM.query(\"#editor-detached\")) self.props.attach();\n BDV2.reactDom.unmountComponentAtNode(self.root);\n self.root.remove();\n break;\n case \"update\":\n self.updateCss();\n break;\n case \"save\":\n self.saveCss();\n break;\n }\n }\n\n updateCss() {\n DOM.removeStyle(\"customcss\");\n DOM.addStyle(\"customcss\", this.editor.session.getValue());\n }\n\n saveCss() {\n DataStore.setBDData(\"bdcustomcss\", Buffer.from(this.editor.session.getValue(), \"utf-8\").toString(\"base64\"));\n }\n}","import {settingsCookie} from \"../0globals\";\nimport Settings from \"../modules/settingsPanel\";\nimport BDV2 from \"../modules/v2\";\nimport DataStore from \"../modules/dataStore\";\nimport DOM from \"../modules/domtools\";\nimport Utils from \"../modules/utils\"\n\nimport SettingsTitle from \"./settingsTitle\";\nimport Checkbox from \"./checkbox\";\nimport V2C_CssEditorDetached from \"./cssEditorDetached\";\n\nexport default class V2C_CssEditor extends BDV2.reactComponent {\n\n constructor(props) {\n super(props);\n const self = this;\n self.props.lines = 0;\n self.setInitialState();\n self.attach = self.attach.bind(self);\n self.detachedEditor = BDV2.react.createElement(V2C_CssEditorDetached, {attach: self.attach});\n self.onClick = self.onClick.bind(self);\n self.updateCss = self.updateCss.bind(self);\n self.saveCss = self.saveCss.bind(self);\n self.detach = self.detach.bind(self);\n }\n\n setInitialState() {\n this.state = {\n detached: this.props.detached || BDV2.editorDetached\n };\n }\n\n componentDidMount() {\n // this.updateLineCount();\n this.editor = ace.edit(\"bd-customcss-editor\");\n this.editor.setTheme(\"ace/theme/discord\");\n this.editor.session.setMode(\"ace/mode/css\");\n this.editor.setShowPrintMargin(false);\n this.editor.setFontSize(14);\n this.editor.on(\"change\", () => {\n if (!settingsCookie[\"bda-css-0\"]) return;\n this.saveCss();\n this.updateCss();\n });\n }\n\n componentWillUnmount() {\n this.editor.destroy();\n }\n\n componentDidUpdate(prevProps, prevState) {\n const self = this;\n if (prevState.detached && !self.state.detached) {\n BDV2.reactDom.unmountComponentAtNode(self.detachedRoot);\n }\n }\n\n codeMirror() {\n }\n\n get options() {\n return {\n lineNumbers: true,\n mode: \"css\",\n indentUnit: 4,\n theme: \"material\",\n scrollbarStyle: \"simple\"\n };\n }\n\n get css() {\n const _ccss = DataStore.getBDData(\"bdcustomcss\");\n let ccss = \"\";\n if (_ccss && _ccss !== \"\") {\n ccss = Buffer.from(_ccss, \"base64\").toString(\"utf8\");\n }\n return ccss;\n }\n\n updateLineCount() {\n const lineCount = this.refs.editor.value.split(\"\\n\").length;\n if (lineCount == this.props.lines) return;\n this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(\".\\n\") + \".\";\n this.props.lines = lineCount;\n }\n\n render() {\n const self = this;\n\n const {detached} = self.state;\n return [\n detached && BDV2.react.createElement(\n \"div\",\n {id: \"editor-detached\"},\n BDV2.react.createElement(SettingsTitle, {text: \"Custom CSS Editor\"}),\n BDV2.react.createElement(\n \"h3\",\n null,\n \"Editor Detached\"\n ),\n BDV2.react.createElement(\n \"button\",\n {className: \"btn btn-primary\", onClick: () => {\n self.attach();\n }},\n \"Attach\"\n )\n ),\n !detached && BDV2.react.createElement(\n \"div\",\n null,\n BDV2.react.createElement(SettingsTitle, {text: \"Custom CSS Editor\"}),\n BDV2.react.createElement(\"div\", {className: \"editor-wrapper\"},\n BDV2.react.createElement(\"div\", {id: \"bd-customcss-editor\", className: \"editor\", ref: \"editor\"}, self.css)\n ),\n BDV2.react.createElement(\n \"div\",\n {id: \"bd-customcss-attach-controls\"},\n BDV2.react.createElement(\n \"ul\",\n {className: \"checkbox-group\"},\n BDV2.react.createElement(Checkbox, {id: \"live-update\", text: \"Live Update\", onChange: this.onChange, checked: settingsCookie[\"bda-css-0\"]})\n ),\n BDV2.react.createElement(\n \"div\",\n {id: \"bd-customcss-detach-controls-button\"},\n BDV2.react.createElement(\n \"button\",\n {style: {borderRadius: \"3px 0 0 3px\", borderRight: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\n self.onClick(\"update\");\n }},\n \"Update\"\n ),\n BDV2.react.createElement(\n \"button\",\n {style: {borderRadius: \"0\", borderLeft: \"1px solid #2d2d2d\", borderRight: \"1px solid #2d2d2d\"}, className: \"btn btn-primary\", onClick: () => {\n self.onClick(\"save\");\n }},\n \"Save\"\n ),\n BDV2.react.createElement(\n \"button\",\n {style: {borderRadius: \"0 3px 3px 0\", borderLeft: \"1px solid #3f4146\"}, className: \"btn btn-primary\", onClick: () => {\n self.onClick(\"detach\");\n }},\n \"Detach\"\n ),\n BDV2.react.createElement(\n \"span\",\n {style: {fontSize: \"10px\", marginLeft: \"5px\"}},\n \"Unsaved changes are lost on detach\"\n ),\n BDV2.react.createElement(\"div\", {className: \"help-text\"},\n \"Press \",\n BDV2.react.createElement(\"code\", {className: \"inline\"}, \"ctrl\"),\n \"+\",\n BDV2.react.createElement(\"span\", {className: \"inline\"}, \",\"),\n \" with the editor focused to access the editor's settings.\"\n )\n )\n )\n )\n ]\n }\n\n onClick(arg) {\n const self = this;\n switch (arg) {\n case \"update\":\n self.updateCss();\n break;\n case \"save\":\n self.saveCss();\n break;\n case \"detach\":\n self.detach();\n break;\n }\n }\n\n onChange(id, checked) {\n switch (id) {\n case \"live-update\":\n settingsCookie[\"bda-css-0\"] = checked;\n Settings.saveSettings();\n break;\n }\n }\n\n updateCss() {\n DOM.removeStyle(\"customcss\");\n DOM.addStyle(\"customcss\", this.editor.session.getValue());\n }\n\n saveCss() {\n DataStore.setBDData(\"bdcustomcss\", Buffer.from(this.editor.session.getValue(), \"utf-8\").toString(\"base64\"));\n }\n\n detach() {\n const self = this;\n self.setState({\n detached: true\n });\n const droot = self.detachedRoot;\n if (!droot) {\n console.log(\"FAILED TO INJECT ROOT: .app\");\n return;\n }\n BDV2.reactDom.render(self.detachedEditor, droot);\n }\n\n get detachedRoot() {\n const _root = DOM.query(\"#bd-customcss-detach-container\");\n if (!_root) {\n if (!this.injectDetachedRoot()) return null;\n return this.detachedRoot;\n }\n return _root;\n }\n\n injectDetachedRoot() {\n const app = DOM.query(\".app, .\"+Utils.removeDa(BDModules.get(e => e.app && e.layers)[0].app));\n if (!app) return false;\n DOM.insertAfter(DOM.createElement(`
`), app);\n return true;\n }\n\n attach() {\n const self = this;\n self.setState({\n detached: false\n });\n }\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class BDErrorBoundary extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {hasError: false};\r\n }\r\n\r\n componentDidCatch() {\r\n this.setState({hasError: true});\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) return BDV2.react.createElement(\"div\", {className: \"react-error\"}, \"Component Error\"); \r\n return this.props.children; \r\n }\r\n}\r\n\r\nconst originalRender = BDErrorBoundary.prototype.render;\r\nObject.defineProperty(BDErrorBoundary.prototype, \"render\", {\r\n enumerable: false,\r\n configurable: false,\r\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\r\n get: () => originalRender\r\n}); ","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_ContentColumn extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n static get displayName() {return \"ContentColumn\";}\r\n\r\n render() {\r\n //let contentModule = BDModules.get(e => e.contentColumn)[0]\r\n let title = this.props.title ? BDV2.react.createElement(\"h2\", {className: \"ui-form-title h2 margin-reset margin-bottom-20\"}, this.props.title) : null\r\n return [\r\n title,\r\n this.props.children\r\n ]\r\n return BDV2.react.createElement(\r\n \"div\",\r\n {className: contentModule.contentColumn + \" \"+contentModule.contentColumnDefault+\" content-column default\", style: {padding: \"60px 40px 0px\"}},\r\n title,\r\n this.props.children\r\n );\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_ReloadIcon extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\"svg\", {\r\n xmlns: \"http://www.w3.org/2000/svg\",\r\n viewBox: \"0 0 24 24\",\r\n fill: \"#dcddde\",\r\n className: \"bd-reload \" + this.props.className,\r\n onClick: this.props.onClick,\r\n style: {width: this.props.size || \"24px\", height: this.props.size || \"24px\"}\r\n },\r\n BDV2.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\"}),\r\n BDV2.react.createElement(\"path\", {fill: \"none\", d: \"M0 0h24v24H0z\"})\r\n );\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\n\r\nexport default class V2C_XSvg extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return BDV2.react.createElement(\r\n \"svg\",\r\n {xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 12 12\", style: {width: \"18px\", height: \"18px\"}},\r\n BDV2.react.createElement(\r\n \"g\",\r\n {className: \"background\", fill: \"none\", fillRule: \"evenodd\"},\r\n BDV2.react.createElement(\"path\", {d: \"M0 0h12v12H0\"}),\r\n BDV2.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\"})\r\n )\r\n );\r\n }\r\n}","import BDV2 from \"../../modules/v2\";\n\nconst React = BDV2.React;\n\nexport default class Edit extends React.Component {\n render() {\n const size = this.props.size || \"24px\";\n return \n \n \n ;\n }\n}","import BDV2 from \"../../modules/v2\";\n\nconst React = BDV2.React;\n\nexport default class Delete extends React.Component {\n render() {\n const size = this.props.size || \"24px\";\n return \n \n \n ;\n }\n}","import {settingsCookie} from \"../0globals\";\nimport BDV2 from \"../modules/v2\";\nimport Utils from \"../modules/utils\";\nimport DOM from \"../modules/domtools\";\n\nimport XSvg from \"./xSvg\";\nimport ReloadIcon from \"./reloadIcon\";\nimport EditIcon from \"./icons/edit\";\nimport DeleteIcon from \"./icons/delete\";\nimport Switch from \"./components/switch\";\nimport TooltipWrap from \"./tooltipWrap\";\nimport { processFile } from \"../modules/pluginCertifier\";\nimport contentManager from \"../modules/contentManager\";\nimport { resolve } from \"path\";\n\nconst React = BDV2.React;\nconst anchorClasses = BDV2.anchorClasses;\n\nexport default class V2C_PluginCard extends BDV2.reactComponent {\n\n constructor(props) {\n super(props);\n this.onChange = this.onChange.bind(this);\n this.showSettings = this.showSettings.bind(this);\n this.setInitialState();\n this.hasSettings = this.props.addon.plugin && typeof(this.props.addon.plugin.getSettingsPanel) === \"function\";\n this.settingsPanel = \"\";\n\n this.edit = this.edit.bind(this);\n this.delete = this.delete.bind(this);\n this.reload = this.reload.bind(this);\n }\n\n setInitialState() {\n this.state = {\n checked: this.props.enabled,\n settings: false,\n reloads: 0,\n trusted: false\n };\n }\n\n showSettings() {\n if (!this.hasSettings) return;\n this.setState({settings: true});\n }\n\n closeSettings() {\n this.panelRef.current.innerHTML = \"\";\n this.setState({settingsOpen: false});\n }\n\n componentDidUpdate() {\n if (!this.state.settings) return;\n if (typeof this.settingsPanel === \"object\") {\n this.refs.settingspanel.appendChild(this.settingsPanel);\n }\n\n if (!settingsCookie[\"fork-ps-3\"]) return;\n setImmediate(() => {\n const isHidden = (container, element) => {\n if(!container){\n console.error(new Error(`Container is undefined.`))\n return false\n }\n const cTop = container.scrollTop;\n const cBottom = cTop + container.clientHeight;\n const eTop = element.offsetTop;\n const eBottom = eTop + element.clientHeight;\n return (eTop < cTop || eBottom > cBottom);\n };\n\n const thisNode = this.refs.cardNode;\n const container = thisNode.closest(\"div[class*=\\\"contentRegionScroller-\\\"]\")\n if (!isHidden(container, thisNode)) return;\n const thisNodeOffset = DOM.offset(thisNode);\n const containerOffset = DOM.offset(container);\n const original = container.scrollTop;\n const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30;\n DOM.animate({\n duration: 300,\n update: function(progress) {\n if (endPoint > original) container.scrollTop = original + (progress * (endPoint - original));\n else container.scrollTop = original - (progress * (original - endPoint));\n }\n });\n });\n }\n\n\n getString(value) {\n if (!value) return \"???\";\n return typeof value == \"string\" ? value : value.toString();\n }\n\n get settingsComponent() {\n try { this.settingsPanel = this.props.addon.plugin.getSettingsPanel(); }\n catch (err) { Utils.err(\"Plugins\", \"Unable to get settings panel for \" + this.name + \".\", err); }\n\n return BDV2.react.createElement(\"div\", {className: \"bd-card bd-addon-card settings-open ui-switch-item\", ref: \"cardNode\"},\n BDV2.react.createElement(\"div\", {style: {\"float\": \"right\", \"cursor\": \"pointer\"}, onClick: () => {\n this.refs.settingspanel.innerHTML = \"\";\n this.setState({settings: false});\n }},\n BDV2.react.createElement(XSvg, null)\n ),\n typeof this.settingsPanel === \"object\" && BDV2.react.createElement(\"div\", {id: `plugin-settings-${this.name}`, className: \"plugin-settings\", ref: \"settingspanel\"}),\n typeof this.settingsPanel !== \"object\" && BDV2.react.createElement(\"div\", {id: `plugin-settings-${this.name}`, className: \"plugin-settings\", ref: \"settingspanel\", dangerouslySetInnerHTML: {__html: this.settingsPanel}})\n );\n }\n\n buildTitle(name, version, author) {\n const title = \"{{name}} v{{version}} by {{author}}\".split(/({{[A-Za-z]+}})/);\n const nameIndex = title.findIndex(s => s == \"{{name}}\");\n if (nameIndex) title[nameIndex] = React.createElement(\"span\", {className: \"name bda-name\"}, name);\n const versionIndex = title.findIndex(s => s == \"{{version}}\");\n if (nameIndex) title[versionIndex] = React.createElement(\"span\", {className: \"version bda-version\"}, version);\n const authorIndex = title.findIndex(s => s == \"{{author}}\");\n if (nameIndex) {\n const props = {className: \"author bda-author\"};\n if (author.link || author.id) {\n props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`;\n props.target = \"_blank\";\n\n if (author.link) props.href = author.link;\n if (author.id) props.onClick = () => {BDV2.LayerStack.popLayer(); BDV2.openDM(author.id);};\n }\n title[authorIndex] = React.createElement(author.link || author.id ? \"a\" : \"span\", props, author.name);\n }\n return title.flat();\n }\n\n makeLink(title, url) {\n const props = {className: \"bda-link bda-link-website\", target: \"_blank\"};\n if (typeof(url) == \"string\") props.href = url;\n if (typeof(url) == \"function\") props.onClick = (event) => {event.preventDefault(); event.stopPropagation(); url();};\n return BDV2.react.createElement(\"a\", props, title);\n }\n\n makeButton(title, children, action) {\n return \n
{children}
\n
;\n }\n\n componentWillUnmount(){\n this.unmounted = true\n }\n\n get links() {\n const links = [];\n const addon = this.props.addon;\n if (addon.website) links.push(this.makeLink(\"Website\", addon.website));\n if (addon.source) links.push(this.makeLink(\"Source\", addon.source));\n if (addon.invite) {\n links.push(this.makeLink(\"Support Server\", () => {\n const tester = /\\.gg\\/(.*)$/;\n let code = addon.invite;\n if (tester.test(code)) code = code.match(tester)[1];\n BDV2.LayerStack.popLayer();\n BDV2.InviteActions.acceptInviteAndTransitionToInviteChannel(code);\n }));\n }\n if (addon.donate) links.push(this.makeLink(\"Donate\", addon.donate));\n if (addon.patreon) links.push(this.makeLink(\"Patreon\", addon.patreon));\n return links;\n }\n\n get footer() {\n const links = this.links;\n return (links.length || this.hasSettings) && BDV2.react.createElement(\"div\", {className: \"bd-card-footer bda-footer\"},\n BDV2.react.createElement(\"span\", {className: \"bd-addon-links bda-links\"},\n ...(links.map((element, index) => index < links.length - 1 ? [element, \" | \"] : element).flat())\n ),\n this.hasSettings && BDV2.react.createElement(\"button\", {onClick: this.showSettings, className: \"bd-button bda-settings-button\", disabled: !this.state.checked}, \"Settings\")\n );\n }\n\n onChange() {\n this.props.toggle && this.props.toggle(this.name);\n this.setState({checked: !this.state.checked});\n }\n\n edit() {this.props.edit(this.name);}\n delete() {this.props.remove(this.name);}\n reload() {this.props.reload(this.name);}\n\n get name() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name);}\n get author() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author);}\n get description() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description);}\n get version() {return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version);}\n\n render() {\n if (this.state.settings) return this.settingsComponent;\n const {authorId, authorLink} = this.props.addon;\n\n const style = {}\n if(settingsCookie[\"fork-ps-6\"]){\n if(!this.isScanning){\n this.isScanning = true\n processFile(resolve(this.props.addon.filename.endsWith(\".plugin.js\") ? contentManager.pluginsFolder : contentManager.themesFolder, this.props.addon.filename), (result) => {\n if(this.unmounted)return\n \n this.setState({\n isTrusted: result.suspect ? \"suspect\" : true\n })\n }, () => {})\n }else{\n if(this.state.isTrusted === true){\n style.borderColor = \"#4087ed\"\n }\n if(this.state.isTrusted === \"suspect\"){\n style.borderColor = \"rgb(240, 71, 71)\"\n }\n }\n }\n \n return BDV2.react.createElement(\"div\", {className: \"bd-card bd-addon-card settings-closed ui-switch-item\", style},\n BDV2.react.createElement(\"div\", {className: \"bd-addon-header bda-header\"},\n BDV2.react.createElement(\"div\", {className: \"bd-card-title bda-header-title\"}, this.buildTitle(this.name, this.version, {name: this.author, id: authorId, link: authorLink})),\n BDV2.react.createElement(\"div\", {className: \"bd-addon-controls bda-controls\"},\n this.props.edit && this.makeButton(\"Edit\", , this.edit),\n this.props.remove && this.makeButton(\"Delete\", , this.delete),\n this.props.reload && this.makeButton(\"Reload\", , this.reload),\n React.createElement(Switch, {onChange: this.onChange, checked: this.state.checked})\n )\n ),\n BDV2.react.createElement(\"div\", {className: \"bd-scroller-wrap bda-description-wrap scroller-wrap fade\"},\n BDV2.react.createElement(\"div\", {className: \"bd-scroller bd-addon-description bda-description scroller\"}, this.description)\n ),\n this.footer\n );\n }\n}\n\nconst originalRender = V2C_PluginCard.prototype.render;\nObject.defineProperty(V2C_PluginCard.prototype, \"render\", {\n enumerable: false,\n configurable: false,\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\n get: () => originalRender\n});","import BDV2 from \"../../modules/v2\";\n\nconst React = BDV2.React;\n\nexport default class DownArrow extends React.Component {\n render() {\n const size = this.props.size || \"16px\";\n return \n \n ;\n }\n}","import BDV2 from \"../../modules/v2\";\r\nimport Arrow from \"../icons/downarrow\";\r\n\r\nconst React = BDV2.React;\r\n\r\n\r\nexport default class Select extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {open: false, value: this.props.value || this.props.options[0].value};\r\n this.dropdown = React.createRef();\r\n this.onChange = this.onChange.bind(this);\r\n this.showMenu = this.showMenu.bind(this);\r\n this.hideMenu = this.hideMenu.bind(this);\r\n }\r\n\r\n showMenu(event) {\r\n event.preventDefault();\r\n this.setState({open: true}, () => {\r\n document.addEventListener(\"click\", this.hideMenu);\r\n });\r\n }\r\n\r\n hideMenu() {\r\n this.setState({open: false}, () => {\r\n document.removeEventListener(\"click\", this.hideMenu);\r\n });\r\n }\r\n\r\n onChange(value) {\r\n this.setState({value});\r\n if (this.props.onChange) this.props.onChange(value);\r\n }\r\n\r\n get selected() {return this.props.options.find(o => o.value == this.state.value);}\r\n\r\n get options() {\r\n const selected = this.selected;\r\n return
\r\n {this.props.options.map(opt => \r\n
{opt.label}
\r\n )}\r\n
;\r\n }\r\n\r\n render() {\r\n const style = this.props.style == \"transparent\" ? \" bd-select-transparent\" : \"\";\r\n const isOpen = this.state.open ? \" menu-open\" : \"\";\r\n return
\r\n
{this.selected.label}
\r\n \r\n {this.state.open && this.options}\r\n
;\r\n }\r\n}\r\n\r\n// return
\r\n// \r\n//
\r\n//
\r\n//
{this.selected.label}
\r\n// \r\n//
\r\n//
\r\n// {this.state.open && this.options}\r\n//
;","import BDV2 from \"../../modules/v2\";\n\nconst React = BDV2.React;\n\nexport default class Search extends React.Component {\n render() {\n const size = this.props.size || \"16px\";\n return \n \n \n ;\n }\n}","import BDV2 from \"../../modules/v2\";\nimport SearchIcon from \"../icons/search\";\n\nconst React = BDV2.React;\n\nexport default class Search extends React.Component {\n constructor(props){\n super(props)\n this.state = {\n focused: false\n }\n }\n render() {\n const className = [\"bd-search-wrapper\"]\n if(this.state.focused)className.push(\"focused\")\n return
\n {\n this.setState({focused: true})\n }} onBlur={() => {\n this.setState({focused: false})\n }}/>\n \n
;\n }\n}","import ErrorBoundary from \"./errorBoundary\";\nimport ContentColumn from \"./contentColumn\";\nimport ReloadIcon from \"./reloadIcon\";\nimport AddonCard from \"./addoncard\";\nimport Dropdown from \"./components/dropdown\";\nimport Search from \"./components/search\";\n\nimport {settingsCookie, pluginCookie, themeCookie, bdplugins, bdthemes} from \"../0globals\";\nimport ContentManager from \"../modules/contentManager\";\nimport BDV2 from \"../modules/v2\";\nimport pluginModule from \"../modules/pluginModule\";\nimport themeModule from \"../modules/themeModule\";\nimport WebpackModules from \"../modules/webpackModules\";\nimport BdApi from \"../modules/bdApi\";\nimport Utils from \"../modules/utils\";\nimport TooltipWrap from \"./tooltipWrap\";\nimport bdEvents from \"../modules/bdEvents\";\nimport EmulatedTooltip from \"./tooltip\";\n\nconst Tooltip = WebpackModules.findByDisplayName(\"Tooltip\");\n\nconst React = BDV2.react;\n\nexport default class CardList extends BDV2.reactComponent {\n constructor(props) {\n super(props);\n this.state = {sort: \"name\", ascending: true, query: \"\"};\n this.isPlugins = this.props.type == \"plugins\";\n this.cookie = this.isPlugins ? pluginCookie : themeCookie;\n this.manager = this.isPlugins ? pluginModule : themeModule;\n\n this.sort = this.sort.bind(this);\n this.reverse = this.reverse.bind(this);\n this.search = this.search.bind(this);\n\n this.onAddonChanges = function(){\n this.forceUpdate()\n }\n this.onAddonChanges = this.onAddonChanges.bind(this)\n }\n\n componentDidMount(){\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\n bdEvents.on(`${type}loaded`, this.onAddonChanges)\n bdEvents.on(`${type}unloaded`, this.onAddonChanges)\n bdEvents.on(`${type}reloaded`, this.onAddonChanges)\n }\n\n componentWillUnmount(){\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\n bdEvents.off(`${type}loaded`, this.onAddonChanges)\n bdEvents.off(`${type}unloaded`, this.onAddonChanges)\n bdEvents.off(`${type}reloaded`, this.onAddonChanges)\n }\n\n openFolder() {\n const shell = require(\"electron\").shell;\n const open = shell.openPath || shell.openItem;\n open(this.isPlugins ? ContentManager.pluginsFolder : ContentManager.themesFolder);\n }\n\n edit(name) {\n console.log(name);\n this.manager.edit(name);\n }\n\n async delete(name) {\n const shouldDelete = await this.confirmDelete(name);\n if (!shouldDelete) return;\n this.manager.delete(name);\n }\n\n confirmDelete(name) {\n return new Promise(resolve => {\n BdApi.showConfirmationModal(\"Are You Sure?\", `Are you sure you want to delete ${name}?`, {\n danger: true,\n confirmText: \"Delete\",\n onConfirm: () => {resolve(true);},\n onCancel: () => {resolve(false);}\n });\n });\n }\n\n get sortOptions() {\n return [\n {label: \"Name\", value: \"name\"},\n {label: \"Author\", value: \"author\"},\n {label: \"Version\", value: \"version\"},\n {label: \"Recently Added\", value: \"added\"},\n {label: \"Last Modified\", value: \"modified\"},\n {label: \"File Size\", value: \"size\"},\n ];\n }\n\n get directions() {\n return [\n {label: \"Ascending\", value: true},\n {label: \"Descending\", value: false}\n ];\n }\n\n reverse(value) {\n this.setState({ascending: value});\n }\n\n sort(value) {\n this.setState({sort: value});\n }\n\n search(event) {\n this.setState({query: event.target.value.toLocaleLowerCase()});\n }\n\n getProps(addon) {\n return {\n key: this.getName(addon),\n enabled: this.cookie[this.getName(addon)],\n toggle: this.manager.toggle.bind(this.manager),\n edit: settingsCookie[\"fork-ps-7\"] ? this.edit.bind(this) : null,\n remove: this.delete.bind(this),\n addon: addon,\n hash: addon.hash\n };\n }\n\n getString(value) {\n if (!value) return \"???\";\n return typeof value == \"string\" ? value : value.toString();\n }\n\n get list(){\n return this.props.type === \"plugins\" ? Object.values(bdplugins) : Object.values(bdthemes);\n }\n\n getAddons() {\n const sortedAddons = this.list.sort((a, b) => {\n const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);\n const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : this.getString(a[this.state.sort]);\n const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(b[this.state.sort]);\n if (typeof(first) == \"string\") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());\n if (first > second) return 1;\n if (second > first) return -1;\n return 0;\n });\n if (!this.state.ascending) sortedAddons.reverse();\n const rendered = [];\n for (let a = 0; a < sortedAddons.length; a++) {\n const addon = sortedAddons[a];\n if (this.state.query) {\n let matches = null;\n const name = this.getName(addon);\n const author = this.getAuthor(addon);\n const description = this.getDescription(addon);\n const version = this.getVersion(addon);\n if (name) matches = name.toLocaleLowerCase().includes(this.state.query);\n if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);\n if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);\n if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);\n if (!matches) continue;\n }\n const props = this.getProps(addon);\n rendered.push();\n }\n return rendered;\n }\n\n getName(addon) {return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);}\n getAuthor(addon) {return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);}\n getDescription(addon) {return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);}\n getVersion(addon) {return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);}\n\n renderCheckUpdates(){\n if(!window.ZeresPluginLibrary)return null\n if(!window.PluginUpdates)return null\n if(typeof window.PluginUpdates.checkAll !== \"function\")return null\n if(!this.isPlugins)return null\n\n let tooltipIsShowing = false\n let tooltip\n return \n {\n tooltipIsShowing = false\n tooltip.hide()\n }}>\n {\n try{\n Utils.showToast(\"Plugin update check in progress.\", {type: \"info\"})\n window.PluginUpdates.checkAll()\n .then(() => {\n Utils.showToast(\"Plugin update check complete.\", {type: \"success\"})\n }).catch(err => {\n console.error(err)\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\n })\n }catch(e){\n console.error(e)\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\n }\n }} wrapper={false} disabled={false} onRightClick={() => {\n if(!this.refs.checkUpdateButton)return\n if (!window.PluginUpdates || !window.PluginUpdates.plugins) return;\n if(tooltipIsShowing)return\n tooltip = new EmulatedTooltip(this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(\", \"), {\n side: \"bottom\",\n attachEvents: false\n })\n tooltip.show()\n tooltipIsShowing = true\n }}>\n Check for Updates\n \n \n \n }\n\n render() {\n const refreshIcon = \n {(props) => \n {\n if (this.isPlugins) pluginModule.updatePluginList();\n else themeModule.updateThemeList();\n this.forceUpdate();\n }} />\n };\n const addonCards = this.getAddons();\n\n return \n \n Open {this.isPlugins ? \"Plugin\" : \"Theme\"} Folder\n \n {this.renderCheckUpdates()}\n {!settingsCookie[\"fork-ps-5\"] && refreshIcon}\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n \n
\n
\n
{addonCards}
\n
\n }\n}\n\nconst originalRender = CardList.prototype.render;\nObject.defineProperty(CardList.prototype, \"render\", {\n enumerable: false,\n configurable: false,\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\n get: () => originalRender\n});","import {settingsRPC, defaultRPC} from \"../0globals\";\r\n\r\nconst dispatcher = BDModules.get(m=>m.Dispatcher&&m.default&&m.default.dispatch)[0].default\r\nconst ActionTypes = BDModules.get(m=>m.ActionTypes)[0].ActionTypes\r\n\r\nconst socketId = \"lightcord-spoof-socket\"\r\nconst pid = process.pid\r\n\r\nexport default new class CustomRichPresence {\r\n constructor(){\r\n this.enabled = false\r\n\r\n this.game = settingsRPC\r\n }\r\n \r\n get formatedGame(){\r\n if(!this.game)return null\r\n if(this.enabled === false)return null\r\n let game = {\r\n name: this.game.name || defaultRPC.name,\r\n application_id: this.game.application_id || defaultRPC.application_id,\r\n details: this.game.details || undefined,\r\n state: this.game.state || undefined,\r\n timestamps: this.game[\"timestamps.start\"] ? {\r\n start: this.game[\"timestamps.start\"]\r\n } : undefined,\r\n assets: this.game[\"assets.large\"] ? {\r\n large_image: this.game[\"assets.large\"],\r\n small_image: this.game[\"assets.small\"] || undefined\r\n } : undefined\r\n }\r\n return game\r\n }\r\n\r\n sendGame(){\r\n dispatcher.dispatch({\r\n type: ActionTypes.LOCAL_ACTIVITY_UPDATE,\r\n socketId,\r\n pid,\r\n activity: this.formatedGame\r\n }) \r\n }\r\n\r\n enable() {\r\n if(this.enabled)return\r\n this.enabled = true\r\n console.log(\"Enabling custom RichPresence\")\r\n\r\n this.set(settingsRPC || Object.create(defaultRPC))\r\n\r\n this.sendGame()\r\n }\r\n\r\n disable() {\r\n if(!this.enabled)return\r\n this.enabled = false\r\n console.log(\"Disabling custom RichPresence\")\r\n\r\n this.sendGame()\r\n }\r\n\r\n async fetchAssets(applicationId){\r\n let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId)\r\n if(assets.undefined && typeof assets.undefined === \"number\"){\r\n throw new Error(\"Unknown Application\")\r\n }\r\n return assets\r\n }\r\n\r\n set(activity){\r\n this.game = activity\r\n\r\n this.sendGame()\r\n }\r\n}","import BDV2 from \"../modules/v2\";\nimport V2C_SettingsTitle from \"./settingsTitle\";\nimport V2C_SettingsGroup from \"./settingsGroup\";\nimport dataStore from \"../modules/dataStore\";\nimport { defaultRPC, settingsRPC } from \"../0globals\";\nimport CustomRichPresence from \"../modules/CustomRichPresence\"\nimport { remote } from \"electron\";\nimport MarginTop from \"./margintop\";\nimport Utils from \"../modules/utils\";\n\nconst React = BDV2.React;\n\nlet V2C_PresenceSettingsModules\nexport default class V2C_PresenceSettings extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n data: dataStore.getSettingGroup(\"rpc\") || defaultRPC,\n assets: []\n }\n\n this.preview = null\n this.isfetching = false\n if(this.state.data.application_id){\n this.fetchAssets()\n }\n\n this.assetComponents = new Set()\n }\n\n updateWhenFetched(comp){\n this.assetComponents.add(comp)\n }\n\n /**\n * \n * @param {InputText} setting \n */\n onChange(setting, value){\n let defaultSetting = RPCProps.find(e => e.id === setting.props.id)\n\n this.setState({\n data: Object.assign(settingsRPC, this.state.data, {\n [defaultSetting.id]: !!value ? value : null\n }),\n assets: this.state.assets\n })\n if(setting.props.id === \"application_id\"){\n this.fetchAssets()\n }\n\n dataStore.setSettingGroup(\"rpc\", settingsRPC);\n this.preview.forceUpdate()\n CustomRichPresence.set(settingsRPC)\n }\n\n fetchAssets(){\n if(this.isfetching === true){\n let app = this.state.data.application_id\n setTimeout(() => {\n if(this.state.data.application_id !== app){\n return\n }\n this.fetchAssets()\n }, 5000);\n }\n if(!this.state.data.application_id){\n this.setState({\n data: this.state.data,\n assets: []\n })\n this.forceUpdate()\n this.assetComponents.forEach(e => e.forceUpdate())\n return\n }\n this.isfetching = true\n CustomRichPresence.fetchAssets(this.state.data.application_id)\n .then(assets => {\n this.isfetching = false\n this.setState({\n data: this.state.data,\n assets: Object.keys(assets).map(k => {\n let asset = assets[k]\n return {\n id: asset.id,\n name: asset.name,\n type: asset.type\n }\n })\n })\n this.forceUpdate()\n this.assetComponents.forEach(e => e.forceUpdate())\n }).catch(() => {\n this.isfetching = false\n this.setState({\n data: this.state.data,\n assets: []\n })\n this.forceUpdate()\n this.assetComponents.forEach(e => e.forceUpdate())\n })\n }\n\n updatePreview(data){\n this.setState({\n data\n })\n }\n\n get modules(){\n return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [\n BDModules.get(e => e.marginBottom20)[0]\n ])\n }\n\n render() {\n let [\n marginModule\n ] = this.modules\n return [\n ,\n ,\n ,\n
\n {/** options */}\n {this.optionsComponents}\n
,\n
\n \n \n {/** preview */}\n \n
,\n
,\n ,\n \n ]\n }\n\n get optionsComponents(){\n return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => {\n if(e.type === \"text\"){\n return \n }else if(e.type === \"number\"){\n let array = []/*\n if(e.id === \"timestamps.start\"){\n array.unshift( {\n DiscordNative.clipboard.copy(Date.now()+\"\")\n }} />)\n }*/\n return array\n }else if(e.type === \"choice\"){\n if([\"assets.small\", \"assets.large\"].includes(e.id)){\n return {\n return {\n value: \"asset-\"+e.id,\n label: e.name\n }\n }))}/>\n }else{\n return \"Unknown choice.\"\n }\n }\n }))\n }\n}\nconst RPCProps = [\n {\n title: \"Application ID\",\n id: \"application_id\",\n type: \"number\",\n placeholder: \"711416957718757418\"\n },\n {\n title: \"Name\",\n id: \"name\",\n type: \"text\",\n placeholder: \"Lightcord\"\n },\n {\n title: \"Details\",\n id: \"details\",\n type: \"text\",\n placeholder: \"Browsing Discord\"\n },\n {\n title: \"State\",\n id: \"state\",\n type: \"text\",\n placeholder: \"Lightcord Client\"\n },\n {\n title: \"Timestamp Start\",\n id: \"timestamps.start\",\n type: \"number\",\n get placeholder(){\n return Date.now()\n }\n },\n {\n title: \"LargeAsset\",\n id: \"assets.large\",\n type: \"choice\"\n },\n {\n title: \"SmallAsset\",\n id: \"assets.small\",\n type: \"choice\"\n },\n]\n\nlet inputTextModules\nclass InputText extends React.PureComponent {\n get modules(){\n if(inputTextModules && inputTextModules[0])return inputTextModules\n return inputTextModules = [\n BDModules.get(e => e.removeKeybind)[0],\n BDModules.get(e => e.marginBottom20)[0],\n BDModules.get(e => e.defaultMarginh5)[0],\n BDModules.get(e => e.colorStandard)[0],\n BDModules.get(e => e.size32)[0],\n BDModules.get(e => e._horizontal)[0],\n BDModules.get(e => e.inputMini)[0],\n BDModules.get(e => e.size16 && e.size20)[0],\n ]\n }\n\n constructor(props){\n super(props)\n let setting = this.props.setting\n this.state = {\n data: this.props.manager.state.data[setting.id]\n }\n\n this.input = {\n this.setState({\n data: value\n })\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\n this.props.manager.onChange(this, value)\n this.lastEdited = Date.now()\n }else if(!this.isTiming){\n this.isTiming = setTimeout(() => {\n this.props.manager.onChange(this, this.state.data)\n this.isTiming = null\n this.lastEdited = Date.now()\n }, 500);\n }\n }} type=\"text\"/>\n }\n\n render(){\n let setting = this.props.setting\n\n let [\n rowModule,\n marginModule,\n marginModule2,\n colorModule,\n sizeModule,\n flexModule,\n inputModule,\n sizeModule2,\n ] = this.modules\n\n return (
\n
\n
\n {setting.title}\n
\n {this.input}\n
\n \n
)\n }\n}\n\nlet InputNumberModules\nclass InputNumber extends React.PureComponent {\n get modules(){\n return InputNumberModules || (InputNumberModules = [\n BDModules.get(e => e.removeKeybind)[0],\n BDModules.get(e => e.marginBottom20)[0],\n BDModules.get(e => e.defaultMarginh5)[0],\n BDModules.get(e => e.colorStandard)[0],\n BDModules.get(e => e.size32)[0],\n BDModules.get(e => e._horizontal)[0],\n BDModules.get(e => e.inputMini)[0],\n BDModules.get(e => e.size16 && e.size20)[0],\n BDModules.get(e => e.colorTransparent)[0],\n ])\n }\n\n constructor(props){\n super(props)\n let setting = this.props.setting\n this.state = {\n data: this.props.manager.state.data[setting.id]\n }\n\n this.input = {\n value = value.replace(/[^\\d]+/g, \"\")\n if(value == this.state.data){\n input.setValue(value)\n return\n }\n\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\n this.props.manager.onChange(this, value)\n this.lastEdited = Date.now()\n }else if(!this.isTiming){\n this.isTiming = setTimeout(() => {\n this.props.manager.onChange(this, this.state.data)\n this.isTiming = null\n this.lastEdited = Date.now()\n }, 500);\n }\n this.setState({\n data: value\n })\n }} type=\"text\"/>\n }\n\n render(){\n let setting = this.props.setting\n\n let [\n rowModule,\n marginModule,\n marginModule2,\n colorModule,\n sizeModule,\n flexModule,\n ] = this.modules\n\n\n return (
\n
\n
\n {setting.title}\n
\n {this.input}\n {setting.id === \"timestamps.start\" ? \n {\n DiscordNative.clipboard.copy(Date.now()+\"\")\n }} color=\"brand\">Copy current timestamp : null}\n
\n \n
)\n }\n}\n\nlet InputChoiceModules\nclass InputChoice extends React.PureComponent {\n constructor(props){\n super(props)\n let setting = this.props.setting\n this.state = {\n data: this.props.manager.state.data[setting.id] ? \"asset-\"+this.props.manager.state.data[setting.id] : \"none\"\n }\n this.props.manager.updateWhenFetched(this)\n }\n\n onChange(value){\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\n this.props.manager.onChange(this, value === \"none\" ? null : value.replace(\"asset-\", \"\"))\n this.lastEdited = Date.now()\n }else if(!this.isTiming){\n this.isTiming = setTimeout(() => {\n this.props.manager.onChange(this, this.state.data === \"none\" ? null : this.state.data.replace(\"asset-\", \"\"))\n this.isTiming = null\n this.lastEdited = Date.now()\n }, 500);\n }\n this.setState({\n data: value\n })\n this.forceUpdate()\n }\n \n get modules(){\n return InputChoiceModules || (InputChoiceModules = [\n BDModules.get(e => e.removeKeybind)[0],\n BDModules.get(e => e.marginBottom20)[0],\n BDModules.get(e => e.defaultMarginh5)[0],\n BDModules.get(e => e.colorStandard)[0],\n BDModules.get(e => e.size32)[0],\n BDModules.get(e => e._horizontal)[0]\n ])\n }\n\n render(){\n let setting = this.props.setting\n\n let [\n rowModule,\n marginModule,\n marginModule2,\n colorModule,\n sizeModule,\n flexModule\n ] = this.modules\n \n let options = this.props.manager.state.assets.map(e => {\n return {\n value: \"asset-\"+e.id,\n label: e.name\n }\n })\n\n options.unshift({\n value: \"none\",\n label: \"No assets\"\n })\n\n return (
\n
\n
\n {setting.title}\n
\n \n {/* {\r\n this.setState({focused: true})\r\n }} onBlur={() => {\r\n this.setState({focused: false})\r\n }}/>\r\n \r\n
;\r\n }\r\n}","import ErrorBoundary from \"./errorBoundary\";\r\nimport ContentColumn from \"./contentColumn\";\r\nimport ReloadIcon from \"./reloadIcon\";\r\nimport AddonCard from \"./addoncard\";\r\nimport Dropdown from \"./components/dropdown\";\r\nimport Search from \"./components/search\";\r\n\r\nimport {settingsCookie, pluginCookie, themeCookie, bdplugins, bdthemes} from \"../0globals\";\r\nimport ContentManager from \"../modules/contentManager\";\r\nimport BDV2 from \"../modules/v2\";\r\nimport pluginModule from \"../modules/pluginModule\";\r\nimport themeModule from \"../modules/themeModule\";\r\nimport WebpackModules from \"../modules/webpackModules\";\r\nimport BdApi from \"../modules/bdApi\";\r\nimport Utils from \"../modules/utils\";\r\nimport TooltipWrap from \"./tooltipWrap\";\r\nimport bdEvents from \"../modules/bdEvents\";\r\nimport EmulatedTooltip from \"./tooltip\";\r\n\r\nconst Tooltip = WebpackModules.findByDisplayName(\"Tooltip\");\r\n\r\nconst React = BDV2.react;\r\n\r\nexport default class CardList extends BDV2.reactComponent {\r\n constructor(props) {\r\n super(props);\r\n this.state = {sort: \"name\", ascending: true, query: \"\"};\r\n this.isPlugins = this.props.type == \"plugins\";\r\n this.cookie = this.isPlugins ? pluginCookie : themeCookie;\r\n this.manager = this.isPlugins ? pluginModule : themeModule;\r\n\r\n this.sort = this.sort.bind(this);\r\n this.reverse = this.reverse.bind(this);\r\n this.search = this.search.bind(this);\r\n\r\n this.onAddonChanges = function(){\r\n this.forceUpdate()\r\n }\r\n this.onAddonChanges = this.onAddonChanges.bind(this)\r\n }\r\n\r\n componentDidMount(){\r\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\r\n bdEvents.on(`${type}loaded`, this.onAddonChanges)\r\n bdEvents.on(`${type}unloaded`, this.onAddonChanges)\r\n bdEvents.on(`${type}reloaded`, this.onAddonChanges)\r\n }\r\n\r\n componentWillUnmount(){\r\n const type = (this.isPlugins ? \"plugin\" : \"theme\") + \"-\"\r\n bdEvents.off(`${type}loaded`, this.onAddonChanges)\r\n bdEvents.off(`${type}unloaded`, this.onAddonChanges)\r\n bdEvents.off(`${type}reloaded`, this.onAddonChanges)\r\n }\r\n\r\n openFolder() {\r\n const shell = require(\"electron\").shell;\r\n const open = shell.openPath || shell.openItem;\r\n open(this.isPlugins ? ContentManager.pluginsFolder : ContentManager.themesFolder);\r\n }\r\n\r\n edit(name) {\r\n console.log(name);\r\n this.manager.edit(name);\r\n }\r\n\r\n async delete(name) {\r\n const shouldDelete = await this.confirmDelete(name);\r\n if (!shouldDelete) return;\r\n this.manager.delete(name);\r\n }\r\n\r\n confirmDelete(name) {\r\n return new Promise(resolve => {\r\n BdApi.showConfirmationModal(\"Are You Sure?\", `Are you sure you want to delete ${name}?`, {\r\n danger: true,\r\n confirmText: \"Delete\",\r\n onConfirm: () => {resolve(true);},\r\n onCancel: () => {resolve(false);}\r\n });\r\n });\r\n }\r\n\r\n get sortOptions() {\r\n return [\r\n {label: \"Name\", value: \"name\"},\r\n {label: \"Author\", value: \"author\"},\r\n {label: \"Version\", value: \"version\"},\r\n {label: \"Recently Added\", value: \"added\"},\r\n {label: \"Last Modified\", value: \"modified\"},\r\n {label: \"File Size\", value: \"size\"},\r\n ];\r\n }\r\n\r\n get directions() {\r\n return [\r\n {label: \"Ascending\", value: true},\r\n {label: \"Descending\", value: false}\r\n ];\r\n }\r\n\r\n reverse(value) {\r\n this.setState({ascending: value});\r\n }\r\n\r\n sort(value) {\r\n this.setState({sort: value});\r\n }\r\n\r\n search(event) {\r\n this.setState({query: event.target.value.toLocaleLowerCase()});\r\n }\r\n\r\n getProps(addon) {\r\n return {\r\n key: this.getName(addon),\r\n enabled: this.cookie[this.getName(addon)],\r\n toggle: this.manager.toggle.bind(this.manager),\r\n edit: settingsCookie[\"fork-ps-7\"] ? this.edit.bind(this) : null,\r\n remove: this.delete.bind(this),\r\n addon: addon,\r\n hash: addon.hash\r\n };\r\n }\r\n\r\n getString(value) {\r\n if (!value) return \"???\";\r\n return typeof value == \"string\" ? value : value.toString();\r\n }\r\n\r\n get list(){\r\n return this.props.type === \"plugins\" ? Object.values(bdplugins) : Object.values(bdthemes);\r\n }\r\n\r\n getAddons() {\r\n const sortedAddons = this.list.sort((a, b) => {\r\n const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);\r\n const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : this.getString(a[this.state.sort]);\r\n const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(b[this.state.sort]);\r\n if (typeof(first) == \"string\") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());\r\n if (first > second) return 1;\r\n if (second > first) return -1;\r\n return 0;\r\n });\r\n if (!this.state.ascending) sortedAddons.reverse();\r\n const rendered = [];\r\n for (let a = 0; a < sortedAddons.length; a++) {\r\n const addon = sortedAddons[a];\r\n if (this.state.query) {\r\n let matches = null;\r\n const name = this.getName(addon);\r\n const author = this.getAuthor(addon);\r\n const description = this.getDescription(addon);\r\n const version = this.getVersion(addon);\r\n if (name) matches = name.toLocaleLowerCase().includes(this.state.query);\r\n if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);\r\n if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);\r\n if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);\r\n if (!matches) continue;\r\n }\r\n const props = this.getProps(addon);\r\n rendered.push();\r\n }\r\n return rendered;\r\n }\r\n\r\n getName(addon) {return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);}\r\n getAuthor(addon) {return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);}\r\n getDescription(addon) {return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);}\r\n getVersion(addon) {return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);}\r\n\r\n renderCheckUpdates(){\r\n if(!window.ZeresPluginLibrary)return null\r\n if(!window.PluginUpdates)return null\r\n if(typeof window.PluginUpdates.checkAll !== \"function\")return null\r\n if(!this.isPlugins)return null\r\n\r\n let tooltipIsShowing = false\r\n let tooltip\r\n return \r\n {\r\n tooltipIsShowing = false\r\n tooltip.hide()\r\n }}>\r\n {\r\n try{\r\n Utils.showToast(\"Plugin update check in progress.\", {type: \"info\"})\r\n window.PluginUpdates.checkAll()\r\n .then(() => {\r\n Utils.showToast(\"Plugin update check complete.\", {type: \"success\"})\r\n }).catch(err => {\r\n console.error(err)\r\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\r\n })\r\n }catch(e){\r\n console.error(e)\r\n Utils.showToast(\"An error occured while checking update.\", {type: \"error\"})\r\n }\r\n }} wrapper={false} disabled={false} onRightClick={() => {\r\n if(!this.refs.checkUpdateButton)return\r\n if (!window.PluginUpdates || !window.PluginUpdates.plugins) return;\r\n if(tooltipIsShowing)return\r\n tooltip = new EmulatedTooltip(this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(\", \"), {\r\n side: \"bottom\",\r\n attachEvents: false\r\n })\r\n tooltip.show()\r\n tooltipIsShowing = true\r\n }}>\r\n Check for Updates\r\n \r\n \r\n \r\n }\r\n\r\n render() {\r\n const refreshIcon = \r\n {(props) => \r\n {\r\n if (this.isPlugins) pluginModule.updatePluginList();\r\n else themeModule.updateThemeList();\r\n this.forceUpdate();\r\n }} />\r\n };\r\n const addonCards = this.getAddons();\r\n\r\n return \r\n \r\n Open {this.isPlugins ? \"Plugin\" : \"Theme\"} Folder\r\n \r\n {this.renderCheckUpdates()}\r\n {!settingsCookie[\"fork-ps-5\"] && refreshIcon}\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
{addonCards}
\r\n
\r\n }\r\n}\r\n\r\nconst originalRender = CardList.prototype.render;\r\nObject.defineProperty(CardList.prototype, \"render\", {\r\n enumerable: false,\r\n configurable: false,\r\n set: function() {console.warn(\"Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins\");},\r\n get: () => originalRender\r\n});","import {settingsRPC, defaultRPC} from \"../0globals\";\r\n\r\nconst dispatcher = BDModules.get(m=>m.Dispatcher&&m.default&&m.default.dispatch)[0].default\r\nconst ActionTypes = BDModules.get(m=>m.ActionTypes)[0].ActionTypes\r\n\r\nconst socketId = \"lightcord-spoof-socket\"\r\nconst pid = process.pid\r\n\r\nexport default new class CustomRichPresence {\r\n constructor(){\r\n this.enabled = false\r\n\r\n this.game = settingsRPC\r\n }\r\n \r\n get formatedGame(){\r\n if(!this.game)return null\r\n if(this.enabled === false)return null\r\n let game = {\r\n name: this.game.name || defaultRPC.name,\r\n application_id: this.game.application_id || defaultRPC.application_id,\r\n details: this.game.details || undefined,\r\n state: this.game.state || undefined,\r\n timestamps: this.game[\"timestamps.start\"] ? {\r\n start: this.game[\"timestamps.start\"]\r\n } : undefined,\r\n assets: this.game[\"assets.large\"] ? {\r\n large_image: this.game[\"assets.large\"],\r\n small_image: this.game[\"assets.small\"] || undefined\r\n } : undefined\r\n }\r\n return game\r\n }\r\n\r\n sendGame(){\r\n dispatcher.dispatch({\r\n type: ActionTypes.LOCAL_ACTIVITY_UPDATE,\r\n socketId,\r\n pid,\r\n activity: this.formatedGame\r\n }) \r\n }\r\n\r\n enable() {\r\n if(this.enabled)return\r\n this.enabled = true\r\n console.log(\"Enabling custom RichPresence\")\r\n\r\n this.set(settingsRPC || Object.create(defaultRPC))\r\n\r\n this.sendGame()\r\n }\r\n\r\n disable() {\r\n if(!this.enabled)return\r\n this.enabled = false\r\n console.log(\"Disabling custom RichPresence\")\r\n\r\n this.sendGame()\r\n }\r\n\r\n async fetchAssets(applicationId){\r\n let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId)\r\n if(assets.undefined && typeof assets.undefined === \"number\"){\r\n throw new Error(\"Unknown Application\")\r\n }\r\n return assets\r\n }\r\n\r\n set(activity){\r\n this.game = activity\r\n\r\n this.sendGame()\r\n }\r\n}","import BDV2 from \"../modules/v2\";\r\nimport V2C_SettingsTitle from \"./settingsTitle\";\r\nimport V2C_SettingsGroup from \"./settingsGroup\";\r\nimport dataStore from \"../modules/dataStore\";\r\nimport { defaultRPC, settingsRPC } from \"../0globals\";\r\nimport CustomRichPresence from \"../modules/CustomRichPresence\"\r\nimport { remote } from \"electron\";\r\nimport MarginTop from \"./margintop\";\r\nimport Utils from \"../modules/utils\";\r\n\r\nconst React = BDV2.React;\r\n\r\nlet V2C_PresenceSettingsModules\r\nexport default class V2C_PresenceSettings extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n data: dataStore.getSettingGroup(\"rpc\") || defaultRPC,\r\n assets: []\r\n }\r\n\r\n this.preview = null\r\n this.isfetching = false\r\n if(this.state.data.application_id){\r\n this.fetchAssets()\r\n }\r\n\r\n this.assetComponents = new Set()\r\n }\r\n\r\n updateWhenFetched(comp){\r\n this.assetComponents.add(comp)\r\n }\r\n\r\n /**\r\n * \r\n * @param {InputText} setting \r\n */\r\n onChange(setting, value){\r\n let defaultSetting = RPCProps.find(e => e.id === setting.props.id)\r\n\r\n this.setState({\r\n data: Object.assign(settingsRPC, this.state.data, {\r\n [defaultSetting.id]: !!value ? value : null\r\n }),\r\n assets: this.state.assets\r\n })\r\n if(setting.props.id === \"application_id\"){\r\n this.fetchAssets()\r\n }\r\n\r\n dataStore.setSettingGroup(\"rpc\", settingsRPC);\r\n this.preview.forceUpdate()\r\n CustomRichPresence.set(settingsRPC)\r\n }\r\n\r\n fetchAssets(){\r\n if(this.isfetching === true){\r\n let app = this.state.data.application_id\r\n setTimeout(() => {\r\n if(this.state.data.application_id !== app){\r\n return\r\n }\r\n this.fetchAssets()\r\n }, 5000);\r\n }\r\n if(!this.state.data.application_id){\r\n this.setState({\r\n data: this.state.data,\r\n assets: []\r\n })\r\n this.forceUpdate()\r\n this.assetComponents.forEach(e => e.forceUpdate())\r\n return\r\n }\r\n this.isfetching = true\r\n CustomRichPresence.fetchAssets(this.state.data.application_id)\r\n .then(assets => {\r\n this.isfetching = false\r\n this.setState({\r\n data: this.state.data,\r\n assets: Object.keys(assets).map(k => {\r\n let asset = assets[k]\r\n return {\r\n id: asset.id,\r\n name: asset.name,\r\n type: asset.type\r\n }\r\n })\r\n })\r\n this.forceUpdate()\r\n this.assetComponents.forEach(e => e.forceUpdate())\r\n }).catch(() => {\r\n this.isfetching = false\r\n this.setState({\r\n data: this.state.data,\r\n assets: []\r\n })\r\n this.forceUpdate()\r\n this.assetComponents.forEach(e => e.forceUpdate())\r\n })\r\n }\r\n\r\n updatePreview(data){\r\n this.setState({\r\n data\r\n })\r\n }\r\n\r\n get modules(){\r\n return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [\r\n BDModules.get(e => e.marginBottom20)[0]\r\n ])\r\n }\r\n\r\n render() {\r\n let [\r\n marginModule\r\n ] = this.modules\r\n return [\r\n ,\r\n ,\r\n ,\r\n
\r\n {/** options */}\r\n {this.optionsComponents}\r\n
,\r\n
\r\n \r\n \r\n {/** preview */}\r\n \r\n
,\r\n
,\r\n ,\r\n \r\n ]\r\n }\r\n\r\n get optionsComponents(){\r\n return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => {\r\n if(e.type === \"text\"){\r\n return \r\n }else if(e.type === \"number\"){\r\n let array = []/*\r\n if(e.id === \"timestamps.start\"){\r\n array.unshift( {\r\n DiscordNative.clipboard.copy(Date.now()+\"\")\r\n }} />)\r\n }*/\r\n return array\r\n }else if(e.type === \"choice\"){\r\n if([\"assets.small\", \"assets.large\"].includes(e.id)){\r\n return {\r\n return {\r\n value: \"asset-\"+e.id,\r\n label: e.name\r\n }\r\n }))}/>\r\n }else{\r\n return \"Unknown choice.\"\r\n }\r\n }\r\n }))\r\n }\r\n}\r\nconst RPCProps = [\r\n {\r\n title: \"Application ID\",\r\n id: \"application_id\",\r\n type: \"number\",\r\n placeholder: \"711416957718757418\"\r\n },\r\n {\r\n title: \"Name\",\r\n id: \"name\",\r\n type: \"text\",\r\n placeholder: \"Lightcord\"\r\n },\r\n {\r\n title: \"Details\",\r\n id: \"details\",\r\n type: \"text\",\r\n placeholder: \"Browsing Discord\"\r\n },\r\n {\r\n title: \"State\",\r\n id: \"state\",\r\n type: \"text\",\r\n placeholder: \"Lightcord Client\"\r\n },\r\n {\r\n title: \"Timestamp Start\",\r\n id: \"timestamps.start\",\r\n type: \"number\",\r\n get placeholder(){\r\n return Date.now()\r\n }\r\n },\r\n {\r\n title: \"LargeAsset\",\r\n id: \"assets.large\",\r\n type: \"choice\"\r\n },\r\n {\r\n title: \"SmallAsset\",\r\n id: \"assets.small\",\r\n type: \"choice\"\r\n },\r\n]\r\n\r\nlet inputTextModules\r\nclass InputText extends React.PureComponent {\r\n get modules(){\r\n if(inputTextModules && inputTextModules[0])return inputTextModules\r\n return inputTextModules = [\r\n BDModules.get(e => e.removeKeybind)[0],\r\n BDModules.get(e => e.marginBottom20)[0],\r\n BDModules.get(e => e.defaultMarginh5)[0],\r\n BDModules.get(e => e.colorStandard)[0],\r\n BDModules.get(e => e.size32)[0],\r\n BDModules.get(e => e._horizontal)[0],\r\n BDModules.get(e => e.inputMini)[0],\r\n BDModules.get(e => e.size16 && e.size20)[0],\r\n ]\r\n }\r\n\r\n constructor(props){\r\n super(props)\r\n let setting = this.props.setting\r\n this.state = {\r\n data: this.props.manager.state.data[setting.id]\r\n }\r\n\r\n this.input = {\r\n this.setState({\r\n data: value\r\n })\r\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\r\n this.props.manager.onChange(this, value)\r\n this.lastEdited = Date.now()\r\n }else if(!this.isTiming){\r\n this.isTiming = setTimeout(() => {\r\n this.props.manager.onChange(this, this.state.data)\r\n this.isTiming = null\r\n this.lastEdited = Date.now()\r\n }, 500);\r\n }\r\n }} type=\"text\"/>\r\n }\r\n\r\n render(){\r\n let setting = this.props.setting\r\n\r\n let [\r\n rowModule,\r\n marginModule,\r\n marginModule2,\r\n colorModule,\r\n sizeModule,\r\n flexModule,\r\n inputModule,\r\n sizeModule2,\r\n ] = this.modules\r\n\r\n return (
\r\n
\r\n
\r\n {setting.title}\r\n
\r\n {this.input}\r\n
\r\n \r\n
)\r\n }\r\n}\r\n\r\nlet InputNumberModules\r\nclass InputNumber extends React.PureComponent {\r\n get modules(){\r\n return InputNumberModules || (InputNumberModules = [\r\n BDModules.get(e => e.removeKeybind)[0],\r\n BDModules.get(e => e.marginBottom20)[0],\r\n BDModules.get(e => e.defaultMarginh5)[0],\r\n BDModules.get(e => e.colorStandard)[0],\r\n BDModules.get(e => e.size32)[0],\r\n BDModules.get(e => e._horizontal)[0],\r\n BDModules.get(e => e.inputMini)[0],\r\n BDModules.get(e => e.size16 && e.size20)[0],\r\n BDModules.get(e => e.colorTransparent)[0],\r\n ])\r\n }\r\n\r\n constructor(props){\r\n super(props)\r\n let setting = this.props.setting\r\n this.state = {\r\n data: this.props.manager.state.data[setting.id]\r\n }\r\n\r\n this.input = {\r\n value = value.replace(/[^\\d]+/g, \"\")\r\n if(value == this.state.data){\r\n input.setValue(value)\r\n return\r\n }\r\n\r\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\r\n this.props.manager.onChange(this, value)\r\n this.lastEdited = Date.now()\r\n }else if(!this.isTiming){\r\n this.isTiming = setTimeout(() => {\r\n this.props.manager.onChange(this, this.state.data)\r\n this.isTiming = null\r\n this.lastEdited = Date.now()\r\n }, 500);\r\n }\r\n this.setState({\r\n data: value\r\n })\r\n }} type=\"text\"/>\r\n }\r\n\r\n render(){\r\n let setting = this.props.setting\r\n\r\n let [\r\n rowModule,\r\n marginModule,\r\n marginModule2,\r\n colorModule,\r\n sizeModule,\r\n flexModule,\r\n ] = this.modules\r\n\r\n\r\n return (
\r\n
\r\n
\r\n {setting.title}\r\n
\r\n {this.input}\r\n {setting.id === \"timestamps.start\" ? \r\n {\r\n DiscordNative.clipboard.copy(Date.now()+\"\")\r\n }} color=\"brand\">Copy current timestamp : null}\r\n
\r\n \r\n
)\r\n }\r\n}\r\n\r\nlet InputChoiceModules\r\nclass InputChoice extends React.PureComponent {\r\n constructor(props){\r\n super(props)\r\n let setting = this.props.setting\r\n this.state = {\r\n data: this.props.manager.state.data[setting.id] ? \"asset-\"+this.props.manager.state.data[setting.id] : \"none\"\r\n }\r\n this.props.manager.updateWhenFetched(this)\r\n }\r\n\r\n onChange(data){\r\n let value = data.value\r\n\r\n if(!this.lastEdited || this.lastEdited < Date.now() - 500){\r\n this.props.manager.onChange(this, value === \"none\" ? null : value.replace(\"asset-\", \"\"))\r\n this.lastEdited = Date.now()\r\n }else if(!this.isTiming){\r\n this.isTiming = setTimeout(() => {\r\n this.props.manager.onChange(this, this.state.data === \"none\" ? null : this.state.data.replace(\"asset-\", \"\"))\r\n this.isTiming = null\r\n this.lastEdited = Date.now()\r\n }, 500);\r\n }\r\n this.setState({\r\n data: value\r\n })\r\n this.forceUpdate()\r\n }\r\n \r\n get modules(){\r\n return InputChoiceModules || (InputChoiceModules = [\r\n BDModules.get(e => e.removeKeybind)[0],\r\n BDModules.get(e => e.marginBottom20)[0],\r\n BDModules.get(e => e.defaultMarginh5)[0],\r\n BDModules.get(e => e.colorStandard)[0],\r\n BDModules.get(e => e.size32)[0],\r\n BDModules.get(e => e._horizontal)[0]\r\n ])\r\n }\r\n\r\n render(){\r\n let setting = this.props.setting\r\n\r\n let [\r\n rowModule,\r\n marginModule,\r\n marginModule2,\r\n colorModule,\r\n sizeModule,\r\n flexModule\r\n ] = this.modules\r\n \r\n let options = this.props.manager.state.assets.map(e => {\r\n return {\r\n value: \"asset-\"+e.id,\r\n label: e.name\r\n }\r\n })\r\n\r\n options.unshift({\r\n value: \"none\",\r\n label: \"No assets\"\r\n })\r\n\r\n return (
\r\n
\r\n
\r\n {setting.title}\r\n
\r\n \r\n {/*