Lightcord/BetterDiscordApp/dist/index.js

12076 lines
1.4 MiB

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.307";
const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.307";
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",
experimental: false
},
/** 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<string|ReactElement>)} 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)`);
}
console.log(selects);
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");
const path = __webpack_require__(/*! path */ "path");
const fs = __webpack_require__(/*! fs */ "fs");
const Module = __webpack_require__(/*! module */ "module").Module;
Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules"));
class MetaError extends Error {
constructor(message) {
super(message);
this.name = "MetaError";
}
}
const originalJSRequire = Module._extensions[".js"];
const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => {
return null;
};
const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/;
const escapedAtRegex = /^\\@/;
let addonCache = {};
let hasPatched = false;
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
constructor() {
this.timeCache = {};
this.watchers = {};
}
patchExtensions() {
if (hasPatched) return;
hasPatched = true;
Module._extensions[".js"] = this.getContentRequire("plugin");
Module._extensions[".css"] = this.getContentRequire("theme");
}
get pluginsFolder() {
return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/")));
}
get themesFolder() {
return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/")));
}
loadAddonCertifierCache() {
if (typeof _dataStore__WEBPACK_IMPORTED_MODULE_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 {
window.require(path.resolve(baseFolder, filename));
} catch (error) {
return {
name: filename,
file: filename,
message: "Could not be compiled.",
error: {
message: error.message,
stack: error.stack
}
};
}
const content = window.require(path.resolve(baseFolder, filename));
if (!content.name) return {
name: filename,
file: filename,
message: "Cannot escape the ID.",
error: 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 window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
} catch (err) {
return {
name: filename,
file: filename,
message: "Could not be unloaded.",
error: {
message: err.message,
stack: err.stack
}
};
}
}
isLoaded(filename, type) {
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
} catch (err) {
return false;
}
return true;
}
async reloadContent(filename, type) {
const cantUnload = this.unloadContent(filename, type);
if (cantUnload) return cantUnload;
return await this.loadContent(filename, type);
}
loadNewContent(type) {
const isPlugin = type === "plugin";
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
const files = fs.readdirSync(basedir);
const contentList = Object.values(isPlugin ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"] : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name);
const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile());
return {
added,
removed
};
}
async loadAllContent(type) {
this.patchExtensions();
const isPlugin = type === "plugin";
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
const errors = [];
const files = fs.readdirSync(basedir);
for (const filename of files) {
if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;
const error = await this.loadContent(filename, type);
if (error) errors.push(error);
}
return errors;
}
loadPlugins() {
return this.loadAllContent("plugin");
}
loadThemes() {
return this.loadAllContent("theme");
}
}());
/**
* Don't expose contentManager - could be dangerous for now
*/
/***/ }),
/***/ "./src/modules/core.js":
/*!*****************************!*\
!*** ./src/modules/core.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _svg_Lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/Lightcord */ "./src/svg/Lightcord.jsx");
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js");
/* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__);
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
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"] + ").<br><br> Please download the latest version from <a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>GitHub</a>");
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 = `<svg xmlns="http://www.w3.org/2000/svg" height="10" width="70" viewBox="0 0 72.54 10" style="margin-left: -5px, margin-top: 10px">
<path fill="currentColor" d="M44.81,9.67V6.33c0-1.21,2.13-1.49,2.78-.28l2-.81A3.53,3.53,0,0,0,46.2,3c-1.92,0-3.81,1.13-3.81,3.33V9.67c0,2.21,1.89,3.33,3.77,3.33a3.87,3.87,0,0,0,3.45-2.18l-2.12-1C47,11.17,44.81,10.85,44.81,9.67ZM10.68,12.89h2.41V3.17H10.68ZM71.76,3.14H68.19V7.23L70.57,9.4v-4h1.27c.81,0,1.21.41,1.21,1v3c0,.63-.38,1.05-1.21,1.05H68.18v2.31h3.57c1.92,0,3.72-1,3.72-3.2V6.39C75.48,4.13,73.68,3.14,71.76,3.14ZM54.22,3c-2,0-4,1.1-4,3.34V9.66c0,2.23,2,3.34,4,3.34s3.95-1.11,3.95-3.34V6.34C58.19,4.11,56.2,3,54.22,3Zm1.55,6.66c0,.7-.78,1.06-1.54,1.06s-1.55-.35-1.55-1.06V6.34c0-.72.75-1.1,1.5-1.1s1.59.35,1.59,1.1ZM66.84,6.34c0-2.29-1.58-3.2-3.55-3.2H59.46v9.73h2.45V9.77h.43l2.22,3.09h3L65,9.52C66.13,9.15,66.84,8.14,66.84,6.34ZM63.33,7.65H61.91V5.43h1.42A1.11,1.11,0,1,1,63.33,7.65ZM29.83,13h2.42V3.06H29.83V6.73l-3,0V3.09H24.7v9.78h2.14V8.68l3,0ZM17.16,9.76V6.42c0-1.21,2.13-1.49,2.78-.28l2-.81a3.55,3.55,0,0,0-3.36-2.24c-1.92,0-3.81,1.13-3.81,3.33V9.76c0,2.21,2,3.15,3.9,3.15s3.58-1,3.58-3V7.58H18.79l0,1.36H20.3v.77C20.3,10.92,17.16,10.94,17.16,9.76Z" transform="translate(-2.93 -3)"/>
<polygon fill="currentColor" points="35.91 0.06 38.43 0.06 38.43 1.84 35.92 1.81 35.97 10 33.55 10 33.49 1.75 30.98 1.74 30.98 0.06 33.49 0.06 35.91 0.06"/>
<polygon fill="currentColor" points="0 9.97 6.5 10 6.5 7.63 2.41 7.63 2.41 0.26 0 2.26 0 9.97"/>
</svg>`;
}
};
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("lightcord-settings")) {
for (let key in _0globals__WEBPACK_IMPORTED_MODULE_0__["lightcordSettings"]) {
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["lightcordSettings"][key];
}
}
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 additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: `${classNameColorMuted} ${sizes.size12}`
}, `Lightcord ${electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: classNameVersionHash + " da-versionHash"
}, `(${(electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").commit || "Unknown").slice(0, 7)})`)), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: `${classNameColorMuted} ${sizes.size12}`
}, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: classNameVersionHash + " da-versionHash"
}, versionHash))];
const originalVersions = children[children.length - 1].type;
children[children.length - 1].type = function () {
const returnVal = originalVersions(...arguments);
returnVal.props.children.splice(1, 0, additional);
return returnVal;
};
}
});
};
const getGuildClasses = function () {
const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("wrapper", "unreadMentionsBar");
const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("guildsError", "selected");
const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("blobContainer");
return Object.assign({}, guildsWrapper, guilds, pill);
};
Core.prototype.patchGuildListItems = function () {
if (this.guildListItemsPatch) return;
const GuildClasses = getGuildClasses();
const listItemClass = GuildClasses.listItem.split(" ")[0];
const blobClass = GuildClasses.blobContainer.split(" ")[0];
const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement);
const GuildComponent = reactInstance.return.type;
if (!GuildComponent) return;
this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(GuildComponent.prototype, "render", {
after: data => {
if (data.returnValue && data.thisObject) {
const returnValue = data.returnValue;
const guildData = data.thisObject.props;
let className = returnValue.props.className;
className += " bd-guild";
if (guildData.unread) className += " bd-unread";
if (guildData.selected) className += " bd-selected";
if (guildData.audio) className += " bd-audio";
if (guildData.video) className += " bd-video";
if (guildData.badge) className += " bd-badge";
if (guildData.animatable) className += " bd-animatable";
returnValue.props.className = className;
return returnValue;
}
}
});
};
Core.prototype.patchGuildPills = function () {
if (this.guildPillPatch) return;
const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d"));
if (!guildPill) return;
this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", {
after: data => {
const props = data.methodArguments[0];
if (props.unread) data.returnValue.props.className += " bd-unread";
if (props.selected) data.returnValue.props.className += " bd-selected";
if (props.hovered) data.returnValue.props.className += " bd-hovered";
return data.returnValue;
}
});
};
Core.prototype.patchGuildSeparator = function () {
if (this.guildSeparatorPatch) return;
const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds");
const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem");
if (!guildComponents || !Guilds) return;
const GuildSeparator = function () {
const returnValue = guildComponents.Separator(...arguments);
returnValue.props.className += " bd-guild-separator";
return returnValue;
};
this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", {
after: data => {
data.returnValue.props.children[1].props.children[3].type = GuildSeparator;
}
});
};
Core.prototype.patchAttachment = function () {
if (this.AttachmentPatch) return;
const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !Attachment || !Attachment.default) return;
this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", {
after: data => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) return;
const attachment = data.methodArguments[0] || null;
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
if (!children || !attachment || !attachment.url) return;
if (!Array.isArray(children)) return;
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
id: "certified-" + id
}));
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id);
}
});
};
Core.prototype.patchMessageHeader = function () {
if (this.messageHeaderPatch) return;
const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !MessageHeader || !MessageHeader.default) return;
this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", {
after: data => {
const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props");
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children");
if (!children || !author || !author.id) return; // if (header && header.className) header.className += " "
if (!Array.isArray(children)) return;
if (author.id === "249746236008169473") {
// Rauenzi: BandagedBD Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (author.id === "696481194443014174" || author.id === "696003456611385396") {
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-chat-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_Lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id,
style: {
display: "inline"
}
}));
applyBadges(id, author, true);
}
});
};
function applyBadges(id, user, chat) {
process.nextTick(() => {
const div = document.getElementById("badges-" + id);
if (!div || div.childNodes.length > 0) return;
if (div.childNodes.length) return;
let blockDiv = document.createElement("div");
blockDiv.style.display = "none";
div.appendChild(blockDiv);
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
_distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => {
badges.forEach(badge => {
const props = {
svg: {
size: "16px",
className: "bd-logo",
width: "16px"
}
};
badge.scopes.forEach(scope => {
if (scope === "user") {
// require user
props.user = user;
}
});
if (!badge.href) {
props.Anchor = Anchor;
props.href = {
className: chat ? "bd-chat-badge" : "bd-member-badge",
title: badge.name,
target: "_blank"
};
}
const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: badge.name
}, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, {
href: badge.href,
className: chat ? "bd-chat-badge" : "bd-member-badge",
title: badge.name,
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props));
const div2 = document.createElement("div");
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2);
div2.childNodes.forEach(node => {
div.appendChild(node);
});
});
});
});
}
Core.prototype.patchMemberList = function () {
if (this.memberListPatch) return;
const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem");
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;
this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", {
after: data => {
const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user");
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
if (!children || !user || !user.id) return; // if (header && header.className) header.className += " "
if (!Array.isArray(children)) return;
if (user.id === "249746236008169473") {
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "BandagedBD Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-member-badge",
href: "https://github.com/rauenzi/BetterDiscordApp",
title: "BandagedBD",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
size: "16px",
className: "bd-logo"
}))));
} else if (user.id === "696481194443014174" || user.id === "696003456611385396") {
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
color: "black",
side: "top",
text: "Lightcord Developer"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
className: "bd-member-badge",
href: "https://github.com/Lightcord/Lightcord",
title: "Lightcord",
target: "_blank"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_Lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
size: "16px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id
}));
applyBadges(id, user, false);
}
});
};
Core.prototype.updateInjector = async function () {
// 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 __non_webpack_require__ = window.require;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable";
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 = __non_webpack_require__(this.settingsFile);
fs.unlinkSync(this.settingsFile);
if (settings.hasOwnProperty("settings")) settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, {
[releaseChannel]: settings
});else settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, settings);
this.setBDData("settings", settings);
} catch (err) {
console.error(err);
_utils__WEBPACK_IMPORTED_MODULE_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;
if (this._injectionPath) return this._injectionPath;
const electron = __webpack_require__(/*! electron */ "electron").remote.app;
const base = electron.getAppPath();
const roamingBase = electron.getPath("userData");
const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector");
const location = path.resolve(base, "..", "app");
const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null;
if (!realLocation) return this._injectionPath = null;
return this._injectionPath = realLocation;
}
get configFile() {
return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json"));
}
get BDFile() {
return this._BDFile || (this._BDFile = path.resolve(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(`<div class="${classLayer.layer}">`);
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.menu} ${classItems.styleFlexible} ${classItems.accommodateScrollbar} bd-context-menu" style=""></div>`);
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(`<div class="${scrollerClasses.scrollerWrap} ${scrollerClasses.scrollerThemed} ${scrollerClasses.themeGhostHairline}"></div>`);
const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${BDModules.get(e => e.scroller)[0].scroller} ${classItems.scroller}"></div>`);
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(`<div role="group"></div>`);
/**
* @type {HTMLElement}
*/
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.labelContainer} ${classItems.colorDefault}" role="menuitem" id="bd-copy-selector-item-cm"></div>`);
cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.label}">Copy Selector</div>`));
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(`<div role="separator" class="${classItems.separator}"></div>`);
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<Constants["badges"]>}
*/
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.deroku.xyz",
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(`<style id="${id}">${css}</style>`));
}
/**
* 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<Element>} - 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<HTMLElement>} elements - array of elements to put into a single parent
*/
static wrap(elements) {
const domWrapper = this.parseHTML(`<div class="dom-wrapper"></div>`);
for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);
return domWrapper;
}
/**
* Resolves the node to an HTMLElement. This is mainly used by library modules.
* @param {(jQuery|Element)} node - node to resolve
*/
static resolveElement(node) {
if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;
return node instanceof jQuery ? node[0] : node;
}
}
window.Lightcord.BetterDiscord.DOM = DOMTools;
/***/ }),
/***/ "./src/modules/emojiModule.js":
/*!************************************!*\
!*** ./src/modules/emojiModule.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
const Constants = {
EmojiRegex: /<a?\.(\w+)\.(\d+)>/g
};
let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0];
let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0];
let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0];
let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0];
let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0];
let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext);
/* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule {
constructor() {
this.init().catch(err => _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("EmojiModule", "An error occured", err)); // better logging
}
async init() {
/** Emoji AutoComplete */
if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete");
if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions);
if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults);
if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING);
if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching);
if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext);
if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) {
console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates);
const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions;
AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) {
const value = getAutocompleteOptions.call(this, ...arguments);
value.LIGHTCORD_EMOJIS = {
matches(arg1, arg2) {
let condition = arg2.length > 1 && "." === arg1;
setEmojiUsable(condition);
return condition;
},
queryResults(t) {
let results = EmojiModuleQuery.default.queryEmojiResults(t, e);
return results;
},
renderResults(e, t, n, r, a) {
return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) {
return {
emoji: e,
key: e.id || e.uniqueName || e.name,
sentinel: ".",
guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null
};
}, function (e) {
return "." + e + ".";
});
},
getPlainText(id, guild) {
var emojis = guild.emojis;
if (null == emojis || null == emojis[id]) return "";
var emoji = emojis[id],
isAnimated = emoji.animated ? "a" : "";
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
},
getRawText(id, guild) {
var emojis = guild.emojis;
if (null == emojis || null == emojis[id]) return "";
var emoji = emojis[id],
isAnimated = emoji.animated ? "a" : "";
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
}
};
return value;
};
} else {
console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));
}
/** Emoji display */
while (!_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
if (!this.cancelEmojiRender) {
// TODO: Proper emoji formatting / rendering
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent, "default", {
before: data => {
const message = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
if (!message) return;
const content = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
if (!content || !content.length) return;
/**
* @type {{
* raw: string,
* name: string,
* id: string,
* animated: boolean
* }[]}
*/
let emojis = [];
const newContent = [];
for (let node of content) {
if (typeof node !== "string") {
newContent.push(node);
continue;
}
;
let parsed;
let hasParsed = false;
do {
parsed = Constants.EmojiRegex.exec(node);
if (parsed) {
hasParsed = true;
if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]);
if (emoji) {
emojis.push({
animated: emoji.animated,
name: emoji.name,
id: emoji.id,
raw: parsed[0]
});
} else {
emojis.push({
animated: parsed[0].startsWith("<a"),
name: parsed[1],
id: parsed[2],
raw: parsed[0]
});
}
}
} while (parsed);
if (hasParsed) {
const words = node.split(" ").map((word, index, arr) => {
if (!word) return "";
const emoji = emojis.find(e => e.raw == word);
if (!emoji) return word;
if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
return React.createElement(CustomEmojiModule.CustomEmoji, {
emoji: {
name: `.${emoji.name}.`,
emojiId: emoji.id,
animated: emoji.animated,
jumboable: arr.length === 1 && content.length === 1
}
});
}).reduce((previous, current) => {
if (previous.length === 0) return [current];
if (typeof current === "string") {
if (typeof previous[previous.length - 1] === "string") {
previous[previous.length - 1] += ` ${current}`;
return previous;
}
previous.push(" " + current);
return previous;
}
previous.push(" ", current);
return previous;
}, []);
newContent.push(...words);
} else {
newContent.push(node);
}
}
while (data.methodArguments[0].childrenMessageContent.props.content[0]) {
data.methodArguments[0].childrenMessageContent.props.content.shift();
}
while (newContent[0]) {
data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift());
}
}
});
}
/*
let userModule
window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "EmojiPickerListRow")
.then(EmojiPickerListRow => {
let classs = EmojiPickerListRow.default
EmojiPickerListRow.default = class EmojiPickerListRow extends React.Component {
constructor(props){
super(props)
}
render(){
if(!userModule)userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0]
if(!userModule)return React.createElement(classs, this.props)
let user = userModule.default.getCurrentUser()
if(!user.hasPremiumSubscription)return React.createElement(classs, this.props)
return React.createElement(classs, Object.assign({}, this.props, {
emojiDescriptors: this.props.emojiDescriptors.map(e => {
e.isDisabled = false
})
}))
}
}
EmojiPickerListRow.default.displayName = "EmojiPickerListRow"
})*/
}
disable() {
if (!this.cancelEmoteRender) return;
this.cancelEmoteRender();
this.cancelEmoteRender = null;
}
start() {}
}());
function D(e, t, n, r, o, i, s, u, l, c) {
if (null == n || 0 === n.length) return null;
var d = n.map(function (e, n) {
return React.createElement(u, Object.assign({
onClick: o,
onHover: r,
selected: t === n,
index: n
}, l(e, n)));
});
return [R(i, s, e, c), d];
}
function R(e, t, n, r) {
var a = n.length > 0 ? e.format({
prefix: r(n)
}) : t;
if (Array.isArray(a)) {
a.unshift(React.createElement("strong", {}, "[Lightcord] "));
} else {
a = "[LIGHTCORD] " + a;
}
return React.createElement(AutocompleteModule.default.Title, {
title: a
}, a);
}
R.displayName = "renderHeader";
let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled;
let isUsable = false;
let hasPatched = false;
function setEmojiUsable(usable) {
isUsable = usable;
if (hasPatched) return;
if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
if (!EmojiFilterModule) return;
if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled;
hasPatched = true;
EmojiFilterModule.default.isEmojiDisabled = function (emoji) {
if (isUsable) {
if (emoji.surrogates || emoji.diversity) return true;
return false;
}
return isEmojiDisabled.call(this, ...arguments);
};
}
/***/ }),
/***/ "./src/modules/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() {
return useState()[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], [/email/gi, 0], [/mfa/gi, 0], [/2fa/gi, 0], [/phone/gi, 0], [/child_process/gi, 0], [/localStorage/gi, 0], [/getGlobal/gi, 0], [/BrowserWindow/gi, 0], [/\.exe/gi, 0], [/eval/gi, 0], [/WebAssembly/gi, 0], [/XMLHttpRequest(\.|\[["'`])prototype/gi, 0], [/window\.fetch( +)?=/gi, 0],
/** Obfuscation / hidden / workarounds */
[/(["'`]\+)["'`]\w["'`]/gi, 1], [/["'`]\w["'`](\+["'`])/gi, 1], [/\${["'`]\w+["'`]}/gi, 1],
/** hexadecimal */
[/_0x\w{4}\('0x[\dabcdef]+'\)/g, 1], [/_0x\w{4}\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g, 1], // _0x8db7('0x0', 'x1]f')
/** mangled */
[/\w+\('0x[\dabcdef]+'\)/g, 1], // b('0x0')
[/\w+\('0x[\dabcdef]+'( +)?,( +)?'[^']{4}'\)/g, 1], // b('0x0', 'x1]f')
/** string array at start */
[/^var [\w\d_$]+=\["/gi, 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] of tests) {
const scrpt = type === 1 ? no_comments : data;
if (test.exec(scrpt)) {
isHarmful = 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__["remote"].getCurrentWebContents().userAgent // 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__["remote"].getCurrentWebContents().userAgent
}
}).then(res => {
if (res.status !== 200) throw new Error("File doesn't exist.");
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
let data = Buffer.alloc(0);
res.body.on("data", chunk => {
data = Buffer.concat([data, chunk]);
hash.update(chunk);
});
res.body.on("end", () => {
const hashResult = hash.digest("hex");
cache2[attachment.url] = hashResult;
hashToUrl[hashResult] = attachment.url;
checkHash(hashResult, data, attachment.filename, result => {
renderToElements(id, result, attachment.filename);
}, () => {
let elem = document.getElementById(id);
if (elem) elem.remove();
});
});
}).catch(() => {});
}
let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
let childModule = BDModules.get(e => e.childContainer)[0];
/**
*
* @param {HTMLDivElement[]} elements
* @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result
*/
function renderToElements(id, result, filename) {
const div = document.getElementById(id);
if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore.
if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
if (!childModule) childModule = BDModules.get(e => e.childContainer)[0];
if (result.suspect) {
try {
div.parentNode.style.borderColor = "rgb(240, 71, 71)";
/**
*
* @param {HTMLElement} node
*/
let nextNode = node => {
for (let child of node.children) {
if (child.tagName === "A") {
child.addEventListener("click", e => {
e.preventDefault();
e.stopImmediatePropagation();
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", {
confirmText: "Download Anyway",
cancelText: "Don't !",
danger: true,
onCancel: () => {},
onConfirm: () => {
electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href);
}
});
});
} else if (["div"].includes(child.tagName.toLowerCase())) {
nextNode(child);
}
}
};
nextNode(div.parentNode);
} catch (e) {
console.error(e);
}
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " is potentially dangerous."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: BDModules.get(e => e.svg)[0].svg,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 40 32"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", {
x: "0",
y: "0",
width: "32",
height: "32",
mask: "url(#svg-mask-avatar-status-round-32)",
fill: "#f04747",
mask: "url(#svg-mask-status-dnd)",
className: BDModules.get(e => e.pointerEvents)[0].pointerEvents
})))), div);
} else if (!result.official) {
div.parentNode.style.borderColor = "#4087ed";
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
style: {
display: "inherit"
}
}, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: result.type + " " + result.name + " is certified by Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px",
float: "left"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#4f545c",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: childModule.childContainer
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 16 15.2"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
fill: "#ffffff",
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
},
onClick() {
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically install and launch this " + result.type.toLowerCase() + ". You don't have anything to do.", {
confirmText: "Download and Install",
cancelText: "I've changed my mind",
danger: false,
onCancel: () => {},
onConfirm: () => {
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
console.log(link);
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
if (res.status !== 200) throw new Error("Status was not 200");
let content = await res.buffer();
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
console.log(installPath);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
}).catch(err => {
err = err instanceof Error ? err : new Error(err);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
type: "error"
});
});
}
});
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 24 24",
style: {
color: "rgb(67, 181, 129)",
cursor: "pointer"
}
}, /*#__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) {
console.log("Edit " + filenameOrName);
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
console.log("Edit " + fullPath);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
PluginModule.prototype.updatePluginList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
for (const filename of results.added) this.loadPlugin(filename);
for (const name of results.removed) this.unloadPlugin(name);
};
PluginModule.prototype.loadPluginData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
}
};
PluginModule.prototype.savePluginData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
};
PluginModule.prototype.newMessage = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onMessage === "function") {
try {
plugin.onMessage();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.channelSwitch = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onSwitch === "function") {
try {
plugin.onSwitch();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.rawObserver = function (e) {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.observer === "function") {
try {
plugin.observer(e);
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
}
}
}
};
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
/***/ }),
/***/ "./src/modules/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<string, Window>}
*/
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(`<div id="bd-pub-li" class="${_v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.listItem}">`);
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none";
const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-button" class="${"wrapper-25eVIn " + _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.circleButtonMask}">public</div>`);
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");
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"].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") {
if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false);
}
if (id === "lightcord-4") {
if (enabled) {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
} else {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable();
}
}
if (id === "lightcord-6") {
if (enabled) {
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
} else {
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable();
}
}
if (id === "lightcord-7") {
if (enabled) {
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
} else {
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
}
}
if (id === "lightcord-8") {
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
appSettings.set("isTabs", enabled);
appSettings.save();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
}
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 = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
appSettings.set("NO_WINDOWS_BOUND", enabled);
appSettings.delete("IS_MAXIMIZED");
appSettings.delete("IS_MINIMIZED");
appSettings.delete("WINDOW_BOUNDS");
appSettings.save();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
}
if (id === "enable_glasstron") {
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
appSettings.set("GLASSTRON", enabled);
appSettings.save();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
}
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__["remote"].getCurrentWindow().setAlwaysOnTop(true);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["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"]);
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("lightcord-settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["lightcordSettings"]);
}
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"));
console.log(_0globals__WEBPACK_IMPORTED_MODULE_0__["lightcordSettings"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("lightcord-settings"));
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["lightcordSettings"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("lightcord-settings"));
}
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 = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
return [this.lightcordSettings.map((section, i) => {
return [i === 0 ? null : _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_margintop__WEBPACK_IMPORTED_MODULE_25__["default"]), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, section.title), section.settings.map(setting => {
let isChecked = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id];
if (setting.id === "lightcord-8") isChecked = appSettings.get("isTabs", false);
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 = _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_switch__WEBPACK_IMPORTED_MODULE_24__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: isChecked,
onChange: (id, checked) => {
this.onChange(id, checked, sidebar);
}
});
if (setting.id == "lightcord-8" && isChecked) {
return [returnValue, 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")];
}
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() {
console.log("Should relaunch");
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch({
args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"])
});
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.quit();
},
wrapper: true
}, "Relaunch without BetterDiscord"), 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.openItem(`${fullPath}`);
};
ThemeModule.prototype.updateThemeList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("theme");
for (const filename of results.added) this.loadTheme(filename);
for (const name of results.removed) this.unloadTheme(name);
};
ThemeModule.prototype.loadThemeData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("themes");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], saved);
}
};
ThemeModule.prototype.saveThemeData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("themes", _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]);
};
/* harmony default export */ __webpack_exports__["default"] = (new ThemeModule());
/***/ }),
/***/ "./src/modules/utils.js":
/*!******************************!*\
!*** ./src/modules/utils.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
class Utils {
/** Document/window width */
static get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
}
/** Document/window height */
static get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
static get WindowConfigFile() {
return this._windowConfigFile = null;
}
static getAllWindowPreferences() {
return {
transparent: true,
frame: false
};
}
static getWindowPreference(key) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static setWindowPreference(key, value) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static stripBOM(content) {
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
static getTextArea() {
return _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("." + 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(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}">
<div class="title">${title}</div>
</div>
<div class="bd-modal-body">
<div class="scroller-wrap fade">
<div class="scroller">
${content}
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
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(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
<div class="bd-modal bd-content-modal ${modalModule.modal}">
<div class="bd-modal-inner ${modalModule.inner}">
<div class="header ${headerModule.header}"><div class="title">Content Errors</div></div>
<div class="bd-modal-body">
<div class="tab-bar-container">
<div class="tab-bar TOP">
<div class="tab-bar-item">Plugins</div>
<div class="tab-bar-item">Themes</div>
</div>
</div>
<div class="table-header">
<div class="table-column column-name">Name</div>
<div class="table-column column-message">Message</div>
<div class="table-column column-error">Error</div>
</div>
<div class="scroller-wrap fade">
<div class="scroller">
</div>
</div>
</div>
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
<button type="button">Okay</button>
</div>
</div>
</div>
</div>`);
function generateTab(errors) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="errors">`);
for (const err of errors) {
const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="error">
<div class="table-column column-name">${err.name ? err.name : err.file}</div>
<div class="table-column column-message">${err.message}</div>
<div class="table-column column-error"><a class="error-link" href="">${err.error ? err.error.message : ""}</a></div>
</div>`);
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<string|ReactElement>)} 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.deroku.xyz/LightcordApi/docs");
},
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 `<div style={{
marginTop: "20px", marginBottom: "20px"
}}>
<div style={{
backgroundColor: "var(--background-secondary)",
padding: "30px 30px",
borderRadius: "8px"
}} className="lc-tab-box-shadow">
<Lightcord.Api.Components.general.Title>Preview tabs</Lightcord.Api.Components.general.Title>
</div>
</div>`;
}
}
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 = `</${compPath}>`;
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/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 <div className="bd-select-wrap">
// <label className="bd-label">{this.props.label}</label>
// <div className={`bd-select${style}${isOpen}`} onClick={this.showMenu} ref={this.dropdown}>
// <div className="bd-select-controls">
// <div className="bd-select-value">{this.selected.label}</div>
// <Arrow className="bd-select-arrow" />
// </div>
// </div>
// {this.state.open && this.options}
// </div>;
/***/ }),
/***/ "./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);
this.switch = /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Switch, {
onChange: this.onChange,
value: this.state.checked
});
}
onChange(value) {
if (this.props.disabled) return;
this.props.onChange(value);
this.setState({
checked: value
});
}
render() {
return this.switch;
}
}
/***/ }),
/***/ "./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(`<div id="bd-customcss-detach-container">`), 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(`<div id="bd-customcss-detach-container">`), 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");
{
/* <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white" width="18px" height="18px">
<path d="M0 0h24v24H0z" fill="none"/>
<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"/>
</svg> */
}
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(<DiscordButton title="Copy Current Timestamp" onClick={() => {
DiscordNative.clipboard.copy(Date.now()+"")
}} />)
}*/
return array;
} 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(data) {
let value = data.value;
if (!this.lastEdited || this.lastEdited < Date.now() - 500) {
this.props.manager.onChange(this, value === "none" ? null : value.replace("asset-", ""));
this.lastEdited = Date.now();
} else if (!this.isTiming) {
this.isTiming = setTimeout(() => {
this.props.manager.onChange(this, this.state.data === "none" ? null : this.state.data.replace("asset-", ""));
this.isTiming = null;
this.lastEdited = Date.now();
}, 500);
}
this.setState({
data: value
});
this.forceUpdate();
}
get modules() {
return InputChoiceModules || (InputChoiceModules = [BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0]]);
}
render() {
let setting = this.props.setting;
let [rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule] = this.modules;
let options = this.props.manager.state.assets.map(e => {
return {
value: "asset-" + e.id,
label: e.name
};
});
options.unshift({
value: "none",
label: "No assets"
});
return /*#__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(<ServerCard server={server} join={self.join}/>);
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 (window.require("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");
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);
}
});
})];
}
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 /*#__PURE__*/React.createElement(switchItem.default, {
onChange: ev => {
this.props.onChange(setting.id, ev.target.checked);
this.forceUpdate();
},
key: setting.id,
value: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
className: __SECRET_EMOTION__.css({
marginBottom: "20px"
}),
disabled: false,
hideBorder: false,
size: switchItem.default.Sizes.DEFAULT,
theme: switchItem.default.Themes.DEFAULT,
note: setting.info
}, 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 (!classnames.find(e => e.startsWith("beta-"))) {
classnames.push(BDModules.get(e => e.beta && !e.container && !e.userSettingsVoice)[0].beta);
}
if (this.props.data.experimental) {
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0xheWVycy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvaG9va3MuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3BsdWdpbkNlcnRpZmllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luTW9kdWxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wb3BvdXRXaW5kb3cuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvYnVnX2h1bnRlci5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvY2lyY3VzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9zZXJ2ZXJDYXJkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc0dyb3VwLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJTZXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1vZHVsZVwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJub2RlLWZldGNoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInBhdGhcIiJdLCJuYW1lcyI6WyJtaW5pbXVtRGlzY29yZFZlcnNpb24iLCJjdXJyZW50RGlzY29yZFZlcnNpb24iLCJ3aW5kb3ciLCJEaXNjb3JkTmF0aXZlIiwicmVtb3RlQXBwIiwiZ2V0VmVyc2lvbiIsIm1pblN1cHBvcnRlZFZlcnNpb24iLCJiYmRWZXJzaW9uIiwiYmJkQ2hhbmdlbG9nIiwiZGVzY3JpcHRpb24iLCJjaGFuZ2VzIiwidGl0bGUiLCJ0eXBlIiwiaXRlbXMiLCJzZXR0aW5ncyIsImlkIiwiaW5mbyIsImltcGxlbWVudGVkIiwiaGlkZGVuIiwiY2F0IiwiY2F0ZWdvcnkiLCJleHBlcmltZW50YWwiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwibGlnaHRjb3JkU2V0dGluZ3MiLCJkZWZhdWx0TGlnaHRjb3JkU2V0dGluZ3MiLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwiQkRWMiIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwibWV0aG9kcyIsInNldENvbmZpZyIsInNldE1ldGhvZHMiLCJpbml0IiwidjJMb2FkZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsImZvb3RlciIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwibSIsIkRpc3BhdGNoZXIiLCJkaXNwYXRjaCIsIkFjdGlvblR5cGVzIiwic29ja2V0SWQiLCJwaWQiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIkxheWVycyIsImxheWVycyIsIkJldHRlckRpc2NvcmQiLCJpc0luamVjdGVkIiwicXVlcnlTZWxlY3RvciIsImluamVjdCIsImNsYXNzTmFtZUxheWVycyIsInJlbW92ZURhIiwidjIiLCJXZWJwYWNrTW9kdWxlcyIsImZpbmQiLCJsYXllciIsIlJlYWN0SW5zdGFuY2UiLCJBcGkiLCJGaW5kUmVhY3QiLCJyZW5kZXIiLCJjYWxsIiwiY2xhc3NMaXN0IiwicHJvcHMiLCJjaGlsZHJlbiIsInNwbGl0IiwicHVzaCIsImpvaW4iLCJmb3JFYWNoIiwiZm9yY2VVcGRhdGUiLCJjcmVhdGVMYXllciIsInV1aWR2NCIsImxheSIsImluZGV4IiwiZmluZEluZGV4Iiwic3BsaWNlIiwicmVtb3ZlIiwiTGF5ZXJNb2R1bGVzIiwiTGF5ZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImFuaW1hdGlvbiIsIm1vZHVsZXMiLCJWYWx1ZSIsImdldExheWVyIiwia2V5ZG93biIsIndoaWNoIiwiZGl2IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJhZGRFdmVudExpc3RlbmVyIiwiY29tcG9uZW50V2lsbEVudGVyIiwidGltaW5nIiwidG9WYWx1ZSIsImR1cmF0aW9uIiwiY29tcG9uZW50V2lsbExlYXZlIiwiaW50ZXJwb2xhdGlvbiIsImludGVycG9sYXRlIiwiaW5wdXRSYW5nZSIsIm91dHB1dFJhbmdlIiwic3R5bGUiLCJvcGFjaXR5IiwidHJhbnNmb3JtIiwic2NhbGUiLCJEaXYiLCJfX1NFQ1JFVF9FTU9USU9OX18iLCJjc3MiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwb3NpdGlvbiIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCIsImRpc3BsYXkiLCJvdmVyZmxvdyIsIldlYmtpdEJveE9yaWVudCIsIldlYmtpdEJveERpcmVjdGlvbiIsIm1zRmxleERpcmVjdGlvbiIsImZsZXhEaXJlY3Rpb24iLCJ6SW5kZXgiLCJwYWRkaW5nVG9wIiwiZmlsdGVyIiwiZGVmYXVsdFByb3BzIiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzIiwiZmluZE1vZHVsZUJ5UHJvdG90eXBlcyIsInByb3RvcyIsImZpbmRCeVByb3RvdHlwZXMiLCJmaW5kTW9kdWxlQnlEaXNwbGF5TmFtZSIsImZpbmRCeURpc3BsYXlOYW1lIiwiZ2V0SW50ZXJuYWxJbnN0YW5jZSIsIm5vZGUiLCJqUXVlcnkiLCJFbGVtZW50IiwibG9hZERhdGEiLCJwbHVnaW5OYW1lIiwiZ2V0UGx1Z2luRGF0YSIsImdldERhdGEiLCJzYXZlRGF0YSIsInNldFBsdWdpbkRhdGEiLCJzZXREYXRhIiwiZGVsZXRlRGF0YSIsImRlbGV0ZVBsdWdpbkRhdGEiLCJ3aGF0IiwibWV0aG9kTmFtZSIsIm9uUmVtb3ZlZCIsImNhbGxiYWNrIiwic3VwcHJlc3NFcnJvcnMiLCJtZXRob2QiLCJ0ZXN0SlNPTiIsImlzUGx1Z2luRW5hYmxlZCIsImlzVGhlbWVFbmFibGVkIiwiaXNTZXR0aW5nRW5hYmxlZCIsImVuYWJsZVNldHRpbmciLCJvbkNoYW5nZSIsImRpc2FibGVTZXR0aW5nIiwidG9nZ2xlU2V0dGluZyIsImdldEJERGF0YSIsInNldEJERGF0YSIsIm1ha2VBZGRvbkFQSSIsImNvb2tpZSIsImxpc3QiLCJtYW5hZ2VyIiwiQWRkb25BUEkiLCJmb2xkZXIiLCJpc0VuYWJsZWQiLCJ0b2dnbGUiLCJyZWxvYWQiLCJnZXRBbGwiLCJrIiwiYSIsIlBsdWdpbnMiLCJUaGVtZXMiLCJFdmVudEVtaXR0ZXIiLCJyZXF1aXJlIiwiZXZlbnROYW1lIiwiYXJncyIsImVtaXQiLCJvZmYiLCJldmVudEFjdGlvbiIsInJlbW92ZUxpc3RlbmVyIiwic2VsZWN0b3JzIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwidXNlclNldHRpbmdzQWNjb3VudCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidmlld0JvZHkiLCJ1c2VyU2V0dGluZ3NTZWN1cml0eSIsIkJsdXJQcml2YXRlIiwiZXJyb3IiLCJET01Ub29scyIsIm5vcm1hbGl6ZWRQcmVmaXgiLCJyYW5kQ2xhc3MiLCJzdG9wIiwiaGFzUGF0Y2hlZCIsInVucGF0Y2hDbGFzc01vZHVsZXMiLCJtb2R1bGVGaWx0ZXIiLCJyZXZlcnRFbGVtZW50IiwicGF0Y2hDbGFzc01vZHVsZXMiLCJub3JtYWxpemVFbGVtZW50IiwicGF0Y2hET01NZXRob2RzIiwibW9kdWxlIiwicGF0Y2hDbGFzc01vZHVsZSIsInVucGF0Y2hDbGFzc01vZHVsZSIsInNob3VsZElnbm9yZSIsImlzTmFOIiwiZW5kc1dpdGgiLCJzdGFydHNXaXRoIiwiQXJyYXkiLCJpc0FycmF5IiwiX19lc01vZHVsZSIsImJhc2VDbGFzc05hbWUiLCJjb21wb25lbnROYW1lIiwiY2xhc3NOYW1lcyIsIm5vcm1hbENsYXNzIiwiY2FtZWxDYXNlIiwicyIsImkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwibmV3U3RyaW5nIiwidHJpbSIsImVsZW1lbnQiLCJjbGFzc2VzIiwiYyIsImNsZW4iLCJuZXdDbGFzcyIsImFkZCIsImNoaWxkIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidG9SZW1vdmUiLCJjb250YWlucyIsIkRPTVRva2VuTGlzdCIsInRva2VuIiwidG9rZW5zIiwidCIsIkNvbG9yZWRUZXh0IiwiaW5qZWN0Q29sb3JlZFRleHQiLCJjYW5jZWxDb2xvcmVkVGV4dCIsIk1lc3NhZ2VDb21wb25lbnQiLCJiZWZvcmUiLCJtZXRob2RBcmd1bWVudHMiLCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50IiwibWVzc2FnZUNvbnRlbnQiLCJkaXNwbGF5TmFtZSIsIm9yaWdpbmFsVHlwZSIsIl9fb3JpZ2luYWxNZXRob2QiLCJyb2xlQ29sb3IiLCJjb2xvclN0cmluZyIsImNvbG9yIiwiYXNzaWduIiwicmVtb3ZlQ29sb3JlZFRleHQiLCJjbGFzc05hbWVNYXJrdXAiLCJtYXJrdXAiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZWxlbSIsInNldFByb3BlcnR5IiwicGF0aCIsImZzIiwiTW9kdWxlIiwiZ2xvYmFsUGF0aHMiLCJyZXNvbHZlIiwicmVtb3RlIiwiYXBwIiwiZ2V0QXBwUGF0aCIsIk1ldGFFcnJvciIsIm9yaWdpbmFsSlNSZXF1aXJlIiwiX2V4dGVuc2lvbnMiLCJvcmlnaW5hbENTU1JlcXVpcmUiLCJzcGxpdFJlZ2V4IiwiZXNjYXBlZEF0UmVnZXgiLCJhZGRvbkNhY2hlIiwidGltZUNhY2hlIiwid2F0Y2hlcnMiLCJwYXRjaEV4dGVuc2lvbnMiLCJnZXRDb250ZW50UmVxdWlyZSIsInBsdWdpbnNGb2xkZXIiLCJfcGx1Z2luc0ZvbGRlciIsInJlYWxwYXRoU3luYyIsImRhdGFQYXRoIiwidGhlbWVzRm9sZGVyIiwiX3RoZW1lc0ZvbGRlciIsImxvYWRBZGRvbkNlcnRpZmllckNhY2hlIiwiZGF0YVN0b3JlIiwiZ2V0U2V0dGluZ0dyb3VwIiwic2V0U2V0dGluZ0dyb3VwIiwiZW5jcnlwdFNldHRpbmdzQ2FjaGUiLCJKU09OIiwicGFyc2UiLCJkZWNyeXB0U2V0dGluZ3NDYWNoZSIsImhhc2giLCJyZXN1bHQiLCJzdXNwZWN0Iiwic2F2ZUFkZG9uQ2FjaGUiLCJzdHJpbmdpZnkiLCJ3YXRjaENvbnRlbnQiLCJjb250ZW50VHlwZSIsImlzUGx1Z2luIiwiYmFzZUZvbGRlciIsImZpbGVFbmRpbmciLCJ3YXRjaCIsInBlcnNpc3RlbnQiLCJldmVudFR5cGUiLCJmaWxlbmFtZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsInN0YXRTeW5jIiwiZXJyIiwiY29kZSIsInVubG9hZFBsdWdpbiIsInVubG9hZFRoZW1lIiwiaXNGaWxlIiwic3RhdHMiLCJtdGltZSIsImdldFRpbWUiLCJsb2FkUGx1Z2luIiwibG9hZFRoZW1lIiwicmVsb2FkUGx1Z2luIiwicmVsb2FkVGhlbWUiLCJ1bndhdGNoQ29udGVudCIsImNsb3NlIiwiZXh0cmFjdE1ldGEiLCJmaXJzdExpbmUiLCJoYXNPbGRNZXRhIiwicGFyc2VPbGRNZXRhIiwiaGFzTmV3TWV0YSIsInBhcnNlTmV3TWV0YSIsIm1ldGEiLCJyYXdNZXRhIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJpbmRleE9mIiwicGFyc2VkIiwiZm9ybWF0IiwiYmxvY2siLCJvdXQiLCJmaWVsZCIsImFjY3VtIiwibGluZSIsImNoYXJBdCIsImwiLCJzdWJzdHIiLCJzZWxmIiwib3JpZ2luYWxSZXF1aXJlIiwicG9zc2libGVQYXRoIiwiYmFzZW5hbWUiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3RyaXBCT00iLCJhZGRlZCIsImF0aW1lTXMiLCJtb2RpZmllZCIsIm10aW1lTXMiLCJzaXplIiwiX2NvbXBpbGUiLCJkaWRFeHBvcnQiLCJpc0VtcHR5IiwiZXhwb3J0cyIsIm1ha2VQbGFjZWhvbGRlclBsdWdpbiIsImdldE5hbWUiLCJnZXRBdXRob3IiLCJnZXREZXNjcmlwdGlvbiIsInNvdXJjZSIsIndlYnNpdGUiLCJsb2FkQ29udGVudCIsInByb2Nlc3NGaWxlIiwidGltZXN0YW1wIiwiZmlsZSIsImhhcm0iLCJzdGFjayIsInVubG9hZENvbnRlbnQiLCJjYWNoZSIsImlzTG9hZGVkIiwicmVsb2FkQ29udGVudCIsImNhbnRVbmxvYWQiLCJsb2FkTmV3Q29udGVudCIsImJhc2VkaXIiLCJmaWxlcyIsInJlYWRkaXJTeW5jIiwiY29udGVudExpc3QiLCJ2YWx1ZXMiLCJyZW1vdmVkIiwiZiIsImxvYWRBbGxDb250ZW50IiwiZXJyb3JzIiwibG9hZFBsdWdpbnMiLCJsb2FkVGhlbWVzIiwiY29uZmlnIiwiaGFzU3RhcnRlZCIsImZsYXQiLCJ2ZXJzaW9uIiwiRUQiLCJXZWJTb2NrZXQiLCJwYXRjaEF0dHJpYnV0ZXMiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJjb250ZW50TWFuYWdlciIsIkJ1ZmZlciIsImZyb20iLCJ0b1N0cmluZyIsImNsaWNrIiwiUGx1Z2luQ2VydGlmaWVyIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImluaXRPYnNlcnZlciIsInNob3dDb250ZW50RXJyb3JzIiwicGx1Z2lucyIsInRoZW1lcyIsInByZXZpb3VzVmVyc2lvbiIsInNob3dDaGFuZ2Vsb2dNb2RhbCIsIkVtb2ppTW9kdWxlIiwicGF0Y2hTb2NpYWwiLCJwYXRjaEd1aWxkUGlsbHMiLCJwYXRjaEd1aWxkTGlzdEl0ZW1zIiwicGF0Y2hHdWlsZFNlcGFyYXRvciIsInBhdGNoTWVzc2FnZUhlYWRlciIsInBhdGNoTWVtYmVyTGlzdCIsInBhdGNoQXR0YWNobWVudCIsImhhdmVJbnN0YWxsZWREZWZhdWx0Iiwib25DbG9zZSIsImxvZ28iLCJpbm5lckhUTUwiLCJhdHRyaWJzUGF0Y2hzIiwiY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzIiwiQW5jaG9yIiwiZW5zdXJlRXhwb3J0ZWQiLCJ0aGVuIiwiRGlzY29yZFRhZyIsIkRpc2NvcmRUYWdDb21wIiwiYmFkZ2VEaXYiLCJtYXJnaW5Ub3AiLCJ1c2VyIiwiVG9vbHRpcFdyYXAiLCJzaWRlIiwiaHJlZiIsInRhcmdldCIsIkJETG9nbyIsIkxpZ2h0Y29yZExvZ28iLCJhcHBseUJhZGdlcyIsInRpbWVzQ2hlY2tlZCIsIndyYXBwZXIiLCJndWlsZENsYXNzZXMiLCJndWlsZCIsImxpc3RJdGVtIiwiYmxvYiIsImJsb2JDb250YWluZXIiLCJkZWZlckxvYWRlZCIsInJlYWR5U3RhdGUiLCJpbmplY3RFeHRlcm5hbHMiLCJzYXZlU2V0dGluZ3MiLCJsb2FkU2V0dGluZ3MiLCJzZXR0aW5nIiwiZ2V0UHJlZGljYXRlU2VjdGlvbnMiLCJzZXR0aW5nTW9kdWxlIiwic2VjdGlvbiIsInBvcGVkIiwicG9wIiwicmVuZGVyU2lkZWJhciIsImNsYXNzTmFtZUxheWVyIiwiY2xhc3NOYW1lU29jaWFsTGlua3MiLCJjbGFzc05hbWVNb2RhbCIsIm1haW5PYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtbGVuIiwibXV0YXRpb24iLCJyYXdPYnNlcnZlciIsImFkZGVkTm9kZXMiLCJhbmltYXRpbmciLCJzb2NpYWxMaW5rcyIsIm1vZGFsIiwiaW5uZXIiLCJyZXNwb25zaXZlV2lkdGhNb2JpbGUiLCJnZXRBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJwYXJlbnRFbGVtZW50Iiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsInN1YnRyZWUiLCJzb2NpYWxQYXRjaCIsIlRhYkJhciIsInNvY2lhbE1vZHVsZTEiLCJvcmlnaW5hbCIsIm5ld09uZSIsInJldHVyblZhbCIsImxpbmsiLCJjbGFzc05hbWVDb2xvck11dGVkIiwic2l6ZXMiLCJjbGFzc05hbWVWZXJzaW9uSGFzaCIsImNvbG9yTXV0ZWQiLCJzaXplMzIiLCJ2ZXJzaW9uSGFzaCIsImJyYW5jaCIsImFkZGl0aW9uYWwiLCJyZWFjdCIsInNpemUxMiIsImVsZWN0cm9uIiwiZ2V0R2xvYmFsIiwiY29tbWl0Iiwib3JpZ2luYWxWZXJzaW9ucyIsImdldEd1aWxkQ2xhc3NlcyIsImd1aWxkc1dyYXBwZXIiLCJmaW5kQnlQcm9wcyIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJjaGF0IiwibmV4dFRpY2siLCJnZXRFbGVtZW50QnlJZCIsImNoaWxkTm9kZXMiLCJibG9ja0RpdiIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwidXBkYXRlSW5qZWN0b3IiLCJpbmplY3Rpb25QYXRoIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsImVudiIsIkFQUERBVEEiLCJIT01FIiwiWERHX0NPTkZJR19IT01FIiwic3RhYmxlIiwiY2FuYXJ5IiwicHRiIiwicGx1Z2luRGF0YSIsIkJERmlsZSIsIndyaXRlRmlsZVN5bmMiLCJzZXR0aW5nc0ZpbGUiLCJ1bmxpbmtTeW5jIiwiX2luamVjdGlvblBhdGgiLCJiYXNlIiwicm9hbWluZ0Jhc2UiLCJnZXRQYXRoIiwicm9hbWluZ0xvY2F0aW9uIiwicmVhbExvY2F0aW9uIiwiY29uZmlnRmlsZSIsIl9jb25maWdGaWxlIiwiX0JERmlsZSIsIl9zZXR0aW5nc0ZpbGUiLCJnZXRQbHVnaW5GaWxlIiwiRGV2TW9kZSIsImRlYnVnTGlzdGVuZXIiLCJjb3B5U2VsZWN0b3JMaXN0ZW5lciIsInN0YXJ0RGVidWdMaXN0ZW5lciIsInN0YXJ0Q29weVNlbGVjdG9yIiwic3RvcERlYnVnTGlzdGVuZXIiLCJzdG9wQ29weVNlbGVjdG9yIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzdG9wUHJvcGFnYXRpb24iLCJzZWxlY3RvciIsImdldFNlbGVjdG9yIiwiY2xhc3NMYXllciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJtZW51IiwiYXR0YWNoIiwiY20iLCJxdWVyeSIsImNvbnRhaW5lciIsImxheWVyQ29udGFpbmVyIiwiY21XcmFwIiwic3R5bGVGbGV4aWJsZSIsImFjY29tbW9kYXRlU2Nyb2xsYmFyIiwiYXBwZW5kIiwiY2xpZW50WSIsImNsaWVudFgiLCJzY3JvbGxlckNsYXNzZXMiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyIiwicmVtb3ZlQ00iLCJrZXlDb2RlIiwiY21nIiwiY21pIiwiaXRlbSIsImxhYmVsQ29udGFpbmVyIiwiY29sb3JEZWZhdWx0IiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5IiwiZWxlbWVudHMiLCJxdWVyeUFsbCIsImZvY3VzZWQiLCJzZXBhcmF0b3IiLCJzY3JvbGxIZWlnaHQiLCJmdWxsUGF0aCIsImVsIiwibmFtZXMiLCJwYXJlbnROb2RlIiwidW5zaGlmdCIsIm93bmVyRG9jdW1lbnQiLCJ0YWdOYW1lIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJEaXNhYmxlVHlwaW5nIiwic3RhcnRUeXBpbmciLCJ0eXBpbmdNb2R1bGUiLCJkaXNhYmxlZCIsInN0b3BUeXBpbmciLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwibmV3UHJvbWlzZSIsInJlcyIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJ1c2VycyIsImhhbmRsZVJlcXVlc3QiLCJSb3V0ZXMiLCJzdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJqc29uIiwicHJvbWlzZSIsInVzZXJfaWQiLCJjYXRjaCIsIkxpZ2h0Y29yZEVycm9yIiwicm91dGUiLCJyZWplY3QiLCJub2RlRmV0Y2giLCJTRVJWRVJfVVJMIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJCdWdIdW50ZXJCYWRnZSIsIkNpcmN1cyIsImhlYWQiLCJzY3JpcHQiLCJzcmMiLCJvbmxvYWQiLCJhbmltYXRlIiwiXyIsInVwZGF0ZSIsInBlcmZvcm1hbmNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwidGltZSIsInRpbWVGcmFjdGlvbiIsInByb2dyZXNzIiwiUSIsInBhcnNlSFRNTCIsImlzSFRNTCIsIk5vZGVMaXN0Iiwic29tZSIsIm4iLCJub2RlVHlwZSIsImJhc2VFbGVtZW50IiwiaHRtbCIsImZyYWdtZW50IiwidGVtcGxhdGUiLCJjbG9uZU5vZGUiLCJlc2NhcGVIVE1MIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInNwYW5FbGVtZW50Iiwibm9kZVZhbHVlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiY2xhc3NuYW1lIiwiaW5kaWNhdG9yIiwiaGFzQ2xhc3MiLCJldmVyeSIsInJlcGxhY2VDbGFzcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiYXBwZW5kVG8iLCJ0aGlzTm9kZSIsInRoYXROb2RlIiwicHJlcGVuZFRvIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwidGFyZ2V0Tm9kZSIsImluc2VydEJlZm9yZSIsIm5leHRTaWJsaW5nIiwibmV3Tm9kZSIsIm5leHQiLCJuZXh0QWxsIiwibmV4dFVudGlsIiwibWF0Y2hlcyIsInByZXZpb3VzIiwicHJldmlvdXNBbGwiLCJwcmV2aW91c1VudGlsIiwiaW5kZXhJblBhcmVudCIsIm51bSIsInBhcmVudCIsImZpbmRDaGlsZCIsImZpbmRDaGlsZHJlbiIsInBhcmVudHMiLCJjbG9zZXN0IiwicGFyZW50c1VudGlsIiwic2libGluZ3MiLCJhdHRyaWJ1dGUiLCJnbG9iYWwiLCJnZXRDb21wdXRlZFN0eWxlIiwiaGVpZ2h0IiwidGV4dENvbnRlbnQiLCJvdXRlcldpZHRoIiwib2Zmc2V0V2lkdGgiLCJvdXRlckhlaWdodCIsIm9mZnNldEhlaWdodCIsIm9mZnNldCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxpc3RlbmVycyIsIl9saXN0ZW5lcnMiLCJvbiIsImV2ZW50IiwiZGVsZWdhdGUiLCJuYW1lc3BhY2UiLCJoYXNEZWxlZ2F0ZSIsImV2ZW50RnVuYyIsImNhbmNlbCIsIm5ld0NhbmNlbCIsIm9uY2UiLCJfX29mZkFsbCIsIm1hdGNoRmlsdGVyIiwibGlzdGVuZXIiLCJkZWZhdWx0RmlsdGVyIiwib25Nb3VudENoYW5nZSIsIm9uTW91bnQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvYnNlcnZlciIsIm5vZGVzIiwicmVtb3ZlZE5vZGVzIiwiZGlyZWN0TWF0Y2giLCJwYXJlbnRNYXRjaCIsIm9uVW5tb3VudCIsIm9uQWRkZWQiLCJ3cmFwIiwiZG9tV3JhcHBlciIsInJlc29sdmVFbGVtZW50IiwiRW1vamlSZWdleCIsIkN1c3RvbUVtb2ppTW9kdWxlIiwiQ3VzdG9tRW1vamkiLCJFbW9qaU1vZHVsZUFwaSIsImdldEN1c3RvbUVtb2ppQnlJZCIsIkF1dG9jb21wbGV0ZU1vZHVsZSIsIkF1dG9Db21wbGV0aW9uVGVtcGxhdGVzIiwiZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyIsIkVtb2ppTW9kdWxlUXVlcnkiLCJxdWVyeUVtb2ppUmVzdWx0cyIsIk1lc3NhZ2VzIiwiRU1PSklfTUFUQ0hJTkciLCJndWlsZE1vZHVsZSIsImdldEd1aWxkIiwiZ2V0R3VpbGRzIiwiaXNGZXRjaGluZyIsImVtb2ppU2VhcmNoIiwiZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dCIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uQ2xpY2siLCJvbkhvdmVyIiwiUiIsInByZWZpeCIsIlRpdGxlIiwiRW1vamlGaWx0ZXJNb2R1bGUiLCJpc0Vtb2ppRGlzYWJsZWQiLCJpc1VzYWJsZSIsInVzYWJsZSIsInN1cnJvZ2F0ZXMiLCJkaXZlcnNpdHkiLCJ1c2VTdGF0ZSIsInVzZUZvcmNlVXBkYXRlIiwiY2FjaGUyIiwicHJvY2Vzc0F0dGFjaG1lbnQiLCJpc1RydXN0ZWQiLCJ0ZXN0cyIsInRocmVhdHMiLCJjaGVja1ZpcnVzZXMiLCJyZXN1bHRDYWxsYmFjayIsInJlbW92ZUNhbGxiYWNrIiwiaXNIYXJtZnVsIiwibm9fY29tbWVudHMiLCJzY3JwdCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiYXRvYiIsImdlbmVyYXRlS2V5IiwiZGVjaXBoZXIiLCJkZWNyeXB0ZWQiLCJmaW5hbCIsImNpcGhlciIsImVuY3J5cHRlZCIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImRlbGV0ZSIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsInBvcG91dFdpbmRvdyIsIndpbmRvd3MiLCJNYXAiLCJwb3BvdXRNb2R1bGUiLCJnZXRXaW5kb3ciLCJzZXRJbW1lZGlhdGUiLCJiZEV2ZW50cyIsInJlbW92ZVRoZW1lcyIsImFwcGx5VGhlbWVzIiwidGhlbWVOYW1lIiwidGhlbWUiLCJleGlzdGluZyIsInVuZXNjYXBlIiwicmVtb3ZlQXR0cmlidXRlIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJWMkNfUHVibGljU2VydmVycyIsInJvb3RJZCIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJpc0NsZWFyaW5nQ2FjaGUiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNvcmVTZXR0aW5ncyIsImdldFNldHRpbmdzIiwiY2F0ZWdvcmllcyIsIlNldCIsInNlY3Rpb25zIiwiUHJlc2VuY2VTZXR0aW5ncyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsIlNldHRpbmdzIiwiZGV2TW9kZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwiYXBwU2V0dGluZ3MiLCJyZWxhdW5jaCIsImV4aXQiLCJjb3JlIiwiTm90aWZpY2F0aW9uc1VzZVNoaW0iLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiaXNDaGVja2VkIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsImxvb2siLCJob3ZlckNvbG9yIiwiaXBjIiwic2VuZCIsImFyZ3YiLCJxdWl0Iiwic2Vzc2lvbiIsImNsZWFyQ2FjaGUiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJMQ0Rldkl0ZW1zIiwiVGhlbWVNb2R1bGUiLCJsb2FkVGhlbWVEYXRhIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJmb3JtYXRTdHJpbmciLCJzdHJpbmciLCJyZXBsYWNlbWVudCIsImVzY2FwZSIsInBhcmFtcyIsImluc3RlYWQiLCJzaWxlbnQiLCJmb3JjZSIsIm9yaWdNZXRob2QiLCJjYW5jZWxlZCIsImNhbmNlbFBhdGNoIiwib3JpZ2luYWxNZXRob2QiLCJjYWxsT3JpZ2luYWxNZXRob2QiLCJ0ZW1wUmV0IiwiX19tb25rZXlQYXRjaGVkIiwiZGlzY29ubmVjdCIsImhhc05vdGljZSIsImZvcm0iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiTW9kYWxTdGFjayIsIkNoYW5nZWxvZ0NsYXNzZXMiLCJUZXh0RWxlbWVudCIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImltYWdlIiwic3VidGl0bGUiLCJjZSIsImNoYW5nZWxvZ0l0ZW1zIiwiZW50cnkiLCJtYXJnaW4iLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJTaXplcyIsIlNNQUxMIiwiQ29sb3JzIiwiU1RBTkRBUkQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiQW5jaG9yQ2xhc3NlcyIsImFuY2hvciIsImFuY2hvclVuZGVybGluZU9uSG92ZXIiLCJqb2luU3VwcG9ydFNlcnZlciIsImpvaW5CRDIiLCJzdXBwb3J0TGluayIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1vZGFsQWN0aW9ucyIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwib3Blbk1vZGFsIiwicmVkIiwibW9kYWxLZXkiLCJWMiIsImVkaXRvckRldGFjaGVkIiwicmVxIiwid2VicGFja0pzb25wIiwiX19leHRyYV9pZF9fIiwic2hvdWxkUHJvdGVjdCIsInRoZU1vZHVsZSIsImNsZWFyIiwic29ydCIsImdldFRva2VuIiwiZ2V0RW1haWwiLCJzaG93VG9rZW4iLCJwcm90ZWN0IiwiaXNEZWZhdWx0IiwibW9kIiwicHJveHkiLCJmdW5jIiwiX19wcm90b19fIiwicHJvcE5hbWVzIiwicHJvdG9OYW1lcyIsInByb3RvUHJvcCIsImludGVybmFsIiwiam9pbkJEMSIsIkludml0ZUFjdGlvbnMiLCJhY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsIiwibGVhdmVCRDEiLCJHdWlsZEFjdGlvbnMiLCJsZWF2ZUd1aWxkIiwibGVhdmVCRDIiLCJqb2luTEMiLCJsZWF2ZUxDIiwicmVhY3RDb21wb25lbnQiLCJhbmNob3JDbGFzc2VzIiwic2xhdGVFZGl0b3JDbGFzc2VzIiwibWVzc2FnZUNsYXNzZXMiLCJ1bnJlYWRNZW50aW9uc0JhciIsImd1aWxkc0Vycm9yIiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJUb29sdGlwV3JhcHBlciIsIlRvb2x0aXBzIiwiaGlkZSIsInNob3ciLCJzdWJtaXQiLCJhY3RpdmF0ZVJhZ2luZ0RlbW9uIiwiZGlzbWlzcyIsIktleUdlbmVyYXRvciIsIkxheWVyU3RhY2siLCJVc2VyU3RvcmUiLCJDaGFubmVsU3RvcmUiLCJDaGFubmVsQWN0aW9ucyIsIlByaXZhdGVDaGFubmVsQWN0aW9ucyIsIm9wZW5ETSIsInVzZXJJZCIsInNlbGZJZCIsInByaXZhdGVDaGFubmVsSWQiLCJnZXRETUZyb21Vc2VySWQiLCJzZWxlY3RQcml2YXRlQ2hhbm5lbCIsIm9wZW5Qcml2YXRlQ2hhbm5lbCIsInBhcnNlU2V0dGluZ3MiLCJWb2ljZU1vZGUiLCJtYXJnaW5Nb2R1bGUyIiwiZGVmYXVsdE1hcmdpbmg1IiwiY29sb3JNb2R1bGUiLCJjb2xvclN0YW5kYXJkIiwic2l6ZU1vZHVsZSIsInNjcm9sbGJhck1vZHVsZTEiLCJzY3JvbGxiYXJHaG9zdEhhaXJsaW5lIiwiR3VpbGRNb2R1bGUiLCJnZXRSZWxhdGlvbnNoaXBzIiwic2Vzc2lvbk1vZHVsZSIsImdldFNlc3Npb25zIiwic2l6ZTE0IiwiaDUiLCJnZXRQcm9maWxlVmFsdWUiLCJnZXRTdGF0aXN0aWNzIiwiZ2V0U2Vzc2lvblZhbHVlIiwibWFyZ2luQm90dG9tMjAiLCJzZXNzaW9uc1JhdyIsInNlc3Npb25zIiwic2Vzc2lvbklkIiwiY2xpZW50SW5mbyIsIm9zIiwiY2xpZW50IiwiYWN0aXZpdGllcyIsInJlcGVhdCIsImNyZWF0ZWRBdCIsImF2YXRhclVSTCIsImF2YXRhciIsImdldEF2YXRhclVSTCIsImdldERhdGUiLCJnZXRNb250aCIsImdldEZ1bGxZZWFyIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImZsYWdzIiwiaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiIsImVtYWlsIiwibWZhRW5hYmxlZCIsIm1vYmlsZSIsInBob25lIiwidmVyaWZpZWQiLCJuc2Z3QWxsb3dlZCIsInJlbGF0aW9ucyIsImZyaWVuZHMiLCJpc0ZyaWVuZCIsImlzQmxvY2tlZCIsImhpZ2h0bGlnaHRKUyIsImhpZ2hsaWdodCIsIm1lc3NhZ2VNb2R1bGUxIiwibWVzc2FnZU1vZHVsZTIiLCJDb2RlQ29udGVudCIsImxpc3RMYW5ndWFnZXMiLCJfX2h0bWwiLCJsYW5ndWFnZSIsIm1hcmdpbkJvdHRvbTgiLCJmb3JtTW9kdWxlIiwic3RhdGVzIiwiRm9ybVNlY3Rpb24iLCJhbGxDb21wb25lbnRzIiwiY29tcCIsImNvbXBOYW1lIiwiY29tcFBhdGgiLCJyZW5kZXJzIiwiQ29tcG9uZW50UHJldmlldyIsInRhYiIsIkFsbFByZXZpZXdzIiwiZ2V0UHJvcHMiLCJyZW5kZXJQcmV2aWV3IiwicGFkZGluZyIsImJvcmRlclJhZGl1cyIsInJlbmRlckNvZGUiLCJnZW5lcmF0ZUNvZGUiLCJnZXRTdHJGb3JQcm9wIiwibGFuZyIsIlN0cmluZyIsIiQkdHlwZW9mIiwiU3ltYm9sIiwiZm9yIiwiY29tcENhdGVnb3J5IiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJjaGlsZHJlbkRhdGEiLCJoZWxwIiwic3VjY2VzcyIsInNldFN0YXRlIiwibWFyZ2luQm90dG9tIiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJ0cnVzdGVkIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib25BZGRvbkNoYW5nZXMiLCJvcGVuRm9sZGVyIiwib3BlblBhdGgiLCJzaG91bGREZWxldGUiLCJjb25maXJtRGVsZXRlIiwic29ydE9wdGlvbnMiLCJkaXJlY3Rpb25zIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJnZXRBZGRvbnMiLCJzb3J0ZWRBZGRvbnMiLCJiIiwiY2FwIiwiZmlyc3QiLCJzZWNvbmQiLCJsb2NhbGVDb21wYXJlIiwicmVuZGVyQ2hlY2tVcGRhdGVzIiwiWmVyZXNQbHVnaW5MaWJyYXJ5IiwiUGx1Z2luVXBkYXRlcyIsImNoZWNrQWxsIiwidG9vbHRpcElzU2hvd2luZyIsInRvb2x0aXAiLCJtYXJnaW5MZWZ0IiwiY2hlY2tVcGRhdGVCdXR0b24iLCJFbXVsYXRlZFRvb2x0aXAiLCJhdHRhY2hFdmVudHMiLCJyZWZyZXNoSWNvbiIsImFkZG9uQ2FyZHMiLCJmaWxsUnVsZSIsImNsaXBSdWxlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwiVjJDX0NoZWNrYm94IiwiY2hlY2tib3hFbGVtZW50IiwiY2hlY2tib3giLCJjaGVja2JveElubmVyIiwiU2VsZWN0IiwiZHJvcGRvd24iLCJjcmVhdGVSZWYiLCJzaG93TWVudSIsImhpZGVNZW51Iiwib3B0IiwiaXNPcGVuIiwiU2VhcmNoIiwib25LZXlEb3duIiwicGxhY2Vob2xkZXIiLCJzd2l0Y2giLCJWMkNfQ29udGVudENvbHVtbiIsImNvbnRlbnRNb2R1bGUiLCJjb250ZW50Q29sdW1uIiwiY29udGVudENvbHVtbkRlZmF1bHQiLCJWMkNfQ3NzRWRpdG9yIiwibGluZXMiLCJkZXRhY2hlZEVkaXRvciIsIlYyQ19Dc3NFZGl0b3JEZXRhY2hlZCIsInVwZGF0ZUNzcyIsInNhdmVDc3MiLCJkZXRhY2giLCJkZXRhY2hlZCIsImVkaXRvciIsImFjZSIsInNldFRoZW1lIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJkZXRhY2hlZFJvb3QiLCJjb2RlTWlycm9yIiwibGluZU51bWJlcnMiLCJtb2RlIiwiaW5kZW50VW5pdCIsInNjcm9sbGJhclN0eWxlIiwiX2Njc3MiLCJjY3NzIiwidXBkYXRlTGluZUNvdW50IiwibGluZUNvdW50IiwiU2V0dGluZ3NUaXRsZSIsIkNoZWNrYm94IiwiYm9yZGVyUmlnaHQiLCJib3JkZXJMZWZ0IiwiZm9udFNpemUiLCJhcmciLCJnZXRWYWx1ZSIsImRyb290IiwiX3Jvb3QiLCJpbmplY3REZXRhY2hlZFJvb3QiLCJyb290IiwiaW5qZWN0Um9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwibWFyZ2luTW9kdWxlIiwibWFyZ2luVG9wNjAiLCJWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMiLCJwcmV2aWV3IiwiaXNmZXRjaGluZyIsImFzc2V0Q29tcG9uZW50cyIsInVwZGF0ZVdoZW5GZXRjaGVkIiwiZGVmYXVsdFNldHRpbmciLCJSUENQcm9wcyIsImFzc2V0IiwidXBkYXRlUHJldmlldyIsIm9wdGlvbnNDb21wb25lbnRzIiwib2hnb2RvaGZ1Y2siLCJfb3B0aW9uc0NvbXBvbmVudHMiLCJhcnJheSIsImlucHV0VGV4dE1vZHVsZXMiLCJJbnB1dFRleHQiLCJyZW1vdmVLZXliaW5kIiwiX2hvcml6b250YWwiLCJpbnB1dE1pbmkiLCJzaXplMTYiLCJzaXplMjAiLCJpbnB1dCIsImxhc3RFZGl0ZWQiLCJpc1RpbWluZyIsInJvd01vZHVsZSIsImZsZXhNb2R1bGUiLCJpbnB1dE1vZHVsZSIsInNpemVNb2R1bGUyIiwicm93IiwiZmxleENoaWxkIiwiSW5wdXROdW1iZXJNb2R1bGVzIiwiSW5wdXROdW1iZXIiLCJjb2xvclRyYW5zcGFyZW50Iiwic2V0VmFsdWUiLCJjbGlwYm9hcmQiLCJJbnB1dENob2ljZU1vZHVsZXMiLCJJbnB1dENob2ljZSIsIkRpdmlkZXJNb2R1bGVzIiwiRGl2aWRlciIsImRpdmlkZXIiLCJkaXZpZGVyRGVmYXVsdCIsIkRpc2NvcmRCdXR0b24iLCJScGNQcmV2aWV3IiwiYWN0aXZlIiwiY2hhbmdlVGFiIiwiYW5jaWVudFRhYiIsInNldEFjdGl2ZSIsImZsZXgiLCJycGMiLCJpc0FjdGl2ZSIsIlByb2ZpbGUiLCJQb3BvdXQiLCJUYWIiLCJlbXB0eUNsYXNzZXMiLCJQcmVzZW5jZUVycm9yQ2F0Y2hlciIsImVyckluZm8iLCJlbXB0eVN0YXRlSW1hZ2UiLCJlbXB0eVN0YXRlIiwiZW1wdHlTdGF0ZUhlYWRlciIsImVtcHR5U3RhdGVTdWJ0ZXh0IiwicG9wb3V0TW9kdWxlcyIsIlVzZXJQb3BvdXRDb21wb25lbnQiLCJQb3BvdXRQcm9wcyIsIlVzZXJQb3BvdXQiLCJyZW5kZXIxIiwiY2hhbm5lbElkIiwiZGlzYWJsZVVzZXJQcm9maWxlTGluayIsIl9Vc2VyUG9wb3V0IiwicG9wb3V0IiwiZXhjbHVkZVByb3BlcnRpZXMiLCJwcm9maWxlTW9kdWxlcyIsIlVzZXJQcm9maWxlQ29tcG9uZW50IiwiUHJvZmlsZVByb3BzIiwiY29ubmVjdGVkUHJvZmlsZVN0b3JlIiwiVXNlclByb2ZpbGUiLCJyZW5kZXIyIiwicmVuZGVyMyIsInJlbmRlcjQiLCJwcm9maWxlIiwiU2V0dGluZ3NWaWV3IiwiY2hhbmdlQ2F0ZWdvcnkiLCJzZWFyY2hLZXlEb3duIiwiY2hlY2tDb25uZWN0aW9uIiwiY29ubmVjdCIsIkd1aWxkU3RvcmUiLCJBdmF0YXJEZWZhdWx0cyIsIlNvcnRlZEd1aWxkU3RvcmUiLCJob29rcyIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJjYXRlZ29yeVNsdWdzIiwiZmV0Y2giLCJzZWFyY2hFbmRQb2ludCIsInNlcnZlciIsImpvaW5lZCIsImVuZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJyb3VuZCIsInNjcmVlblgiLCJzY3JlZW5ZIiwid2luIiwiam9pbldpbmRvdyIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsImxvYWRVUkwiLCJzZXRNZW51QmFyVmlzaWJpbGl0eSIsInJlc2l6YWJsZSIsIm1heGltaXphYmxlIiwibWluaW1pemFibGUiLCJhbHdheXNPblRvcCIsImNlbnRlciIsIndlYlByZWZlcmVuY2VzIiwibm9kZUludGVncmF0aW9uIiwiYmRTZXJ2ZXIiLCJvbmxpbmUiLCJtZW1iZXJzIiwiaWNvblVybCIsIm5hdGl2ZWpvaW4iLCJzZXJ2ZXIyIiwiZ3VpbGRMaXN0IiwiZ2V0RmxhdHRlbmVkR3VpbGRJZHMiLCJkZWZhdWx0TGlzdCIsIkRFRkFVTFRfQVZBVEFSUyIsIlNlcnZlckNhcmQiLCJmYWxsYmFjayIsImZsb29yIiwiY29ubmVjdEVuZFBvaW50IiwicmVzcG9uc2UiLCJvblNldFNlY3Rpb24iLCJzZWFyY2hJbnB1dCIsImdldFRoaXMiLCJzZXJjaGlucHV0Iiwic2VhcmNoaW5wdXQiLCJtYXhMZW5ndGgiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwidXNlRWZmZWN0IiwiVGFiQmFyU2VwYXJhdG9yIiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJub1dyYXAiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiaG9yaXpvbnRhbCIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCIsIlNldHRpbmdzR3JvdXAiLCJzd2l0Y2hJdGVtIiwiYmV0YUNsYXNzTmFtZXMiLCJWMkNfU2V0dGluZ3NHcm91cCIsInJlbmRlck9sZFNldHRpbmdzIiwiYnV0dG9uQ29tcG9uZW50IiwiYmV0YSIsInVzZXJTZXR0aW5nc1ZvaWNlIiwiREVGQVVMVCIsIlYyQ19TZXR0aW5nc1RpdGxlIiwiY2xhc3NuYW1lcyIsImdldENsYXNzTmFtZSIsIlN3aXRjaEl0ZW0iLCJWMkNfVGFiQmFyU2VwYXJhdG9yIiwiVG9vbHRpcENsYXNzZXMiLCJnZXRUb29sdGlwQ2xhc3NlcyIsIlRvb2x0aXBMYXllcnMiLCJnZXRUb29sdGlwTGF5ZXJzIiwiZ2V0Q2xhc3MiLCJzaWRlT3JDb2xvciIsInVwcGVyQ2FzZSIsInRvb2x0aXBDbGFzcyIsImNsYXNzRXhpc3RzIiwidG9QeCIsInByZXZlbnRGbGlwIiwidG9vbHRpcEVsZW1lbnQiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwiY2FuU2hvd0Fib3ZlIiwiY2FuU2hvd0JlbG93IiwiY2FuU2hvd0xlZnQiLCJjYW5TaG93UmlnaHQiLCJfY2xhc3NOYW1lIiwic2hvd0Fib3ZlIiwic2hvd0JlbG93Iiwic2hvd0xlZnQiLCJzaG93UmlnaHQiLCJjZW50ZXJIb3Jpem9udGFsbHkiLCJjZW50ZXJWZXJ0aWNhbGx5Iiwibm9kZWNlbnRlciIsImZpbmRET01Ob2RlIiwiVjJDX1hTdmciXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FB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SCxLQURHLEVBRUg7QUFBQ3dzRCxXQUFLLEVBQUUsNEJBQVI7QUFBc0MzdEIsYUFBTyxFQUFFLFdBQS9DO0FBQTREN3pCLFdBQUssRUFBRTtBQUFDeWUsYUFBSyxFQUFFLE1BQVI7QUFBZ0JvTSxjQUFNLEVBQUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdILzJCLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0MsZUFBUyxFQUFFLFlBQVo7QUFBMEJnL0IsVUFBSSxFQUFFLE1BQWhDO0FBQXdDMmUsY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSTkrQyxtREFBSSxDQUFDeW5CLEtBQUwsQ0FBV3ZtQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUN5N0IsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJMzhCLG1EQUFJLENBQUN5bkIsS0FBTCxDQUFXdm1CLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0MsZUFBUyxFQUFFLE1BQVo7QUFBb0JnL0IsVUFBSSxFQUFFLFNBQTFCO0FBQXFDeEQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiZXhwb3J0IGNvbnN0IG1pbmltdW1EaXNjb3JkVmVyc2lvbiA9IFwiMC4wLjMwN1wiO1xuZXhwb3J0IGNvbnN0IGN1cnJlbnREaXNjb3JkVmVyc2lvbiA9ICh3aW5kb3cuRGlzY29yZE5hdGl2ZSAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24gJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24oKSkgfHwgXCIwLjAuMzA3XCI7XG5leHBvcnQgY29uc3QgbWluU3VwcG9ydGVkVmVyc2lvbiA9IFwiMC4zLjBcIjtcbmV4cG9ydCBjb25zdCBiYmRWZXJzaW9uID0gXCIwLjMuNVwiO1xuZXhwb3J0IGNvbnN0IGJiZENoYW5nZWxvZyA9IHtcbiAgICBkZXNjcmlwdGlvbjogXCJCaWcgdGhpbmdzIGFyZSBjb21pbmcuXCIsXG4gICAgY2hhbmdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgICB0aXRsZTogXCJCdWcgRml4ZXNcIixcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgXCJTb21lIGZpeGVzIHJlbGF0ZWQgdG8gc2hvd2luZyBtb2RhbHMgaW4gdGhlIGBCZEFwaWAuXCIsXG4gICAgICAgICAgICAgICAgXCJGaXhlZCB0aGUgb3BlbiBmb2xkZXIgYnV0dG9ucyBmb3IgcGx1Z2lucyBhbmQgdGhlbWVzXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgIF1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICBcIkN1c3RvbSBjc3MgbGl2ZSB1cGRhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTBcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxuICAgIFwiQmV0dGVyRGlzY29yZCBCbHVlXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy1iXCIsICBpbmZvOiBcIlJlcGxhY2UgRGlzY29yZCBibHVlIHdpdGggQkQgQmx1ZVwiLCAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IGZhbHNlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIn0sXG5cbiAgICAvKiBDb3JlICovXG4gICAgLyogPT09PT09ICovXG4gICAgXCJQdWJsaWMgU2VydmVyc1wiOiAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTFcIiwgIGluZm86IFwiRGlzcGxheSBwdWJsaWMgc2VydmVycyBidXR0b25cIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJWb2ljZSBNb2RlXCI6ICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTRcIiwgIGluZm86IFwiT25seSBzaG93IHZvaWNlIGNoYXRcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJIaWRlIENoYW5uZWxzXCI6ICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTNcIiwgIGluZm86IFwiSGlkZSBjaGFubmVscyBpbiBtaW5pbWFsIG1vZGVcIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJWb2ljZSBEaXNjb25uZWN0XCI6ICAgICAgICAgICB7aWQ6IFwiYmRhLWRjLTBcIiwgIGluZm86IFwiRGlzY29ubmVjdCBmcm9tIHZvaWNlIHNlcnZlciB3aGVuIGNsb3NpbmcgRGlzY29yZFwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCIyNCBIb3VyIFRpbWVzdGFtcHNcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLTZcIiwgIGluZm86IFwiUmVwbGFjZSAxMmhyIHRpbWVzdGFtcHMgd2l0aCBwcm9wZXIgb25lc1wiLCAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXG4gICAgXCJOb3JtYWxpemUgQ2xhc3Nlc1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy00XCIsIGluZm86IFwiQWRkcyBzdGFibGUgY2xhc3NlcyB0byBlbGVtZW50cyB0byBoZWxwIHRoZW1lcy4gKGUuZy4gYWRkcyAuZGEtY2hhbm5lbHMgdG8gLmNoYW5uZWxzLUllMmw2QSlcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxuXG4gICAgLyogQ29udGVudCAqL1xuICAgIFwiQ29udGVudCBFcnJvciBNb2RhbFwiOiAgICAgICAge2lkOiBcImZvcmstcHMtMVwiLCBpbmZvOiBcIlNob3dzIGEgbW9kYWwgd2l0aCBwbHVnaW4vdGhlbWUgZXJyb3JzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJTY2FuIFBsdWdpbnNcIjogICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy02XCIsIGluZm86IFwiU2NhbiBwbHVnaW5zIGZvciBhbnkgdGhyZWF0IHRoYXQgY2FuIGJlIGhpZGRlbiBpbnNpZGUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXG4gICAgXCJTaG93IFRvYXN0c1wiOiAgICAgICAgICAgICAgICB7aWQ6IFwiZm9yay1wcy0yXCIsIGluZm86IFwiU2hvd3MgYSBzbWFsbCBub3RpZmljYXRpb24gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvblwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiU2Nyb2xsIFRvIFNldHRpbmdzXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtM1wiLCBpbmZvOiBcIkF1dG8tc2Nyb2xscyB0byBhIHBsdWdpbidzIHNldHRpbmdzIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIChvbmx5IGlmIG91dCBvZiB2aWV3KVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiQXV0b21hdGljIExvYWRpbmdcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNVwiLCBpbmZvOiBcIkF1dG9tYXRpY2FsbHkgbG9hZHMsIHJlbG9hZHMsIGFuZCB1bmxvYWRzIHBsdWdpbnMgYW5kIHRoZW1lc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxuICAgIFwiRW5hYmxlIEVkaXQgQnV0dG9uXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtN1wiLCBpbmZvOiBcIkVuYWJsZSBhbiBFZGl0IEJ1dHRvbiBvbiB0aGUgcGx1Z2luIGFuZCB0aGVtZSBwYW5lbC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcbiAgICBcIlRoZW1lcyBpbiBQb3BvdXQgV2luZG93XCI6ICAgIHtpZDogXCJsaWdodGNvcmQtOVwiLCBpbmZvOiBcIkVuYWJsZSB0aGVtZXMgaW4gUG9wb3V0IFdpbmRvdy4gKEZvciBleGFtcGxlLCB3aGVuIGRldGFjaGluZyBzY3JlZW5zaGFyZS4pXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIiwgZXhwZXJpbWVudGFsOiB0cnVlfSxcblxuICAgIC8qIERldmVsb3BlciAqL1xuICAgIFwiRGV2ZWxvcGVyIE1vZGVcIjogICAgICAgICBcdCAge2lkOiBcImJkYS1ncy04XCIsIGluZm86IFwiRGV2ZWxvcGVyIE1vZGUgVG9nZ2xlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXG4gICAgXCJDb3B5IFNlbGVjdG9yXCI6XHRcdFx0ICB7aWQ6IFwiZm9yay1kbS0xXCIsIGluZm86IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxuXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xuICAgIFwiRGlzYWJsZSBCZXR0ZXJEaXNjb3JkXCI6ICAgICAge2lkOiBcImJkLWRpc2FibGVcIiwgIGluZm86IFwiRGlzYWJsZSBCZXR0ZXJkaXNjb3JkIChwbHVnaW5zLCB0aGVtZXMsIGV0YykgKE5vdCBpbXBsZW1lbnRlZCkuXCIsIGltcGxlbWVudGVkOiBmYWxzZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJCbHVyIFBlcnNvbmFsIEluZm9ybWF0aW9uXCI6ICB7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiRGV2ZWxvcGVyIE9wdGlvbnNcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0xXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyAmIExpZ2h0Y29yZCdzIEludGVybmFsIERldmVsb3BlciBPcHRpb25zLiBUaGlzIGFsbG93IHRoZSBcXFwiRXhwZXJpbWVudHNcXFwiIHRhYiwgdGhlIFxcXCJEZXZlbG9wZXIgT3B0aW9uc1xcXCIgdGFiIGFuZCB0aGUgXFxcIkxpZ2h0Y29yZCBBcGlcXFwiIHNlY3Rpb24uXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcbiAgICBcIkFkIEJsb2NrXCI6ICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtNFwiLCBpbmZvOiBcIkJsb2NrIGFueSBCT1QgdGhhdCBkbXMgeW91IHdpdGggYW4gaW52aXRlIGxpbmsuIEV2ZW4gaW4gYW4gZW1iZWQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxuICAgIFwiRGlzYWJsZSB0eXBpbmdcIjogICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC03XCIsIGluZm86IFwiRG9uJ3QgbGV0IG90aGVyIHNlZSB5b3UncmUgdHlwaW5nLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXG4gICAgXCJMaWdodGNvcmQgVGFic1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLThcIiwgaW5mbzogXCJBbGxvd3MgeW91IHRvIGxhdW5jaCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgTGlnaHRjb3JkIGluIHRoZSBzYW1lIHdpbmRvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCIsIGV4cGVyaW1lbnRhbDogdHJ1ZX0sXG4gICAgXCJVc2UgTm90aWZpY2F0aW9uIFNoaW1cIjogICAgICB7aWQ6IFwibGlnaHRjb3JkLTEwXCIsIGluZm86IFwiQmFzaWNhbGx5IGRvbid0IHVzZSBXaW5kb3dzJ3MgTm90aWZpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJ3aW4zMlwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IGZhbHNlfSxcblxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgdGhlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcbiAgICBcIk5vIFdpbmRvdyBCb3VuZHNcIjogICAgICAgICAgIHtpZDogXCJub193aW5kb3dfYm91bmRcIiwgaW5mbzogXCJEaXNhYmxlIFdpbmRvdyBCb3VuZHMuIENhbiBiZSB1c2VmdWwgaWYgeW91IHVzZSBhIHdpbmRvdyBtYW5hZ2VyLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBwcm9jZXNzLnBsYXRmb3JtICE9PSBcImxpbnV4XCIsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxuICAgIFwiRW5hYmxlIEdsYXNzdHJvblwiOiAgICAgICAgICAge2lkOiBcImVuYWJsZV9nbGFzc3Ryb25cIiwgaW5mbzogXCJFbmFibGUgR2xhc3N0cm9uLiBJZiB5b3UncmUgbm90IHVzaW5nIHRyYW5zcGFyZW50IHRoZW1lcywgdGhpcyBjYW4gcmVkdWNlIGxhZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxuICAgIFxuICAgIC8qKiBSaWNoUHJlc2VuY2UgKi9cbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXG4gICAgXCJiZGEtZ3MtMlwiOiBmYWxzZSxcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXG4gICAgXCJiZGEtZ3MtNVwiOiB0cnVlLFxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcbiAgICBcImJkYS1ncy04XCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLTBcIjogdHJ1ZSxcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXG4gICAgXCJiZGEtZXMtMlwiOiB0cnVlLFxuICAgIFwiYmRhLWVzLTRcIjogZmFsc2UsXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxuICAgIFwiYmRhLWVzLTdcIjogdHJ1ZSxcbiAgICBcImJkYS1ncy1iXCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcbiAgICBcImJkYS1kYy0wXCI6IGZhbHNlLFxuICAgIFwiYmRhLWNzcy0wXCI6IGZhbHNlLFxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxuICAgIFwiYmRhLWVzLTlcIjogdHJ1ZSxcbiAgICBcImZvcmstZG0tMVwiOiBmYWxzZSxcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxuICAgIFwiZm9yay1wcy0yXCI6IHRydWUsXG4gICAgXCJmb3JrLXBzLTNcIjogdHJ1ZSxcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxuICAgIFwiZm9yay1wcy01XCI6IHRydWUsXG4gICAgXCJmb3JrLXBzLTZcIjogdHJ1ZSxcbiAgICBcImZvcmstcHMtN1wiOiBmYWxzZSxcbiAgICBcImZvcmstZXMtMlwiOiBmYWxzZSxcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxuICAgIFwiZm9yay13cC0xXCI6IGZhbHNlLFxuICAgIFwiZm9yay13cC0yXCI6IGZhbHNlLFxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXG4gICAgXCJsaWdodGNvcmQtMVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0yXCI6IHRydWUsXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0zXCI6IGZhbHNlLFxuICAgIFwibGlnaHRjb3JkLTRcIjogZmFsc2UsXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxuICAgIFwibGlnaHRjb3JkLTZcIjogdHJ1ZSxcbiAgICBcImxpZ2h0Y29yZC03XCI6IGZhbHNlLFxuICAgIFwibGlnaHRjb3JkLThcIjogZmFsc2UsXG4gICAgXCJsaWdodGNvcmQtOVwiOiBmYWxzZSxcbiAgICBcImxpZ2h0Y29yZC0xMFwiOiBmYWxzZSxcbiAgICBcIm5vX3dpbmRvd19ib3VuZFwiOiBmYWxzZSxcbn07XG5cblxuZXhwb3J0IGNvbnN0IHNldHRpbmdzQ29va2llID0ge307XG5cbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRSUEMgPSB7XG4gICAgXCJuYW1lXCI6IFwiTGlnaHRjb3JkXCIsXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxuICAgIFwic3RhdGVcIjogXCJMaWdodGNvcmQgQ2xpZW50XCIsXG4gICAgXCJkZXRhaWxzXCI6IFwiQnJvd3NpbmcgRGlzY29yZFwiLFxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxuICAgIFwiYXNzZXRzLnNtYWxsXCI6IG51bGwsXG4gICAgXCJhc3NldHMubGFyZ2VcIjogXCI3MTIzMjM4MjEwMzc2ODI3OTFcIlxufVxuXG5leHBvcnQgY29uc3QgbGlnaHRjb3JkU2V0dGluZ3MgPSB7fTtcbmV4cG9ydCBjb25zdCBkZWZhdWx0TGlnaHRjb3JkU2V0dGluZ3MgPSB7fTtcblxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XG5leHBvcnQgY29uc3QgYmR0aGVtZUVycm9ycyA9IFtdOyAvLyBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XG5cbmV4cG9ydCBjb25zdCBiZHRoZW1lcyA9IHt9O1xuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luQ29va2llID0ge307XG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xuaW1wb3J0IGxvYWRpbmdJY29uIGZyb20gXCIuL2xvYWRpbmdJY29uXCI7XG5sb2NhbFN0b3JhZ2VGaXgoKTtcbmxvYWRpbmdJY29uKCk7XG5cbmNvbnN0IGRlcHJlY2F0ZUdsb2JhbCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGVkIEdsb2JhbFwiLCBgXCIke2tleX1cIiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiBQbGVhc2Ugb25seSB1c2UgQmRBcGkuYCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTsgIFxufTtcblxuXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XG5cbmNvbnN0IGdsb2JhbEtleXMgPSBPYmplY3Qua2V5cyhHbG9iYWxzKTtcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XG5cblxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL21vZHVsZXMvYmRFdmVudHNcIjtcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcblxuZGVwcmVjYXRlR2xvYmFsKFwiQkRWMlwiLCBCRFYyKTtcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xuZGVwcmVjYXRlR2xvYmFsKFwiVXRpbHNcIiwgVXRpbHMpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcbmRlcHJlY2F0ZUdsb2JhbChcIkRhdGFTdG9yZVwiLCBEYXRhU3RvcmUpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XG5cbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xuXG5pbXBvcnQgQ29yZSBmcm9tIFwiLi9tb2R1bGVzL2NvcmVcIjtcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xuXG4vLyBUT0RPOiBDaGFuZ2UgSW5pdCBtb2RlIGFuZCBzdG9wIHVzaW5nIENvcmVXcmFwcGVyLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKGJkQ29uZmlnLCBtZXRob2RzKSB7XG4gICAgICAgIENvcmUuc2V0Q29uZmlnKGJkQ29uZmlnKTtcbiAgICAgICAgQ29yZS5zZXRNZXRob2RzKG1ldGhvZHMpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xuICAgICAgICBDb3JlLmluaXQoKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xuICAgIGNvbnN0IHYyTG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodjJMb2FkZXIpO1xufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb250ZW50V2luZG93LCB7XG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByZXZlbnQgaW50ZXJjZXB0aW9uIGJ5IHBhdGNoaW5nIFJlZmxlY3QuYXBwbHkgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XG5cbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XG4gICAgaW5qZWN0MjRIb3VyKCkge1xuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCB0d2VsdmVIb3VyID0gbmV3IFJlZ0V4cChgKFswLTldezEsMn0pOihbMC05XXsxLDJ9KVxcXFxzKEFNfFBNKWApO1xuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IGRhdGEucmV0dXJuVmFsdWUubWF0Y2godHdlbHZlSG91cik7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWUucmVwbGFjZShtYXRjaGVkWzBdLCBgJHttYXRjaGVkWzFdID09PSBcIjEyXCIgPyBcIjEyXCIgOiBwYXJzZUludChtYXRjaGVkWzFdKSArIDEyfToke21hdGNoZWRbMl19YCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2FuY2VsQ296eSA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJjYWxlbmRhckZvcm1hdFwiLCB7YWZ0ZXI6IGNvbnZlcnR9KTsgLy8gQ2FsbGVkIGluIENvenkgbW9kZVxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcbiAgICB9XG5cbiAgICByZW1vdmUyNEhvdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbmNlbDI0SG91cikgdGhpcy5jYW5jZWwyNEhvdXIoKTtcbiAgICB9XG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXG5cbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XG5sZXQgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cblxuY29uc3QgYmxvY2tlZCA9IHt9XG5cbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXG5mdW5jdGlvbiBnZXRDdXJyZW50VXNlcigpe1xuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgZW5hYmxlKCl7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICAgIGRpc3BhdGNoZXIuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpe1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcbiAgICB9XG5cbiAgICBhbnRpRE0oZXYpe1xuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxuICAgICAgICBpZihldi5tZXNzYWdlLmF1dGhvci5pZCA9PT0gZ2V0Q3VycmVudFVzZXIoKS5pZClcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsKGV2Lm1lc3NhZ2UuY2hhbm5lbF9pZClcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxuXG4gICAgICAgIGlmKGNoYW5uZWwudHlwZSAhPT0gMSlyZXR1cm5cblxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cblxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcbiAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChgW0FkQmxvY2tdOiBCbG9ja2VkICR7ZXYubWVzc2FnZS5hdXRob3IudXNlcm5hbWV9IyR7ZXYubWVzc2FnZS5hdXRob3IuZGlzY3JpbWluYXRvcn1gLCB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYoIXJlbGF0aW9uU2hpcE1vZHVsZSlyZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXG4gICAgICAgICAgICB9LCAyKVxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxuICAgIGlmKEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5nZy9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmNvbS9pbnZpdGUvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZGFwcC5jb20vaW52aXRlL1wiKSlyZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkcyB8fCBbXVxuICAgIGlmKGVtYmVkcy5sZW5ndGggPT09IDApcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcbiAgICAgICAgaWYoKGVtYmVkLnRpdGxlIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxuICAgICAgICBpZigoZW1iZWQuZmllbGRzIHx8IFtdKS5tYXAoZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZS52YWx1ZS5pbmNsdWRlcyhzZWFyY2gpIHx8IGUubmFtZS5pbmNsdWRlcyhzZWFyY2gpXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcbn0iLCJpbXBvcnQge3NldHRpbmdzUlBDLCBkZWZhdWx0UlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcblxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxuY29uc3QgQWN0aW9uVHlwZXMgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uQWN0aW9uVHlwZXMpWzBdLkFjdGlvblR5cGVzXG5cbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcbmNvbnN0IHBpZCA9IHByb2Nlc3MucGlkXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG5cbiAgICAgICAgdGhpcy5nYW1lID0gc2V0dGluZ3NSUENcbiAgICB9XG4gICAgXG4gICAgZ2V0IGZvcm1hdGVkR2FtZSgpe1xuICAgICAgICBpZighdGhpcy5nYW1lKXJldHVybiBudWxsXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcbiAgICAgICAgbGV0IGdhbWUgPSB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcbiAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxuICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdhbWVcbiAgICB9XG5cbiAgICBzZW5kR2FtZSgpe1xuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQ0FMX0FDVElWSVRZX1VQREFURSxcbiAgICAgICAgICAgIHNvY2tldElkLFxuICAgICAgICAgICAgcGlkLFxuICAgICAgICAgICAgYWN0aXZpdHk6IHRoaXMuZm9ybWF0ZWRHYW1lXG4gICAgICAgIH0pICAgXG4gICAgfVxuXG4gICAgZW5hYmxlKCkge1xuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcbiAgICAgICAgY29uc29sZS5sb2coXCJFbmFibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXG5cbiAgICAgICAgdGhpcy5zZXQoc2V0dGluZ3NSUEMgfHwgT2JqZWN0LmNyZWF0ZShkZWZhdWx0UlBDKSlcblxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXG5cbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBc3NldHMoYXBwbGljYXRpb25JZCl7XG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxuICAgICAgICBpZihhc3NldHMudW5kZWZpbmVkICYmIHR5cGVvZiBhc3NldHMudW5kZWZpbmVkID09PSBcIm51bWJlclwiKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXBwbGljYXRpb25cIilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNzZXRzXG4gICAgfVxuXG4gICAgc2V0KGFjdGl2aXR5KXtcbiAgICAgICAgdGhpcy5nYW1lID0gYWN0aXZpdHlcblxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcbiAgICB9XG59IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL2Rpc3RhbnRcIjtcbmltcG9ydCB7IHRpbWluZ1NhZmVFcXVhbCB9IGZyb20gXCJjcnlwdG9cIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIExheWVycyB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5sYXllcnMgPSBbXVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuTGF5ZXJzID0gdGhpc1xuICAgIH1cblxuICAgIGdldCBpc0luamVjdGVkKCl7XG4gICAgICAgIHJldHVybiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJkaXYuTGF5ZXJzLmluamVjdGVkXCIpXG4gICAgfVxuXG4gICAgaW5qZWN0KCl7XG4gICAgICAgIGlmKHRoaXMuaXNJbmplY3RlZClyZXR1cm5cbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyc1xuICAgICAgICBdID0gW1xuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEodjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpLmxheWVycylcbiAgICAgICAgXVxuICAgICAgICBjb25zdCBsYXllcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUxheWVycyk7XG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IFJlYWN0SW5zdGFuY2UgPSBMaWdodGNvcmQuQXBpLlV0aWxzLkZpbmRSZWFjdChsYXllcnMsIDEpXG4gICAgICAgIGlmKCFSZWFjdEluc3RhbmNlKXJldHVybiBsYXllcnNcbiAgICAgICAgdGhpcy5SZWFjdEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZVxuICAgICAgICBsZXQgcmVuZGVyID0gUmVhY3RJbnN0YW5jZS5yZW5kZXJcbiAgICAgICAgUmVhY3RJbnN0YW5jZS5yZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSByZW5kZXIuY2FsbChSZWFjdEluc3RhbmNlKVxuICAgICAgICAgICAgbGV0IGNsYXNzTGlzdCA9IHJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuWzFdLnByb3BzLmNsYXNzTmFtZS5zcGxpdChcIiBcIilcbiAgICAgICAgICAgIGNsYXNzTGlzdC5wdXNoKFwiTGF5ZXJzXCIpXG4gICAgICAgICAgICBjbGFzc0xpc3QucHVzaChcImluamVjdGVkXCIpXG4gICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jbGFzc05hbWUgPSBjbGFzc0xpc3Quam9pbihcIiBcIilcblxuICAgICAgICAgICAgdGhpcy5sYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW4ucHVzaChsYXllclsxXSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICAgICAgICB9XG4gICAgICAgIFJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxuICAgIH1cblxuICAgIGNyZWF0ZUxheWVyKGNoaWxkcmVuLCBwcm9wcyA9IHt9KXtcbiAgICAgICAgbGV0IGlkID0gdXVpZHY0KClcbiAgICAgICAgbGV0IGxheWVyID0gbnVsbFxuICAgICAgICB0aGlzLmxheWVycy5wdXNoKFtpZCwgPExheWVyIHsuLi5wcm9wc30gZ2V0TGF5ZXI9e2xheSA9PiB7XG4gICAgICAgICAgICBsYXllciA9IGxheVxuICAgICAgICB9fSBrZXk9e2lkfSBpZD17aWR9IHJlbW92ZT17KCkgPT4ge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXG4gICAgICAgICAgICBpZihpbmRleCA9PT0gLTEpcmV0dXJuXG4gICAgICAgICAgICB0aGlzLmxheWVycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICBsYXllciA9IG51bGxcbiAgICAgICAgICAgIGlmKHRoaXMuUmVhY3RJbnN0YW5jZSl0aGlzLlJlYWN0SW5zdGFuY2UuZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgdGhpcy5pbmplY3QoKVxuICAgICAgICB9fT57Y2hpbGRyZW59PC9MYXllcj5dKVxuICAgICAgICBpZih0aGlzLlJlYWN0SW5zdGFuY2UpdGhpcy5SZWFjdEluc3RhbmNlLmZvcmNlVXBkYXRlKClcbiAgICAgICAgdGhpcy5pbmplY3QoKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVtb3ZlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoIWxheWVyKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5sYXllcnMuZmluZEluZGV4KGUgPT4gZVswXSA9PT0gaWQpXG4gICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID09PSAtMSlyZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgICAgICAgICBsYXllciA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5SZWFjdEluc3RhbmNlKXRoaXMuUmVhY3RJbnN0YW5jZS5mb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0KClcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIucmVtb3ZlKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxubGV0IExheWVyTW9kdWxlc1xuZXhwb3J0IGNsYXNzIExheWVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhbmltYXRpb246IG5ldyB0aGlzLm1vZHVsZXNbMF0uZGVmYXVsdC5WYWx1ZSgwKVxuICAgICAgICB9IFxuICAgICAgICB0aGlzLnByb3BzLmdldExheWVyKHRoaXMpXG4gICAgICAgIHRoaXMua2V5ZG93biA9IHRoaXMua2V5ZG93bi5iaW5kKHRoaXMpXG4gICAgfVxuXG4gICAga2V5ZG93bihlKXtcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gTGF5ZXJNb2R1bGVzIHx8IChMYXllck1vZHVsZXMgPSBbXG4gICAgICAgICAgICB2Mi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5WYWx1ZSAmJiBlLmRlZmF1bHQuZGl2KVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmtleWRvd24pXG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoZXYpe1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5rZXlkb3duKVxuICAgIH1cblxuICAgIHJlbW92ZSgpe1xuICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSgpXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbEVudGVyKGV2KXtcbiAgICAgICAgdGhpcy5tb2R1bGVzWzBdLmRlZmF1bHQudGltaW5nKHRoaXMuc3RhdGUuYW5pbWF0aW9uLCB7XG4gICAgICAgICAgICB0b1ZhbHVlOiAxLFxuICAgICAgICAgICAgZHVyYXRpb246IDEwMFxuICAgICAgICB9KS5zdGFydChldilcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsTGVhdmUoZXYpe1xuICAgICAgICB0aGlzLm1vZHVsZXNbMF0uZGVmYXVsdC50aW1pbmcodGhpcy5zdGF0ZS5hbmltYXRpb24sIHtcbiAgICAgICAgICAgIHRvVmFsdWU6IDAsXG4gICAgICAgICAgICBkdXJhdGlvbjogMTAwXG4gICAgICAgIH0pLnN0YXJ0KGV2KVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgaW50ZXJwb2xhdGlvbiA9IHRoaXMuc3RhdGUuYW5pbWF0aW9uLmludGVycG9sYXRlKHtcbiAgICAgICAgICAgIGlucHV0UmFuZ2U6IFswLCAxXSxcbiAgICAgICAgICAgIG91dHB1dFJhbmdlOiBbMS4wNywgMV1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHN0eWxlID0ge1xuICAgICAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5hbmltYXRpb24sXG4gICAgICAgICAgICB0cmFuc2Zvcm06IFt7XG4gICAgICAgICAgICAgICAgc2NhbGU6IGludGVycG9sYXRpb25cbiAgICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgICAgbGV0IERpdiA9IHRoaXMubW9kdWxlc1swXS5kZWZhdWx0LmRpdlxuICAgICAgICByZXR1cm4gPERpdiBjbGFzc05hbWU9e1tfX1NFQ1JFVF9FTU9USU9OX18uY3NzKHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjpcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIixcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgV2Via2l0Qm94T3JpZW50OiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICBXZWJraXRCb3hEaXJlY3Rpb246IFwibm9ybWFsXCIsXG4gICAgICAgICAgICBtc0ZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgekluZGV4OiAxMDFcbiAgICAgICAgfSkscHJvY2Vzcy5wbGF0Zm9ybT09PVwid2luMzJcIj9fX1NFQ1JFVF9FTU9USU9OX18uY3NzKHtcbiAgICAgICAgICAgIHRvcDogXCItMjJweFwiLFxuICAgICAgICAgICAgcGFkZGluZ1RvcDogXCIyMnB4XCJcbiAgICAgICAgfSk6bnVsbCwuLi4odGhpcy5wcm9wcy5jbGFzc05hbWU/dGhpcy5wcm9wcy5jbGFzc05hbWUuc3BsaXQoXCIgXCIpOltdKV0uZmlsdGVyKGU9PmUpLmpvaW4oXCIgXCIpIHx8IG51bGx9IHN0eWxlPXtzdHlsZX0+XG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgIDwvRGl2PlxuICAgIH1cbn1cbkxheWVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBpZDogbnVsbCxcbiAgICBjaGlsZHJlbjogbnVsbFxufSIsImltcG9ydCB7cGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBtYWluQ29yZSBmcm9tIFwiLi9jb3JlXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xuaW1wb3J0IHNldHRpbmdzUGFuZWwgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuXG5jb25zdCBCZEFwaSA9IHtcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxuICAgIGdldCBSZWFjdERPTSgpIHsgcmV0dXJuIEJEVjIuUmVhY3REb207IH0sXG4gICAgZ2V0IFJlYWN0Q29tcG9uZW50KCkge3JldHVybiBCRFYyLlJlYWN0Q29tcG9uZW50O30sXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcbiAgICBnZXQgc2V0dGluZ3MoKSB7cmV0dXJuIHNldHRpbmdzO30sXG4gICAgZ2V0IGVtb3RlcygpIHtyZXR1cm4gbnVsbH0sIC8vIGRlcHJlY2F0ZWQsIGRlbGV0ZWQgYWxsIGVtb3RlcyBmcm9tIGJldHRlcmRpc2NvcmQuXG4gICAgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfSxcbiAgICBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XG59O1xuXG5CZEFwaS5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBVdGlscy5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpO1xufTtcblxuQmRBcGkuZ2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBVdGlscy5nZXRXaW5kb3dQcmVmZXJlbmNlKGtleSk7XG59O1xuXG5CZEFwaS5zZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpO1xufTtcblxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcbi8vaWQgPSBpZCBvZiBlbGVtZW50XG4vL2NzcyA9IGN1c3RvbSBjc3NcbkJkQXBpLmluamVjdENTUyA9IGZ1bmN0aW9uIChpZCwgY3NzKSB7XG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRChpZCksIGNzcyk7XG59O1xuXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcbi8vaWQgPSBpZCBvZiBlbGVtZW50XG5CZEFwaS5jbGVhckNTUyA9IGZ1bmN0aW9uIChpZCkge1xuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQoaWQpKTtcbn07XG5cbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXG4vL2lkID0gaWQgb2YgZWxlbWVudFxuLy9jc3MgPSBjdXN0b20gY3NzXG5CZEFwaS5saW5rSlMgPSBmdW5jdGlvbiAoaWQsIHVybCkge1xuICAgIERPTS5hZGRTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSwgdXJsKTtcbn07XG5cbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcbkJkQXBpLnVubGlua0pTID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgRE9NLnJlbW92ZVNjcmlwdChET00uZXNjYXBlSUQoaWQpKTtcbn07XG5cbi8vR2V0IGFub3RoZXIgcGx1Z2luXG4vL25hbWUgPSBuYW1lIG9mIHBsdWdpblxuQmRBcGkuZ2V0UGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoYmRwbHVnaW5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBiZHBsdWdpbnNbbmFtZV0ucGx1Z2luO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8vR2V0IEJldHRlckRpc2NvcmQgQ29yZVxuQmRBcGkuZ2V0Q29yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRpb24gTm90aWNlXCIsIGBCZEFwaS5nZXRDb3JlKCkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5gKTtcbiAgICByZXR1cm4gbWFpbkNvcmU7XG59O1xuXG4vKipcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgbW9kYWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgb2YgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBtb2RhbFxuICovXG5CZEFwaS5hbGVydCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCkge1xuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIHtjYW5jZWxUZXh0OiBudWxsfSk7XG59O1xuXG4vKipcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxuICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxuICovXG5CZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMpO1xufTtcblxuLy9TaG93IHRvYXN0IGFsZXJ0XG5CZEFwaS5zaG93VG9hc3QgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICBVdGlscy5zaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyk7XG59O1xuXG4vLyBGaW5kcyBtb2R1bGVcbkJkQXBpLmZpbmRNb2R1bGUgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGZpbHRlcik7XG59O1xuXG4vLyBGaW5kcyBtb2R1bGVcbkJkQXBpLmZpbmRBbGxNb2R1bGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEFsbChmaWx0ZXIpO1xufTtcblxuLy8gRmluZHMgbW9kdWxlXG5CZEFwaS5maW5kTW9kdWxlQnlQcm9wcyA9IGZ1bmN0aW9uKC4uLnByb3BzKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhwcm9wcyk7XG59O1xuXG5CZEFwaS5maW5kTW9kdWxlQnlQcm90b3R5cGVzID0gZnVuY3Rpb24oLi4ucHJvdG9zKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5UHJvdG90eXBlcyhwcm90b3MpO1xufTtcblxuQmRBcGkuZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUobmFtZSk7XG59O1xuXG4vLyBHZXRzIHJlYWN0IGluc3RhbmNlXG5CZEFwaS5nZXRJbnRlcm5hbEluc3RhbmNlID0gZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cualF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgbm9kZSA9IG5vZGVbMF07XG4gICAgcmV0dXJuIEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShub2RlKTtcbn07XG5cbi8vIEdldHMgZGF0YVxuQmRBcGkubG9hZERhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcbn07XG5cbkJkQXBpLmdldERhdGEgPSBCZEFwaS5sb2FkRGF0YTtcblxuLy8gU2V0cyBkYXRhXG5CZEFwaS5zYXZlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSwgZGF0YSkge1xuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIGRhdGEpO1xufTtcblxuQmRBcGkuc2V0RGF0YSA9IEJkQXBpLnNhdmVEYXRhO1xuXG4vLyBEZWxldGVzIGRhdGFcbkJkQXBpLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcbiAgICByZXR1cm4gRGF0YVN0b3JlLmRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcbn07XG5cbi8vIFBhdGNoZXMgb3RoZXIgZnVuY3Rpb25zXG5CZEFwaS5tb25rZXlQYXRjaCA9IGZ1bmN0aW9uKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gVXRpbHMubW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucyk7XG59O1xuXG4vLyBFdmVudCB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZFxuQmRBcGkub25SZW1vdmVkID0gZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gVXRpbHMub25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKTtcbn07XG5cbi8vIFdyYXBzIGZ1bmN0aW9uIGluIHRyeS4uY2F0Y2hcbkJkQXBpLnN1cHByZXNzRXJyb3JzID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIFV0aWxzLnN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSk7XG59O1xuXG4vLyBUZXN0cyBmb3IgdmFsaWQgSlNPTlxuQmRBcGkudGVzdEpTT04gPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIFV0aWxzLnRlc3RKU09OKGRhdGEpO1xufTtcblxuQmRBcGkuaXNQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiAhIXBsdWdpbkNvb2tpZVtuYW1lXTtcbn07XG5cbkJkQXBpLmlzVGhlbWVFbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiAhIXRoZW1lQ29va2llW25hbWVdO1xufTtcblxuQmRBcGkuaXNTZXR0aW5nRW5hYmxlZCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuICEhc2V0dGluZ3NDb29raWVbaWRdO1xufTtcblxuQmRBcGkuZW5hYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIHRydWUpO1xufTtcblxuQmRBcGkuZGlzYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCBmYWxzZSk7XG59O1xuXG5CZEFwaS50b2dnbGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgIXNldHRpbmdzQ29va2llW2lkXSk7XG59O1xuXG4vLyBHZXRzIGRhdGFcbkJkQXBpLmdldEJERGF0YSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0QkREYXRhKGtleSk7XG59O1xuXG4vLyBTZXRzIGRhdGFcbkJkQXBpLnNldEJERGF0YSA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0QkREYXRhKGtleSwgZGF0YSk7XG59O1xuXG5cblxuY29uc3QgbWFrZUFkZG9uQVBJID0gKGNvb2tpZSwgbGlzdCwgbWFuYWdlcikgPT4gbmV3IGNsYXNzIEFkZG9uQVBJIHtcblxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIG1hbmFnZXIuZm9sZGVyO31cblxuICAgIGlzRW5hYmxlZChuYW1lKSB7XG4gICAgICAgIHJldHVybiAhIWNvb2tpZVtuYW1lXTtcbiAgICB9XG5cbiAgICBlbmFibGUobmFtZSkge1xuICAgICAgICByZXR1cm4gbWFuYWdlci5lbmFibGUobmFtZSk7XG4gICAgfVxuXG4gICAgZGlzYWJsZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmRpc2FibGUobmFtZSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlKG5hbWUpIHtcbiAgICAgICAgaWYgKGNvb2tpZVtuYW1lXSkgdGhpcy5kaXNhYmxlKG5hbWUpO1xuICAgICAgICBlbHNlIHRoaXMuZW5hYmxlKG5hbWUpO1xuICAgIH1cblxuICAgIHJlbG9hZChuYW1lKSB7XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLnJlbG9hZChuYW1lKTtcbiAgICB9XG5cbiAgICBnZXQobmFtZSkge1xuICAgICAgICBpZiAobGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgaWYgKGxpc3RbbmFtZV0ucGx1Z2luKSByZXR1cm4gbGlzdFtuYW1lXS5wbHVnaW47XG4gICAgICAgICAgICByZXR1cm4gbGlzdFtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRBbGwoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoayA9PiB0aGlzLmdldChrKSkuZmlsdGVyKGEgPT4gYSk7XG4gICAgfVxufTtcblxuQmRBcGkuUGx1Z2lucyA9IG1ha2VBZGRvbkFQSShwbHVnaW5Db29raWUsIGJkcGx1Z2lucywgcGx1Z2luTW9kdWxlKTtcbkJkQXBpLlRoZW1lcyA9IG1ha2VBZGRvbkFQSSh0aGVtZUNvb2tpZSwgYmR0aGVtZXMsIHRoZW1lTW9kdWxlKTtcblxuZXhwb3J0IGRlZmF1bHQgQmRBcGk7XG5cbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CZEFwaSA9IEJkQXBpIiwiLyogQkRFdmVudHMgKi9cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJERXZlbnRzID0gdGhpc1xuICAgIH1cbiAgICBkaXNwYXRjaChldmVudE5hbWUsIC4uLmFyZ3MpIHt0aGlzLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTt9XG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cbn07IiwiLyoqXG4gKiBDcmVkaXRzIHRvIEBoZWxsYm91bmQxMzM3IG9uIGdpdGh1YiBmb3IgdGhlIGNzc1xuICovXG5cbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi9kb210b29sc1wiXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgc2VsZWN0b3JzXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXG5mdW5jdGlvbiBnZXRTZWxlY3RvcnMoKXtcbiAgICBsZXQgc3RhbmRhcmRTaWRlYmFyVmlldyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcbiAgICBsZXQgZGVmYXVsdENsYXNzTmFtZSA9IHJlbW92ZURhKHN0YW5kYXJkU2lkZWJhclZpZXcuc3RhbmRhcmRTaWRlYmFyVmlldylcbiAgICBsZXQgc2VsZWN0cyA9IFtdXG4gICAgbGV0IHVzZXJTZXR0aW5nc0FjY291bnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXVxuICAgIGNvbnN0IGNoaWxkcmVuID0gQkRNb2R1bGVzLmdldChlID0+IHR5cGVvZiBlLmNoaWxkcmVuID09PSBcInN0cmluZ1wiKVswXVxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAucGF5bWVudC1pbmZvIC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlc2NyaXB0aW9uICYmIHR5cGVvZiBlLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiICYmIGUuZGVzY3JpcHRpb24uaW5jbHVkZXMoXCJmb3JtVGV4dFwiKSlbMF0uZGVzY3JpcHRpb24pfWApXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnBheW1lbnRTb3VyY2VSb3cpWzBdLnBheW1lbnRTb3VyY2VSb3cpfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdWJUZXh0ICYmIGUuZGVzY3JpcHRpb25XcmFwcGVyKVswXS5zdWJUZXh0KX1gKVxuICAgIGlmKHVzZXJTZXR0aW5nc0FjY291bnQpe1xuICAgICAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcbiAgICAgICAgc2VsZWN0cy5wdXNoKGAuJHtyZW1vdmVEYSh1c2VyU2V0dGluZ3NBY2NvdW50LnVzZXJTZXR0aW5nc1NlY3VyaXR5KX0gLiR7cmVtb3ZlRGEoY2hpbGRyZW4uY2hpbGRyZW4pfSA+IGRpdjpudGgtY2hpbGQoMilgKVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhzZWxlY3RzKVxuICAgIHJldHVybiBzZWxlY3RzXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICB9XG5cbiAgICBlbmFibGUoKXtcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycyB8fCBnZXRTZWxlY3RvcnMoKVxuXG4gICAgICAgIGlmKCFzZWxlY3RvcnMpY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIHNlbGVjdG9ycyB0byBibHVyIHBlcnNvbm5hbCBpbmZvcm1hdGlvbnMuXCIpKVxuICAgICAgICBET01Ub29scy5hZGRTdHlsZShcImJsdXJQcml2YXRlXCIsIGBcbiR7c2VsZWN0b3JzLmpvaW4oXCIsIFwiKX0ge1xuICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41Myk7XG4gICAgZmlsdGVyOiBibHVyKDRweCk7XG4gICAgb3BhY2l0eTogLjg7XG59XG5cbiR7c2VsZWN0b3JzLm1hcChlID0+IGUrXCI6aG92ZXJcIikuam9pbihcIiwgXCIpfSAge1xuICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBjdWJpYy1iZXppZXIoLjU1LC4wOSwuNjgsLjUzKTtcbiAgICBmaWx0ZXI6IG5vbmU7XG4gICAgb3BhY2l0eTogMTtcbn1gKVxuICAgIH1cblxuICAgIGRpc2FibGUoKXtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgRE9NVG9vbHMucmVtb3ZlU3R5bGUoXCJibHVyUHJpdmF0ZVwiKVxuICAgIH1cbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcblxuY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IFwiZGFcIjtcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ2xhc3NOb3JtYWxpemVyIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQ2xhc3NOb3JtYWxpemVyID0gdGhpc1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMucmV2ZXJ0RWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF0Y2hET01NZXRob2RzKCk7XG4gICAgfVxuXG4gICAgcGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVucGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvdWxkSWdub3JlKHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcImxheWVyQ29udGFpbmVyLVwiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSAmJiAodmFsdWUubGVuZ3RoID09IDcgfHwgdmFsdWUubGVuZ3RoID09IDQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1vZHVsZUZpbHRlcihtb2R1bGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtb2R1bGUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG1vZHVsZSkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBtb2R1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdCh2YWx1ZS5zcGxpdChcIiBcIilbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwYXRjaENsYXNzTW9kdWxlKGNvbXBvbmVudE5hbWUsIGNsYXNzTmFtZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5vcm1hbENsYXNzLm1hdGNoKHJhbmRDbGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gubGVuZ3RoIHx8IG1hdGNoLmxlbmd0aCA8IDIpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgZXZlciBoYXBwZW4gc2luY2UgdGhleSBwYXNzZWQgdGhlIG1vZHVsZUZpbHRlciwgYnV0IHlvdSBuZXZlciBrbm93XG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gKz0gYCAke2NvbXBvbmVudE5hbWV9LSR7Y2FtZWxDYXNlfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbmV3U3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbENsYXNzLnN0YXJ0c1dpdGgoYCR7Y29tcG9uZW50TmFtZX0tYCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG5ld1N0cmluZyArPSBgICR7bm9ybWFsQ2xhc3N9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gPSBuZXdTdHJpbmcudHJpbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbm9ybWFsaXplRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gY2xhc3Nlcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjbGFzc2VzW2NdLm1hdGNoKHJhbmRDbGFzcylbMV07XG4gICAgICAgICAgICBjb25zdCBuZXdDbGFzcyA9IG1hdGNoLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikgdGhpcy5ub3JtYWxpemVFbGVtZW50KGNoaWxkKTtcbiAgICB9XG5cbiAgICByZXZlcnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5jaGlsZHJlblswXSk7XG4gICAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRvUmVtb3ZlKTtcbiAgICB9XG5cbiAgICBwYXRjaERPTU1ldGhvZHMoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0b2tlbnMgPSB0b2tlbi5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xuICAgICAgICAgICAgLy8gcmV0dXJuIHRva2Vucy5ldmVyeSh0ID0+IGNvbnRhaW5zLmNhbGwodGhpcywgdCkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocmVtb3ZlLCB0aGlzLCB0b2tlbnMpO1xuICAgICAgICB9O1xuICAgIH1cblxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbG9yZWRUZXh0IHtcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcbiAgICAgICAgaWYgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFR5cGUuX19vcmlnaW5hbE1ldGhvZCkgcmV0dXJuOyAvLyBEb24ndCBwYXRjaCBhZ2FpblxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZUNvbG9yID0gc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSA/IHByb3BzLm1lc3NhZ2UuY29sb3JTdHJpbmcgfHwgXCJcIiA6IFwiXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSwgb3JpZ2luYWxUeXBlKTtcbiAgICAgICAgfX0pO1xuICAgIH1cblxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5cIitjbGFzc05hbWVNYXJrdXAuc3BsaXQoXCIgXCIpWzBdKS5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcbmltcG9ydCB7IGVuY3J5cHRTZXR0aW5nc0NhY2hlLCBkZWNyeXB0U2V0dGluZ3NDYWNoZSwgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpLk1vZHVsZTtcbk1vZHVsZS5nbG9iYWxQYXRocy5wdXNoKHBhdGgucmVzb2x2ZShyZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcC5nZXRBcHBQYXRoKCksIFwibm9kZV9tb2R1bGVzXCIpKTtcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xuICAgIH1cbn1cbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xuY29uc3Qgb3JpZ2luYWxDU1NSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA/IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gOiAoKSA9PiB7cmV0dXJuIG51bGw7fTtcbmNvbnN0IHNwbGl0UmVnZXggPSAvW15cXFNcXHJcXG5dKj8oPzpcXHJcXG58XFxuKVteXFxTXFxyXFxuXSo/XFwqW15cXFNcXHJcXG5dPy87XG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xuXG5leHBvcnQgbGV0IGFkZG9uQ2FjaGUgPSB7fVxuXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29udGVudE1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGltZUNhY2hlID0ge307XG4gICAgICAgIHRoaXMud2F0Y2hlcnMgPSB7fTtcbiAgICB9XG5cbiAgICBwYXRjaEV4dGVuc2lvbnMoKXtcbiAgICAgICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cbiAgICAgICAgaGFzUGF0Y2hlZCA9IHRydWVcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA9IHRoaXMuZ2V0Q29udGVudFJlcXVpcmUoXCJ0aGVtZVwiKTtcbiAgICB9XG5cbiAgICBnZXQgcGx1Z2luc0ZvbGRlcigpIHtyZXR1cm4gdGhpcy5fcGx1Z2luc0ZvbGRlciB8fCAodGhpcy5fcGx1Z2luc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInBsdWdpbnMvXCIpKSk7fVxuICAgIGdldCB0aGVtZXNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3RoZW1lc0ZvbGRlciB8fCAodGhpcy5fdGhlbWVzRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwidGhlbWVzL1wiKSkpO31cblxuICAgIGxvYWRBZGRvbkNlcnRpZmllckNhY2hlKCl7XG4gICAgICAgIGlmKHR5cGVvZiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIpICE9PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IEpTT04ucGFyc2UoZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSkpXG4gICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShcInt9XCIpKVxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKGFkZG9uQ2FjaGUpXG4gICAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2tleV1cbiAgICAgICAgICAgIGlmKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cblxuICAgICAgICAgICAgbGV0IHByb3BzID0gW3tcbiAgICAgICAgICAgICAgICBrZXk6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJyZXN1bHRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImhhc2hcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiXG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgZm9yKGxldCBwcm9wIG9mIHByb3BzKXtcbiAgICAgICAgICAgICAgICBpZighKHByb3Aua2V5IGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcC5rZXldICE9PSBwcm9wLnR5cGUpe1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZhbHVlLmhhc2ggIT09IGtleSl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodmFsdWUucmVzdWx0LnN1c3BlY3QpeyAvLyByZWZldGNoIGZyb20gcmVtb3RlIHRvIGJlIHN1cmUgeW91J3JlIHVwIHRvIGRhdGUuXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnNhdmVBZGRvbkNhY2hlKClcbiAgICB9XG5cbiAgICBzYXZlQWRkb25DYWNoZSgpe1xuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKEpTT04uc3RyaW5naWZ5KGFkZG9uQ2FjaGUpKSlcbiAgICB9XG5cbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gY29udGVudFR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xuICAgICAgICB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSA9IGZzLndhdGNoKGJhc2VGb2xkZXIsIHtwZXJzaXN0ZW50OiBmYWxzZX0sIGFzeW5jIChldmVudFR5cGUsIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcbiAgICAgICAgICAgIHRyeSB7ZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7fVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XG4gICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy5tdGltZSB8fCAhc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPSBzdGF0cy5tdGltZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLmxvYWRUaGVtZShmaWxlbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5yZWxvYWRQbHVnaW4oZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1bndhdGNoQ29udGVudChjb250ZW50VHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXTtcbiAgICB9XG5cbiAgICBleHRyYWN0TWV0YShjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XG4gICAgICAgIGlmIChoYXNPbGRNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU9sZE1ldGEoY29udGVudCk7XG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XG4gICAgICAgIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xuICAgIH1cblxuICAgIHBhcnNlT2xkTWV0YShjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xuICAgICAgICBpZiAobWV0YS5pbmRleE9mKFwiTUVUQVwiKSA8IDApIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIHdhcyBub3QgZm91bmQuXCIpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xuICAgICAgICBpZiAoIXBhcnNlZC5uYW1lKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSBtaXNzaW5nIG5hbWUgZGF0YS5cIik7XG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xuICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuc3BsaXQoXCIvKipcIiwgMilbMV0uc3BsaXQoXCIqL1wiLCAxKVswXTtcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XG4gICAgICAgIGxldCBhY2N1bSA9IFwiXCI7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gXCJAXCIgJiYgbGluZS5jaGFyQXQoMSkgIT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZpZWxkID0gbGluZS5zdWJzdHIoMSwgbCAtIDEpO1xuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcbiAgICAgICAgb3V0LmZvcm1hdCA9IFwianNkb2NcIjtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyBzZWxmLnBsdWdpbnNGb2xkZXIgOiBzZWxmLnRoZW1lc0ZvbGRlcjtcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lLCBcInV0ZjhcIik7XG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoZmlsZW5hbWUpO1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XG4gICAgICAgICAgICBtZXRhLmFkZGVkID0gc3RhdHMuYXRpbWVNcztcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcbiAgICAgICAgICAgIGlmICghaXNQbHVnaW4pIHtcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGBtb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O2A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgbW9kdWxlLmZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhLnR5cGUgPSBtb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYFxcbm1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07XFxubW9kdWxlLmV4cG9ydHMudHlwZSA9ICR7bWV0YS5leHBvcnRzIHx8IG1ldGEubmFtZX07YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2R1bGUuX2NvbXBpbGUoY29udGVudCwgZmlsZW5hbWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6ICgpID0+IHt9LFxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxuICAgICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uOiAoKSA9PiB7cmV0dXJuIGRhdGEubWVzc2FnZSA/IGRhdGEubWVzc2FnZSA6IFwiVGhpcyBwbHVnaW4gd2FzIHVuYWJsZSB0byBiZSBsb2FkZWQuIENoZWNrIHRoZSBhdXRob3IncyBwYWdlIGZvciB1cGRhdGVzLlwiO30sXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUgfHwgZGF0YS5maWxlbmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcbiAgICAgICAgICAgIHdlYnNpdGU6IGRhdGEud2Vic2l0ZSA/IGRhdGEud2Vic2l0ZSA6IFwiXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcblxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0sIChoYXNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LCB0cnVlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmKHJlc3VsdCl7XG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZVtyZXN1bHQuaGFzaF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogcmVzdWx0Lmhhc2gsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFkZG9uQ2FjaGUoKVxuICAgICAgICAgICAgICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XG4gICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb21waWxlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIil9XG4gICAgICAgIGNvbnRlbnQuaWQgPSBVdGlscy5lc2NhcGVJRChjb250ZW50Lm5hbWUpO1xuICAgICAgICAvL2lmKCFpZClyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJJbnZhbGlkIElEXCIsIGVycm9yOiBuZXcgRXJyb3IoXCJQbGVhc2UgZml4IHRoZSBuYW1lIG9mIFwiK2ZpbGVuYW1lK1wiLiBCZXR0ZXJEaXNjb3JkIGNhbid0IGVzY2FwZSBhbiBJRC5cIil9XG4gICAgICAgIGlmIChpc1BsdWdpbikge1xuICAgICAgICAgICAgaWYgKCFjb250ZW50LnR5cGUpIHJldHVybjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldO1xuICAgICAgICAgICAgICAgIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldID0gY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgYmR0aGVtZXNbY29udGVudC5uYW1lXTtcbiAgICAgICAgICAgIGJkdGhlbWVzW2NvbnRlbnQubmFtZV0gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgfSAgIFxuXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlbGV0ZSB3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIHVubG9hZGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX07fVxuICAgIH1cblxuICAgIGlzTG9hZGVkKGZpbGVuYW1lLCB0eXBlKSB7XG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XG4gICAgICAgIHRyeSB7d2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07fVxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIGZhbHNlO31cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xuICAgICAgICBjb25zdCBjYW50VW5sb2FkID0gdGhpcy51bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcbiAgICAgICAgaWYgKGNhbnRVbmxvYWQpIHJldHVybiBjYW50VW5sb2FkO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XG4gICAgfVxuXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xuICAgICAgICBjb25zdCBjb250ZW50TGlzdCA9IE9iamVjdC52YWx1ZXMoaXNQbHVnaW4gPyBiZHBsdWdpbnMgOiBiZHRoZW1lcyk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBmaWxlcy5maWx0ZXIoZiA9PiAhY29udGVudExpc3QuZmluZCh0ID0+IHQuZmlsZW5hbWUgPT0gZikgJiYgZi5lbmRzV2l0aChmaWxlRW5kaW5nKSAmJiBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZWRpciwgZikpLmlzRmlsZSgpKTtcbiAgICAgICAgcmV0dXJuIHthZGRlZCwgcmVtb3ZlZH07XG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZEFsbENvbnRlbnQodHlwZSkge1xuICAgICAgICB0aGlzLnBhdGNoRXh0ZW5zaW9ucygpXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgbG9hZFBsdWdpbnMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJwbHVnaW5cIik7fVxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XG59O1xuXG4vKipcbiAqIERvbid0IGV4cG9zZSBjb250ZW50TWFuYWdlciAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XG4gKi8iLCJpbXBvcnQge2JkQ29uZmlnLCBtaW5TdXBwb3J0ZWRWZXJzaW9uLCBiYmRWZXJzaW9uLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5FcnJvcnMsIGJkdGhlbWVFcnJvcnMsIGJiZENoYW5nZWxvZywgZGVmYXVsdENvb2tpZSwgY3VycmVudERpc2NvcmRWZXJzaW9uLCBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQywgbGlnaHRjb3JkU2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XG5cbmltcG9ydCBCRExvZ28gZnJvbSBcIi4uL3VpL2JkTG9nb1wiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9MaWdodGNvcmRcIjtcbmltcG9ydCBQbHVnaW5DZXJ0aWZpZXIgZnJvbSBcIi4vcGx1Z2luQ2VydGlmaWVyXCI7XG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxuaW1wb3J0IHtyZW1vdGUgYXMgZWxlY3Ryb259IGZyb20gXCJlbGVjdHJvblwiXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xuXG5sZXQgbWV0aG9kc1xuZnVuY3Rpb24gQ29yZSgpIHt9XG5cblxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZCkgcmV0dXJuO1xuICAgIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIGNvbmZpZyk7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ29yZS5wcm90b3R5cGUsIFwibWV0aG9kc1wiLCB7XG4gICAgZ2V0KCl7XG4gICAgICAgIHJldHVybiBtZXRob2RzXG4gICAgfVxufSlcblxuQ29yZS5wcm90b3R5cGUuc2V0TWV0aG9kcyA9IGZ1bmN0aW9uKG0pIHtcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XG4gICAgbWV0aG9kcyA9IG1cbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XG4gICAgdGhpcy5oYXNTdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiYmRWZXJzaW9uICsgXCIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9sZCB2ZXJzaW9uIChcIiArIGN1cnJlbnREaXNjb3JkVmVyc2lvbiArIFwiKSBvZiBEaXNjb3JkLiBQbGVhc2UgdXBkYXRlIHlvdXIgRGlzY29yZCBpbnN0YWxsYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5FRCkge1xuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggUG93ZXJjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcbiAgICB0aGlzLmluaXRTZXR0aW5ncygpO1xuXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xuICAgIEJEVjIuaW5pdGlhbGl6ZSgpO1xuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJVcGRhdGluZyBTZXR0aW5nc1wiKTtcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgQWRkb25zIENhY2hlXCIpXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxuXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgUGx1Z2luc1wiKTtcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcblxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFRoZW1lc1wiKTtcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XG5cbiAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20oRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpLCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xuICAgIH0pO1xuXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcblxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIE1haW4gT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcblxuICAgIC8vIFNob3cgbG9hZGluZyBlcnJvcnNcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XG4gICAgICAgIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBiZHBsdWdpbkVycm9ycywgdGhlbWVzOiBiZHRoZW1lRXJyb3JzfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gRGF0YVN0b3JlLmdldEJERGF0YShcInZlcnNpb25cIik7XG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcInZlcnNpb25cIiwgYmJkVmVyc2lvbik7XG4gICAgfVxuXG4gICAgRW1vamlNb2R1bGUuc3RhcnQoKVxuXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFBpbGxzLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgUGlsbHMgUGF0Y2hcIikoKTtcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lc3NhZ2VIZWFkZXIuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBDaGF0IFBhdGNoXCIpKCk7XG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xuXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xuICAgICAgICBsZXQgYWxlcnQgPSBVdGlscy5hbGVydChcIkZpcnN0IEluc3RhbGxhdGlvblwiLCBcIkFzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBpbnN0YWxsIExpZ2h0Y29yZCwgV2UgYWRkZWQgdHdvIGRlZmF1bHQgdGhlbWVzIGFuZCBvbmUgZGVmYXVsdCBwbHVnaW4gaW4geW91ciBwbHVnaW4vdGhlbWUgZm9sZGVyLiBDaGVjayBpdCBpbiB0aGUgUGx1Z2luL1RoZW1lIHNldHRpbmdzLlwiKVxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxuICAgIGlmKGxvZ28pe1xuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cbiAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00NC44MSw5LjY3VjYuMzNjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MUEzLjUzLDMuNTMsMCwwLDAsNDYuMiwzYy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5LjY3YzAsMi4yMSwxLjg5LDMuMzMsMy43NywzLjMzYTMuODcsMy44NywwLDAsMCwzLjQ1LTIuMThsLTIuMTItMUM0NywxMS4xNyw0NC44MSwxMC44NSw0NC44MSw5LjY3Wk0xMC42OCwxMi44OWgyLjQxVjMuMTdIMTAuNjhaTTcxLjc2LDMuMTRINjguMTlWNy4yM0w3MC41Nyw5LjR2LTRoMS4yN2MuODEsMCwxLjIxLjQxLDEuMjEsMXYzYzAsLjYzLS4zOCwxLjA1LTEuMjEsMS4wNUg2OC4xOHYyLjMxaDMuNTdjMS45MiwwLDMuNzItMSwzLjcyLTMuMlY2LjM5Qzc1LjQ4LDQuMTMsNzMuNjgsMy4xNCw3MS43NiwzLjE0Wk01NC4yMiwzYy0yLDAtNCwxLjEtNCwzLjM0VjkuNjZjMCwyLjIzLDIsMy4zNCw0LDMuMzRzMy45NS0xLjExLDMuOTUtMy4zNFY2LjM0QzU4LjE5LDQuMTEsNTYuMiwzLDU0LjIyLDNabTEuNTUsNi42NmMwLC43LS43OCwxLjA2LTEuNTQsMS4wNnMtMS41NS0uMzUtMS41NS0xLjA2VjYuMzRjMC0uNzIuNzUtMS4xLDEuNS0xLjFzMS41OS4zNSwxLjU5LDEuMVpNNjYuODQsNi4zNGMwLTIuMjktMS41OC0zLjItMy41NS0zLjJINTkuNDZ2OS43M2gyLjQ1VjkuNzdoLjQzbDIuMjIsMy4wOWgzTDY1LDkuNTJDNjYuMTMsOS4xNSw2Ni44NCw4LjE0LDY2Ljg0LDYuMzRaTTYzLjMzLDcuNjVINjEuOTFWNS40M2gxLjQyQTEuMTEsMS4xMSwwLDEsMSw2My4zMyw3LjY1Wk0yOS44MywxM2gyLjQyVjMuMDZIMjkuODNWNi43M2wtMywwVjMuMDlIMjQuN3Y5Ljc4aDIuMTRWOC42OGwzLDBaTTE3LjE2LDkuNzZWNi40MmMwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxYTMuNTUsMy41NSwwLDAsMC0zLjM2LTIuMjRjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNzZjMCwyLjIxLDIsMy4xNSwzLjksMy4xNXMzLjU4LTEsMy41OC0zVjcuNThIMTguNzlsMCwxLjM2SDIwLjN2Ljc3QzIwLjMsMTAuOTIsMTcuMTYsMTAuOTQsMTcuMTYsOS43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuOTMgLTMpXCIvPlxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XG48L3N2Zz5gXG4gICAgfVxufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRyaWJ1dGVzID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxuICAgIHRoaXMuY2FuY2VsUGF0Y2hBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGF0dHJpYnNQYXRjaHMuZm9yRWFjaChlID0+IGUoKSlcbiAgICB9XG5cbiAgICB3aGlsZSghdjIuTWVzc2FnZUNvbXBvbmVudClhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSlcbiAgICBcbiAgICAvLyBUT0RPOiB0cnkgdG8gcGF0Y2ggY29ycmVjdGx5IHRoZSB1c2VyIHBvcG91dCBvbiBhIG5leHQgdXBkYXRlXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkRpc2NvcmRUYWdcIilcbiAgICAudGhlbihEaXNjb3JkVGFnID0+IHtcbiAgICAgICAgbGV0IERpc2NvcmRUYWdDb21wID0gRGlzY29yZFRhZy5kZWZhdWx0XG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdCA9IGZ1bmN0aW9uKHByb3BzKXtcbiAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IERpc2NvcmRUYWdDb21wKHByb3BzKVxuXG4gICAgICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxuXG4gICAgICAgICAgICBsZXQgYmFkZ2VEaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCIsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCI1cHhcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcbiAgICAgICAgICAgICAgICBrZXk6IFwiYmFkZ2VzLVwiK2lkLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5oZXJpdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtyZXR1cm5WYWx1ZV1cblxuICAgICAgICAgICAgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIgfHwgcHJvcHMudXNlci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYmFkZ2VEaXYpXG4gICAgICAgICAgICBsZXQgZGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBjaGlsZHJlbilcbiAgICAgICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBwcm9wcy51c2VyLCBmYWxzZSlcblxuICAgICAgICAgICAgcmV0dXJuIGRpdlxuICAgICAgICB9XG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdC5kaXNwbGF5TmFtZSA9IERpc2NvcmRUYWdDb21wLmRpc3BsYXlOYW1lXG4gICAgfSlcblxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBpZihkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UpeyAvLyB0aGlzIGNhbiBiZSBhIGJsb2NrZWQgbWVzc2FnZSAobm90IG9wZW5lZClcbiAgICAgICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHNbXCJkYXRhLW1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcbiAgICAgICAgfVxuICAgIH19KSlcbiAgICAgICAgLypcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcIm1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcbiAgICB9fSkpKi9cbn1cblxuQ29yZS5wcm90b3R5cGUuY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcbiAgICBsZXQgdGltZXNDaGVja2VkID0gMDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gQkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW0uc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmICh0aW1lc0NoZWNrZWQgPj0gNTApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSBcImxvYWRpbmdcIikgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge3NldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7fSk7XG4gICAgfSk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAvLyBObyBleHRlcm5hbHNcbn07XG5cbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xuICAgIGlmKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwibGlnaHRjb3JkLXNldHRpbmdzXCIpKXtcbiAgICAgICAgZm9yKGxldCBrZXkgaW4gbGlnaHRjb3JkU2V0dGluZ3Mpe1xuICAgICAgICAgICAgZGVsZXRlIGxpZ2h0Y29yZFNldHRpbmdzW2tleV1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSl7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xuICAgIH1cbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKXtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIGRlZmF1bHRDb29raWUpO1xuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldHRpbmdzUGFuZWwubG9hZFNldHRpbmdzKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPSBkZWZhdWx0Q29va2llW3NldHRpbmddO1xuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnByb3RvdHlwZSAmJiBlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zKVxuICAgIC50aGVuKHNldHRpbmdNb2R1bGUgPT4ge1xuXG4gICAgICAgIGxldCBnZXRQcmVkaWNhdGVTZWN0aW9ucyA9IHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnNcbiAgICAgICAgc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9ucyA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG5cbiAgICAgICAgICAgIGlmKCFyZXN1bHRbMV0pcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgaWYocmVzdWx0WzFdLnNlY3Rpb24gPT09IFwiTXkgQWNjb3VudFwiKXsgLy8gdXNlciBzZXR0aW5ncywgbm90IGd1aWxkIHNldHRpbmdzXG4gICAgICAgICAgICAgICAgbGV0IHBvcGVkID0gW11cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcblxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcih0aGlzKSlcblxuICAgICAgICAgICAgICAgIHdoaWxlKHBvcGVkWzBdKXtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9wZWQucG9wKCkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgfSlcbn07XG5cblxubGV0IGNsYXNzTmFtZUxheWVyXG5sZXQgY2xhc3NOYW1lU29jaWFsTGlua3NcbmxldCBjbGFzc05hbWVNb2RhbFxuXG5Db3JlLnByb3RvdHlwZS5pbml0T2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbWFpbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBtbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5Nb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHBsdWdpbk1vZHVsZS5yYXdPYnNlcnZlcihtdXRhdGlvbik7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBub3RoaW5nIGFkZGVkLCBza2lwXG4gICAgICAgICAgICBpZiAoIW11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoIHx8ICEobXV0YXRpb24uYWRkZWROb2Rlc1swXSBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG11dGF0aW9uLmFkZGVkTm9kZXNbMF07XG5cbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVMYXllciljbGFzc05hbWVMYXllciA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyXG4gICAgICAgICAgICBpZighY2xhc3NOYW1lU29jaWFsTGlua3MpY2xhc3NOYW1lU29jaWFsTGlua3MgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNvY2lhbExpbmtzICYmIHR5cGVvZiBlLnNvY2lhbExpbmtzID09PSBcInN0cmluZ1wiKVswXS5zb2NpYWxMaW5rc1xuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZU1vZGFsKWNsYXNzTmFtZU1vZGFsID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tb2RhbCAmJiB0eXBlb2YgZS5tb2RhbCA9PT0gXCJzdHJpbmdcIiAmJiBlLmlubmVyICYmIHR5cGVvZiBlLmlubmVyID09PSBcInN0cmluZ1wiICYmICFlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSlbMF0ubW9kYWxcblxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgPT09IFwiR1VJTERfU0VUVElOR1NcIil7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjtcblxuICAgICAgICAgICAgLy8gRW1vamkgUGlja2VyXG4gICAgICAgICAgICAvL25vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVtb2ppUGlja2VyLTNtMVMtalwiKS5sZW5ndGggJiYgIW5vZGUucXVlcnlTZWxlY3RvcihcIi5lbW9qaVBpY2tlci0zbTFTLWpcIikucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbmltYXRvckxlZnQtMUVReFUwXCIpXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcblxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBtYWluT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnNob3dDaGFuZ2Vsb2dNb2RhbCA9IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XG59O1xuXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XG4gICAgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoU29jaWFsID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc29jaWFsUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIVRhYkJhcikgcmV0dXJuO1xuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA8IDMpIHJldHVybjtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcbiAgICAgICAgaWYgKCFjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJzb2NpYWxMaW5rc1wiKSkgcmV0dXJuO1xuICAgICAgICBpZiAoQW5jaG9yKSB7XG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlO1xuICAgICAgICAgICAgY29uc3QgbmV3T25lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAyXS50eXBlID0gbmV3T25lO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXG4gICAgICAgICAgICBzaXplcyxcbiAgICAgICAgICAgIGNsYXNzTmFtZVZlcnNpb25IYXNoXG4gICAgICAgIF0gPSBbXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvck11dGVkKVswXS5jb2xvck11dGVkLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxuICAgICAgICBdXG5cbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsID0gW1xuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGAke2NsYXNzTmFtZUNvbG9yTXV0ZWR9ICR7c2l6ZXMuc2l6ZTEyfWB9LCBgTGlnaHRjb3JkICR7ZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLnZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIGAoJHsoZWxlY3Ryb24uZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLmNvbW1pdCB8fCBcIlVua25vd25cIikuc2xpY2UoMCwgNyl9KWApKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcbiAgICAgICAgXVxuICAgICAgICBcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFZlcnNpb25zID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZTtcbiAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udHlwZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuVmFsLnByb3BzLmNoaWxkcmVuLnNwbGljZSgxLCAwLCBhZGRpdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWw7XG4gICAgICAgIH07XG4gICAgfX0pO1xufTtcblxuY29uc3QgZ2V0R3VpbGRDbGFzc2VzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZ3VpbGRzV3JhcHBlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwid3JhcHBlclwiLCBcInVucmVhZE1lbnRpb25zQmFyXCIpO1xuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcbiAgICBjb25zdCBwaWxsID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJibG9iQ29udGFpbmVyXCIpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZExpc3RJdGVtcyA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZENsYXNzZXMgPSBnZXRHdWlsZENsYXNzZXMoKTtcbiAgICBjb25zdCBsaXN0SXRlbUNsYXNzID0gR3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XG4gICAgY29uc3QgcmVhY3RJbnN0YW5jZSA9IEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAuJHtsaXN0SXRlbUNsYXNzfSAuJHtibG9iQ2xhc3N9YCkucGFyZW50RWxlbWVudCk7XG4gICAgY29uc3QgR3VpbGRDb21wb25lbnQgPSByZWFjdEluc3RhbmNlLnJldHVybi50eXBlO1xuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcbiAgICB0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZENvbXBvbmVudC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEucmV0dXJuVmFsdWUgJiYgZGF0YS50aGlzT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBndWlsZERhdGEgPSBkYXRhLnRoaXNPYmplY3QucHJvcHM7XG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGRcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSBjbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnNlbGVjdGVkKSBjbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYXVkaW8pIGNsYXNzTmFtZSArPSBcIiBiZC1hdWRpb1wiO1xuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmJhZGdlKSBjbGFzc05hbWUgKz0gXCIgYmQtYmFkZ2VcIjtcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYW5pbWF0YWJsZSkgY2xhc3NOYW1lICs9IFwiIGJkLWFuaW1hdGFibGVcIjtcbiAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgICAgICB9XG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFBpbGxzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuZ3VpbGRQaWxsUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xuICAgIGlmICghZ3VpbGRQaWxsKSByZXR1cm47XG4gICAgdGhpcy5ndWlsZFBpbGxQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKGd1aWxkUGlsbCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKHByb3BzLnVucmVhZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XG4gICAgICAgIGlmIChwcm9wcy5zZWxlY3RlZCkgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtc2VsZWN0ZWRcIjtcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcbiAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUucGF0Y2hHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgICBjb25zdCBndWlsZENvbXBvbmVudHMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInJlbmRlckxpc3RJdGVtXCIpO1xuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcbiAgICBjb25zdCBHdWlsZFNlcGFyYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGd1aWxkQ29tcG9uZW50cy5TZXBhcmF0b3IoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2hpbGRyZW5bMV0ucHJvcHMuY2hpbGRyZW5bM10udHlwZSA9IEd1aWxkU2VwYXJhdG9yO1xuICAgIH19KTtcbn07XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0YWNobWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IEF0dGFjaG1lbnQgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdHRhY2htZW50XCIpWzBdIC8vIHRlbXBvcmFyeVxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcbiAgICB0aGlzLkF0dGFjaG1lbnRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEF0dGFjaG1lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSlyZXR1cm5cbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcblxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXG4gICAgICAgIGNoaWxkcmVuLnB1c2goQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICAgICAgICBpZDogXCJjZXJ0aWZpZWQtXCIraWRcbiAgICAgICAgfSkpXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcbiAgICB9fSlcbn1cblxuQ29yZS5wcm90b3R5cGUucGF0Y2hNZXNzYWdlSGVhZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhlYWRlclBhdGNoKSByZXR1cm47XG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVzc2FnZUhlYWRlciB8fCAhTWVzc2FnZUhlYWRlci5kZWZhdWx0KSByZXR1cm47XG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRob3IgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcIm1lc3NhZ2UuYXV0aG9yXCIpO1xuICAgICAgICAvLyBjb25zdCBoZWFkZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wc1wiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdXRob3IgfHwgIWF1dGhvci5pZClyZXR1cm5cbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcbiAgICAgICAgaWYgKGF1dGhvci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikgeyAvLyBSYXVlbnppOiBCYW5kYWdlZEJEIERldmVsb3BlclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIGF1dGhvciwgdHJ1ZSlcbiAgICB9fSk7XG59O1xuXG5mdW5jdGlvbiBhcHBseUJhZGdlcyhpZCwgdXNlciwgY2hhdCl7XG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmFkZ2VzLVwiK2lkKVxuICAgICAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuXG4gICAgICAgIGlmKGRpdi5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5cbiAgICAgICAgbGV0IGJsb2NrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICBibG9ja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJsb2NrRGl2KVxuXG4gICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuXG4gICAgICAgIGRpc3RhbnQuZ2V0QmFkZ2VzKHVzZXIuaWQpXG4gICAgICAgIC50aGVuKGJhZGdlcyA9PiB7XG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN2Zzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIiwgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFkZ2Uuc2NvcGVzLmZvckVhY2goc2NvcGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudXNlciA9IHVzZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pIFxuICAgICAgICAgICAgICAgIGlmKCFiYWRnZS5ocmVmKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuQW5jaG9yID0gQW5jaG9yXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGJhZGdlLm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxuICAgICAgICAgICAgICAgICAgICBiYWRnZS5ocmVmID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogYmFkZ2UuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXG4gICAgICAgICAgICAgICAgZGl2Mi5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG59XG5cbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLm1lbWJlckxpc3RQYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IE1lbWJlckxpc3RJdGVtID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNZW1iZXJMaXN0SXRlbVwiKTtcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVtYmVyTGlzdEl0ZW0gfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLnJlbmRlckRlY29yYXRvcnMpIHJldHVybjtcbiAgICB0aGlzLm1lbWJlckxpc3RQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSwgXCJyZW5kZXJEZWNvcmF0b3JzXCIsIHthZnRlcjogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICF1c2VyIHx8ICF1c2VyLmlkKXJldHVyblxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xuICAgICAgICBpZiAodXNlci5pZCA9PT0gXCIyNDk3NDYyMzYwMDgxNjk0NzNcIikge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCB1c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcbiAgICAgICAgKVxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgdXNlciwgZmFsc2UpXG4gICAgfX0pO1xufTtcblxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGVyZSB3aWxsIG5ldmVyIGJlIGFuIGluamVjdGlvbiBwYXRoLCBzbyB3ZSBkbyBub3QgbmVlZCB0aGUgY29kZSBiZWxvdy4gXG4gICAgLy8gSW5zZXJ0IGNvbW1lbnRzIHNvIGl0IHdpbGwgYmUgZXJhc2VkIHdoZW4gcHJvZHVjdGlvbi5cbiAgICBcbiAgICBjb25zdCBpbmplY3Rpb25QYXRoID0gRGF0YVN0b3JlLmluamVjdGlvblBhdGg7XG4gICAgaWYgKCFpbmplY3Rpb25QYXRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvKlxuXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XG4gICAgY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpO1xuXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcbiAgICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xuXG4gICAgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlcXVlc3QuZ2V0KHt1cmw6IHppcExpbmssIGVuY29kaW5nOiBudWxsfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhzYXZlZFppcCwgcmVzKSk7XG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XG5cbiAgICAgICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiV3JpdGluZyBcIiArIHNhdmVkWmlwKTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xuXG4gICAgLy8gQ2hlY2sgYW5kIGRlbGV0ZSByZW5hbWUgZXh0cmFjdGlvblxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XG4gICAgXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcbiAgICB6aXBmaWxlLm9uKFwiZW50cnlcIiwgZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcblxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgZW50cnkuZmlsZU5hbWUpO1xuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcblxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcblxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGluamVjdGlvblBhdGgsIGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xuXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXG4gICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnVubGluayhzYXZlZFppcCwgcmVzb2x2ZSkpO1xuXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcbiAgICByZXR1cm4gc3VjY2VzczsqL1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IENvcmUoKTtcblxuLyoqXG4gKiBEb24ndCBleHBvc2UgY29yZSAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XG4gKi8iLCJjb25zdCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9IHdpbmRvdy5yZXF1aXJlXG5cbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XG5cbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xuXG5sZXQgZGF0YVBhdGggPSBcIlwiO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikgZGF0YVBhdGggPSBwcm9jZXNzLmVudi5BUFBEQVRBO1xuZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikgZGF0YVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuSE9NRSwgXCJMaWJyYXJ5XCIsIFwiUHJlZmVyZW5jZXNcIik7XG5lbHNlIGRhdGFQYXRoID0gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FID8gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FIDogcGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZ1wiKTtcbmRhdGFQYXRoID0gcGF0aC5qb2luKGRhdGFQYXRoLCBcIkJldHRlckRpc2NvcmRcIik7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRhdGEgPSB7c2V0dGluZ3M6IHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fX07XG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGF0YVN0b3JlID0gdGhpc1xuICAgIH1cblxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5CREZpbGUpKSBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcInV0Zi04XCIpKVxuICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoXCJzZXR0aW5nc1wiKSkgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnNldHRpbmdzRmlsZSkpIHJldHVybjtcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHRoaXMuc2V0dGluZ3NGaWxlKTtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpO1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHtbcmVsZWFzZUNoYW5uZWxdOiBzZXR0aW5nc30pO1xuICAgICAgICAgICAgZWxzZSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLnNldEJERGF0YShcInNldHRpbmdzXCIsIHNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICBVdGlscy5hbGVydChcIkNvcnJ1cHQgU3RvcmFnZVwiLCBcIlRoZSBiZCBzdG9yYWdlIGhhcyBzb21laG93IGJlY29tZSBjb3JydXB0LiBZb3UgbWF5IGVpdGhlciB0cnkgdG8gc2FsdmFnZSB0aGUgZmlsZSBvciBkZWxldGUgaXQgdGhlbiByZWxvYWQuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGluamVjdGlvblBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdGlvblBhdGgpIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoO1xuICAgICAgICBjb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xuICAgICAgICBjb25zdCBiYXNlID0gZWxlY3Ryb24uZ2V0QXBwUGF0aCgpO1xuICAgICAgICBjb25zdCByb2FtaW5nQmFzZSA9IGVsZWN0cm9uLmdldFBhdGgoXCJ1c2VyRGF0YVwiKTtcbiAgICAgICAgY29uc3Qgcm9hbWluZ0xvY2F0aW9uID0gcGF0aC5yZXNvbHZlKHJvYW1pbmdCYXNlLCBlbGVjdHJvbi5nZXRWZXJzaW9uKCksIFwibW9kdWxlc1wiLCBcImRpc2NvcmRfZGVza3RvcF9jb3JlXCIsIFwiaW5qZWN0b3JcIik7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGJhc2UsIFwiLi5cIiwgXCJhcHBcIik7XG4gICAgICAgIGNvbnN0IHJlYWxMb2NhdGlvbiA9IGZzLmV4aXN0c1N5bmMobG9jYXRpb24pID8gbG9jYXRpb24gOiBmcy5leGlzdHNTeW5jKHJvYW1pbmdMb2NhdGlvbikgPyByb2FtaW5nTG9jYXRpb24gOiBudWxsO1xuICAgICAgICBpZiAoIXJlYWxMb2NhdGlvbikgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IHJlYWxMb2NhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlnRmlsZSgpIHtyZXR1cm4gdGhpcy5fY29uZmlnRmlsZSB8fCAodGhpcy5fY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZSh0aGlzLmluamVjdGlvblBhdGgsIFwiYmV0dGVyZGlzY29yZFwiLCBcImNvbmZpZy5qc29uXCIpKTt9XG4gICAgZ2V0IEJERmlsZSgpIHtyZXR1cm4gdGhpcy5fQkRGaWxlIHx8ICh0aGlzLl9CREZpbGUgPSBwYXRoLnJlc29sdmUoZGF0YVBhdGgsIFwiYmRzdG9yYWdlLmpzb25cIikpO31cbiAgICBnZXQgc2V0dGluZ3NGaWxlKCkge3JldHVybiB0aGlzLl9zZXR0aW5nc0ZpbGUgfHwgKHRoaXMuX3NldHRpbmdzRmlsZSA9IHBhdGgucmVzb2x2ZShkYXRhUGF0aCwgXCJiZHNldHRpbmdzLmpzb25cIikpO31cbiAgICBnZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpIHtyZXR1cm4gcGF0aC5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIHBsdWdpbk5hbWUgKyBcIi5jb25maWcuanNvblwiKTt9XG5cbiAgICBnZXRTZXR0aW5nR3JvdXAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBzZXRTZXR0aW5nR3JvdXAoa2V5LCBkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSA9IGRhdGE7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgZ2V0QkREYXRhKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW2tleV0gfHwgXCJcIjtcbiAgICB9XG5cbiAgICBzZXRCRERhdGEoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcbiAgICB9XG5cbiAgICBzZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcbiAgICAgICAgZGVsZXRlIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcbiAgICB9XG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGVidWdMaXN0ZW5lciA9IHRoaXMuZGVidWdMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIHRoaXMuc3RhcnRDb3B5U2VsZWN0b3IoKTtcbiAgICB9XG4gICAgXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnN0b3BDb3B5U2VsZWN0b3IoKTtcbiAgICB9XG5cbiAgICBzdGFydERlYnVnTGlzdGVuZXIoKSB7XG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdGFydENvcHlTZWxlY3RvcigpIHtcbiAgICAgICAgdGhpcy5zdG9wQ29weVNlbGVjdG9yKCk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgZGVidWdMaXN0ZW5lcihlKSB7XG4gICAgICAgIGlmIChlLndoaWNoID09PSAxMTkgfHwgZS53aGljaCA9PSAxMTgpIHsvL0Y4XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xuICAgICAgICAgICAgZGVidWdnZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZGVidWdnZXJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICB9XG4gICAgfVxuXG4gICAgY29weVNlbGVjdG9yTGlzdGVuZXIoZSkge1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGUudGFyZ2V0KTtcbiAgICBcbiAgICAgICAgICAgIGxldCBbXG4gICAgICAgICAgICAgICAgY2xhc3NMYXllciwgXG4gICAgICAgICAgICAgICAgY2xhc3NJdGVtc1xuICAgICAgICAgICAgXSA9IFtcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuZGlzYWJsZWRQb2ludGVyRXZlbnRzKVswXSxcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLm1lbnUpWzBdXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZ1bmN0aW9uIGF0dGFjaCgpIHtcbiAgICAgICAgICAgICAgICBpZighY2xhc3NJdGVtcyB8fCAhY2xhc3NMYXllci5sYXllcilyZXR1cm4gY29uc29sZS5sb2coY2xhc3NJdGVtcywgY2xhc3NMYXllci5sYXllcilcblxuICAgICAgICAgICAgICAgIGxldCBjbSA9IERPTS5xdWVyeShcIi5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLm1lbnUpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5xdWVyeShcIiNhcHAtbW91bnQgPiAuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NMYXllci5sYXllckNvbnRhaW5lcikpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NMYXllci5sYXllcn1cIj5gKTtcbiAgICAgICAgICAgICAgICAgICAgY20gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5tZW51fSAke2NsYXNzSXRlbXMuc3R5bGVGbGV4aWJsZX0gJHtjbGFzc0l0ZW1zLmFjY29tbW9kYXRlU2Nyb2xsYmFyfSBiZC1jb250ZXh0LW1lbnVcIiBzdHlsZT1cIlwiPjwvZGl2PmApO1xuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuYXBwZW5kKGNtKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChjbVdyYXApO1xuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJtZW51XCIpXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5pZCA9IFwiYmQtY29weS1zZWxlY3Rvci1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJDb3B5IFNlbGVjdG9yIEFjdGlvbnNcIilcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlckNsYXNzZXMgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNjcm9sbGVyV3JhcClbMF1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXJXcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyQ2xhc3Nlcy50aGVtZUdob3N0SGFpcmxpbmV9XCI+PC9kaXY+YClcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIpWzBdLnNjcm9sbGVyfSAke2NsYXNzSXRlbXMuc2Nyb2xsZXJ9XCI+PC9kaXY+YClcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXJXcmFwLmFwcGVuZChzY3JvbGxlcilcbiAgICAgICAgICAgICAgICAgICAgY20uYXBwZW5kKHNjcm9sbGVyV3JhcClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDTSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgJiYgZS5rZXlDb2RlICE9PSAyNykgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgY21XcmFwLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCByZW1vdmVDTSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBjbS5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBjbS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF1cbiAgICAgICAgICAgICAgICBjb25zdCBjbWcgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwiZ3JvdXBcIj48L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgY21pID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMuaXRlbX0gJHtjbGFzc0l0ZW1zLmxhYmVsQ29udGFpbmVyfSAke2NsYXNzSXRlbXMuY29sb3JEZWZhdWx0fVwiIHJvbGU9XCJtZW51aXRlbVwiIGlkPVwiYmQtY29weS1zZWxlY3Rvci1pdGVtLWNtXCI+PC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgY21pLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5sYWJlbH1cIj5Db3B5IFNlbGVjdG9yPC9kaXY+YCkpO1xuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBCRFYyLk5hdGl2ZU1vZHVsZS5jb3B5KHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50cyA9IERPTS5xdWVyeUFsbChcImRpdltyb2xlPW1lbnVpdGVtXS5cIitVdGlscy5yZW1vdmVEYShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAmJiBlbGVtZW50cy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZCkpXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QuYWRkKGNsYXNzSXRlbXMuZm9jdXNlZClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xuICAgICAgICAgICAgICAgIGlmKHNjcm9sbGVyLmNoaWxkTm9kZXMubGVuZ3RoKXsgLy8gYXBlbmQgYSBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cInNlcGFyYXRvclwiIGNsYXNzPVwiJHtjbGFzc0l0ZW1zLnNlcGFyYXRvcn1cIj48L2Rpdj5gKVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoc2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoY21nKTtcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmcgXCIrY21XcmFwLnN0eWxlLnRvcClcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IChjbVdyYXAuc3R5bGUudG9wIC0gY21nLmNsaWVudEhlaWdodCkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXR0YWNoLCAxKTtcbiAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcbiAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBmdWxsUGF0aChlbCl7XG4gICAgICAgICAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcbiAgICAgICAgICAgICAgaWYgKGVsLmlkKXtcbiAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KCcjJytlbC5pZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGlmIChlbD09ZWwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpK0FycmF5LmZyb20oZWwuY2xhc3NMaXN0LmVudHJpZXMoKSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKSk7XG4gICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MSxlPWVsO2UucHJldmlvdXNFbGVtZW50U2libGluZztlPWUucHJldmlvdXNFbGVtZW50U2libGluZyxjKyspO1xuICAgICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrKCh0eXBlb2YgZWwuY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsLmNsYXNzTmFtZSkgfHwgXCJcIikuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICEhZSkubWFwKGUgPT4gXCIuXCIrZSkuam9pbihcIlwiKStcIjpudGgtY2hpbGQoXCIrYytcIilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsPWVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lcy5qb2luKFwiID4gXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxuICAgIH1cbn07IiwiZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERpc2FibGVUeXBpbmcge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5zdGFydFR5cGluZylcbiAgICAgICAgLnRoZW4odHlwaW5nTW9kdWxlID0+IHtcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZ1xuICAgICAgICAgICAgdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RhcnRUeXBpbmcgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RvcFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmdcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0b3BUeXBpbmcuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGlzYWJsZVR5cGluZyA9IHRoaXNcbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgZW5hYmxlKCl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZVxuICAgIH1cbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcbmltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0IHsgc2V0dGluZ3NDb29raWUgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHsgLy8gR2VuZXJhdGUgVVVJRCAoTm8gY3J5cHRvIHJuZylcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufSAgXG5cbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxubGV0IGJhZGdlc1RvRmV0Y2ggPSBbXVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7XG4gICAgICAgICAgICBiYWRnZXM6IHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5EaXN0YW50U2VydmVyID0gdGhpc1xuICAgIH1cblxuICAgIGdldCBjYWNoZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVcbiAgICB9XG5cbiAgICBzZXQgY2FjaGUoZGF0YSl7XG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fY2FjaGUsIGRhdGEpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1c3RvbSBiYWRnZXMgZnJvbSB0aGUgdXNlciBJRC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXG4gICAgICAgIGlmKGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0pcmV0dXJuIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cblxuICAgICAgICBsZXQgcmVzb2x2ZVxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHJlc29sdmUgPSByZXMpKVxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxuXG4gICAgICAgIGNvbnN0IGJhZGdlcyA9IFtdXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSlyZXR1cm4gcmVzb2x2ZShbXSlcbiAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2gucHVzaChbdXNlciwgcmVzb2x2ZV0pXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXG4gICAgICAgICAgICAgICAgaWYodXNlcnMubGVuZ3RoID09PSAwKXJldHVyblxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1c2Vycy5maW5kKHByb21pc2UgPT4gcHJvbWlzZVswXSA9PT0gdXNlci51c2VyX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVsxXSh1c2VyLmJhZGdlcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyIGluc3RhbmNlb2YgTGlnaHRjb3JkRXJyb3IpKWNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgfSlcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcbiAgICAgICAgICAgIGlmKCFDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gV2UgZG8gbm90IGhhdmUgdGhlIENvbXBvbmVudCwgc2tpcCBpdC5cbiAgICAgICAgICAgIGlmKGJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIEFscmVhZHkgaW5zZXJ0ZWQuXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZSA9IHtcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxuICAgICAgICB9LCA2MDAwMDApO1xuXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxuICAgICAgICBkZWxldGUgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxuICAgICAgICByZXR1cm4gYmFkZ2VzXG4gICAgfVxufVxuXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XG4gICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pe1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IExpZ2h0Y29yZEVycm9yKFwiVGhlIGN1cnJlbnQgc2V0dGluZ3MgYmxvY2tlZCB0aGUgcmVxdWVzdC5cIikpXG4gICAgfVxuICAgIHJldHVybiBub2RlRmV0Y2goYCR7Q29uc3RhbnRzLlNFUlZFUl9VUkx9L2FwaS92MSR7cm91dGV9YCwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ0xJRU5UXCI6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihkYXRhID8ge1xuICAgICAgICAgICAgYm9keTogZGF0YVxuICAgICAgICB9IDoge30pXG4gICAgfSlcbn1cblxuY2xhc3MgTGlnaHRjb3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxuICAgICAgICB0aGlzLm5hbWUgPSBcIkxpZ2h0Y29yZEVycm9yXCJcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XG4gICAgU0VSVkVSX1VSTDogXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6XCIsXG4gICAgYmFkZ2VzOiBbIC8vIFRPRE86IEFkZCBtb3JlIGJhZGdlcyArIHNlcnZlciBzaWRlIHN2Z1xuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZCBCdWcgSHVudGVyXCIsXG4gICAgICAgICAgICBpZDogXCJmMDQ2OThmNS04MTZiLTQxZTMtYmQwMS05MjI5MTE5M2Q3YTVcIixcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xuICAgICAgICAgICAgICAgIFwiNjk2NDgxMTk0NDQzMDE0MTc0XCIsXG4gICAgICAgICAgICAgICAgXCI2OTYwMDM0NTY2MTEzODUzOTZcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHNjb3BlczogW10sXG4gICAgICAgICAgICBjb21wb25lbnQ6IEJ1Z0h1bnRlckJhZGdlLFxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcyNidWdfaHVudGVyXCJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogXCJCdWZmb29uXCIsXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xuICAgICAgICAgICAgICAgIFwiMzg5MDE2ODk1NTQzNzA1NjAyXCIsXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIixcbiAgICAgICAgICAgICAgICBcIjYyNTM1MDY1NzgyOTg5NjIyNFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudDogQ2lyY3VzLFxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL3lvdXR1LmJlL0VKdGI2ei1kbFQ4P3Q9MTQ1XCJcbiAgICAgICAgfVxuICAgIF1cbn1cblxuZXhwb3J0IGNvbnN0IFJvdXRlcyA9IHtcbiAgICBiYWRnZXM6IGAvdXNlcnMvYmFkZ2VzYFxufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggWmFjaGFyeSBSYXVlblxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWRcbiAqIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELFxuICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcbiAqIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRlxuICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqIFxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQkRQbHVnaW5MaWJyYXJ5XG4gKi9cblxuLyoqXG4gKiBAaW50ZXJmYWNlXG4gKiBAbmFtZSBPZmZzZXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUb3Agb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIC0gQm90dG9tIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIExlZnQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gT3V0ZXIgd2lkdGggb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICovXG5cbiAvKipcbiAqIEZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZW1vdmVzIGFkZGVkIGxpc3RlbmVyLlxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxuICovXG4gXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XG5cbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XG4gICAgfVxuXG4gICAgLyoqXG5cdCAqIEFkZHMgYSBzdHlsZSB0byB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGFzIHRoZSBlbGVtZW50IGlkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxuXHQgKi9cblx0c3RhdGljIGFkZFN0eWxlKGlkLCBjc3MpIHtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXG5cdCAqL1xuXHRzdGF0aWMgcmVtb3ZlU3R5bGUoaWQpIHtcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMvcmVxdWlyZXMgYSByZW1vdGUgc2NyaXB0IHRvIGJlIGxvYWRlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgdGhpcyBzY3JpcHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWRcblx0ICovXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcblx0XHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdFx0XHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcblx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxuXHQgKi9cblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xuICAgICAgICBpZCA9IHRoaXMuZXNjYXBlSUQoaWQpO1xuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxuICAgIHN0YXRpYyBhbmltYXRlKHt0aW1pbmcgPSBfID0+IF8sIHVwZGF0ZSwgZHVyYXRpb259KSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZSkge1xuICAgICAgICAgIC8vIHRpbWVGcmFjdGlvbiBnb2VzIGZyb20gMCB0byAxXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XG4gICAgICAgICAgaWYgKHRpbWVGcmFjdGlvbiA+IDEpIHRpbWVGcmFjdGlvbiA9IDE7XG4gICAgICBcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXG4gICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aW1pbmcodGltZUZyYWN0aW9uKTtcbiAgICAgIFxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcbiAgICAgIFxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPCAxKSB7XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBteSBzaGl0IHZlcnNpb24gb2Ygbm90IGhhdmluZyB0byB1c2UgYCRgIGZyb20galF1ZXJ5LiBNZWFuaW5nXG4gICAgICogdGhhdCB5b3UgY2FuIHBhc3MgYSBzZWxlY3RvciBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5fS5cbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTFxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gRWl0aGVyIHRoZSByZXN1bHQgb2YgYHBhcnNlSFRNTGAgb3IgYHF1ZXJ5YFxuICAgICAqL1xuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlSFRNTChzZWxlY3Rvcik7XG4gICAgICAgIGNvbnN0IGlzSFRNTCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IEFycmF5LmZyb20oZWxlbWVudCkuc29tZShuID0+IG4ubm9kZVR5cGUgPT09IDEpIDogZWxlbWVudC5ub2RlVHlwZSA9PT0gMTtcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHN0YXRpYyBxdWVyeShzZWxlY3RvciwgYmFzZUVsZW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gQXJyYXkgb2YgYWxsIGZvdW5kIGVsZW1lbnRzXG4gICAgICovXG4gICAgc3RhdGljIHF1ZXJ5QWxsKHNlbGVjdG9yLCBiYXNlRWxlbWVudCA9IGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcbiAgICAgKiB0aGUgcGFyc2VkIEhUTUwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGRvY3VtZW50IGZyYWdtZW50IHtAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudEZyYWdtZW50fS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgaWYgeW91IGhhdmUgYSBsaXN0IG9mIGVsZW1lbnRzIGF0IHRoZSB0b3AgbGV2ZWwsIHRoZXkgY2FuIHRoZW4gYmUgYXBwZW5kZWQgYWxsIGF0IG9uY2UgdG8gYW5vdGhlciBub2RlLlxuICAgICAqIFxuICAgICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZhbHNlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbGlzdCBvZiBwYXJzZWRcbiAgICAgKiBub2RlcyBhbmQgdGhlcmUgd2VyZSBtdWx0aXBsZSB0b3AgbGV2ZWwgbm9kZXMsIG90aGVyd2lzZSB0aGUgc2luZ2xlIG5vZGUgaXMgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZyYWdtZW50PWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm4gc2hvdWxkIGJlIHRoZSByYXcgYERvY3VtZW50RnJhZ21lbnRgXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBUaGUgcmVzdWx0IG9mIEhUTUwgcGFyc2luZ1xuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXBsYXRlLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICBpZiAoZnJhZ21lbnQpIHJldHVybiBub2RlO1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XG4gICAgfVxuXG4gICAgLyoqIEFsdGVybmF0ZSBuYW1lIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTH0gKi9cbiAgICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7cmV0dXJuIHRoaXMucGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50KTt9XG4gICAgXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBzdHJpbmcgb2YgaHRtbCBhbmQgZXNjYXBlcyBpdCB1c2luZyB0aGUgYnJvd2VyJ3Mgb3duIGVzY2FwaW5nIG1lY2hhbmlzbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbCAtIGh0bWwgdG8gYmUgZXNjYXBlZFxuICAgICAqL1xuICAgIHN0YXRpYyBlc2NhcGVIVE1MKGh0bWwpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgc3BhbkVsZW1lbnQuYXBwZW5kKHRleHROb2RlKTtcbiAgICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gaHRtbDtcbiAgICAgICAgcmV0dXJuIHNwYW5FbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5mbGF0KCkuZmlsdGVyKGMgPT4gYyk7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc2VzKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50OiBUb2dnbGUgY2xhc3MgdmFsdWU7XG4gICAgICogaS5lLiwgaWYgY2xhc3MgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0IGFuZCByZXR1cm4gZmFsc2UsIGlmIG5vdCwgdGhlbiBhZGQgaXQgYW5kIHJldHVybiB0cnVlLlxuICAgICAqIFdoZW4gYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudDpcbiAgICAgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIGNsYXNzIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byB0b2dnbGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmRpY2F0b3JdIC0gT3B0aW9uYWwgaW5kaWNhdG9yIGZvciBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHRvZ2dsZWRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIHRvZ2dsZUNsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSwgaW5kaWNhdG9yKSB7XG4gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKTtcbiAgICAgICAgaWYgKHR5cGVvZihpbmRpY2F0b3IpICE9PSBcInVuZGVmaW5lZFwiKSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjLCBpbmRpY2F0b3IpKTtcbiAgICAgICAgZWxzZSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjKSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIGNsYXNzXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lKSB7XG4gICAgICAgIHJldHVybiBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYykuZXZlcnkoYyA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgb25lIGNsYXNzIHdpdGggYW5vdGhlclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZE5hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHJlcGxhY2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3TmFtZSAtIE5ldyBuYW1lIGZvciB0aGUgY2xhc3NcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXG4gICAgICovXG4gICAgc3RhdGljIHJlcGxhY2VDbGFzcyhlbGVtZW50LCBvbGROYW1lLCBuZXdOYW1lKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2Uob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgYXBwZW5kZWQgdG8gYW5vdGhlciBub2RlXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgYXBwZW5kZWQgdG9cbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBhcHBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoYXROb2RlLmFwcGVuZCh0aGlzTm9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBwcmVwZW5kZWQgdG8gYW5vdGhlciBub2RlXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgcHJlcGVuZGVkIHRvXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgcHJlcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhhdE5vZGUucHJlcGVuZCh0aGlzTm9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5pbnNlcnRBZnRlcihvdGhlckVsZW1lbnQpYC5cbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXROb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBpbnNlcnRBZnRlcih0aGlzTm9kZSwgdGFyZ2V0Tm9kZSkge1xuICAgICAgICB0YXJnZXROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXNOb2RlLCB0YXJnZXROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50LmFmdGVyKG5ld0VsZW1lbnQpYC5cbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBhZnRlcih0aGlzTm9kZSwgbmV3Tm9kZSkge1xuICAgICAgICB0aGlzTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCB0aGlzTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIG5leHQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RvciA/IGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIisgXCIgKyBzZWxlY3RvcikgOiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBzdWJzZXF1ZW50IHNpYmxpbmdzLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG5leHQgc2libGluZ3Mgb2ZcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcbiAgICAgKi9cbiAgICBzdGF0aWMgbmV4dEFsbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ+ICpcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3Vic2VxdWVudCBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgc2libGluZ3Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXG4gICAgICovXG4gICAgc3RhdGljIG5leHRVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBuZXh0ID0gW107IFxuICAgICAgICB3aGlsZSAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0LnB1c2goZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XG4gICAgICovXG4gICAgc3RhdGljIHByZXZpb3VzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKHNlbGVjdG9yKSByZXR1cm4gcHJldmlvdXMgJiYgcHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikgPyBwcmV2aW91cyA6IG51bGw7XG4gICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwcmVjZWVkaW5nIHNpYmxpbmdzLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcbiAgICAgKiBAcmV0dXJucyB7Tm9kZUxpc3R9IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcbiAgICAgKi9cbiAgICBzdGF0aWMgcHJldmlvdXNBbGwoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdO1xuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBwcmV2aW91c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107IFxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XG4gICAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHdoaWNoIGluZGV4IGluIGNoaWxkcmVuIGEgY2VydGFpbiBub2RlIGlzLiBTaW1pbGFyIHRvIGpRdWVyeSdzIGAkLmluZGV4KClgXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHRvIGZpbmQgaXRzIGluZGV4IGluIHBhcmVudFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBub2RlXG4gICAgICovXG4gICAgc3RhdGljIGluZGV4SW5QYXJlbnQobm9kZSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT0gMSkgbnVtKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMuaW5kZXhJblBhcmVudH0gKi9cbiAgICBzdGF0aWMgaW5kZXgobm9kZSkge3JldHVybiB0aGlzLmluZGV4SW5QYXJlbnQobm9kZSk7fVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IGlmIGl0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLFxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcGFyZW50IG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHBhcmVudFxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgc2libGluZyBlbGVtZW50IG9yIG51bGxcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50KGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xuICAgICAgICByZXR1cm4gIXNlbGVjdG9yIHx8IGVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSA/IGVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cbiAgICAgKi9cbiAgICBzdGF0aWMgZmluZENoaWxkKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxuICAgICAqL1xuICAgIHN0YXRpYyBmaW5kQ2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGFuY2VzdG9ycyBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBwYXJlbnRzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBwYXJlbnRzIHRvXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyZW50cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSk7XG4gICAgICAgIGVsc2Ugd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcnMgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgYW5jZXN0b3JzIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXG4gICAgICovXG4gICAgc3RhdGljIHBhcmVudHNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XG4gICAgICAgIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgIWVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBzaWJsaW5ncyBvZiB0aGUgZWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgc2libGluZ3Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiKlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBzaWJsaW5ncyB0b1xuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xuICAgICAqL1xuICAgIHN0YXRpYyBzaWJsaW5ncyhlbGVtZW50LCBzZWxlY3RvciA9IFwiKlwiKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGUgPT4gZSAhPSBlbGVtZW50ICYmIGUubWF0Y2hlcyhzZWxlY3RvcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyBjc3Mgc3R5bGVzIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHN0eWxlIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3R5bGUuICBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBnZXQgb3Igc2V0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBWYWx1ZSB0byBzZXQgZm9yIGF0dHJpYnV0ZVxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fHN0cmluZ30gLSBXaGVuIHNldHRpbmcgYSB2YWx1ZSwgZWxlbWVudCBpcyByZXR1cm5lZCBmb3IgY2hhaW5pbmcsIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgc3RhdGljIGNzcyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVthdHRyaWJ1dGVdO1xuICAgICAgICBlbGVtZW50LnN0eWxlW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSB3aWR0aCBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSB3aWR0aCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHdpZHRoLiAgXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gV2lkdGggdG8gc2V0XG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgd2lkdGgoZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkud2lkdGgpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgaGVpZ2h0IGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIGhlaWdodCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIGhlaWdodC4gIFxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIEhlaWdodCB0byBzZXRcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBoZWlnaHQoZWxlbWVudCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW5uZXIgdGV4dCBvZiBhbiBlbGVtZW50IGlmIGdpdmVuIGEgdmFsdWUsIG90aGVyd2lzZSByZXR1cm5zIGl0LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSB0ZXh0IG9mXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XSAtIENvbnRlbnQgdG8gc2V0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBFaXRoZXIgdGhlIHN0cmluZyBzZXQgYnkgdGhpcyBjYWxsIG9yIHRoZSBjdXJyZW50IHRleHQgY29udGVudCBvZiB0aGUgbm9kZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdGV4dChlbGVtZW50LCB0ZXh0KSB7XG4gICAgICAgIGlmICh0eXBlb2YodGV4dCkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lcldpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgd2lkdGggb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIHN0YXRpYyBpbm5lcldpZHRoKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciBoZWlnaHQgb2ZcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgaW5uZXJIZWlnaHQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIHdpZHRoIG9mXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBzdGF0aWMgb3V0ZXJXaWR0aChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG91dGVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgaGVpZ2h0IG9mXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgc3RhdGljIG91dGVySGVpZ2h0KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgcGFnZS5cbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBvZmZzZXQgb2ZcbiAgICAgKiBAcmV0dXJuIHtPZmZzZXR9IC0gVGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudFxuICAgICAqL1xuICAgIHN0YXRpYyBvZmZzZXQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGxpc3RlbmVycygpIHsgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pOyB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9uYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxuICAgICAqIFxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIG9uY2UuXG4gICAgICogYGNvbnN0IGNhbmNlbCA9IERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiZmlyZWQhXCIpOyBjYW5jZWwoKTt9KTtgXG4gICAgICogXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBzdGF0aWMgb24oZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSkgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uc3BsaWNlKHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0uZmluZEluZGV4KGwgPT4gbC5ldmVudCA9PSB0eXBlICYmIGwuZWxlbWVudCA9PSBlbGVtZW50KSwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBldmVudDogdHlwZSxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbmFsaXR5IGZvciB0aGlzIG1ldGhvZCBtYXRjaGVzIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub259IGJ1dCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmXG4gICAgICogYW5kIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHVwb24gdGhlIGZpcnN0IGZpcmluZyBvZiB0aGUgZGVzaXJlZCBldmVudC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIHN0YXRpYyBvbmNlKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcbiAgICAgICAgfSA6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkgcmV0dXJuO1xuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgICAgICBjYW5jZWw6IG5ld0NhbmNlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWw7XG4gICAgfVxuXG4gICAgc3RhdGljIF9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgbWF0Y2hGaWx0ZXIgPSBsaXN0ZW5lciA9PiBsaXN0ZW5lci5ldmVudCA9PSB0eXBlLCBkZWZhdWx0RmlsdGVyID0gXyA9PiBfO1xuICAgICAgICBpZiAoZWxlbWVudCkgbWF0Y2hGaWx0ZXIgPSBsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCwgZGVmYXVsdEZpbHRlciA9IGwgPT4gbC5lbGVtZW50ID09IGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gfHwgW107XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0eXBlID8gbGlzdGVuZXJzLmZpbHRlcihtYXRjaEZpbHRlcikgOiBsaXN0ZW5lcnMuZmlsdGVyKGRlZmF1bHRGaWx0ZXIpO1xuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGxpc3QubGVuZ3RoOyBjKyspIGxpc3RbY10uY2FuY2VsKCk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb2ZmYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxuICAgICAqIFxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIG9uQ2xpY2spO2BcbiAgICAgKiBcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZWQgd2hlbiB0aGUgdGFyZ2V0IGlzIGEgYC5ibG9ja2AgZWxlbWVudC5cbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgb25DbGljayk7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGlja1wiLCBvbkNsaWNrKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gYGVsZW1lbnRgLlxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCIubXlQbHVnaW5cIik7YFxuICAgICAqIFxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGNsaWNrIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxuICAgICAqIGBET01Ub29scy5vZmYoXCJjbGljay5teVBsdWdpblwiKTtgXG4gICAgICogXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXG4gICAgICogYERPTVRvb2xzLm9mZihcIi5teVBsdWdpblwiKTtgXG4gICAgICogXG4gICAgICogQHBhcmFtIHsoRWxlbWVudHxzdHJpbmcpfSBlbGVtZW50IC0gRWxlbWVudCB0byByZW1vdmUgbGlzdGVuZXIgZnJvbVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRdIC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IFtkZWxlZ2F0ZV0gLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBvcmlnaW5hbCBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBvZmYoZWxlbWVudCwgZXZlbnQsIGRlbGVnYXRlLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mKGVsZW1lbnQpID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkgcmV0dXJuIHRoaXMuX19vZmZBbGwoZXZlbnQsIGVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igd2hlbiB0aGUgbm9kZSBpcyBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IGJvZHkuXG4gICAgICogVGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB1cG9uIGZpcmluZy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gbm9kZSB0byB3YWl0IGZvclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IGNhbGxiYWNrIC0gZnVuY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGV2ZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbk1vdW50IC0gZGV0ZXJtaW5lcyBpZiBpdCBzaG91bGQgZmlyZSBvbiBNb3VudCBvciBvbiBVbm1vdW50XG4gICAgICovXG4gICAgc3RhdGljIG9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIG9uTW91bnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjaywgbXV0YXRpb24gPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG9uTW91bnQgPyBtdXRhdGlvbi5hZGRlZE5vZGVzIDogbXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgdHJ1ZWAgKi9cbiAgICBzdGF0aWMgb25Nb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrKTsgfVxuXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgZmFsc2VgICovXG4gICAgc3RhdGljIG9uVW5tb3VudChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cblxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50fSAqL1xuICAgIHN0YXRpYyBvbkFkZGVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnQobm9kZSwgY2FsbGJhY2spOyB9XG5cbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Vbm1vdW50fSAqL1xuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrLCBmYWxzZSk7IH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCBjb21iaW5lcyBtdWx0aXBsZSBlbGVtZW50cyBpbnRvIG9uZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIGFycmF5IG9mIGVsZW1lbnRzIHRvIHB1dCBpbnRvIGEgc2luZ2xlIHBhcmVudFxuICAgICAqL1xuICAgIHN0YXRpYyB3cmFwKGVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGRvbVdyYXBwZXIgPSB0aGlzLnBhcnNlSFRNTChgPGRpdiBjbGFzcz1cImRvbS13cmFwcGVyXCI+PC9kaXY+YCk7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIGRvbVdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudHNbZV0pO1xuICAgICAgICByZXR1cm4gZG9tV3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgbm9kZSB0byBhbiBIVE1MRWxlbWVudC4gVGhpcyBpcyBtYWlubHkgdXNlZCBieSBsaWJyYXJ5IG1vZHVsZXMuXG4gICAgICogQHBhcmFtIHsoalF1ZXJ5fEVsZW1lbnQpfSBub2RlIC0gbm9kZSB0byByZXNvbHZlXG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmVFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XG4gICAgfVxufVxuXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRE9NID0gRE9NVG9vbHMiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmNvbnN0IENvbnN0YW50cyA9IHtcbiAgICBFbW9qaVJlZ2V4OiAvPGE/XFwuKFxcdyspXFwuKFxcZCspPi9nXG59XG5cbmxldCBDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxubGV0IEVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxubGV0IEF1dG9jb21wbGV0ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVswXVxubGV0IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylbMF1cbmxldCBFbW9qaU1vZHVsZVF1ZXJ5ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpWzBdXG5sZXQgTWVzc2FnZXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpWzBdXG5sZXQgZ3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylbMF1cbmxldCBlbW9qaVNlYXJjaCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW9qaU1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5pbml0KCkuY2F0Y2goZXJyID0+IFV0aWxzLmVycihcIkVtb2ppTW9kdWxlXCIsIFwiQW4gZXJyb3Igb2NjdXJlZFwiLCBlcnIpKSAvLyBiZXR0ZXIgbG9nZ2luZ1xuICAgIH1cblxuICAgIGFzeW5jIGluaXQoKXtcbiAgICAgICAgLyoqIEVtb2ppIEF1dG9Db21wbGV0ZSAqL1xuICAgICAgICBpZighQXV0b2NvbXBsZXRlTW9kdWxlKUF1dG9jb21wbGV0ZU1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXG4gICAgICAgIGlmKCFFbW9qaU1vZHVsZVF1ZXJ5KUVtb2ppTW9kdWxlUXVlcnkgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpXG4gICAgICAgIGlmKCFNZXNzYWdlcylNZXNzYWdlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5NZXNzYWdlcyAmJiBlLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcpXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcbiAgICAgICAgaWYoIWVtb2ppU2VhcmNoKWVtb2ppU2VhcmNoID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXG5cbiAgICAgICAgaWYoQXV0b2NvbXBsZXRlTW9kdWxlICYmIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzICYmIEVtb2ppTW9kdWxlUXVlcnkgJiYgTWVzc2FnZXMgJiYgZ3VpbGRNb2R1bGUgJiYgZW1vamlTZWFyY2gpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcbiAgICAgICAgICAgIGNvbnN0IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zXG4gICAgICAgICAgICBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zID0gZnVuY3Rpb24oZSwgdCwgbiwgciwgYSl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgIHZhbHVlLkxJR0hUQ09SRF9FTU9KSVMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMoYXJnMSwgYXJnMil7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIFwiLlwiID09PSBhcmcxXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFbW9qaVVzYWJsZShjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cyh0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gRW1vamlNb2R1bGVRdWVyeS5kZWZhdWx0LnF1ZXJ5RW1vamlSZXN1bHRzKHQsIGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJSZXN1bHRzKGUsIHQsIG4sIHIsIGEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoZSwgdCwgYS5lbW9qaXMsIG4sIHIsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSkksIEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LkVtb2ppLCAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQgfHwgZS51bmlxdWVOYW1lIHx8IGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWw6IFwiLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlsZDogbnVsbCAhPSBlLmd1aWxkSWQgPyBndWlsZE1vZHVsZS5kZWZhdWx0LmdldEd1aWxkKGUuZ3VpbGRJZCkgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgZSArIFwiLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhaW5UZXh0KGlkLCBndWlsZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBnZXRSYXdUZXh0KGlkLCBndWlsZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3Qgc3RhcnQgYXV0b2NvbXBsZXRpb24gb2YgTGlnaHRjb3JkJ3MgZW1vamlzLlwiKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBFbW9qaSBkaXNwbGF5ICovXG4gICAgICAgIHdoaWxlICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb2ppUmVuZGVyKXsgLy8gVE9ETzogUHJvcGVyIGVtb2ppIGZvcm1hdHRpbmcgLyByZW5kZXJpbmdcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZVwiKVxuICAgICAgICAgICAgICAgIGlmKCFtZXNzYWdlKXJldHVyblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxuICAgICAgICAgICAgICAgIGlmKCFjb250ZW50IHx8ICFjb250ZW50Lmxlbmd0aClyZXR1cm5cbiAgICBcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBAdHlwZSB7e1xuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgKiAgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAqICBpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxuICAgICAgICAgICAgICAgICAqIH1bXX1cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gW11cbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaChub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnNlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBFbW9qaU1vZHVsZUFwaS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZChwYXJzZWRbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZW1vamkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbW9qaS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IHBhcnNlZFswXS5zdGFydHNXaXRoKFwiPGFcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmKGhhc1BhcnNlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF3b3JkKXJldHVybiBcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBlbW9qaXMuZmluZChlID0+IGUucmF3ID09IHdvcmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUN1c3RvbUVtb2ppTW9kdWxlKUN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tRW1vamlNb2R1bGUuQ3VzdG9tRW1vamksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAuJHtlbW9qaS5uYW1lfS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlJZDogZW1vamkuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1ib2FibGU6IGFyci5sZW5ndGggPT09IDEgJiYgY29udGVudC5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJldmlvdXMubGVuZ3RoID09PSAwKXJldHVybiBbY3VycmVudF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSArPSBgICR7Y3VycmVudH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiK2N1cnJlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5wdXNoKFwiIFwiLCBjdXJyZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2goLi4ud29yZHMpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50WzBdKXtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnNoaWZ0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUobmV3Q29udGVudFswXSl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5wdXNoKG5ld0NvbnRlbnQuc2hpZnQoKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fSk7XG4gICAgICAgIH0vKlxuICAgICAgICBsZXQgdXNlck1vZHVsZVxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiRW1vamlQaWNrZXJMaXN0Um93XCIpXG4gICAgICAgIC50aGVuKEVtb2ppUGlja2VyTGlzdFJvdyA9PiB7XG4gICAgICAgICAgICBsZXQgY2xhc3NzID0gRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHRcbiAgICAgICAgICAgIEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0ID0gY2xhc3MgRW1vamlQaWNrZXJMaXN0Um93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlbmRlcigpe1xuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSl1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXG4gICAgICAgICAgICAgICAgICAgIGlmKCF1c2VyTW9kdWxlKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxuICAgICAgICAgICAgICAgICAgICBpZighdXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjbGFzc3MsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppRGVzY3JpcHRvcnM6IHRoaXMucHJvcHMuZW1vamlEZXNjcmlwdG9ycy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pc0Rpc2FibGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pKSAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQuZGlzcGxheU5hbWUgPSBcIkVtb2ppUGlja2VyTGlzdFJvd1wiXG4gICAgICAgIH0pKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW90ZVJlbmRlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXJ0KCl7XG4gICAgICAgIFxuICAgIH1cbn1cblxuZnVuY3Rpb24gRChlLCB0LCBuLCByLCBvLCBpLCBzLCB1LCBsLCBjKSB7XG4gICAgaWYgKG51bGwgPT0gbiB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGQgPSBuLm1hcCgoZnVuY3Rpb24oZSwgbikge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh1LCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IG8sXG4gICAgICAgICAgICBvbkhvdmVyOiByLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHQgPT09IG4sXG4gICAgICAgICAgICBpbmRleDogblxuICAgICAgICB9LCBsKGUsIG4pKSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIFtSKGksIHMsIGUsIGMpLCBkXVxufVxuXG5mdW5jdGlvbiBSKGUsIHQsIG4sIHIpIHtcbiAgICB2YXIgYSA9IChuLmxlbmd0aCA+IDAgPyBlLmZvcm1hdCh7XG4gICAgICAgIHByZWZpeDogcihuKVxuICAgIH0pIDogdClcbiAgICBpZihBcnJheS5pc0FycmF5KGEpKXtcbiAgICAgICAgYS51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwge30sIFwiW0xpZ2h0Y29yZF0gXCIpKVxuICAgIH1lbHNle1xuICAgICAgICBhID0gXCJbTElHSFRDT1JEXSBcIithXG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LlRpdGxlLCB7XG4gICAgICAgIHRpdGxlOiBhXG4gICAgfSwgYSlcbn1cblIuZGlzcGxheU5hbWUgPSBcInJlbmRlckhlYWRlclwiO1xuXG5sZXQgRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXG5sZXQgaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUgJiYgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcbmxldCBpc1VzYWJsZSA9IGZhbHNlXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXG5cbmZ1bmN0aW9uIHNldEVtb2ppVXNhYmxlKHVzYWJsZSl7XG4gICAgaXNVc2FibGUgPSB1c2FibGVcbiAgICBpZihoYXNQYXRjaGVkKXJldHVyblxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpcmV0dXJuXG4gICAgaWYoIWlzRW1vamlEaXNhYmxlZClpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxuXG4gICAgaGFzUGF0Y2hlZCA9IHRydWVcbiAgICBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZCA9IGZ1bmN0aW9uKGVtb2ppKXtcbiAgICAgICAgaWYoaXNVc2FibGUpe1xuICAgICAgICAgICAgaWYoZW1vamkuc3Vycm9nYXRlcyB8fCBlbW9qaS5kaXZlcnNpdHkpcmV0dXJuIHRydWVcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Vtb2ppRGlzYWJsZWQuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcbmNvbnN0IHt1c2VTdGF0ZX0gPSBCRFYyLnJlYWN0XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZvcmNlVXBkYXRlKCl7XG4gICAgcmV0dXJuIHVzZVN0YXRlKClbMV07XG59IiwiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXG5pbXBvcnQgKiBhcyBlbGVjdHJvbiBmcm9tIFwiZWxlY3Ryb25cIlxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIlxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiXG5pbXBvcnQgeyBhZGRvbkNhY2hlIH0gZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIlxuXG5jb25zdCBjYWNoZSA9IHt9XG5jb25zdCBjYWNoZTIgPSB7fVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgUGx1Z2luQ2VydGlmaWVyIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luQ2VydGlmaWVyID0gdGhpc1xuICAgIH1cblxuICAgIHBhdGNoKGF0dGFjaG1lbnQsIGlkKXtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGFydCgpe1xuXG4gICAgfVxuXG4gICAgaXNUcnVzdGVkKGhhc2gpe1xuICAgICAgICByZXR1cm4gY2FjaGVbaGFzaF0gJiYgIWNhY2hlW2hhc2hdLnN1c3BlY3RcbiAgICB9XG59XG5cbmNvbnN0IHRlc3RzID0gW1xuICAgIFsvdG9rZW4vZ2ksIDBdLFxuICAgIFsvZW1haWwvZ2ksIDBdLFxuICAgIFsvbWZhL2dpLCAwXSxcbiAgICBbLzJmYS9naSwgMF0sXG4gICAgWy9waG9uZS9naSwgMF0sXG4gICAgWy9jaGlsZF9wcm9jZXNzL2dpLCAwXSxcbiAgICBbL2xvY2FsU3RvcmFnZS9naSwgMF0sXG4gICAgWy9nZXRHbG9iYWwvZ2ksIDBdLFxuICAgIFsvQnJvd3NlcldpbmRvdy9naSwgMF0sXG4gICAgWy9cXC5leGUvZ2ksIDBdLFxuICAgIFsvZXZhbC9naSwgMF0sXG4gICAgWy9XZWJBc3NlbWJseS9naSwgMF0sXG4gICAgWy9YTUxIdHRwUmVxdWVzdChcXC58XFxbW1wiJ2BdKXByb3RvdHlwZS9naSwgMF0sXG4gICAgWy93aW5kb3dcXC5mZXRjaCggKyk/PS9naSwgMF0sXG4gICAgLyoqIE9iZnVzY2F0aW9uIC8gaGlkZGVuIC8gd29ya2Fyb3VuZHMgKi9cbiAgICBbLyhbXCInYF1cXCspW1wiJ2BdXFx3W1wiJ2BdL2dpLCAxXSxcbiAgICBbL1tcIidgXVxcd1tcIidgXShcXCtbXCInYF0pL2dpLCAxXSxcbiAgICBbL1xcJHtbXCInYF1cXHcrW1wiJ2BdfS9naSwgMV0sXG4gICAgLyoqIGhleGFkZWNpbWFsICovXG4gICAgWy9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIDFdLFxuICAgIFsvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJyggKyk/LCggKyk/J1teJ117NH0nXFwpL2csIDFdLCAvLyBfMHg4ZGI3KCcweDAnLCAneDFdZicpXG4gICAgLyoqIG1hbmdsZWQgKi9cbiAgICBbL1xcdytcXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csIDFdLCAvLyBiKCcweDAnKVxuICAgIFsvXFx3K1xcKCcweFtcXGRhYmNkZWZdKycoICspPywoICspPydbXiddezR9J1xcKS9nLCAxXSwgLy8gYignMHgwJywgJ3gxXWYnKVxuICAgIC8qKiBzdHJpbmcgYXJyYXkgYXQgc3RhcnQgKi9cbiAgICBbL152YXIgW1xcd1xcZF8kXSs9XFxbXCIvZ2ksIDFdXG5dXG5cbmNvbnN0IHRocmVhdHMgPSBbXG4gICAgXCJBY2NvdW50IFN0ZWFsZXIvVmlydXNcIixcbiAgICBcIk9iZnVzY2F0aW9uL0hpZGRlbiBjb2RlXCJcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKXtcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIilcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGNvbnN0IG5vX2NvbW1lbnRzID0gZGF0YS5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfChbXlxcXFw6XXxeKVxcL1xcLy4qJC9nbSwgXCJcIikudHJpbSgpLy8gcmVtb3ZpbmcgYWxsIGNvbW1lbnRzIGZyb20gcGx1Z2lucyAocmVtb3ZlIG1ldGEgYW5kIG90aGVyLilcblxuICAgIGZvcihjb25zdCBbdGVzdCwgdHlwZV0gb2YgdGVzdHMpe1xuICAgICAgICBjb25zdCBzY3JwdCA9IHR5cGUgPT09IDEgPyBub19jb21tZW50cyA6IGRhdGFcbiAgICAgICAgaWYodGVzdC5leGVjKHNjcnB0KSl7XG4gICAgICAgICAgICBpc0hhcm1mdWwgPSB0aHJlYXRzW3R5cGVdXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYoIWlzSGFybWZ1bClyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcbiAgICBjYWNoZVtoYXNoXSA9IHtcbiAgICAgICAgc3VzcGVjdDogdHJ1ZSxcbiAgICAgICAgbmFtZTogaGFzaFRvVXJsW2hhc2hdLnNwbGl0KFwiL1wiKS5wb3AoKSxcbiAgICAgICAgdHlwZTogaGFzaFRvVXJsW2hhc2hdLmVuZHNXaXRoKFwiLmpzXCIpID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIixcbiAgICAgICAgaGFybTogaXNIYXJtZnVsLFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBmaWxlbmFtZVxuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXG5cbiAgICByZXN1bHRDYWxsYmFjayhjYWNoZVtoYXNoXSlcbn1cblxuY29uc3QgaGFzaFRvVXJsID0ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSGFzaChoYXNoLCBkYXRhLCBmaWxlbmFtZSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKXtcbiAgICBjb25zb2xlLmxvZyhgRmlsZTogJHtmaWxlbmFtZX0gaGFzaDogJHtoYXNofWApXG4gICAgaWYoIWNhY2hlW2hhc2hdKXtcbiAgICAgICAgbm9kZUZldGNoKFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL0xpZ2h0Y29yZC9maWxlaGFzaGVzQG1hc3Rlci9oYXNoZXMvXCIraGFzaCwgeyAvLyBVc2luZyBub2RlLWZldGNoIHRvIGJ5cGFzcyBjb3JzXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnQgLy8gaGF2ZSB0byBzZXQgdXNlci1hZ2VudFxuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApe1xuICAgICAgICAgICAgICAgIGlmKGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcbiAgICAgICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKVxuICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFjaygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgICAgICAgcmVzdWx0Lmhhc2ggPSBoYXNoXG4gICAgICAgICAgICByZXN1bHQuZmlsZW5hbWUgPSBmaWxlbmFtZVxuXG4gICAgICAgICAgICBjYWNoZVtoYXNoXSA9IHJlc3VsdFxuXG4gICAgICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCByZWFkIGZyb20gZ2l0aHViLiAke2Vycn1gKVxuICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxuICAgICAgICAgICAgY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpXG4gICAgICAgIH0pXG4gICAgfWVsc2V7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhY2hlW2hhc2hdXG5cbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlKF9fcGF0aCwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrID0gKGhhc2gpID0+IHt9LCBpc0Zyb21Mb2FkZXIgPSBmYWxzZSl7ICAgIFxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXG5cbiAgICBjcmVhdGVSZWFkU3RyZWFtKF9fcGF0aCkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcbiAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXG4gICAgfSkub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcblxuICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBfX3BhdGhcblxuICAgICAgICBpZihpc0Zyb21Mb2FkZXIgJiYgYWRkb25DYWNoZVtoYXNoUmVzdWx0XSl7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVbaGFzaFJlc3VsdF1cbiAgICAgICAgICAgICAgICBjb250ZW50TWFuYWdlci5zYXZlQWRkb25DYWNoZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayh2YWx1ZS5yZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZCl7XG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXG4gICAgaWYoIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpICYmICFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXG5cbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcbiAgICAgICAgfVxuICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIkZpbGUgZG9lc24ndCBleGlzdC5cIilcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxuICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKVxuXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxuICAgICAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gYXR0YWNobWVudC51cmxcblxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGF0dGFjaG1lbnQuZmlsZW5hbWUpXG4gICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgICAgICBpZihlbGVtKWVsZW0ucmVtb3ZlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfSkuY2F0Y2goKCk9Pnt9KVxufVxuXG5sZXQgZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXG4gKiBAcGFyYW0ge3t0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBvZmZpY2lhbD86IGJvb2xlYW59fHtzdXNwZWN0OnRydWUsIHR5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIGhhcm06IHN0cmluZ319IHJlc3VsdFxuICovXG5mdW5jdGlvbiByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGZpbGVuYW1lKXtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxuXG4gICAgaWYoIWZsb3dlclN0YXJNb2R1bGUpZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXG4gICAgXG4gICAgaWYocmVzdWx0LnN1c3BlY3Qpe1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xuICAgICAgICAgICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSBcIkFcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgP1wiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgQW55d2F5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUoZGl2LnBhcmVudE5vZGUpXG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN2ZylbMF0uc3ZnLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDQwIDMyXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OlwiMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s6XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtMzIpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTpCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApLCBkaXYpXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIiwgZmxvYXQ6IFwibGVmdFwifX0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCJ9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCJ9LCBvbkNsaWNrKCl7XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJMaWdodGNvcmQgd2lsbCBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYW5kIGxhdW5jaCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIuIFlvdSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvLlwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsaW5rKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmV0Y2gobGluaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0dXMgd2FzIG5vdCAyMDBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgcmVzLmJ1ZmZlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbnN0YWxsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMoaW5zdGFsbFBhdGgsIGNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDI0IDI0XCIsc3R5bGU6e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImZpbGxcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICBdKVxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzcGFuLCBkaXYpXG4gICAgfWVsc2V7XG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIHdhcyBtYWRlIGJ5IHRoZSBkZXZlbG9wZXJzIG9mIExpZ2h0Y29yZC5cIiwgc3R5bGU6XCJicmFuZFwifSwgXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIixzdHJva2U6XCIjMzYzOTNmXCIsc3R5bGU6e2NvbG9yOlwiIzQwODdlZFwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiY3VycmVudENvbG9yXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcbiAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgbXVzdCBlbmFibGUgaXQgaW4gdGhlIHNldHRpbmdzLlwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIHdhcyBub3QgMjAwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgXSlcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0S2V5ZWRBcnJheShvYmope1xuICAgIGxldCBhcnIgPSBbXVxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcbiAgICAgICAgYXJyLnB1c2goW2ssIG9ialtrXV0pXG4gICAgfSlcbiAgICByZXR1cm4gYXJyXG59XG5cbmxldCBrZXkgPSBudWxsXG5sZXQgc2F2ZSA9IG51bGxcblxud2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQobT0+bS5PYmplY3RTdG9yYWdlKVxuLnRoZW4obG9jYWxTdG9yYWdlTW9kdWxlID0+IHtcbiAgICBsZXQgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlTW9kdWxlLmltcGxcbiAgICBzYXZlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldChcIlBsdWdpbkNlcnRpZmllcktleUVuY3J5cHRpb25fX1wiLCBidG9hKEpTT04uc3RyaW5naWZ5KGtleSkpKVxuICAgIH1cbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHNhdmUoKVxuICAgIH0sIDEwMDAwMCk7XG4gICAgdHJ5e1xuICAgICAgICBsZXQgdmFsID0gc2FmZUpTT05QYXJzZShhdG9iKGxvY2FsU3RvcmFnZS5nZXQoXCJQbHVnaW5DZXJ0aWZpZXJLZXlFbmNyeXB0aW9uX19cIikpKVxuICAgICAgICBpZih2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCAhQXJyYXkuaXNBcnJheSh2YWwpIHx8IHZhbC5sZW5ndGggIT09IDIgfHwgdmFsLmZpbmQoZSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgfHwgQnVmZmVyLmZyb20odmFsWzBdLCBcImJhc2U2NFwiKS5sZW5ndGggIT09IDE2IHx8IEJ1ZmZlci5mcm9tKHZhbFsxXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAzMil7XG4gICAgICAgICAgICBnZW5lcmF0ZUtleSgpXG4gICAgICAgICAgICBzYXZlKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGtleSA9IHZhbFxuICAgIH1jYXRjaChlKXtcbiAgICAgICAgZ2VuZXJhdGVLZXkoKVxuICAgICAgICBzYXZlKClcbiAgICB9XG59KVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUtleSgpe1xuICAgIGtleSA9IFtjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLCBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXVxufVxuXG5mdW5jdGlvbiBzYWZlSlNPTlBhcnNlKGpzb24pe1xuICAgIHRyeXtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcbiAgICB9Y2F0Y2goZSl7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3IgPyBuZXcgRXJyb3IoZSkgOiBlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XG4gICAgdHJ5e1xuICAgICAgICBsZXQgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihcImFlcy0yNTYtY2JjXCIsIEJ1ZmZlci5mcm9tKGtleVsxXSwgXCJiYXNlNjRcIiksIEJ1ZmZlci5mcm9tKGtleVswXSwgXCJiYXNlNjRcIikpXG4gICAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIikpO1xuICAgICAgICBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9Y2F0Y2goZSl7XG4gICAgICAgIHJldHVybiBcInt9XCJcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XG4gICAgbGV0IGFyZ3MgPSBbQnVmZmVyLmZyb20oa2V5WzFdLCBcImJhc2U2NFwiKSwgQnVmZmVyLmZyb20oa2V5WzBdLCBcImJhc2U2NFwiKV1cbiAgICBcbiAgICBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIC4uLmFyZ3MpO1xuICAgIGxldCBlbmNyeXB0ZWQgPSBjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwidXRmOFwiKSk7XG4gICAgZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdGVkLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoXCJiYXNlNjRcIilcbn0iLCJpbXBvcnQge2JkcGx1Z2luRXJyb3JzLCBwbHVnaW5Db29raWUsIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbnN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcblxuY2xhc3MgUGx1Z2luTW9kdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luTW9kdWxlID0gdGhpc1xuICAgIH1cbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cbn1cblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmxvYWRQbHVnaW5EYXRhKCk7XG4gICAgYmRwbHVnaW5FcnJvcnMuc3BsaWNlKDAsIDAsIC4uLihhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkUGx1Z2lucygpKSk7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBwbHVnaW4sIG5hbWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBsb2FkZWQuXCIsIGVycik7XG4gICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwibG9hZCgpIGNvdWxkIG5vdCBiZSBmaXJlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwbHVnaW5Db29raWVbbmFtZV0pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0YXJ0ZWQuYCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIG5hbWUgKyBcIiBjb3VsZCBub3QgYmUgc3RhcnRlZC5cIiwgZXJyKTtcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXG4gICAgfVxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcblxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkub24oXCJkaWQtbmF2aWdhdGUtaW4tcGFnZVwiLCB0aGlzLmNoYW5uZWxTd2l0Y2guYmluZCh0aGlzKSk7XG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0YXJ0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdGFydCgpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0YXJ0ZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgcGx1Z2luICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdG9wUGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdG9wKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0b3BwZWQuYCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RvcHBlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKSArIFwiIGNvdWxkIG5vdCBiZSBzdG9wcGVkLlwiLCBlcnIpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IHRydWU7XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbik7XG4gICAgZWxzZSB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiAoY29uc29sZS5sb2cocC5maWxlbmFtZSwgZmlsZW5hbWUpKSB8fCBwLmZpbGVuYW1lID09IGZpbGVuYW1lKS5wbHVnaW47XG4gICAgdHJ5IHsgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO31cbiAgICBjYXRjaCAoZXJyKSB7aWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycl19KTt9XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLWxvYWRlZFwiLCBwbHVnaW4uZ2V0TmFtZSgpKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudW5sb2FkUGx1Z2luID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgZGVsZXRlIGJkcGx1Z2luc1twbHVnaW5dO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIGVycm9yKTtcbiAgICB9XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tdW5sb2FkZWRcIiwgcGx1Z2luKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XG4gICAgdGhpcy51bmxvYWRQbHVnaW4oYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybiB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWVPck5hbWUpO1xuICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luLnBsdWdpbi5nZXROYW1lKCk7XG4gICAgY29uc3QgZW5hYmxlZCA9IHBsdWdpbkNvb2tpZVtwbHVnaW5dO1xuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLnJlbG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xuICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkICYmIHR5cGVvZihiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCgpO1xuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCk7XG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tcmVsb2FkZWRcIiwgcGx1Z2luKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJlbG9hZFBsdWdpbihuYW1lKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZmlsZW5hbWVPck5hbWUpO1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZ1bGxQYXRoKTtcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZVBsdWdpbkxpc3QgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJwbHVnaW5cIik7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkUGx1Z2luKG5hbWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbkNvb2tpZSwgc2F2ZWQpO1xuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc2F2ZVBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInBsdWdpbnNcIiwgcGx1Z2luQ29va2llKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubmV3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uTWVzc2FnZSgpOyB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvbk1lc3NhZ2UgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmNoYW5uZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25Td2l0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uU3dpdGNoKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uU3dpdGNoIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yYXdPYnNlcnZlciA9IGZ1bmN0aW9uKGUpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub2JzZXJ2ZXIoZSk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9ic2VydmVyIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IFBsdWdpbk1vZHVsZSgpOyIsImltcG9ydCB7IHRoZW1lQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCJcblxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIHBvcG91dFdpbmRvdyB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBXaW5kb3c+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy53aW5kb3dzID0gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuaW5pdCgpXG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCgpe1xuICAgICAgICBsZXQgcG9wb3V0TW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFdpbmRvdylcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfT1BFTlwiLCAoZXYpID0+IHtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQHR5cGUge1dpbmRvd31cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBwb3BvdXRNb2R1bGUuZGVmYXVsdC5nZXRXaW5kb3coZXYua2V5KVxuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5zZXQoZXYua2V5LCB3aW5kb3cpXG5cbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NMaXN0ID0gd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcIndpbmRvdy1wb3BvdXRcIilcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChcImxpZ2h0Y29yZFwiKVxuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZXYua2V5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfQ0xPU0VcIiwgKGV2KSA9PiB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2luZG93cy5kZWxldGUoZXYua2V5KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1lbmFibGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1kaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXG4gICAgICAgIH0pXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtcmVsb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxuICAgICAgICB9KVxuICAgICAgICBiZEV2ZW50cy5vbihcInRoZW1lLXVubG9hZGVkXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGVuYWJsZSgpe1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICAgIHRoaXMudXBkYXRlKClcbiAgICB9XG5cbiAgICBkaXNhYmxlKCl7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMudXBkYXRlKClcbiAgICB9XG5cbiAgICB1cGRhdGUoa2V5KXtcbiAgICAgICAgaWYoIXRoaXMud2luZG93cy5zaXplKXJldHVyblxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZVRoZW1lcyhrZXkpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUaGVtZXMoa2V5KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGhlbWVzKGtleSl7XG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgaWYoa2V5KXtcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVUaGVtZXMoa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlUaGVtZXMoa2V5KXtcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cbiAgICAgICAgaWYoa2V5KXtcbiAgICAgICAgICAgIGxldCB3aW5kb3cgPSB0aGlzLndpbmRvd3MuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShcIndpbGwtcmVtb3ZlXCIsIFwidHJ1ZVwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhiZHRoZW1lcylcbiAgICAgICAgICAgIC5mb3JFYWNoKHRoZW1lTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lQ29va2llW3RoZW1lTmFtZV0pcmV0dXJuIC8vIHRoZW1lIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZU5hbWVdXG4gICAgICAgICAgICAgICAgaWYoIXRoZW1lKXJldHVybiAvLzpzaHJ1ZzpcblxuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtkYXRhLWxpZ2h0Y29yZC10aGVtZT10cnVlXSNcIitET00uZXNjYXBlSUQodGhlbWUuaWQpKVxuICAgICAgICAgICAgICAgIGlmKGV4aXN0aW5nKXtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJ3aWxsLXJlbW92ZVwiKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pZCA9IERPTS5lc2NhcGVJRCh0aGVtZS5pZClcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gdW5lc2NhcGUodGhlbWUuY3NzKVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpZ2h0Y29yZC10aGVtZVwiLCBcInRydWVcIilcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbd2lsbC1yZW1vdmU9dHJ1ZV1cIikpe1xuICAgICAgICAgICAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZm9yKGxldCBrZXkgb2YgdGhpcy53aW5kb3dzLmtleXMoKSl7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVRoZW1lcyhrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuaW1wb3J0IFYyQ19QdWJsaWNTZXJ2ZXJzIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnNcIjtcbmltcG9ydCBMYXllcnMgZnJvbSBcIi4vTGF5ZXJzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlYyX1B1YmxpY1NlcnZlcnMgPSB0aGlzXG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBMYXllcnMuY3JlYXRlTGF5ZXIoKGNsb3NlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QdWJsaWNTZXJ2ZXJzLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIiwgY2xvc2V9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldCBidXR0b24oKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIGJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XG4gICAgICAgIGJ0bi5hcHBlbmQobGFiZWwpO1xuICAgICAgICByZXR1cm4gYnRuO1xuICAgIH1cblxuICAgIF9hcHBlbmRCdXR0b24oKSB7XG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lclxuICAgICAgICBdID0gW1xuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZG93bmxvYWRQcm9ncmVzcyAmJiBlLnR1dG9yaWFsQ29udGFpbmVyKVswXS50dXRvcmlhbENvbnRhaW5lcilcbiAgICAgICAgXVxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYGRpdi4ke2NsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyfSA+IGRpdmApO1xuICAgICAgICBET00uYWZ0ZXIoZ3VpbGRzLCB0aGlzLmJ1dHRvbik7XG4gICAgfVxuXG4gICAgYWRkQnV0dG9uKCkge1xuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xuICAgICAgICBjb25zdCBHdWlsZExpc3RPbGQgPSB3ZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24oKTtcbiAgICB9XG5cbiAgICByZW1vdmVCdXR0b24oKSB7XG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xuICAgICAgICBjb25zdCBidXR0b24gPSBET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpO1xuICAgICAgICBpZiAoYnV0dG9uKSBidXR0b24ucmVtb3ZlKCk7XG4gICAgfVxufTsiLCJpbXBvcnQge3NldHRpbmdzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3NSUEMsIGxpZ2h0Y29yZFNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIGZyb20gXCIuL3NldHRpbmdzUGFuZWxTaWRlYmFyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xuaW1wb3J0IHZvaWNlTW9kZSBmcm9tIFwiLi92b2ljZU1vZGVcIjtcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xuXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XG5pbXBvcnQgQ2FyZExpc3QgZnJvbSBcIi4uL3VpL2FkZG9ubGlzdFwiO1xuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xuaW1wb3J0IFYyQ19BY2NvdW50SW5mb3MgZnJvbSBcIi4uL3VpL0FjY291bnRJbmZvc1wiO1xuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcbmltcG9ydCBibHVyUHJpdmF0ZSBmcm9tIFwiLi9ibHVyUHJpdmF0ZVwiO1xuaW1wb3J0IGRpc2FibGVUeXBpbmcgZnJvbSBcIi4vZGlzYWJsZVR5cGluZ1wiO1xuaW1wb3J0IEFwaVByZXZpZXcgZnJvbSBcIi4uL3VpL0FwaVByZXZpZXdcIjtcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4uL3VpL3N3aXRjaFwiO1xuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi4vdWkvbWFyZ2ludG9wXCI7XG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XG5pbXBvcnQgY29yZSBmcm9tIFwiLi9jb3JlXCI7XG5pbXBvcnQgcG9wb3V0V2luZG93IGZyb20gXCIuL3BvcG91dFdpbmRvd1wiO1xuXG5jbGFzcyBCRFNpZGViYXJIZWFkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNpZGViYXJDb21wb25lbnRzID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuU2VwYXJhdG9yICYmIGUuSGVhZGVyICYmIGUuSXRlbSlcblxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dCdXR0b24gPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJDaGFuZ2Vsb2dcIn0sIFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZmxvYXQ6IFwicmlnaHRcIiwgY3Vyc29yOiBcInBvaW50ZXJcIn0sIGNsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhpc3RvcnksIHtjbGFzc05hbWU6IFwiYmQtaWNvblwiLCBzaXplOiBcIjE2cHhcIn0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZW5kZXJlZCA9IG5ldyBzaWRlYmFyQ29tcG9uZW50cy5IZWFkZXIoe1xuICAgICAgICAgICAgY2hpbGRyZW46IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwiQmFuZGFnZWQgQkRcIiwgY2hhbmdlbG9nQnV0dG9uKSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZW5kZXJlZFxuICAgIH1cbn1cblxubGV0IGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9TZXR0aW5nc1BhbmVsIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNpZGViYXIgPSBuZXcgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyKCk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxuICAgIH1cblxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xuICAgICAgICAvKiogTGlnaHRjb3JkICovXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImxpZ2h0Y29yZFwiLCBtYWtlQ29tcG9uZW50KHRoaXMubGlnaHRjb3JkQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJhY2NvdW50aW5mb1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuQWNjb3VudEluZm9zQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsY2FwaXByZXZpZXdcIiwgbWFrZUNvbXBvbmVudCh0aGlzLkFwaVByZXZpZXdDb21wb25lbnQuYmluZCh0aGlzKSkpXG5cbiAgICAgICAgLyogQmFuZGFnZWQgQkQgKi9cbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwiQkRDaGFuZ2Vsb2dUaXRsZVwiLCBtYWtlQ29tcG9uZW50KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcbiAgICAgICAgfSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImNvcmVcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmNvcmVDb21wb25lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJwbHVnaW5zXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJwbHVnaW5zXCIpKSlcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwidGhlbWVzXCIsIG1ha2VDb21wb25lbnQodGhpcy5yZW5kZXJBZGRvblBhbmUoXCJ0aGVtZXNcIikpKVxuICAgIH1cbiAgICBcbiAgICBnZXQgY29yZVNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJjb3JlXCIpO1xuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBnZXQgbGlnaHRjb3JkU2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImxpZ2h0Y29yZFwiKTtcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IFByZXNlbmNlU2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwic3RhdHVzXCIpXG4gICAgfVxuXG4gICAgZ2V0U2V0dGluZ3MoY2F0ZWdvcnkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ZWdvcnkgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG5cbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcikge1xuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcbiAgICB9XG5cbiAgICB1cGRhdGVTZXR0aW5ncyhpZCwgZW5hYmxlZCwgc2lkZWJhcikge1xuICAgICAgICBpZighW1wibGlnaHRjb3JkLThcIiwgXCJub193aW5kb3dfYm91bmRcIiwgXCJlbmFibGVfZ2xhc3N0cm9uXCIsIFwibGlnaHRjb3JkLTEwXCJdLmluY2x1ZGVzKGlkKSlzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xuXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0yXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTNcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XG4gICAgICAgICAgICBlbHNlIHB1YmxpY1NlcnZlcnNNb2R1bGUucmVtb3ZlQnV0dG9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNFwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XG4gICAgICAgICAgICBlbHNlIHZvaWNlTW9kZS5zdG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNVwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XG5cbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTdcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XG4gICAgICAgICAgICBlbHNlIGNvbG9yZWRUZXh0LnJlbW92ZUNvbG9yZWRUZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTRcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstd3AtMVwiKSB7XG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBudWxsKTtcbiAgICAgICAgICAgIGVsc2UgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBcIiMyZjMxMzZcIik7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcERlYnVnTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstZG0tMVwiKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcENvcHlTZWxlY3RvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0xXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXG4gICAgICAgICAgICBzaWRlYmFyLmZvcmNlVXBkYXRlKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NTdG9yZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgdHlwZW9mIGUuZGVmYXVsdCA9PT0gXCJvYmplY3RcIiAmJiBcInNob3dDdXJyZW50R2FtZVwiIGluIGUuZGVmYXVsdClbMF1cbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0N1cnJlbnRHYW1lOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0zXCIpIHtcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xuICAgICAgICAgICAgICAgIEFudGlBZERNLmVuYWJsZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmRpc2FibGUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtN1wiKSB7XG4gICAgICAgICAgICBpZihlbmFibGVkKXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmRpc2FibGUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOFwiKXtcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiaXNUYWJzXCIsIGVuYWJsZWQpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTlcIikge1xuICAgICAgICAgICAgcG9wb3V0V2luZG93W2VuYWJsZWQgPyBcImVuYWJsZVwiIDogXCJkaXNhYmxlXCJdKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTEwXCIpe1xuICAgICAgICAgICAgY29yZS5tZXRob2RzLk5vdGlmaWNhdGlvbnNVc2VTaGltKGVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpe1xuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGVuYWJsZWQpXG5cbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIklTX01BWElNSVpFRFwiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiSVNfTUlOSU1JWkVEXCIpIFxuICAgICAgICAgICAgYXBwU2V0dGluZ3MuZGVsZXRlKFwiV0lORE9XX0JPVU5EU1wiKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWQgPT09IFwiZW5hYmxlX2dsYXNzdHJvblwiKXtcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2V0KFwiR0xBU1NUUk9OXCIsIGVuYWJsZWQpXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZVNldHRpbmdzKCkge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTNcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTVcIl0pIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgdGZIb3VyLmluamVjdDI0SG91cigpO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy00XCJdKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTFcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiXSkgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0zXCJdKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNlwiXSkgYmx1clByaXZhdGUuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTdcIl0pIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTlcIl0pIHBvcG91dFdpbmRvdy5lbmFibGUoKVxuXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcblxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgIH1cblxuICAgIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJsaWdodGNvcmQtc2V0dGluZ3NcIiwgbGlnaHRjb3JkU2V0dGluZ3MpO1xuICAgIH1cblxuICAgIGxvYWRTZXR0aW5ncygpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGxpZ2h0Y29yZFNldHRpbmdzLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwibGlnaHRjb3JkLXNldHRpbmdzXCIpKVxuICAgICAgICBPYmplY3QuYXNzaWduKGxpZ2h0Y29yZFNldHRpbmdzLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwibGlnaHRjb3JkLXNldHRpbmdzXCIpKTtcbiAgICB9XG5cbiAgICByZW5kZXJTaWRlYmFyKHNpZGViYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lkZWJhci5yZW5kZXIoc2lkZWJhcik7XG4gICAgfVxuXG4gICAgY29yZUNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXG4gICAgfVxuXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIsIGZvcmNlVXBkYXRlKSB7XG4gICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAoaSA9PT0gMCA/IG51bGwgOiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wKSksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ2hlY2tlZCA9IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImxpZ2h0Y29yZC04XCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiaXNUYWJzXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwibm9fd2luZG93X2JvdW5kXCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiTk9fV0lORE9XU19CT1VORFwiLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT09IFwiZW5hYmxlX2dsYXNzdHJvblwiKWlzQ2hlY2tlZCA9IGFwcFNldHRpbmdzLmdldChcIkdMQVNTVFJPTlwiLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtMTBcIilpc0NoZWNrZWQgPSAhYXBwU2V0dGluZ3MuZ2V0KFwiREVGQVVMVF9OT1RJRklDQVRJT05TXCIsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogaXNDaGVja2VkLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShpZCwgY2hlY2tlZCwgc2lkZWJhcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuaWQgPT0gXCJsaWdodGNvcmQtOFwiICYmIGlzQ2hlY2tlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImdyZWVuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3ZlckNvbG9yOiBcImJyYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5pcGMuc2VuZChcIk5FV19UQUJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcIk9wZW4gYSBuZXcgVGFiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSksIFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcInllbGxvd1wiLFxuICAgICAgICAgICAgICAgIGxvb2s6IFwiZ2hvc3RcIixcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxuICAgICAgICAgICAgICAgIGhvdmVyQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgICAgb25DbGljaygpe1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNob3VsZCByZWxhdW5jaFwiKVxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHJlbW90ZS5wcm9jZXNzLmFyZ3Yuc2xpY2UoMSkuY29uY2F0KFtcIi0tZGlzYWJsZS1iZXR0ZXJkaXNjb3JkXCJdKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuYXBwLnF1aXQoKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZVxuICAgICAgICAgICAgfSwgXCJSZWxhdW5jaCB3aXRob3V0IEJldHRlckRpc2NvcmRcIiksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXG4gICAgICAgICAgICAgICAgbG9vazogXCJnaG9zdFwiLFxuICAgICAgICAgICAgICAgIHNpemU6IFwibWVkaXVtXCIsXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzQ2xlYXJpbmdDYWNoZSlyZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDbGVhcmluZyBjYWNoZS4uLlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImluZm9cIlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5zZXNzaW9uLmNsZWFyQ2FjaGUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJDYWNoZSBpcyBjbGVhcmVkICFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZC4gQ2hlY2sgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogaXNDbGVhcmluZ0NhY2hlXG4gICAgICAgICAgICB9LCBcIkNsZWFyIGNhY2hlXCIpXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHJlc2VuY2VTZXR0aW5ncywge1xuICAgICAgICAgICAga2V5OiBcImxwcGFubmVsXCIsXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXG4gICAgICAgICAgICBzZXR0aW5nczogdGhpcy5QcmVzZW5jZVNldHRpbmdzXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgQWNjb3VudEluZm9zQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcbiAgICAgICAgICAgIGtleTogXCJsYXBhbm5lbFwiXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgQXBpUHJldmlld0NvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XG4gICAgICAgICAgICBrZXk6IFwibGFwaXBhbm5lbFwiXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY3VzdG9tQ3NzQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXG4gICAgfVxuXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcbiAgICAgICAgLy8gSSBrbm93IHRoaXMgc2hvdWxkbid0IGJlIGhlcmUsIGJ1dCB3aGVuIGl0IGlzbid0LFxuICAgICAgICAvLyBSZWFjdCByZWZ1c2VzIHRvIGNoYW5nZSB0aGUgYnV0dG9uIHdoZW4gZ29pbmdcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcbiAgICAgICAgLy8gdG8gZGVidWcgbGF0ZXIuXG4gICAgICAgIGNsYXNzIENvbnRlbnRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdC5Db21wb25lbnQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLnByb3BzLnR5cGUucmVwbGFjZShcInNcIiwgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgb25DaGFuZ2UoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDb250ZW50TGlzdC5wcm90b3R5cGUucmVuZGVyO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRMaXN0LCB7dHlwZX0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDYXJkTGlzdCwge3R5cGV9KSlcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbCBvbiB3aW5kb3dcbiAqL1xuXG5mdW5jdGlvbiBtYWtlQ29tcG9uZW50KGNoaWxkcmVuKXtcbiAgICBjbGFzcyBTZXR0aW5nQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICAgICAgcmVuZGVyKCl7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oc2lkZWJhciwgKCkgPT4gdGhpcy5mb3JjZVVwZGF0ZSgpKVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzaWRlYmFyXG4gICAgcmV0dXJuIChzKSA9PiB7XG4gICAgICAgIHNpZGViYXIgPSBzXG4gICAgICAgIHJldHVybiBTZXR0aW5nQ29tcG9uZW50XG4gICAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xuICAgICAgICB0aGlzLnBhbmVsc1twYW5lbF0gPSBjb21wb25lbnRcbiAgICB9XG5cbiAgICBnZXRDb21wb25lbnQocGFuZWwsIHNpZGViYXIpe1xuICAgICAgICByZXR1cm4gdGhpcy5wYW5lbHNbcGFuZWxdKHNpZGViYXIpXG4gICAgfVxuXG4gICAgZ2V0IGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICAgIHRleHQ6IFwiQmV0dGVyRGlzY29yZCBTZXR0aW5nc1wiLCBcbiAgICAgICAgICAgIGlkOiBcImNvcmVcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB0ZXh0OiBcIlBsdWdpbnNcIiwgXG4gICAgICAgICAgICBpZDogXCJwbHVnaW5zXCJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgdGV4dDogXCJUaGVtZXNcIiwgXG4gICAgICAgICAgICBpZDogXCJ0aGVtZXNcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICB0ZXh0OiBcIkN1c3RvbSBDU1NcIiwgXG4gICAgICAgICAgICBpZDogXCJjdXN0b21jc3NcIlxuICAgICAgICB9XTtcbiAgICB9XG5cbiAgICBnZXQgTENpdGVtcygpe1xuICAgICAgICBsZXQgaXRlbXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcbiAgICAgICAgICAgICAgICBpZDogXCJsaWdodGNvcmRcIlxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxuICAgICAgICAgICAgICAgIGlkOiBcInN0YXR1c1wiXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcbiAgICAgICAgICAgICAgICBpZDogXCJhY2NvdW50aW5mb1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgZ2V0IExDRGV2SXRlbXMoKXtcbiAgICAgICAgbGV0IGl0ZW1zID0gW11cbiAgICAgICAgaWYoIXdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlyZXR1cm4gaXRlbXNcbiAgICAgICAgaXRlbXMucHVzaCguLi5bXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcbiAgICAgICAgICAgICAgICBsYWJlbDogXCJMaWdodGNvcmQgQXBpXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogXCJDb21wb25lbnRzIFByZXZpZXdcIixcbiAgICAgICAgICAgICAgICBpZDogXCJsY2FwaXByZXZpZXdcIlxuICAgICAgICAgICAgfVxuICAgICAgICBdKVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICByZW5kZXIoc2lkZWJhcikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiTGlnaHRjb3JkXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLkxDaXRlbXMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi50aGlzLkxDRGV2SXRlbXMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmKGUuc2VjdGlvbilyZXR1cm4gZVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChcIkJEQ2hhbmdlbG9nVGl0bGVcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBlLmlkLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9XG59XG5cbi8qKlxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XG4gKi8iLCJpbXBvcnQge2JkdGhlbWVFcnJvcnMsIHRoZW1lQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xuXG5jbGFzcyBUaGVtZU1vZHVsZSB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlRoZW1lTW9kdWxlID0gdGhpc1xuICAgIH1cbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXI7fVxufVxuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmxvYWRUaGVtZURhdGEoKTtcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XG4gICAgY29uc3QgdGhlbWVzID0gT2JqZWN0LmtleXMoYmR0aGVtZXMpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZXNbaV1dO1xuICAgICAgICBpZiAoIXRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSB0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXG4gICAgfVxuICAgIGZvciAoY29uc3QgdGhlbWUgaW4gdGhlbWVDb29raWUpIHtcbiAgICAgICAgaWYgKCFiZHRoZW1lc1t0aGVtZV0pIGRlbGV0ZSB0aGVtZUNvb2tpZVt0aGVtZV07XG4gICAgfVxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRoZW1lQ29va2llW25hbWVdID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcbiAgICBiZEV2ZW50cy5kaXNwYXRjaChcInRoZW1lLWVuYWJsZWRcIilcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGFwcGxpZWQuYCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHRoZW1lQ29va2llW25hbWVdID0gZmFsc2U7XG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSk7XG4gICAgYmRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1kaXNhYmxlZFwiKVxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVUaGVtZShuYW1lLCByZWxvYWQpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZVRoZW1lID0gZnVuY3Rpb24odGhlbWUpIHtcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSk7XG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJ0aGVtZVwiKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBjb25zdCB0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lKTtcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1sb2FkZWRcIiwgdGhlbWUubmFtZSk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudW5sb2FkVGhlbWUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xuICAgIGRlbGV0ZSBiZHRoZW1lc1t0aGVtZV07XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS11bmxvYWRlZFwiLCB0aGVtZSk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcbiAgICB0aGlzLnVubG9hZFRoZW1lKGJkdGhlbWUuZmlsZW5hbWUpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkdGhlbWUuZmlsZW5hbWUpO1xuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm4gdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWVPck5hbWUpO1xuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpLCB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XG4gICAgfVxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtcmVsb2FkZWRcIiwgdGhlbWUpO1xufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRUaGVtZShuYW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XG59O1xuXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcbn07XG5cblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInRoZW1lc1wiLCB0aGVtZUNvb2tpZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgVGhlbWVNb2R1bGUoKTsiLCJpbXBvcnQge2JiZFZlcnNpb259IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cbiAgICBzdGF0aWMgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfVxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgaGVpZ2h0ICovXG4gICAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cblxuICAgIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd0NvbmZpZ0ZpbGUgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBnZXRXaW5kb3dQcmVmZXJlbmNlKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBzZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdHJpcEJPTShjb250ZW50KSB7XG4gICAgICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xuICAgICAgICByZXR1cm4gRE9NLnF1ZXJ5KFwiLlwiK3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoYW5uZWxUZXh0QXJlYSAmJiBlLnRpdGxlV3JhcHBlcilbMF0uY2hhbm5lbFRleHRBcmVhKStcIiB0ZXh0YXJlYVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xuICAgICAgICB0ZXh0YXJlYS5mb2N1cygpO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCB0ZXh0KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGxvZyhtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgd2Fybihtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogI0U4QTQwMDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogI0U4QTQwMDtcIiwgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGVycihtb2R1bGVOYW1lLCBtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogcmVkOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiByZWQ7XCIsIFwiXCIpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXCIlY0Vycm9yOiBcIiArIGVycm9yLm1lc3NhZ2UsIFwiY29sb3I6IHJlZDtcIik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBzdHJpbmdzIHdpdGggcGxhY2Vob2xkZXJzIChge3twbGFjZWhvbGRlcn19YCkgaW50byBmdWxsIHN0cmluZ3MuXG4gICAgICogUXVpY2sgZXhhbXBsZTogYFBsdWdpblV0aWxpdGllcy5mb3JtYXRTdHJpbmcoXCJIZWxsbywge3t1c2VyfX1cIiwge3VzZXI6IFwiWmVyZWJvc1wifSlgXG4gICAgICogd291bGQgcmV0dXJuIFwiSGVsbG8sIFplcmVib3NcIi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIC0gc3RyaW5nIHRvIGZvcm1hdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgLSBvYmplY3QgbGl0ZXJhbCBvZiBwbGFjZWhvbGRlcnMgdG8gcmVwbGFjZW1lbnRzXG4gICAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHByb3Blcmx5IGZvcm1hdHRlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9ybWF0U3RyaW5nKHN0cmluZywgdmFsdWVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIGluIHZhbHVlcykge1xuICAgICAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdmFsdWVzW3ZhbF07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlbWVudCkpIHJlcGxhY2VtZW50ID0gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZihyZXBsYWNlbWVudCkgPT09IFwib2JqZWN0XCIgJiYgcmVwbGFjZW1lbnQgIT09IG51bGwpIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKG5ldyBSZWdFeHAoYHt7JHt2YWx9fX1gLCBcImdcIiksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHN0YXRpYyBlc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZihvYmopICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4ge1xuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgdGhpcy5lcnIoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIG1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmxvZyhcInBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcihtZXRob2ROYW1lLCBcImRvZXMgbm90IGV4aXN0IGZvclwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xuICAgICAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIC8vd2hhdFttZXRob2ROYW1lXSA9IG9yaWdNZXRob2Q7XG4gICAgICAgICAgICBjYW5jZWxlZCA9IHRydWUgLy8gdGhpcyBhbGxvdyB0byBtb25rZXlwYXRjaCBtb3JlIHRoYW4gb25lIHRpbWUuXG4gICAgICAgIH07XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmKGNhbmNlbGVkKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ01ldGhvZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcbiAgICAgICAgICAgICAgICBtZXRob2RBcmd1bWVudHM6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxuICAgICAgICAgICAgICAgIGNhbGxPcmlnaW5hbE1ldGhvZDogKCkgPT4gZGF0YS5yZXR1cm5WYWx1ZSA9IGRhdGEub3JpZ2luYWxNZXRob2QuYXBwbHkoZGF0YS50aGlzT2JqZWN0LCBkYXRhLm1ldGhvZEFyZ3VtZW50cylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBSZXQgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhpbnN0ZWFkLCBcImBpbnN0ZWFkYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcbiAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGFmdGVyLCBcImBhZnRlcmAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuYXNzaWduKHdoYXRbbWV0aG9kTmFtZV0sIG9yaWdNZXRob2QpO1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fbW9ua2V5UGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdNZXRob2Q7XG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7cmV0dXJuIG9yaWdNZXRob2QudG9TdHJpbmcoKTt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5jZWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+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+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTWVzc2FnZVwiKTt9XG4gICAgZ2V0IFRpbWVGb3JtYXR0ZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJkYXRlRm9ybWF0XCJdKTt9XG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XG4gICAgZ2V0IE5hdGl2ZU1vZHVsZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNldEJhZGdlXCJdKTt9XG4gICAgZ2V0IEludml0ZUFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO31cbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxuICAgIGdldCBUb29sdGlwcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5oaWRlICYmIG0uc2hvdyAmJiAhbS5zZWFyY2ggJiYgIW0uc3VibWl0ICYmICFtLnNlYXJjaCAmJiAhbS5hY3RpdmF0ZVJhZ2luZ0RlbW9uICYmICFtLmRpc21pc3MpO31cbiAgICBnZXQgS2V5R2VuZXJhdG9yKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLnRvU3RyaW5nICYmIC9cImJpbmFyeVwiLy50ZXN0KG0udG9TdHJpbmcoKSkpO31cbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XG4gICAgZ2V0IFVzZXJTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEN1cnJlbnRVc2VyXCJdKTt9XG4gICAgZ2V0IENoYW5uZWxTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldENoYW5uZWxcIl0pO31cbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cbiAgICBnZXQgUHJpdmF0ZUNoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2VsZWN0UHJpdmF0ZUNoYW5uZWxcIl0pO31cblxuICAgIG9wZW5ETSh1c2VySWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZklkID0gdGhpcy5Vc2VyU3RvcmUuZ2V0Q3VycmVudFVzZXIoKS5pZDtcbiAgICAgICAgaWYgKHNlbGZJZCA9PSB1c2VySWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xuICAgICAgICBpZiAocHJpdmF0ZUNoYW5uZWxJZCkgcmV0dXJuIHRoaXMuUHJpdmF0ZUNoYW5uZWxBY3Rpb25zLnNlbGVjdFByaXZhdGVDaGFubmVsKHByaXZhdGVDaGFubmVsSWQpO1xuICAgICAgICB0aGlzLkNoYW5uZWxBY3Rpb25zLm9wZW5Qcml2YXRlQ2hhbm5lbChzZWxmSWQsIHVzZXJJZCk7XG4gICAgfVxuXG4gICAgcGFyc2VTZXR0aW5ncyhjYXQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xuICAgICAgICAgICAgfSByZXR1cm4gYXJyO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcblxuY29uc3Qgc3R5bGUgPSBgXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuY2hhdC0zYlJ4eHUge1xuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAuc2lkZWJhci0ySzhwRmgge1xuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xuICAgIH1cbmA7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWb2ljZU1vZGUge1xuICAgIHN0YXJ0KCkge1xuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xuICAgIH1cblxuICAgIHN0b3AoKSB7XG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcIlZvaWNlTW9kZVwiKTtcbiAgICB9XG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XG5kZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xuZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gbS5kZWZhdWx0O1xuICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIG07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKG0uZGVmYXVsdCk7XG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVzO1xufTtcblxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xuY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9ICguLi5wcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XG5jb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XG5cbmxldCBtb2QgPSAge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVByb3BzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XG5leHBvcnQgZGVmYXVsdCBtb2Rcblxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLldlYnBhY2tNb2R1bGVzID0gbW9kIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkTG9nbyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2OCAxNjguNjlcIiB7Li4ucHJvcHN9IGhlaWdodD1cIjEwMCVcIiB3aWR0aD17cHJvcHMuc2l6ZX0+XG4gICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fYVwiIHgxPXs2Ni43fSB5MT17LTQ4Ny43fSB4Mj17NjYuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2JcIiB4MT17MTAxLjd9IHkxPXstNDg3Ljd9IHgyPXsxMDEuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE0LjkgMzUuM2gxMzkuMlYxMzNIMTQuOXpcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMDEuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19iKVwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDB2MTY4bDE2OCAuNjlWMHptMTExLjMgMTI0LjFzLTMuNC00LjEtNi4zLTcuN2MxMi42LTMuNSAxNy40LTExLjMgMTcuNC0xMS4zYTUyLjUyIDUyLjUyIDAgMDEtMTEuMSA1LjYgNjguNjMgNjguNjMgMCAwMS0zOC45IDQgNzAuMTIgNzAuMTIgMCAwMS0xNC4xLTQuMSA0OC44OCA0OC44OCAwIDAxLTcuMS0zLjNjLS4zLS4yLS42LS4zLS45LS41YS43Ni43NiAwIDAwLS40LS4yYy0xLjctMS0yLjYtMS42LTIuNi0xLjZzNC42IDcuNiAxNi44IDExLjJjLTIuOSAzLjYtNi40IDcuOS02LjQgNy45LTIxLjItLjYtMjkuMy0xNC41LTI5LjMtMTQuNSAwLTMwLjYgMTMuOC01NS40IDEzLjgtNTUuNCAxMy44LTEwLjMgMjYuOS0xMCAyNi45LTEwbDEgMS4xQzUyLjggNTAuMyA0NSA1Ny45IDQ1IDU3LjlhNTYuMiA1Ni4yIDAgMDE1LjctMi43IDcyLjE5IDcyLjE5IDAgMDEyMS44LTYgOC43NSA4Ljc1IDAgMDExLjYtLjIgODkuMSA4OS4xIDAgMDExOS40LS4yIDc4LjQ1IDc4LjQ1IDAgMDEyOC45IDkuMXMtNy41LTcuMi0yMy45LTEyLjFsMS4zLTEuNXMxMy4xLS4zIDI2LjkgMTBjMCAwIDEzLjggMjQuOCAxMy44IDU1LjQuMS0uMS04IDEzLjgtMjkuMiAxNC40elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYylcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIClcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgKVxuICAgIH0gXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKXtcbiAgICAgICAgcmV0dXJuICg8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgIHsuLi50aGlzLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjREQyRTQ0XCJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zMyAzM2EyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJsMS0xMmgyOGwxIDEyelwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0VBNTk2RVwiXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMgMzVjLS43OTItMS44NzUtMS43NS0zLjI5MS0zLjQxNy00LjY2NiAxLjc1LTEuNDU5IDQuNTQyLTUuNSA1LjI1LTguMjkyczIuNzUgOC4xMjUgMi4wNDIgMTAuNjI1UzEzIDM1IDEzIDM1em0xMC4zMDMgMGMuNzkxLTEuODc1IDEuNzUtMy4yOTEgMy40MTYtNC42NjYtMS43NS0xLjQ1OS00LjU0MS01LjUtNS4yNS04LjI5Mi0uNzA3LTIuNzkyLTIuNzUgOC4xMjUtMi4wNCAxMC42MjUuNzA4IDIuNSAzLjg3NCAyLjMzMyAzLjg3NCAyLjMzM3pcIlxuICAgICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNCRTE5MzFcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTMuNzI4IDI0LjI2M0EyLjUgMi41IDAgMDA4IDIyLjVjMC0uNTY1LS4xOTUtMS4wODEtLjUxMS0xLjVINGwtLjI3MiAzLjI2M3ptMjguNTQ0IDBMMzIgMjFoLTMuNDg5QTIuNDgyIDIuNDgyIDAgMDAyOCAyMi41YTIuNSAyLjUgMCAwMDQuMjcyIDEuNzYzelwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTRcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjZcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjMgMzVIMTNzMi02IDItMTNoNmMwIDcgMiAxMyAyIDEzek0xNyAyaDJ2N2gtMnpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NUFDRUVcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4LjgzOC4yMDZDMTcuNjY3LjA0MiAxNyAuMzE4IDE3IDEuNDE4djFjMCAxLjEuODY1IDEuNzUzIDEuOTIzIDEuNDUxbDUuMTU0LS45MDFjMS43MTUtLjM0MyAxLjU0OC0xLjU5My4wODUtMS44ODRMMTguODM4LjIwNnpcIlxuICAgICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNDQ0Q2RERcIlxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZsLS4wODEuMTIzQzEwLjkzOCAxNi45ODEgMyAxNS4wMTUgMyAxOXYyLjVhMi41IDIuNSAwIDAwNC45NS41SDEyYTIgMiAwIDAwNCAwaDRhMiAyIDAgMDA0IDBoNC4wNWEyLjUgMi41IDAgMDA0Ljk1LS41VjE5YzAtNC04LTItMTUtMTN6XCJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgICAgIDxnIGZpbGw9XCIjRjVGOEZBXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTQ4IDYuMDc4bC0uMDMuMDQ1QzE3LjEzMiAxMS42MTkgMTAuODExIDE2LjEyNiA4IDE4djRhMiAyIDAgMDA0IDB2LTRjLjk4Mi0uOTgyIDUuODEzLTYuNzg3IDUuOTg0LTExLjczMi0uMDEtLjA2NC0uMDI3LS4xMjYtLjAzNi0uMTl6bS4wOC4zOThDMTguMzI0IDExLjM3NCAyMy4wMzEgMTcuMDMxIDI0IDE4djRhMiAyIDAgMDA0IDB2LTRjLTIuNzUtMS44MzMtOC45NTMtNi4xOS05Ljk3Mi0xMS41MjR6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk4NCA2LjI3QzE3LjkyMiA4LjM0NiAxNy42MDYgMTYuMzk0IDE2IDE4djRhMiAyIDAgMDA0IDB2LTRjLTEuNTY0LTEuNTY0LTEuOTA1LTkuMjQxLTEuOTc5LTExLjU1OS0uMDExLS4wNTctLjAyNy0uMTEzLS4wMzctLjE3MXpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIClcbiAgICB9IFxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuXG4vKipcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XG4gKi9cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxubGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxubGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXG5sZXQgc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxuY29uc3QgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UmVsYXRpb25zaGlwcylbMF0uZGVmYXVsdFxuY29uc3Qgc2Vzc2lvbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFNlc3Npb25zKVswXS5kZWZhdWx0XG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0FjY291bnRJbmZvcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZTIpbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cbiAgICAgICAgaWYoIXNpemVNb2R1bGUpc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiQWNjb3VudCBJbmZvc1wiLz4sXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIFByb2ZpbGVcbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFByb2ZpbGVWYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3NcbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFN0YXRpc3RpY3MoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxuICAgICAgICAgICAgICAgICAgICBDb25uZWN0ZWQgU2Vzc2lvbnNcbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFNlc3Npb25WYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxuICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBnZXRTZXNzaW9uVmFsdWUoKXtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnNSYXcgPSBzZXNzaW9uTW9kdWxlLmdldFNlc3Npb25zKClcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXG5cbiAgICAgICAgaWYoc2Vzc2lvbnMubGVuZ3RoID09PSAwKXJldHVybiBcIi0gTm8gc2Vzc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHRyeSBpbiBhIGZldyBzZWNvbmRzXCJcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzZXNzaW9ucy5tYXAoZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCsgaWQ6ICR7ZS5zZXNzaW9uSWR9XG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cbisgY2xpZW50OiAke2UuY2xpZW50SW5mby5jbGllbnR9XG4rIHN0YXR1czogJHtlLnN0YXR1c31cbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcbiAgICAgICAgfSkuam9pbihcIlxcblwiK1wiLVwiLnJlcGVhdCgzOCkrXCJcXG5cIilcbiAgICB9XG5cbiAgICBnZXRQcm9maWxlVmFsdWUoKXtcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZ2V0Q3VycmVudFVzZXIoKVxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0RhdGV9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxuXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmF2YXRhclVSTFxuICAgICAgICBpZih1c2VyLmF2YXRhciAmJiB1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikpe1xuICAgICAgICAgICAgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwoXCJnaWZcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGF2YXRhclVSTC5zdGFydHNXaXRoKFwiL1wiKSl7XG4gICAgICAgICAgICBhdmF0YXJVUkwgPSBcImh0dHBzOi8vZGlzY29yZC5jb21cIithdmF0YXJVUkxcbiAgICAgICAgfVxuICAgICAgICBpZihhdmF0YXJVUkwuZW5kc1dpdGgoXCI/c2l6ZT0xMjhcIikpe1xuICAgICAgICAgICAgYXZhdGFyVVJMID0gYXZhdGFyVVJMLnJlcGxhY2UoXCI/c2l6ZT0xMjhcIiwgXCI/c2l6ZT00MDk2XCIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCsgVXNlcm5hbWU6ICR7dXNlci51c2VybmFtZX1cbisgRGlzY3JpbWluYXRvcjogJHt1c2VyLmRpc2NyaW1pbmF0b3J9XG4rIFRhZzogJHt1c2VyLnRhZ31cbisgSUQ6ICR7dXNlci5pZH1cbisgQXZhdGFyOiAke3VzZXIuYXZhdGFyfVxuKyBBdmF0YXIgVVJMOiAke2F2YXRhclVSTH1cbisgQ3JlYXRpb24gRGF0ZTogJHsoY3JlYXRlZEF0LmdldERhdGUoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0RnVsbFllYXIoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9ICR7Y3JlYXRlZEF0LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9aCAke2NyZWF0ZWRBdC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9bWluICR7Y3JlYXRlZEF0LmdldFNlY29uZHMoKX1zXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XG4rIEhhcyBOaXRybzogJHt1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24gPyBcIlllc1wiIDogXCJOb1wifVxuLSBFbWFpbDogJHt1c2VyLmVtYWlsfVxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cbi0gSGFzIEJlZW4gT24gTW9iaWxlOiAke3VzZXIubW9iaWxlID8gXCJZZXNcIiA6IFwiTm9cIn1cbi0gUGhvbmU6ICR7dXNlci5waG9uZSB8fCBcIk5vbmVcIn1cbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1cbi0gQ2FuIFNlZSBOU0ZXIENoYW5uZWxzOiAke3VzZXIubnNmd0FsbG93ZWR9YDtcbiAgICB9XG5cbiAgICBnZXRTdGF0aXN0aWNzKCl7XG5cbiAgICAgICAgY29uc3QgZ3VpbGRzID0gT2JqZWN0LnZhbHVlcyhHdWlsZE1vZHVsZS5nZXRHdWlsZHMoKSlcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LmtleXMocmVsYXRpb25TaGlwTW9kdWxlLmdldFJlbGF0aW9uc2hpcHMoKSlcbiAgICAgICAgY29uc3QgZnJpZW5kcyA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNGcmllbmQoZSkpXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSByZWxhdGlvbnMuZmlsdGVyKGUgPT4gcmVsYXRpb25TaGlwTW9kdWxlLmlzQmxvY2tlZChlKSlcblxuICAgICAgICByZXR1cm4gYCsgU2VydmVyIENvdW50OiAke2d1aWxkcy5sZW5ndGh9IHNlcnZlcnNcbisgUmVsYXRpb25zOiAke3JlbGF0aW9ucy5sZW5ndGh9IHJlbGF0aW9uc1xuKyBGcmllbmRzIENvdW50OiAke2ZyaWVuZHMubGVuZ3RofSBmcmllbmRzXG4tIEJsb2NrZWQgVXNlcnMgQ291bnQ6ICR7YmxvY2tlZC5sZW5ndGh9IGJsb2NrZWQgdXNlcnNgXG4gICAgfVxufVxuXG5cbmxldCBoaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXG5sZXQgbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXG5sZXQgbWVzc2FnZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tZXNzYWdlQ29udGVudClbMF1cblxuY2xhc3MgQ29kZUNvbnRlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTEpbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMiltZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxuICAgICAgICBpZighc2Nyb2xsYmFyTW9kdWxlMSlzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cbiAgICAgICAgaWYoIWhpZ2h0bGlnaHRKUyloaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5saXN0TGFuZ3VhZ2VzKVswXVxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2Ake21lc3NhZ2VNb2R1bGUxLm1hcmt1cH0gJHttZXNzYWdlTW9kdWxlMi5tZXNzYWdlQ29udGVudH1gfT5cbiAgICAgICAgICAgIDxwcmU+XG4gICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9e2Ake3Njcm9sbGJhck1vZHVsZTEuc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gaGxqc2B9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBoaWdodGxpZ2h0SlMuaGlnaGxpZ2h0KHRoaXMucHJvcHMubGFuZ3VhZ2UsIHRoaXMucHJvcHMuY29udGVudCkudmFsdWV9fT5cblxuICAgICAgICAgICAgICAgIDwvY29kZT5cbiAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9PjwvZGl2PlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufSIsIi8vIEdvb2QgbHVjayB0byByZWFkIG15IGNvZGUsIEV2ZW4gbWUgY2FuJ3QgcmVhZCBpdCBwcm9wZXJseS5cblxuaW1wb3J0IHsgc3RhdCB9IGZyb20gXCJmc1wiXG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi4vbW9kdWxlcy9kaXN0YW50XCJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIlxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIlxuXG5sZXQgZm9ybU1vZHVsZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpUHJldmlldyBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHN0YXRlczogW11cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBpZighZm9ybU1vZHVsZSlmb3JtTW9kdWxlID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuRm9ybVNlY3Rpb24pXG4gICAgICAgIC8qKiBcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9uW119XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV0pLm1hcChrID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1ba10pXG4gICAgICAgIH0pLmZsYXQoKSldXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtU2VjdGlvbiB0YWc9XCJoMlwiIHRpdGxlPVwiTGlnaHRjb3JkJ3MgQXBpIEF2YWlsbGFibGUgY29tcG9uZW50c1wiPlxuICAgICAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1UZXh0IHR5cGU9XCJkZXNjcmlwdGlvblwiIGNsYXNzTmFtZT1cIlwiIHNlbGVjdGFibGU9e2ZhbHNlfT5cbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luVG9wOiBcIjIwcHhcIn19PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImluZm9cIj5BbGwgdGhlc2UgY29tcG9uZW50cyBoYXZlIGVycm9yIGhhbmRsaW5nLiBJZiB5b3Ugd2FudCBub25lLCBhZGQgYC5vcmlnaW5hbGAgYWZ0ZXIgdGhlIGNvbXBvbmVudCBwYXRoLjwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+XG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPldlIGRvIG5vdCByZWNvbW1lbmQgbW9kaWZ5aW5nIHRoZXNlIGNvbXBvbmVudCB3aXRoIHBsdWdpbnMuIE9ubHkgZG8gdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cbiAgICAgICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVRleHQ+XG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcD48L01hcmdpblRvcD5cbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6L0xpZ2h0Y29yZEFwaS9kb2NzXCIpXG4gICAgICAgICAgICAgICAgfX0gd3JhcHBlcj17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cbiAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtU2VjdGlvbj4sXG4gICAgICAgICAgICBhbGxDb21wb25lbnRzLm1hcChjb21wID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wTmFtZSA9IGNvbXAuZGlzcGxheU5hbWUgfHwgY29tcC5uYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcFBhdGggPSBgTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLiR7T2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKX0uJHtjb21wTmFtZX1gXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRQcmV2aWV3IGtleT17Y29tcFBhdGh9IGNvbXA9e2NvbXB9IC8+XG4gICAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlcnMoKXtcblxuICAgIH1cbn1cblxuY2xhc3MgQ29tcG9uZW50UHJldmlldyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHRhYjogXCJwcmV2aWV3XCIsXG4gICAgICAgICAgICBlbGVtOiBwcm9wcy5jb21wLFxuICAgICAgICAgICAgb3B0aW9uczoge31cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wcm9wcy5jb21wXG4gICAgICAgIGxldCBBbGxQcmV2aWV3cyA9IFtdXG4gICAgICAgIGlmKGNvbXAuQWxsUHJldmlld3MpQWxsUHJldmlld3MgPSBjb21wLkFsbFByZXZpZXdzXG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcbiAgICAgICAgbGV0IGdldFByb3BzID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbmFsID0ge31cbiAgICAgICAgICAgIEFsbFByZXZpZXdzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmFsW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV0gPSBjYXRlZ29yeVswXVtPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1dXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUub3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmFsW2tleV0gPSBBbGxQcmV2aWV3cy5maW5kKGUgPT4gZS5maW5kKGUgPT4gZVtrZXldKSlbc3RhdGUub3B0aW9uc1trZXldXVtrZXldXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbmRlclByZXZpZXcgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxuICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIGxldCByZW5kZXJDb2RlID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICBKU1hcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkVycm9yQ2F0Y2hlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5Db2RlQmxvY2sgbGFuZ3VhZ2U9XCJqc3hcIiBjb250ZW50PXtnZW5lcmF0ZUNvZGUoXCJqc3hcIil9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdFxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcbiAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgfWVsc2UgaWYodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlICYmIHZhbHVlLiQkdHlwZW9mICYmICh2YWx1ZS4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgdmFsdWUuJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xuICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXG59fSxcblJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XG5iYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsXG5wYWRkaW5nOiBcIjMwcHggMzBweFwiLFxuYm9yZGVyUmFkaXVzOiBcIjhweFwiXG59LCBjbGFzc05hbWU6IFwibGMtdGFiLWJveC1zaGFkb3dcIiB9LFxuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZSwgbnVsbCwgXCJQcmV2aWV3IHRhYnNcIilcbilcbilgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcImpzeFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9e3tcbm1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcbn19PlxuPGRpdiBzdHlsZT17e1xuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXG4gICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXG4gICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG59fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxuICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UaXRsZT5QcmV2aWV3IHRhYnM8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlxuPC9kaXY+XG48L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCBcIiAgICBcIilcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdlbmVyYXRlQ29kZSA9IGZ1bmN0aW9uKGxhbmcpeyAvLyBjb2RlIGZvcm1hdHRpbmcgaXMgaGFyZFxuICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxuICAgICAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBPYmplY3Qua2V5cyh3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzKVxuICAgICAgICAgICAgY29uc3QgY29tcENhdGVnb3J5ID0gY2F0ZWdvcmllcy5maW5kKGUgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtjb21wTmFtZV0pXG4gICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBnZXRQcm9wcygpXG5cbiAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xuICAgICAgICAgICAgICAgIGxldCBwcm9wU3RyaW5ncyA9IFtdXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUHJvcCA9IG51bGxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZihrZXkgPT0gXCJjaGlsZHJlblwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcCA9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGtleStcIj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGB7JHtnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKX19YFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCBvcGVuVGFnXG4gICAgICAgICAgICAgICAgaWYoY2hpbGRyZW5Qcm9wKXtcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2VUYWcgPSBgPC8ke2NvbXBQYXRofT5gXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtvcGVuVGFnfVxcbiAgICAke2NoaWxkcmVuUHJvcH1cXG4ke2Nsb3NlVGFnfWBcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0vPmBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5UYWdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihsYW5nID09PSBcInJlYWN0XCIpe1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuIHx8IG51bGxcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBpZihjaGlsZHJlbiAmJiBjaGlsZHJlbi4kJHR5cGVvZiAmJiAoY2hpbGRyZW4uJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IGNoaWxkcmVuLiQkdHlwZW9mID09PSAweGVhYzcpKXtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRTdHJGb3JQcm9wKGNoaWxkcmVuLCBjb21wUGF0aCwgbGFuZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gdmlzaWJsZUtleStcIjogXCJcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpLnNwbGl0KFwiXFxuXCIpLm1hcCgoc3RyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiICAgIFwiICsgc3RyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXG4gICAgICAgICAgICAgICAgaWYocHJvcFN0cmluZ3MubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MuZm9yRWFjaCgoc3RyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZighaXNGaXJzdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIlxcbiAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTGFzdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPVwiXFxufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGF0YSA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiAmJiBjaGlsZHJlbi5zdGFydHNXaXRoKFwiUmVhY3QuY3JlYXRlRWxlbWVudFwiKSA/IGNoaWxkcmVuIDogSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XG4gICAgICAgIGxldCBpbmZvID0gaGVscC5pbmZvID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiaW5mb1wiPlxuICAgICAgICAgICAge2hlbHAuaW5mb31cbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxuICAgICAgICBsZXQgd2FybiA9IGhlbHAud2FybiA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cIndhcm5cIj5cbiAgICAgICAgICAgIHtoZWxwLndhcm59XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgbGV0IGRhbmdlciA9IGhlbHAuZGFuZ2VyID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICB7aGVscC5kYW5nZXJ9XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgbGV0IGVycm9yID0gaGVscC5lcnJvciA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cImVycm9yXCI+XG4gICAgICAgICAgICB7aGVscC5lcnJvcn1cbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxuICAgICAgICBsZXQgc3VjY2VzcyA9IGhlbHAuc3VjY2VzcyA/IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3ggdHlwZT1cInN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIHtoZWxwLnN1Y2Nlc3N9XG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcbiAgICAgICAgcmV0dXJuICg8ZGl2PlxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nc1RpdGxlPlxuICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cbiAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdzVGl0bGU+XG4gICAgICAgICAgICB7aW5mb31cbiAgICAgICAgICAgIHtzdWNjZXNzfVxuICAgICAgICAgICAge3dhcm59XG4gICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICB7ZGFuZ2VyfVxuICAgICAgICAgICAge0FsbFByZXZpZXdzLm1hcChjYXRlZ29yeSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0ub25DbGljaylyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS5jaGlsZHJlbilyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5Lmxlbmd0aCA9PT0gMSlyZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBPYmplY3Qua2V5cyhjYXRlZ29yeVswXSlbMF1cbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtrZXl9XG4gICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT4sXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIm9wdC1cIitpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pfSB2YWx1ZT17XCJvcHQtXCIrKHN0YXRlLm9wdGlvbnNba2V5XSB8fCBcIjBcIil9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm9wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tleV06ICh2YWx1ZS52YWx1ZSB8fCBcIjBcIikucmVwbGFjZShcIm9wdC1cIiwgXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfX0gc2VhcmNoYWJsZT17dHJ1ZX0vPixcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXG4gICAgICAgICAgICAgICAgYWN0aXZlPXtzdGF0ZS50YWJ9IGNoaWxkcmVuPXtzdGF0ZS50YWIgPT09IFwicHJldmlld1wiID8gcmVuZGVyUHJldmlldygpIDogcmVuZGVyQ29kZSgpfSBvbkNoYW5nZT17KHRhYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH19Lz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcblxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcbmltcG9ydCBEZWxldGVJY29uIGZyb20gXCIuL2ljb25zL2RlbGV0ZVwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XG5pbXBvcnQgeyBwcm9jZXNzRmlsZSB9IGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbkNlcnRpZmllclwiO1xuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1BsdWdpbkNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zaG93U2V0dGluZ3MgPSB0aGlzLnNob3dTZXR0aW5ncy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IFwiXCI7XG5cbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVsZXRlID0gdGhpcy5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGNoZWNrZWQ6IHRoaXMucHJvcHMuZW5hYmxlZCxcbiAgICAgICAgICAgIHNldHRpbmdzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXG4gICAgICAgICAgICB0cnVzdGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNob3dTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgY2xvc2VTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+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+IG9yaWdpbmFsUmVuZGVyXG59KTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCRExvZ28gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInN2Z1wiLFxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcIm1ldGFkYXRhXCIsIG51bGwpLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MlwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTVcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjE1KVwifSkpLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93M1wifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MylcIn0sIGQ6IFwiTTExOTUuNDQrMTM1LjQ0MkwxMTk1LjQ0KzEzNS40NDJMOTk3LjYrMTM2LjQ0MkMxMDI0LjIrMTQ5Ljc0MisxMTcwLjM0KzE2My41NDIrMTE5My42NCsxNzkuNzQyQzEyNjQuMzQrMjI4Ljg0MisxMzE5Ljc0KzI5MS4yNDIrMTM1OC4yNCszNjUuMDQyQzEzOTguMTQrNDQxLjY0MisxNDE5Ljc0KzUzMC42NDIrMTQyMi41NCs2MjkuNjQyTDE0MjIuNTQrNjMwLjg0MkwxNDIyLjU0KzYzMi4wNDJDMTQyMi41NCs3NzMuMTQyKzE0MjIuNTQrMTIyOC4xNCsxNDIyLjU0KzEzNjkuMTRMMTQyMi41NCsxMzcwLjM0TDE0MjIuNTQrMTM3MS41NEMxNDE5Ljg0KzE0NzAuNTQrMTM5OC4yNCsxNTU5LjU0KzEzNTguMjQrMTYzNi4xNEMxMzE5Ljc0KzE3MDkuOTQrMTI2NC40NCsxNzcyLjM0KzExOTMuNjQrMTgyMS40NEMxMTcxLjA0KzE4MzcuMTQrMTAyNS43KzE4NTAuNTQrMTAwMCsxODYzLjU0TDExOTMuNTQrMTg2NC41NEMxNTM5Ljc0KzE4NjYuNDQrMTg2NC41NCsxNjkzLjM0KzE4NjQuNTQrMTI5Ni42NEwxODY0LjU0KzcxNi45NDJDMTg2Ni40NCszMTIuNDQyKzE1NDEuNjQrMTM1LjQ0MisxMTk1LjQ0KzEzNS40NDJaXCIsIGZpbGw6IFwiIzE3MTcxN1wiLCBvcGFjaXR5OiBcIjFcIn0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cxKVwifSwgZDogXCJNMTQ2OS4yNSs2MzEuNDQyQzE0NTkuNTUrMjc4LjA0MisxMTgzLjA1KzEzNS40NDIrODI2LjY1KzEzNS40NDJMMTM1LjQ1KzEzNS40NDJMMTM1LjQ1KzEwMDRDMTM1LjQ1KzEwMDQrMTM1LjQyNysxMjU1LjIxKzM1NS42MjYrMTI1NS4yMUM1NzUuODI1KzEyNTUuMjErNTc1Ljg0OCsxMDA0KzU3NS44NDgrMTAwNEw1NzcuNDUrNDkwLjQ0Mkw4MzQuNDUrNDkwLjQ0MkMxMTA4Ljk1KzQ5MC40NDIrMTEwOC45NSs4MzUuMzQyKzgzNC40NSs4MzUuMzQyTDY2NC42NSs4MzUuMzQyTDY2NC42NSsxMTY0Ljg0TDgzNC40NSsxMTY0Ljg0QzkyMy45MzIrMTE2NC44NCs5ODQuMjQ0KzEyMDEuNDgrMTAxNS4zOSsxMjUwLjg3QzEwNzkuNzgrMTM1MysxMDE5LjQ3KzE1MDkuNjQrODM0LjQ1KzE1MDkuNjRMMTM1LjQ1KzE1MDkuNjRMMTM1LjQ1KzE4NjQuNTRMODI2LjY1KzE4NjQuNTRDMTE4Mi45NSsxODY0LjU0KzE0NTkuNDUrMTcyMS45NCsxNDY5LjI1KzEzNjguNTRDMTQ2OS4yNSsxMjA1Ljk0KzE0MjQuNzUrMTA4NC40NCsxMzQ2LjM1Kzk5OS45NDJDMTQyNC43NSs5MTUuNTQyKzE0NjkuMjUrNzk0LjA0MisxNDY5LjI1KzYzMS40NDJaXCIsIGZpbGw6IFwiI0ZGRkZGRlwiLCBvcGFjaXR5OiBcIjFcIn0pXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19DaGVja2JveCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkIHx8IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJsaVwiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3ggXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hFbGVtZW50KVswXS5jaGVja2JveCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtaW5uZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hlY2tib3hJbm5lcilbMF0uY2hlY2tib3hJbm5lcn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsICF0aGlzLnN0YXRlLmNoZWNrZWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcbiAgICAgICAgfSk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4uL2ljb25zL2Rvd25hcnJvd1wiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XG4gICAgICAgIHRoaXMuZHJvcGRvd24gPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oaWRlTWVudSA9IHRoaXMuaGlkZU1lbnUuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBzaG93TWVudShldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoaWRlTWVudSgpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0ZWQoKSB7cmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PSB0aGlzLnN0YXRlLnZhbHVlKTt9XG5cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtb3B0aW9uc1wiPlxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0LW9wdGlvbiR7c2VsZWN0ZWQudmFsdWUgPT0gb3B0LnZhbHVlID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YH0gb25DbGljaz17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMsIG9wdC52YWx1ZSl9PntvcHQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj47XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGUgPT0gXCJ0cmFuc3BhcmVudFwiID8gXCIgYmQtc2VsZWN0LXRyYW5zcGFyZW50XCIgOiBcIlwiO1xuICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLnN0YXRlLm9wZW4gPyBcIiBtZW51LW9wZW5cIiA6IFwiXCI7XG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cbiAgICAgICAgICAgICAgICA8L2Rpdj47XG4gICAgfVxufVxuXG4vLyByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcFwiPlxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cbi8vIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxuLy8gICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWNvbnRyb2xzXCI+XG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XG4vLyAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxuLy8gICAgIDwvZGl2PlxuLy8gPC9kaXY+XG4vLyB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cbi8vIDwvZGl2PjsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBbXCJiZC1zZWFyY2gtd3JhcHBlclwiXVxuICAgICAgICBpZih0aGlzLnN0YXRlLmZvY3VzZWQpY2xhc3NOYW1lLnB1c2goXCJmb2N1c2VkXCIpXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lLmpvaW4oXCIgXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gbWF4TGVuZ3RoPVwiNTBcIiBcbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogdHJ1ZX0pXG4gICAgICAgICAgICAgICAgICAgIH19IG9uQmx1cj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogZmFsc2V9KVxuICAgICAgICAgICAgICAgICAgICB9fS8+XG4gICAgICAgICAgICAgICAgICAgIDxTZWFyY2hJY29uIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+O1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge2NoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH07XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3dpdGNoID0gPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuU3dpdGNoIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB2YWx1ZT17dGhpcy5zdGF0ZS5jaGVja2VkfSAvPlxuICAgIH1cblxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3dpdGNoXG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgZGlzcGxheU5hbWUoKSB7cmV0dXJuIFwiQ29udGVudENvbHVtblwiO31cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgLy9sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMucHJvcHMudGl0bGUgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHRoaXMucHJvcHMudGl0bGUpIDogbnVsbFxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIiwgc3R5bGU6IHtwYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19LFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCJcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xuICAgICAgICBzZWxmLnNldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5kZXRhY2ggPSBzZWxmLmRldGFjaC5iaW5kKHNlbGYpO1xuICAgIH1cblxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL2Rpc2NvcmRcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoc2VsZi5kZXRhY2hlZFJvb3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29kZU1pcnJvcigpIHtcbiAgICB9XG5cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgY3NzKCkge1xuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIGNjc3MgPSBCdWZmZXIuZnJvbShfY2NzcywgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjY3NzO1xuICAgIH1cblxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICBjb25zdCB7ZGV0YWNoZWR9ID0gc2VsZi5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgXCJFZGl0b3IgRGV0YWNoZWRcIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiLCBjbGFzc05hbWU6IFwiZWRpdG9yXCIsIHJlZjogXCJlZGl0b3JcIn0sIHNlbGYuY3NzKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1bFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRyb2xzLWJ1dHRvblwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIzcHggMCAwIDNweFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwiZGV0YWNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2ZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCI1cHhcIn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiaGVscC10ZXh0XCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiK1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBvbkNsaWNrKGFyZykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc3dpdGNoIChhcmcpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkZXRhY2hcIjpcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcbiAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQ3NzKCkge1xuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xuICAgIH1cblxuICAgIHNhdmVDc3MoKSB7XG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBCdWZmZXIuZnJvbSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCksIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpO1xuICAgIH1cblxuICAgIGRldGFjaCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRyb290ID0gc2VsZi5kZXRhY2hlZFJvb3Q7XG4gICAgICAgIGlmICghZHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcbiAgICB9XG5cbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcbiAgICAgICAgaWYgKCFfcm9vdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jvb3Q7XG4gICAgfVxuXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHApKTtcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXR0YWNoKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCJcblxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IHRydWU7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9kaXNjb3JkXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XG4gICAgfVxuXG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGNzcygpIHtcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBjY3NzID0gQnVmZmVyLmZyb20oX2Njc3MsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2NzcztcbiAgICB9XG5cbiAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XG4gICAgICAgIGlmICghX3Jvb3QpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcm9vdDtcbiAgICB9XG5cbiAgICBpbmplY3RSb290KCkge1xuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHApKTtcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJkLWRldGFjaGVkLWNzcy1lZGl0b3JcIiwgaWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1lZGl0b3JcIn0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWlubmVycGFuZVwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtYXR0YWNoLWNvbnRyb2xzXCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWdyb3VwXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogc2VsZi5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInVwZGF0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHlsZToge2JvcmRlclJhZGl1czogXCIwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMyZDJkMmRcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTYXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnNhdmVkIGNoYW5nZXMgYXJlIGxvc3Qgb24gYXR0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrKGlkKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XG4gICAgICAgICAgICAgICAgaWYgKERPTS5xdWVyeShcIiNlZGl0b3ItZGV0YWNoZWRcIikpIHNlbGYucHJvcHMuYXR0YWNoKCk7XG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYucm9vdCk7XG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQ3NzKCkge1xuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xuICAgIH1cblxuICAgIHNhdmVDc3MoKSB7XG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBCdWZmZXIuZnJvbSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCksIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpO1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6IHRydWV9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInJlYWN0LWVycm9yXCJ9LCBcIkNvbXBvbmVudCBFcnJvclwiKTsgIFxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxuICAgIH1cbn1cblxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBCREVycm9yQm91bmRhcnkucHJvdG90eXBlLnJlbmRlcjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCREVycm9yQm91bmRhcnkucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz47XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG93bkFycm93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjEyIDkuMjlMMTIgMTMuMTdsMy44OC0zLjg4Yy4zOS0uMzkgMS4wMi0uMzkgMS40MSAwIC4zOS4zOS4zOSAxLjAyIDAgMS40MWwtNC41OSA0LjU5Yy0uMzkuMzktMS4wMi4zOS0xLjQxIDBMNi43IDEwLjdjLS4zOS0uMzktLjM5LTEuMDIgMC0xLjQxLjM5LS4zOCAxLjAzLS4zOSAxLjQyIDB6XCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzelwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XG4gICAgICAgICAgICAgICA8L3N2Zz47XG4gICAgfVxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxuICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxuPC9zdmc+ICovfVxuXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xuXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE4cHhcIjtcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxuICAgICAgICA8L3N2Zz47XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6XCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcbiAgICB9XG59IiwibGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpe1xuICAgICAgICBpZighbWFyZ2luTW9kdWxlKW1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcbmltcG9ydCBkYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XG5cbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcblxubGV0IFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxuICAgICAgICAgICAgYXNzZXRzOiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gbnVsbFxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cyA9IG5ldyBTZXQoKVxuICAgIH1cblxuICAgIHVwZGF0ZVdoZW5GZXRjaGVkKGNvbXApe1xuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5hZGQoY29tcClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0lucHV0VGV4dH0gc2V0dGluZyBcbiAgICAgKi9cbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XG4gICAgICAgIGxldCBkZWZhdWx0U2V0dGluZyA9IFJQQ1Byb3BzLmZpbmQoZSA9PiBlLmlkID09PSBzZXR0aW5nLnByb3BzLmlkKVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgdGhpcy5zdGF0ZS5kYXRhLCB7XG4gICAgICAgICAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuc3RhdGUuYXNzZXRzXG4gICAgICAgIH0pXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xuICAgICAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKVxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxuICAgIH1cblxuICAgIGZldGNoQXNzZXRzKCl7XG4gICAgICAgIGlmKHRoaXMuaXNmZXRjaGluZyA9PT0gdHJ1ZSl7XG4gICAgICAgICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQgIT09IGFwcCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcbiAgICAgICAgICAgIH0sIDUwMDApO1xuICAgICAgICB9XG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5mZXRjaEFzc2V0cyh0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpXG4gICAgICAgIC50aGVuKGFzc2V0cyA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIGFzc2V0czogT2JqZWN0LmtleXMoYXNzZXRzKS5tYXAoayA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldCA9IGFzc2V0c1trXVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNzZXQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXG4gICAgICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cy5mb3JFYWNoKGUgPT4gZS5mb3JjZVVwZGF0ZSgpKVxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgdXBkYXRlUHJldmlldyhkYXRhKXtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkYXRhXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgcmV0dXJuIFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyB8fCAoVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzID0gW1xuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXG4gICAgICAgIF0pXG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgbWFyZ2luTW9kdWxlXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NHcm91cCB0aXRsZT1cIlJpY2hQcmVzZW5jZSBTZXR0aW5nc1wiIHNldHRpbmdzPXt0aGlzLnByb3BzLnNldHRpbmdzfSBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0vPixcbiAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz4sXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlJpY2hQcmVzZW5jZVwiLz4sXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHsvKiogb3B0aW9ucyAqL31cbiAgICAgICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29tcG9uZW50c31cbiAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcCAvPlxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUHJldmlld1wiLz5cbiAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XG4gICAgICAgICAgICAgICAgPFJwY1ByZXZpZXcgc2V0dGluZ3M9e3RoaXN9Lz5cbiAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXttYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PjwvZGl2PixcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17d2luZG93Lm9oZ29kb2hmdWNrfT5cbiAgICAgICAgICAgICAgICBPaCBnb2QgT2ggZnVja1xuICAgICAgICAgICAgPC9idXR0b24+LFxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGtZYTdycHNfZzRcIilcbiAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgIFNlZSA/IEkgcHVsbGVkIGEgbGl0bGUgc25lYWt5IG9uIHlhXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgXVxuICAgIH1cblxuICAgIGdldCBvcHRpb25zQ29tcG9uZW50cygpe1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgfHwgKHRoaXMuX29wdGlvbnNDb21wb25lbnRzID0gUlBDUHJvcHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgaWYoZS50eXBlID09PSBcInRleHRcIil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gWzxJbnB1dE51bWJlciBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0vPl0vKlxuICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcbiAgICAgICAgICAgICAgICAgICAgfX0gLz4pXG4gICAgICAgICAgICAgICAgfSovXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5XG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xuICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRDaG9pY2Ugc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9IGNob2ljZXM9e1t7dmFsdWU6IFwibm9uZVwiLCBsYWJlbDogXCJObyBhc3NldHNcIn1dLmNvbmNhdCh0aGlzLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKVxuICAgIH1cbn1cbmNvbnN0IFJQQ1Byb3BzID0gW1xuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiQXBwbGljYXRpb24gSURcIixcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiNzExNDE2OTU3NzE4NzU3NDE4XCJcbiAgICB9LFxuICAgIHtcbiAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxuICAgICAgICBpZDogXCJuYW1lXCIsXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJEZXRhaWxzXCIsXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkJyb3dzaW5nIERpc2NvcmRcIlxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJTdGF0ZVwiLFxuICAgICAgICBpZDogXCJzdGF0ZVwiLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkIENsaWVudFwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHRpdGxlOiBcIlRpbWVzdGFtcCBTdGFydFwiLFxuICAgICAgICBpZDogXCJ0aW1lc3RhbXBzLnN0YXJ0XCIsXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGdldCBwbGFjZWhvbGRlcigpe1xuICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KClcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICB0aXRsZTogXCJMYXJnZUFzc2V0XCIsXG4gICAgICAgIGlkOiBcImFzc2V0cy5sYXJnZVwiLFxuICAgICAgICB0eXBlOiBcImNob2ljZVwiXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHRpdGxlOiBcIlNtYWxsQXNzZXRcIixcbiAgICAgICAgaWQ6IFwiYXNzZXRzLnNtYWxsXCIsXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcbiAgICB9LFxuXVxuXG5sZXQgaW5wdXRUZXh0TW9kdWxlc1xuY2xhc3MgSW5wdXRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgZ2V0IG1vZHVsZXMoKXtcbiAgICAgICAgaWYoaW5wdXRUZXh0TW9kdWxlcyAmJiBpbnB1dFRleHRNb2R1bGVzWzBdKXJldHVybiBpbnB1dFRleHRNb2R1bGVzXG4gICAgICAgIHJldHVybiBpbnB1dFRleHRNb2R1bGVzID0gW1xuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF0sXG4gICAgICAgIF1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XG4gICAgICAgIHN1cGVyKHByb3BzKVxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcblxuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgcm93TW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXG4gICAgICAgICAgICBpbnB1dE1vZHVsZSxcbiAgICAgICAgICAgIHNpemVNb2R1bGUyLFxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxuICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxEaXZpZGVyLz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH1cbn1cblxubGV0IElucHV0TnVtYmVyTW9kdWxlc1xuY2xhc3MgSW5wdXROdW1iZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gSW5wdXROdW1iZXJNb2R1bGVzIHx8IChJbnB1dE51bWJlck1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF0sXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdLFxuICAgICAgICBdKVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IHR5cGU9XCJudW1iZXJcIiBvbkNoYW5nZT17KHZhbHVlLCBuYW1lLCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0rL2csIFwiXCIpXG4gICAgICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLnN0YXRlLmRhdGEpe1xuICAgICAgICAgICAgICAgIGlucHV0LnNldFZhbHVlKHZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcblxuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgcm93TW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcblxuXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cbiAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxuICAgICAgICAgICAgICAgIHtzZXR0aW5nLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIiA/IFxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxuICAgICAgICAgICAgICAgIH19IGNvbG9yPVwiYnJhbmRcIj5Db3B5IGN1cnJlbnQgdGltZXN0YW1wPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj4gOiBudWxsfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8RGl2aWRlci8+XG4gICAgICAgIDwvZGl2PilcbiAgICB9XG59XG5cbmxldCBJbnB1dENob2ljZU1vZHVsZXNcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdID8gXCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA6IFwibm9uZVwiXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLnVwZGF0ZVdoZW5GZXRjaGVkKHRoaXMpXG4gICAgfVxuXG4gICAgb25DaGFuZ2UoZGF0YSl7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRhdGEudmFsdWVcblxuICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiB2YWx1ZS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxuICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxuICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XG4gICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSA9PT0gXCJub25lXCIgPyBudWxsIDogdGhpcy5zdGF0ZS5kYXRhLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZGF0YTogdmFsdWVcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXG4gICAgfVxuICAgIFxuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBJbnB1dENob2ljZU1vZHVsZXMgfHwgKElucHV0Q2hvaWNlTW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xuXG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICByb3dNb2R1bGUsXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxuICAgICAgICAgICAgZmxleE1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG4gICAgICAgIFxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBvcHRpb25zLnVuc2hpZnQoe1xuICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxuICAgICAgICAgICAgbGFiZWw6IFwiTm8gYXNzZXRzXCJcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XG4gICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb3B0aW9ucz17b3B0aW9uc30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gLz5cbiAgICAgICAgICAgICAgICB7Lyo8U2VsZWN0IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IG9wdGlvbnM9e29wdGlvbnN9Lz4qL31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPERpdmlkZXIvPlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufVxuXG5sZXQgRGl2aWRlck1vZHVsZXMgPSBbXVxuY2xhc3MgRGl2aWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBEaXZpZGVyTW9kdWxlcyYmRGl2aWRlck1vZHVsZXNbMF0gPyBEaXZpZGVyTW9kdWxlcyA6IChEaXZpZGVyTW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXVxuICAgICAgICBdKVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgW1xuICAgICAgICAgICAgZGl2aWRlcixcbiAgICAgICAgICAgIGRpdmlkZXJEZWZhdWx0XG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YCR7ZGl2aWRlci5kaXZpZGVyfSAke2RpdmlkZXJEZWZhdWx0LmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxuICAgIH1cbn1cblxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCl7XG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXG5cbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9IGNvbG9yPVwiYnJhbmRcIj5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4pXG4gICAgfVxufVxuXG5jbGFzcyBScGNQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KXtcbiAgICAgICAgc3VwZXIocHJvcHMpXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhY3RpdmU6IFwicHJvZmlsZVwiXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJzID0gW11cblxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXG4gICAgfVxuXG4gICAgY2hhbmdlVGFiKHRhYil7XG4gICAgICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmVcbiAgICAgICAgaWYoYW5jaWVudFRhYiA9PT0gdGFiLnByb3BzLmlkKXJldHVyblxuXG4gICAgICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZS5zZXRBY3RpdmUoZmFsc2UpXG4gICAgICAgIH0pXG4gICAgICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSlcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJuYXZcIiBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJGdWxsIFByb2ZpbGVcIiBpZD1cInByb2ZpbGVcIi8+XG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxQcmVzZW5jZUVycm9yQ2F0Y2hlciBwcmV2aWV3PXt0aGlzLnByZXZpZXd9IHN0YXRlPXt0aGlzLnN0YXRlLnJwY30gcHJvcHM9e3twcmV2aWV3OiB0aGlzfX0ga2V5PXt0aGlzLnN0YXRlLmFjdGl2ZX0gLz5cbiAgICAgICAgPC9kaXY+KVxuICAgIH0gICBcblxuICAgIGlzQWN0aXZlKHRhYil7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gdGFiXG4gICAgfVxuXG4gICAgZ2V0IHByZXZpZXcoKXtcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUgPT09IFwicHJvZmlsZVwiKXJldHVybiBQcm9maWxlXG4gICAgICAgIHJldHVybiBQb3BvdXRcbiAgICB9XG59XG5cbmNsYXNzIFRhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xuICAgICAgICBzdXBlcihwcm9wcylcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxuICAgICAgICB9XG4gICAgICAgIHByb3BzLnByZXZpZXcudGFicy5wdXNoKHRoaXMpXG4gICAgfVxuXG4gICAgc2V0QWN0aXZlKGlzQWN0aXZlKXtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6ICEhaXNBY3RpdmVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGBsYy1uYXZJdGVtYFxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSl7XG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtQWN0aXZlYFxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1JbmFjdGl2ZWBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9eygpPT57XG4gICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpXG4gICAgICAgIH19PlxuICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XG4gICAgICAgIDwvZGl2PilcbiAgICB9XG59XG5cbmxldCBlbXB0eUNsYXNzZXNcbmNsYXNzIFByZXNlbmNlRXJyb3JDYXRjaGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb21wb25lbnREaWRDYXRjaChlcnIsIGVyckluZm8pe1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJySW5mbylcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlcnJvcjogdHJ1ZVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZW5kZXIoKXtcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUpe1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5zdGF0ZS5lcnJvcil7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlldyA9IG5ldyB0aGlzLnByb3BzLnByZXZpZXcodGhpcy5wcm9wcy5wcm9wcylcbiAgICAgICAgICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHRoaXMucHJvcHMuc3RhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpZXcucmVuZGVyKClcbiAgICAgICAgICAgIH1jYXRjaChlcnIpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZXJyb3IgPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBlbXB0eUNsYXNzZXMgPSBlbXB0eUNsYXNzZXMgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5lbXB0eVN0YXRlSW1hZ2UgJiYgZS5lbXB0eVN0YXRlKVxuICAgICAgICAgICAgaWYoIWVtcHR5Q2xhc3Nlcyl7XG4gICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiQW4gZXJyb3Igb2NjdXJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy5cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBtYXJnaW46IFwiMjBweFwiXG4gICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPXtgbGMtdGFiLWJveC1zaGFkb3cgJHtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZX1gfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSW1hZ2V9IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiXG4gICAgICAgICAgICAgICAgICAgIH19PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGVIZWFkZXJ9PkFuIGVycm9yIG9jY3VyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZVN1YnRleHR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9ucy4gSm9pbiBvdXIgwq1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzTmFtZT17YCR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtCRFYyLmFuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9ezB9IG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLmpvaW5MQygpXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgwq0gZm9yIGhlbHAuXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgcG9wb3V0TW9kdWxlc1xubGV0IFVzZXJQb3BvdXRDb21wb25lbnRcbmxldCBQb3BvdXRQcm9wc1xuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBnZXQgbW9kdWxlcygpe1xuICAgICAgICByZXR1cm4gcG9wb3V0TW9kdWxlcyB8fCAocG9wb3V0TW9kdWxlcyA9IFtcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiVXNlclBvcG91dFwiKSxcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpXG4gICAgICAgIF0pXG4gICAgfVxuXG4gICAgZ2V0Q29tcG9uZW50KCl7XG4gICAgICAgIGxldCBbXG4gICAgICAgICAgICBVc2VyUG9wb3V0LFxuICAgICAgICAgICAgdXNlck1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZW5kZXIxID0gVXNlclBvcG91dC5kZWZhdWx0KHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHVzZXIuaWQsIFxuICAgICAgICAgICAgICAgIGd1aWxkSWQ6IG51bGwsIFxuICAgICAgICAgICAgICAgIGNoYW5uZWxJZDogbnVsbCwgXG4gICAgICAgICAgICAgICAgZGlzYWJsZVVzZXJQcm9maWxlTGluazogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFVzZXJQb3BvdXRDb21wb25lbnQgPSByZW5kZXIxLnR5cGVcbiAgICAgICAgICAgIFBvcG91dFByb3BzID0gcmVuZGVyMS5wcm9wc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcbiAgICAgICAgfSwgbnVsbClcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgaWYoIVVzZXJQb3BvdXRDb21wb25lbnQpcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50KClcbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIF9Vc2VyUG9wb3V0LFxuICAgICAgICAgICAgdXNlck1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG5cbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnYW1lXG4gICAgICAgIH0pLmNhbGwoe1xuICAgICAgICAgICAgZ2FtZTogZGF0YVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHBvcG91dCA9IG5ldyBVc2VyUG9wb3V0Q29tcG9uZW50KE9iamVjdC5hc3NpZ24oe30sIFBvcG91dFByb3BzLCB7XG4gICAgICAgICAgICBhY3Rpdml0eTogYWN0aXZpdHksXG4gICAgICAgICAgICB1c2VySWQ6IHVzZXIuaWRcbiAgICAgICAgfSkpLnJlbmRlcigpLnByb3BzLmNoaWxkcmVuIC8vIGJ5cGFzcyB0cmFja2luZ1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgc3RvcCBwcm9wYWdhdGlvbiBzaGl0LlxuICAgICAgICBjb25zdCBjb250YWluZXIgPSA8ZGl2IHsuLi53aW5kb3cuTGlnaHRjb3JkLkFwaS5fLmV4Y2x1ZGVQcm9wZXJ0aWVzKHBvcG91dC5wcm9wcywgW1wib25DbGlja1wiLCBcIm9uQ29udGV4dE1lbnVcIl0pfSAvPlxuXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImxjLXVzZXJQb3BvdXQgbGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgIHtjb250YWluZXJ9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbn1cblxubGV0IHByb2ZpbGVNb2R1bGVzXG5sZXQgVXNlclByb2ZpbGVDb21wb25lbnRcbmxldCBQcm9maWxlUHJvcHNcbmxldCBjb25uZWN0ZWRQcm9maWxlU3RvcmVcbmNsYXNzIFByb2ZpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGdldCBtb2R1bGVzKCl7XG4gICAgICAgIHJldHVybiBwcm9maWxlTW9kdWxlcyB8fCAocHJvZmlsZU1vZHVsZXMgPSBbXG4gICAgICAgICAgICBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlVzZXJQcm9maWxlXCIpLFxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcbiAgICAgICAgXSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgbGV0IFtcbiAgICAgICAgICAgIFVzZXJQcm9maWxlLFxuICAgICAgICAgICAgdXNlck1vZHVsZVxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXG5cbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXG4gICAgICAgIGlmKCFVc2VyUHJvZmlsZUNvbXBvbmVudCl7XG4gICAgICAgICAgICBjb25zdCByZW5kZXIxID0gbmV3IFVzZXJQcm9maWxlLmRlZmF1bHQoe1xuICAgICAgICAgICAgICAgIHVzZXI6IHVzZXJcbiAgICAgICAgICAgIH0pLnJlbmRlcigpXG4gICAgICAgICAgICBjb25uZWN0ZWRQcm9maWxlU3RvcmUgPSByZW5kZXIxLnR5cGVcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcjIgPSBuZXcgcmVuZGVyMS50eXBlKHJlbmRlcjEucHJvcHMpLnJlbmRlcigpXG4gICAgICAgICAgICBjb25zdCByZW5kZXIzID0gcmVuZGVyMi50eXBlLnJlbmRlcihyZW5kZXIyLnByb3BzLCBudWxsKVxuICAgICAgICAgICAgY29uc3QgcmVuZGVyNCA9IG5ldyByZW5kZXIzLnR5cGUocmVuZGVyMy5wcm9wcykucmVuZGVyKClcbiAgICAgICAgICAgIFVzZXJQcm9maWxlQ29tcG9uZW50ID0gcmVuZGVyNC50eXBlXG4gICAgICAgIH1cbiAgICAgICAgaWYoIVVzZXJQcm9maWxlQ29tcG9uZW50KXRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0aGUgVXNlclByb2ZpbGVDb21wb25lbnQgY29tcG9uZW50LmApXG5cbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcbiAgICAgICAgICAgIGxldCBnYW1lID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5nYW1lLmRldGFpbHMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcbiAgICAgICAgICAgICAgICAgICAgbGFyZ2VfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHR5cGU6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnYW1lXG4gICAgICAgIH0pLmNhbGwoe1xuICAgICAgICAgICAgZ2FtZTogZGF0YVxuICAgICAgICB9KVxuXG4gICAgICAgIFByb2ZpbGVQcm9wcyA9IG5ldyBjb25uZWN0ZWRQcm9maWxlU3RvcmUoe1xuICAgICAgICAgICAgdXNlcjogdXNlcixcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7fVxuICAgICAgICB9KS5yZW5kZXIoKS5wcm9wc1xuICAgICAgICBjb25zdCBwcm9maWxlID0gbmV3IFVzZXJQcm9maWxlQ29tcG9uZW50KE9iamVjdC5hc3NpZ24oe30sIFByb2ZpbGVQcm9wcywge1xuICAgICAgICAgICAgYWN0aXZpdHk6IGFjdGl2aXR5XG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcblxuICAgICAgICBwcm9maWxlLnByb3BzLnN0eWxlID0ge1xuICAgICAgICAgICAgd2lkdGg6IFwiYXV0b1wiXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy10YWIgbGMtdGFiLWJveC1zaGFkb3dcIj5cbiAgICAgICAgICAgIHtwcm9maWxlfVxuICAgICAgICA8L2Rpdj5cbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4uL3NldHRpbmdzVGl0bGVcIjtcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xuXG5pbXBvcnQgU2VydmVyQ2FyZCBmcm9tIFwiLi9zZXJ2ZXJDYXJkXCI7XG5pbXBvcnQgeyB1c2VGb3JjZVVwZGF0ZSB9IGZyb20gXCIuLi8uLi9tb2R1bGVzL2hvb2tzXCI7XG5cbmxldCBTZXR0aW5nc1ZpZXdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QdWJsaWNTZXJ2ZXJzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICAgIHRoaXMuY2xvc2UgPSB0aGlzLmNsb3NlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2hhbmdlQ2F0ZWdvcnkgPSB0aGlzLmNoYW5nZUNhdGVnb3J5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zZWFyY2hLZXlEb3duID0gdGhpcy5zZWFyY2hLZXlEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uID0gdGhpcy5jaGVja0Nvbm5lY3Rpb24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY29ubmVjdCA9IHRoaXMuY29ubmVjdC5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xuICAgICAgICB0aGlzLkF2YXRhckRlZmF1bHRzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFVzZXJBdmF0YXJVUkxcIiwgXCJERUZBVUxUX0FWQVRBUlNcIl0pO1xuICAgICAgICB0aGlzLkludml0ZUFjdGlvbnMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTtcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XG5cbiAgICAgICAgdGhpcy5ob29rcyA9IFtdXG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgc2VydmVyczogW10sXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgICAgIHN0YXRlOiAwLFxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWN0aW9uOiB0aGlzLmNhdGVnb3J5U2x1Z3NbMF0sXG4gICAgICAgICAgICB0aGVtZTogXCJkYXJrXCJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5jbG9zZSgpXG4gICAgfVxuXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgZmV0Y2goYCR7c2VsZi5zZWFyY2hFbmRQb2ludH0ke3F1ZXJ5fSR7cXVlcnkgPyBcIiZzY2hlbWE9bmV3XCIgOiBcIj9zY2hlbWE9bmV3XCJ9YCwge1xuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBhd2FpdCByZXMudGV4dCgpXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlcnZlcnMgPSBkYXRhLnJlc3VsdHMucmVkdWNlKChhcnIsIHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIC8vIGFyci5wdXNoKDxTZXJ2ZXJDYXJkIHNlcnZlcj17c2VydmVyfSBqb2luPXtzZWxmLmpvaW59Lz4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XG4gICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzID0gc2VsZi5zdGF0ZS5zZXJ2ZXJzLmNvbmNhdChzZXJ2ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vc2VydmVycy51bnNoaWZ0KHNlbGYuYmRTZXJ2ZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZW5kID0gZGF0YS5zaXplICsgZGF0YS5mcm9tO1xuICAgICAgICAgICAgZGF0YS5uZXh0ID0gYD9mcm9tPSR7ZW5kfWA7XG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5KSBkYXRhLm5leHQgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZGF0YS50b3RhbCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRpdGxlID0gYFNob3dpbmcgMS0ke2VuZH0gb2YgJHtkYXRhLnRvdGFsfSByZXN1bHRzIGluICR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgdGl0bGUgKz0gYCBmb3IgJHtzZWxmLnN0YXRlLnRlcm19YDtcblxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgIHNlcnZlcnM6IHNlcnZlcnMsXG4gICAgICAgICAgICAgICAgbmV4dDogZGF0YS5uZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBqb2luKHNlcnZlckNhcmQpIHtcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcblxuICAgICAgICBhd2FpdCBmZXRjaChgJHt0aGlzLmpvaW5FbmRQb2ludH0vJHtzZXJ2ZXJDYXJkLnByb3BzLnNlcnZlci5pZGVudGlmaWVyfWAse1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxmLndpbmRvd09wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XG4gICAgICAgIG9wdGlvbnMueSA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblkgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyIC0gb3B0aW9ucy5oZWlnaHQgLyAyKTtcblxuICAgICAgICBjb25zdCB3aW4gPSBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1cmwgPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vY29ubmVjdD9zY29wZXM9Z3VpbGRzLmpvaW4mcHJldmlvdXNVcmw9aHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCI7XG4gICAgICAgIHdpbi53ZWJDb250ZW50cy5vbihcImRpZC1uYXZpZ2F0ZVwiLCAoZXZlbnQsIHVybCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XG4gICAgICAgICAgICB3aW4uY2xvc2UoKTtcbiAgICAgICAgICAgIHNlbGYuY2hlY2tDb25uZWN0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW4ubG9hZFVSTCh1cmwpO1xuICAgICAgICB3aW4uc2V0TWVudUJhclZpc2liaWxpdHkoZmFsc2UpXG4gICAgfVxuXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogNTAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiIzI4MmIzMFwiLFxuICAgICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBtaW5pbWl6YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcbiAgICAgICAgICAgIGZyYW1lOiB0cnVlLFxuICAgICAgICAgICAgY2VudGVyOiBmYWxzZSxcbiAgICAgICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCBiZFNlcnZlcigpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xuICAgICAgICAgICAgbmFtZTogXCJCZXR0ZXJEaXNjb3JkXCIsXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzAwMDArXCIsXG4gICAgICAgICAgICBtZW1iZXJzOiBcIjcwMDAwK1wiLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzg2MDA0NzQ0OTY2OTE0MDQ4LzI5MmU3ZjZiZmZmMmI3MWRmZDEzZTUwOGE4NTlhZWRkLndlYnBcIixcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCIwVG1mbzVaYk9SQ1JxYkFkXCIsXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc2VydmVyMiA9IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkXCIsXG4gICAgICAgICAgICBvbmxpbmU6IFwiMTAwK1wiLFxuICAgICAgICAgICAgbWVtYmVyczogXCIzMDArXCIsXG4gICAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJjb21tdW5pdHlcIiwgXCJwcm9ncmFtbWluZ1wiLCBcInN1cHBvcnRcIl0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBMaWdodGNvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI3MDU5MDgzNTAyMTg2NjYxMTdcIixcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC5wbmdcIixcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXG4gICAgICAgICAgICBpbnZpdGVfY29kZTogXCI3ZUZmZjJBXCIsXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyMiwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KVxuICAgICAgICBdXG4gICAgfVxuXG4gICAgZ2V0IHNlYXJjaEVuZFBvaW50KCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3NlYXJjaC5kaXNjb3Jkc2VydmVycy5jb21cIjtcbiAgICB9XG5cbiAgICBnZXQgam9pbkVuZFBvaW50KCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL2ouZGlzY29yZHNlcnZlcnMuY29tXCI7XG4gICAgfVxuXG4gICAgZ2V0IGNvbm5lY3RFbmRQb2ludCgpIHtcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgICAgICAgIGlmKCF0ZXh0KXtcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dClcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IDAsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAxLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuaG9va3MuZm9yRWFjaCgoZSkgPT4gZSgpKVxuICAgICAgICBTZXR0aW5nc1ZpZXcgPSBTZXR0aW5nc1ZpZXcgfHwgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlNldHRpbmdzVmlld1wiKVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJwdWJzbGF5ZXJyb290XCJ9LCBcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NWaWV3LCB7XG4gICAgICAgICAgICAgICAgb25TZXRTZWN0aW9uOiAoc2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5KHRoaXMuY2F0ZWdvcnlTbHVncy5pbmRleE9mKHNlY3Rpb24pKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VjdGlvbnM6IHRoaXMuc2VjdGlvbnMsXG4gICAgICAgICAgICAgICAgb25DbG9zZTogdGhpcy5jbG9zZSxcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiB0aGlzLnN0YXRlLnNlY3Rpb25cbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBzZWN0aW9ucygpe1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXVxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiSEVBREVSXCIsXG4gICAgICAgICAgICBsYWJlbDogXCJQdWJsaWMgU2VydmVyc1wiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiRElWSURFUlwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNlY3Rpb246IFwiQ1VTVE9NXCIsXG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLnNlYXJjaElucHV0LmJpbmQobnVsbCwgKCkgPT4gdGhpcywgdGhpcy5zZWFyY2hLZXlEb3duKVxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxuICAgICAgICAgICAgbGFiZWw6IFwiQ2F0ZWdvcmllc1wiXG4gICAgICAgIH0sIC4uLnRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNlY3Rpb246IHRoaXMuY2F0ZWdvcnlTbHVnc1tpbmRleF0sXG4gICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuY29udGVudC5iaW5kKG51bGwsICgpID0+IHRoaXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzZWN0aW9uOiBcIkNVU1RPTVwiLFxuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5mb290ZXJcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuY29ubmVjdGlvbi5iaW5kKG51bGwsICgpID0+IHRoaXMpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzZWN0aW9uc1xuICAgIH1cbiAgICBcbiAgICBzZWFyY2hJbnB1dChnZXRUaGlzLCBzZWFyY2hLZXlEb3duKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gQkRWMi5yZWFjdC51c2VTdGF0ZShcIlwiKVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS1pdGVtXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10ZXh0LWlucHV0IGZsZXgtdmVydGljYWxcIiwgc3R5bGU6IHt3aWR0aDogXCIxNzJweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiAoc2VyY2hpbnB1dCkgPT4gKGdldFRoaXMoKS5yZWZzLnNlYXJjaGlucHV0ID0gc2VyY2hpbnB1dCksIFxuICAgICAgICAgICAgICAgICAgICBvbktleURvd246IHNlYXJjaEtleURvd24sIFxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUudGFyZ2V0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsIFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiU2VhcmNoLi4uXCIsIFxuICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6IFwiNTBcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcgfHwgZS53aGljaCAhPT0gMTMpIHJldHVybjtcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBxdWVyeSA9IGA/dGVybT0ke2UudGFyZ2V0LnZhbHVlfWA7XG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcbiAgICAgICAgICAgIHF1ZXJ5ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xuICAgIH1cblxuICAgIGdldCBjYXRlZ29yeVNsdWdzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5QnV0dG9ucy5tYXAoZSA9PiBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15cXHdcXGRdKy9nLCBcIl9cIikpXG4gICAgfVxuXG4gICAgZ2V0IGNhdGVnb3J5QnV0dG9ucygpIHtcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcbiAgICB9XG5cbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO1xuICAgICAgICBzZWxmLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcbiAgICAgICAgICAgIHRlcm06IG51bGwsXG4gICAgICAgICAgICBzZWN0aW9uOiBzZWxmLmNhdGVnb3J5U2x1Z3NbaWRdXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaWQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29udGVudChnZXRUaGlzKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSBnZXRUaGlzKCk7XG4gICAgICAgIHNlbGYudXNlU3RhdGUoKVxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSBzZWxmLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSBzZWxmLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuY29ubmVjdGlvbi5zdGF0ZSA9PT0gMSkgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChzZWxmLm5vdENvbm5lY3RlZC5iaW5kKG51bGwsIGdldFRoaXMpKTtcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7cmVmOiAocmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgKHNlbGYucmVmcy5jb250ZW50ID0gcmVmKVxuICAgICAgICAgICAgfSwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pLFxuICAgICAgICAgICAgc2VsZi5iZFNlcnZlcixcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge2tleTogc2VydmVyLmlkZW50aWZpZXIsIHNlcnZlcjogc2VydmVyLCBqb2luOiBzZWxmLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIiwgc3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIxMHB4XCJ9fSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLmxvYWRpbmcgPyBcIkxvYWRpbmdcIiA6IFwiTG9hZCBNb3JlXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSlcbiAgICAgICAgKV07XG4gICAgfVxuXG4gICAgbm90Q29ubmVjdGVkKGdldFRoaXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IGdldFRoaXMoKTtcbiAgICAgICAgLy9yZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHsgdGV4dDogc2VsZi5zdGF0ZS50aXRsZSB9KTtcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7a2V5OiBcIm5jY1wiLCByZWY6IChyZWYpID0+IChzZWxmLnJlZnMuY29udGVudCA9IHJlZiksIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcImgyXCIsXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxuICAgICAgICAgICAgICAgIFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogXCIxOHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogXCIxNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksIHNlbGYuYmRTZXJ2ZXJcbiAgICAgICAgKV07XG4gICAgfVxuXG4gICAgZm9vdGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJhXCIsXG4gICAgICAgICAgICAgICAge2hyZWY6IFwiaHR0cHM6Ly9kaXNjb3Jkc2VydmVycy5jb21cIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcbiAgICAgICAgICAgICAgICBcIkRpc2NvcmRzZXJ2ZXJzLmNvbVwiXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXNlU3RhdGUoKXtcbiAgICAgICAgY29uc3QgZm9yY2VVcGRhdGUgPSB1c2VGb3JjZVVwZGF0ZSgpXG4gICAgICAgIEJEVjIuUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9va3MucHVzaChsaXN0ZW5lcilcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmhvb2tzLmZpbmRJbmRleChlID0+IGU9PT1saXN0ZW5lcilcbiAgICAgICAgICAgICAgICBpZihpbmRleCA8IDApcmV0dXJuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKVxuICAgIH1cblxuICAgIGNvbm5lY3Rpb24oZ2V0VGhpcykge1xuICAgICAgICBjb25zdCBzZWxmID0gZ2V0VGhpcygpO1xuICAgICAgICBzZWxmLnVzZVN0YXRlKClcbiAgICAgICAgY29uc3Qge2Nvbm5lY3Rpb259ID0gc2VsZi5zdGF0ZTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IDIpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpO1xuXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtjb2xvcjogXCIjYjliYmJlXCIsIGZvbnRTaXplOiBcIjEwcHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcbiAgICAgICAgICAgICAgICBcIkNvbm5lY3RlZCBhczogXCIsXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICB7c3R5bGU6IHtwYWRkaW5nOiBcIjVweCAxMHB4IDAgMTBweFwifX0sXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHt3aWR0aDogXCIxMDAlXCIsIG1pbkhlaWdodDogXCIyMHB4XCJ9LCB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCJ9LFxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIiwgb25DbGljazogc2VsZi5jb25uZWN0fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVjb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlcnZlckNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCkgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpbWFnZUVycm9yOiBmYWxzZSxcbiAgICAgICAgICAgIGpvaW5lZDogdGhpcy5wcm9wcy5ndWlsZExpc3QuaW5jbHVkZXModGhpcy5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcilcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtzZXJ2ZXJ9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGNhcmRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jYXJkICYmIGUuY2FyZFByaW1hcnkpWzBdXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxuICAgICAgICBsZXQgd3JhcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vV3JhcCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkKVswXVxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgJHtjYXJkTW9kdWxlLmNhcmR9ICR7Y2FyZE1vZHVsZS5jYXJkUHJpbWFyeX0gJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fSBiZC1zZXJ2ZXItY2FyZCR7c2VydmVyLnBpbm5lZCA/IFwiIGJkLXNlcnZlci1jYXJkLXBpbm5lZFwiIDogXCJcIn1gfSxcbiAgICAgICAgICAgIC8vIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxuICAgICAgICAgICAgICAgIC8vIHsgY2xhc3NOYW1lOiBcImZsZXgtMXhNUWc1IGZsZXgtMU8xR0tZIGhvcml6b250YWwtMWFlOWNpIGhvcml6b250YWwtMkVFRW5ZIGZsZXgtMU8xR0tZIGRpcmVjdGlvblJvdy0zdjN0ZkcganVzdGlmeVN0YXJ0LTJ5SVpvMCBhbGlnblN0cmV0Y2gtMWh3eE1hIG5vV3JhcC0zanludjZcIiB9LFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7cmVmOiBcImltZ1wiLCBjbGFzc05hbWU6IFwiYmQtc2VydmVyLWltYWdlXCIsIHNyYzogc2VydmVyLmljb25VcmwsIG9uRXJyb3I6IHRoaXMuaGFuZGxlRXJyb3IuYmluZCh0aGlzKSwgZHJhZ2dhYmxlOiBmYWxzZX0pLFxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5mbGV4Q2hpbGQrXCIgYmQtc2VydmVyLWNvbnRlbnRcIn0sXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXArXCIgYmQtc2VydmVyLWhlYWRlclwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW5hbWVcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1tZW1iZXItY291bnRcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm1lbWJlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXkgYmQtc2VydmVyLWRlc2NyaXB0aW9uLWNvbnRhaW5lclwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXItMkZLRlBHIHNjcm9sbGVyIGJkLXNlcnZlci1kZXNjcmlwdGlvblwifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY2F0ZWdvcmllcy5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gY29sb3JHcmVlbi0yOWlBS1lcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjM2FjMTVjXCJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gZGlzYWJsZWQtOWFGMnVnXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiI2MxM2EzYVwifX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTlwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIn0sIG9uQ2xpY2s6ICgpID0+IHt0aGlzLmpvaW4oKTt9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIC8vIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcigpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ltYWdlRXJyb3I6IHRydWV9KTtcbiAgICB9XG5cbiAgICBqb2luKCkge1xuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XG4gICAgICAgIC8vdGhpcy5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19SZWxvYWRJY29uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICAgICAgICAgICAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgICAgICAgICAgICAgIGZpbGw6IFwiI2RjZGRkZVwiLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLnByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgICAgICAgc3R5bGU6IHt3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiLCBoZWlnaHQ6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIn1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXpcIn0pLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDogXCJub25lXCIsIGQ6IFwiTTAgMGgyNHYyNEgwelwifSlcbiAgICAgICAgKTtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi9tYXJnaW50b3BcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlY3Rpb25zLm1hcCgoc2VjdGlvbiwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBpICE9PSAwID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCwge30pIDogbnVsbCxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NHcm91cCwgT2JqZWN0LmFzc2lnbih7fSwgc2VjdGlvbiwge29uQ2hhbmdlOiB0aGlzLnByb3BzLm9uQ2hhbmdlfSkpXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pXG4gICAgfVxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XG5cbmxldCBmb3JtTW9kdWxlXG5sZXQgc3dpdGNoSXRlbVxubGV0IGJldGFDbGFzc05hbWVzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NHcm91cCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlcnJvcjogZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlck9sZFNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCB7dGl0bGUsIHNldHRpbmdzLCBidXR0b259ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGl0bGV9KSxcbiAgICAgICAgICAgICAgICBidXR0b25Db21wb25lbnQsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xuICAgICAgICAgICAgICAgIH0pXTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRDYXRjaChlcnIsIGVyckluZm8pe1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIsIGVyckluZm8pXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZXJyb3I6IHRydWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5lcnJvcil7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyT2xkU2V0dGluZ3MoKVxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICBpZighZm9ybU1vZHVsZSlmb3JtTW9kdWxlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5Gb3JtU2VjdGlvbilcbiAgICAgICAgICAgICAgICBpZighc3dpdGNoSXRlbSlzd2l0Y2hJdGVtID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJTd2l0Y2hJdGVtXCIpXG4gICAgICAgICAgICAgICAgaWYoIWJldGFDbGFzc05hbWVzKWJldGFDbGFzc05hbWVzID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5iZXRhICYmICghZS5jb250YWluZXIgJiYgIWUudXNlclNldHRpbmdzVm9pY2UpKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtdXG4gICAgICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5kZXNjcmlwdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goPGZvcm1Nb2R1bGUuRm9ybVRleHQgdHlwZT1cImRlc2NyaXB0aW9uXCIgc2VsZWN0YWJsZT17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD4sIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKC4uLnRoaXMucHJvcHMuc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIGlmKHNldHRpbmcuZXhwZXJpbWVudGFsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucHVzaCg8c3VwIGNsYXNzTmFtZT17YmV0YUNsYXNzTmFtZXMuYmV0YX0+KEVYUEVSSU1FTlRBTCk8L3N1cD4pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxzd2l0Y2hJdGVtLmRlZmF1bHQgb25DaGFuZ2U9eyhldikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShzZXR0aW5nLmlkLCBldi50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgfX0ga2V5PXtzZXR0aW5nLmlkfSB2YWx1ZT17c2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF19IGNsYXNzTmFtZT17X19TRUNSRVRfRU1PVElPTl9fLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IFwiMjBweFwiXG4gICAgICAgICAgICAgICAgICAgIH0pfSBkaXNhYmxlZD17ZmFsc2V9IGhpZGVCb3JkZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT17c3dpdGNoSXRlbS5kZWZhdWx0LlNpemVzLkRFRkFVTFR9IHRoZW1lPXtzd2l0Y2hJdGVtLmRlZmF1bHQuVGhlbWVzLkRFRkFVTFR9IG5vdGU9e3NldHRpbmcuaW5mb30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aW5mb31cbiAgICAgICAgICAgICAgICAgICAgPC9zd2l0Y2hJdGVtLmRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9e3RoaXMucHJvcHMudGl0bGV9PlxuICAgICAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPlxuICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICB9XG4vL2gyLTJnV0UtbyB0aXRsZS0zc1pXWVEgc2l6ZTE2LTE0Y0d6NSBoZWlnaHQyMC1tTzJlSU4gd2VpZ2h0U2VtaUJvbGQtTkpleHppIGRhLWgyIGRhLXRpdGxlIGRhLXNpemUxNiBkYS1oZWlnaHQyMCBkYS13ZWlnaHRTZW1pQm9sZCBkZWZhdWx0Q29sb3ItMV9halgwIGRhLWRlZmF1bHRDb2xvciBtYXJnaW5Ub3A2MC0zUEdidEsgZGEtbWFyZ2luVG9wNjAgbWFyZ2luQm90dG9tMjAtMzJxSUQ3IGRhLW1hcmdpbkJvdHRvbTIwXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJoMlwiLFxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XG4gICAgICAgICk7XG4gICAgfVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL2NvbXBvbmVudHMvc3dpdGNoXCI7XG5cbmxldCBjbGFzc25hbWVzID0gW11cbmZ1bmN0aW9uIGdldENsYXNzTmFtZShuYW1lKXtcbiAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKG5hbWUrXCItXCIpKVxuICAgIGlmKGNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXG4gICAgY2xhc3NOYW1lID0gQkRNb2R1bGVzLmdldChlID0+IGVbbmFtZV0pWzBdW25hbWVdXG4gICAgY2xhc3NuYW1lcy5wdXNoKGNsYXNzTmFtZSlcbiAgICByZXR1cm4gY2xhc3NOYW1lXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5jaGVja2VkID0gIXRoaXMucHJvcHMuY2hlY2tlZDtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHt0ZXh0LCBpbmZvfSA9IHRoaXMucHJvcHMuZGF0YTtcbiAgICAgICAgaWYoIWNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChcImJldGEtXCIpKSl7XG4gICAgICAgICAgICBjbGFzc25hbWVzLnB1c2goQkRNb2R1bGVzLmdldChlID0+IGUuYmV0YSAmJiAoIWUuY29udGFpbmVyICYmICFlLnVzZXJTZXR0aW5nc1ZvaWNlKSlbMF0uYmV0YSlcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLnByb3BzLmRhdGEuZXhwZXJpbWVudGFsKXtcbiAgICAgICAgICAgIGluZm8gPSBbXG4gICAgICAgICAgICAgICAgaW5mbyxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3VwXCIsIHtjbGFzc05hbWU6IGdldENsYXNzTmFtZShcImJldGFcIil9LCBcIihFWFBFUklNRU5UQUwpXCIpXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LWhvcml6b250YWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcFwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoM1wiLCB7a2V5OiBcInRpdGxlXCIsIGNsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgzIG1hcmdpbi1yZXNldCBtYXJnaW4tcmVzZXQgdWktZmxleC1jaGlsZFwifSwgdGV4dCksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2tleTogXCJzd2l0Y2hcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10ZXh0IHN0eWxlLWRlc2NyaXB0aW9uIG1hcmdpbi10b3AtNFwiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LCBpbmZvKVxuICAgICAgICApO1xuICAgIH1cbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFyU2VwYXJhdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItc2VwYXJhdG9yIG1hcmdpbi10b3AtOCBtYXJnaW4tYm90dG9tLThcIn0pO1xuICAgIH1cbn0iLCIvKipcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cbiAqIFdpbGwgYWxzbyByZW1vdmUgdGhlbXNlbHZlcyBpZiB0aGUgbm9kZSB0byB3YXRjaCBpcyByZW1vdmVkIGZyb20gRE9NIHRocm91Z2hcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cbiAqXG4gKiBOb3RlIHRoaXMgaXMgbm90IHVzaW5nIERpc2NvcmQncyBpbnRlcm5hbHMgYnV0IG5vcm1hbCBET00gbWFuaXB1bGF0aW9uIGFuZCBlbXVsYXRlc1xuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxuICpcbiAqIEBtb2R1bGUgRW11bGF0ZWRUb29sdGlwXG4gKiBAdmVyc2lvbiAwLjAuMVxuICovXG5cbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XG5sZXQgVG9vbHRpcENsYXNzZXNcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XG5cdGlmKFRvb2x0aXBDbGFzc2VzKXJldHVybiBUb29sdGlwQ2xhc3Nlc1xuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XG59XG5sZXQgVG9vbHRpcExheWVyc1xuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXG5cdHJldHVybiBUb29sdGlwTGF5ZXJzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJsYXllclwiLCBcImxheWVyQ29udGFpbmVyXCIpO1xufVxuXG5jb25zdCBnZXRDbGFzcyA9IGZ1bmN0aW9uKHNpZGVPckNvbG9yKSB7XG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcbiAgICBpZiAodG9vbHRpcENsYXNzKSByZXR1cm4gdG9vbHRpcENsYXNzO1xuICAgIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XG59O1xuXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9cHhgO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxqUXVlcnkpfSBub2RlIC0gRE9NIG5vZGUgdG8gbW9uaXRvciBhbmQgc2hvdyB0aGUgdG9vbHRpcCBvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1ibGFja10gLSBjb3JyZWxhdGVzIHRvIHRoZSBkaXNjb3JkIHN0eWxpbmcvY29sb3JzIChibGFjaywgYnJhbmQsIGdyZWVuLCBncmV5LCByZWQsIHllbGxvdylcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGJlIGRpc2FibGVkIGZyb20gc2hvd2luZyBvbiBob3ZlclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0YWNoRXZlbnRzPXRydWVdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgbGlzdGVuIHRvIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxuXHQgKi9cblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZSwgYXR0YWNoRXZlbnRzID0gdHJ1ZX0gPSBvcHRpb25zO1xuXHRcdHRoaXMubm9kZSA9IG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHRoaXMuc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xuXHRcdFxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcblxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XG5cblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxuXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XG5cblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xuXHRcdHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy50b29sdGlwRWxlbWVudCk7XG5cblx0XHRpZihhdHRhY2hFdmVudHMpe1xuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblx0XHRcdFx0dGhpcy5zaG93KCk7XG5cdFxuXHRcdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcblx0XHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKHRoaXMubm9kZSkgPiAtMTtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xuXHRcdFx0XHRcdFx0aWYgKGRpcmVjdE1hdGNoIHx8IHBhcmVudE1hdGNoKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcblx0XHRcdFx0b2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XG5cdFx0XHR9KTtcblx0XG5cdFx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmhpZGUoKTtcblx0XHRcdH0pO1xuXHRcdH1cbiAgICB9XG5cbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgXG5cdFx0cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cykrXCIgfiAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyKSk7IFxuXHR9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBiZWxvdyB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xuICAgIGdldCBjYW5TaG93TGVmdCgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoID49IDA7IH1cbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cblxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cblx0aGlkZSgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcblx0fVxuXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXG5cdHNob3coKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xuXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcblx0XHRcdGVsc2UgdGhpcy5zaG93QmVsb3coKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zaWRlID09IFwiYm90dG9tXCIpIHtcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcblx0XHRcdGlmICh0aGlzLmNhblNob3dMZWZ0IHx8ICghdGhpcy5jYW5TaG93TGVmdCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93TGVmdCgpO1xuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcblx0XHRcdGVsc2UgdGhpcy5zaG93TGVmdCgpO1xuXHRcdH1cblx0fVxuXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXG5cdHNob3dBYm92ZSgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJ0b3BcIikpO1xuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xuXHR9XG5cbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cblx0c2hvd0JlbG93KCkge1xuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XG5cdH1cblxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBsZWZ0IG9mIHRoZSBub2RlLiAqL1xuXHRzaG93TGVmdCgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLSAxMCkpO1xuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xuXHR9XG5cbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXG5cdHNob3dSaWdodCgpIHtcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJyaWdodFwiKSk7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcblx0fVxuXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcbiAgICAgICAgY29uc3Qgbm9kZWNlbnRlciA9IHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKHRoaXMubm9kZS5vZmZzZXRXaWR0aCAvIDIpO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xuXHR9XG5cblx0Y2VudGVyVmVydGljYWxseSgpIHtcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMikpKTtcblx0fVxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XG5pbXBvcnQgVG9vbHRpcCBmcm9tIFwiLi90b29sdGlwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XG4gICAgICAgIHRoaXMubm9kZSA9IEJEVjIucmVhY3REb20uZmluZERPTU5vZGUodGhpcyk7XG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRvb2x0aXA7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgXCJzdmdcIixcbiAgICAgICAgICAgIHt4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAxMiAxMlwiLCBzdHlsZToge3dpZHRoOiBcIjE4cHhcIiwgaGVpZ2h0OiBcIjE4cHhcIn19LFxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFwiZ1wiLFxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmFja2dyb3VuZFwiLCBmaWxsOiBcIm5vbmVcIiwgZmlsbFJ1bGU6IFwiZXZlbm9kZFwifSxcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7Y2xhc3NOYW1lOiBcImZpbGxcIiwgZmlsbDogXCIjZGNkZGRlXCIsIGQ6IFwiTTkuNSAzLjIwNUw4Ljc5NSAyLjUgNiA1LjI5NSAzLjIwNSAyLjVsLS43MDUuNzA1TDUuMjk1IDYgMi41IDguNzk1bC43MDUuNzA1TDYgNi43MDUgOC43OTUgOS41bC43MDUtLjcwNUw2LjcwNSA2XCJ9KVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG9cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlY3Ryb25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXZlbnRzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vZHVsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7Il0sInNvdXJjZVJvb3QiOiIifQ==