1
0
mirror of https://github.com/Lightcord/Lightcord.git synced 2025-04-12 00:55:40 +02:00
2020-06-11 18:39:32 +02:00

11593 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, LCChanelog, bbdChangelog, settings, defaultCookie, settingsCookie, settingsRPC, defaultRPC, bdpluginErrors, bdthemeErrors, bdConfig, bdthemes, bdplugins, pluginCookie, themeCookie */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minimumDiscordVersion", function() { return minimumDiscordVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "currentDiscordVersion", function() { return currentDiscordVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minSupportedVersion", function() { return minSupportedVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdVersion", function() { return bbdVersion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LCChanelog", function() { return LCChanelog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bbdChangelog", function() { return bbdChangelog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return settings; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultCookie", function() { return defaultCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsCookie", function() { return settingsCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "settingsRPC", function() { return settingsRPC; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultRPC", function() { return defaultRPC; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdpluginErrors", function() { return bdpluginErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemeErrors", function() { return bdthemeErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdConfig", function() { return bdConfig; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdthemes", function() { return bdthemes; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bdplugins", function() { return bdplugins; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluginCookie", function() { return pluginCookie; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "themeCookie", function() { return themeCookie; });
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/webpackModules */ "./src/modules/webpackModules.js");
// var settingsPanel, voiceMode, pluginModule, themeModule, dMode, publicServersModule, mainCore, BDV2;
const minimumDiscordVersion = "0.0.306";
const currentDiscordVersion = window.DiscordNative && window.DiscordNative.remoteApp && window.DiscordNative.remoteApp.getVersion && window.DiscordNative.remoteApp.getVersion() || "0.0.306";
const minSupportedVersion = "0.3.0";
const bbdVersion = "0.3.4";
const LCChanelog = {
description: "Lightcord's changelog",
changes: [{
title: "What's New?",
items: ["Lightcord is now available !", "We removed emotes. That's sad for people who were actually using it, but it was leading to more loading time and some basic words were emote."]
}],
image: "https://i.imgur.com/sfNhqwP.png",
title: "Lightcord",
subtitle: "v" + electron__WEBPACK_IMPORTED_MODULE_0__["remote"].getGlobal("BuildInfo").version,
footer: function () {
const TextElement = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Text");
const ModalStack = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("push", "update", "pop", "popWithKey");
if (!TextElement || !ModalStack) return null;
const Anchor = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.displayName == "Anchor");
const AnchorClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByProps("anchorUnderlineOnHover") || {
anchor: "anchor-3Z-8Bb",
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
};
const joinSupportServer = click => {
click.preventDefault();
click.stopPropagation();
ModalStack.pop();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].joinLC();
};
const supportLink = Anchor ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(Anchor, {
onClick: joinSupportServer
}, "Join our Discord Server.") : _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement("a", {
className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,
onClick: joinSupportServer
}, "Join our Discord Server.");
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].React.createElement(TextElement, {
size: TextElement.Sizes.SMALL,
color: TextElement.Colors.STANDARD
}, "Need support? ", supportLink);
}()
};
const bbdChangelog = {
description: "BBD's changelog.",
changes: [{
title: "What's New?",
items: ["**Lightcord** is now using BandagedBD. That means all plugins you were using can be used too !", "**Window Transparency** changes were made to more compatible with external window managers and addons like Glasscord.", "Initialization sequence has once again been changed slightly to hopefully improve loading times."]
}, {
title: "Bug Fixes",
type: "fixed",
items: ["Some fixes related to showing modals in the `BdApi`."]
}]
};
const settings = {
"Custom css live update": {
id: "bda-css-0",
info: "",
implemented: true,
hidden: true,
cat: "core"
},
"Custom css auto udpate": {
id: "bda-css-1",
info: "",
implemented: true,
hidden: true,
cat: "core"
},
"BetterDiscord Blue": {
id: "bda-gs-b",
info: "Replace Discord blue with BD Blue",
implemented: false,
hidden: false,
cat: "core"
},
/* Core */
/* ====== */
"Public Servers": {
id: "bda-gs-1",
info: "Display public servers button",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Minimal Mode": {
id: "bda-gs-2",
info: "Hide elements and reduce the size of elements.",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Voice Mode": {
id: "bda-gs-4",
info: "Only show voice chat",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Hide Channels": {
id: "bda-gs-3",
info: "Hide channels in minimal mode",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Dark Mode": {
id: "bda-gs-5",
info: "Make certain elements dark by default(wip)",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Voice Disconnect": {
id: "bda-dc-0",
info: "Disconnect from voice server when closing Discord",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"24 Hour Timestamps": {
id: "bda-gs-6",
info: "Replace 12hr timestamps with proper ones",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Colored Text": {
id: "bda-gs-7",
info: "Make text color the same as role color",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
"Normalize Classes": {
id: "fork-ps-4",
info: "Adds stable classes to elements to help themes. (e.g. adds .da-channels to .channels-Ie2l6A)",
implemented: true,
hidden: false,
cat: "core",
category: "modules"
},
/* Content */
"Content Error Modal": {
id: "fork-ps-1",
info: "Shows a modal with plugin/theme errors",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Show Toasts": {
id: "fork-ps-2",
info: "Shows a small notification for important information",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Scroll To Settings": {
id: "fork-ps-3",
info: "Auto-scrolls to a plugin's settings when the button is clicked (only if out of view)",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
"Automatic Loading": {
id: "fork-ps-5",
info: "Automatically loads, reloads, and unloads plugins and themes",
implemented: true,
hidden: false,
cat: "core",
category: "content manager"
},
/* Developer */
"Developer Mode": {
id: "bda-gs-8",
info: "Developer Mode Toggle",
implemented: true,
hidden: false,
cat: "core",
category: "developer settings"
},
"Copy Selector": {
id: "fork-dm-1",
info: "Adds a \"Copy Selector\" option to context menus when developer mode is active",
implemented: true,
hidden: false,
cat: "core",
category: "developer settings"
},
"React DevTools": {
id: "reactDevTools",
info: "Adds react developer tools to the devtools. Must be installed in Google Chrome on your pc.",
implemented: true,
hidden: true,
cat: "core",
category: "developer settings"
},
/** Lightcord */
"Disable BetterDiscord": {
id: "bd-disable",
info: "Disable Betterdiscord (plugins, themes, etc).",
implemented: false,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Blur Personnal Informations": {
id: "lightcord-6",
info: "Blur sensitive informations like email, payment infos and more.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Calling Ring Beat": {
id: "lightcord-2",
info: "Enable Discord's special calling beat.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Developer Options": {
id: "lightcord-1",
info: "Enable Discord's Internal Developer Options. This allow the \"Experiments\" tab and the \"Developer Options\" tab. (must close and reopen settings)",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Lightcord"
},
"Ad Block": {
id: "lightcord-4",
info: "Block any BOT that dm 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"
},
/** Lightcord Window */
"Always-on-Top": {
id: "lightcord-3",
info: "Enable window's Always-on-Top mode, where Lightcord stays on top of other applications.",
implemented: true,
hidden: false,
cat: "lightcord",
category: "Window"
},
/** RichPresence */
"Enable": {
id: "lightcord-presence-1",
info: "Enable RichPresence below.",
implemented: true,
hidden: false,
cat: "status"
}
};
const defaultCookie = {
"bda-gs-1": true,
"bda-gs-2": false,
"bda-gs-3": false,
"bda-gs-4": false,
"bda-gs-5": true,
"bda-gs-6": false,
"bda-gs-7": false,
"bda-gs-8": true,
"bda-es-0": true,
"bda-es-1": true,
"bda-es-2": true,
"bda-es-4": false,
"bda-es-6": true,
"bda-es-7": true,
"bda-gs-b": false,
"bda-es-8": true,
"bda-dc-0": false,
"bda-css-0": false,
"bda-css-1": false,
"bda-es-9": true,
"fork-dm-1": false,
"fork-ps-1": true,
"fork-ps-2": true,
"fork-ps-3": true,
"fork-ps-4": true,
"fork-ps-5": true,
"fork-es-2": false,
"fork-es-3": true,
"fork-wp-1": false,
"fork-wp-2": false,
"fork-beta": true,
"reactDevTools": false,
"lightcord-1": false,
"lightcord-2": true,
"lightcord-presence-1": false,
"lightcord-3": false,
"lightcord-4": false,
"lightcord-5": true,
"lightcord-6": true
};
const settingsCookie = {};
const settingsRPC = {};
const defaultRPC = {
"name": "Lightcord",
"application_id": "711416957718757418",
"state": "Lightcord Client",
"details": "Browsing Discord",
"timestamps.start": Date.now(),
"assets.small": null,
"assets.large": "712323821037682791"
};
const bdpluginErrors = [];
const bdthemeErrors = []; // define for backwards compatibility
const bdConfig = Object.create(BetterDiscordConfig);
const bdthemes = {};
const bdplugins = {};
const pluginCookie = {};
const themeCookie = {};
/***/ }),
/***/ "./src/index.js":
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CoreWrapper; });
/* harmony import */ var _localStorageFix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localStorageFix */ "./src/localStorageFix.js");
/* harmony import */ var _loadingIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loadingIcon */ "./src/loadingIcon.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./0globals */ "./src/0globals.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/bdApi */ "./src/modules/bdApi.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _modules_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/core */ "./src/modules/core.js");
Object(_localStorageFix__WEBPACK_IMPORTED_MODULE_0__["default"])();
Object(_loadingIcon__WEBPACK_IMPORTED_MODULE_1__["default"])();
const deprecateGlobal = (key, value) => {
// value = typeof(value) !== "object" ? value : new Proxy(value, {
// get: function(obj, mod) {
// if (!obj.hasOwnProperty(mod)) return undefined;
// return obj[mod];
// },
// set: function(obj, mod) {
// if (obj.hasOwnProperty(mod)) return Utils.err("Deprecated Global", "Trying to overwrite deprecated BD globals");
// }
// });
Object.defineProperty(window, key, {
get() {
_modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"].warn("Deprecated Global", `"${key}" will be removed in future versions. Please only use BdApi.`);
return value;
}
});
};
const globalKeys = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_2__);
for (const key of globalKeys) deprecateGlobal(key, _0globals__WEBPACK_IMPORTED_MODULE_2__[key]);
deprecateGlobal("BDV2", _modules_v2__WEBPACK_IMPORTED_MODULE_4__["default"]);
deprecateGlobal("pluginModule", _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
deprecateGlobal("themeModule", _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
deprecateGlobal("Utils", _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"]);
deprecateGlobal("BDEvents", _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__["default"]);
deprecateGlobal("settingsPanel", _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__["default"]);
deprecateGlobal("DataStore", _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__["default"]);
deprecateGlobal("ContentManager", _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"]);
deprecateGlobal("ClassNormalizer", _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__["default"]);
window.BdApi = _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__["default"];
deprecateGlobal("mainCore", _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"]);
class CoreWrapper {
constructor(bdConfig) {
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
}
init() {
// deprecateGlobal("mainCore", this.mainCore);
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
}
} // function patchModuleLoad() {
// const namespace = "betterdiscord";
// const prefix = `${namespace}/`;
// const Module = require("module");
// const load = Module._load;
// // const resolveFilename = Module._resolveFilename;
// Module._load = function(request) {
// if (request === namespace || request.startsWith(prefix)) {
// const requested = request.substr(prefix.length);
// if (requested == "api") return BdApi;
// }
// return load.apply(this, arguments);
// };
// // Module._resolveFilename = function (request, parent, isMain) {
// // if (request === "betterdiscord" || request.startsWith("betterdiscord/")) {
// // const contentPath = PluginManager.getPluginPathByModule(parent);
// // if (contentPath) return request;
// // }
// // return resolveFilename.apply(this, arguments);
// // };
// return function() {
// Module._load = load;
// };
// }
// patchModuleLoad();
// var settingsPanel, voiceMode,, dMode, publicServersModule;
// var bdConfig = null;
__webpack_require__(/*! request */ "request"); // just in cache so plugin can require it too
/***/ }),
/***/ "./src/loadingIcon.js":
/*!****************************!*\
!*** ./src/loadingIcon.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (() => {
const v2Loader = document.createElement("div");
v2Loader.className = "bd-loaderv2";
v2Loader.title = "BandagedBD is loading...";
document.body.appendChild(v2Loader);
});
/***/ }),
/***/ "./src/localStorageFix.js":
/*!********************************!*\
!*** ./src/localStorageFix.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony default export */ __webpack_exports__["default"] = (function () {
const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get;
Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", {
get: function () {
const contentWindow = Reflect.apply(contentWindowGetter, this, arguments);
return new Proxy(contentWindow, {
getOwnPropertyDescriptor: function (obj, prop) {
if (prop === "localStorage") return undefined;
return Object.getOwnPropertyDescriptor(obj, prop);
},
get: function (obj, prop) {
if (prop === "localStorage") return null;
const val = obj[prop];
if (typeof val === "function") return val.bind(obj);
return val;
}
});
}
}); // Prevent interception by patching Reflect.apply and Function.prototype.bind
Object.defineProperty(Reflect, "apply", {
value: Reflect.apply,
writable: false,
configurable: false
});
Object.defineProperty(Function.prototype, "bind", {
value: Function.prototype.bind,
writable: false,
configurable: false
});
const oOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
const url = arguments[1];
if (url.toLowerCase().includes("api/webhooks")) return null;
return Reflect.apply(oOpen, this, arguments);
};
});
/***/ }),
/***/ "./src/modules/24hour.js":
/*!*******************************!*\
!*** ./src/modules/24hour.js ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony default export */ __webpack_exports__["default"] = (new class TFHour {
inject24Hour() {
if (this.cancel24Hour) return;
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
const convert = data => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return;
const matched = data.returnValue.match(twelveHour);
if (!matched || matched.length !== 4) return;
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
};
const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", {
after: convert
}); // Called in Cozy mode
const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", {
after: convert
}); // Called in Compact mode
this.cancel24Hour = () => {
cancelCozy();
cancelCompact();
}; // Cancel both
}
remove24Hour() {
if (this.cancel24Hour) this.cancel24Hour();
}
}());
/***/ }),
/***/ "./src/modules/AntiAdDM.js":
/*!*********************************!*\
!*** ./src/modules/AntiAdDM.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
const dispatcher = window.Lightcord.DiscordModules.dispatcher;
const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default;
let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
const blocked = {};
let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0];
function getCurrentUser() {
if (userModule) return userModule.default.getCurrentUser();
return null;
}
/* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM {
constructor() {
this.antiDM = this.antiDM.bind(this);
this.enabled = false;
}
enable() {
if (this.enabled) return;
this.enabled = true;
dispatcher.subscribe("MESSAGE_CREATE", this.antiDM);
}
disable() {
if (!this.enabled) return;
this.enabled = false;
dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM);
}
antiDM(ev) {
if (!ev.message.author.bot) return;
if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return;
const channel = ChannelModule.getChannel(ev.message.channel_id);
if (!channel) return; // might be broken
if (channel.type !== 1) return;
if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again.
if (scanMessage(ev.message)) {
blocked[ev.message.author.id] = true;
_utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, {
"type": "warning"
});
if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
relationShipModule.default.addRelationship(ev.message.author.id, {
location: "ContextMenu"
}, 2);
if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
DMModule.default.closePrivateChannel(channel.id, false);
}
}
}());
function scanMessage(message) {
if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true;
if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true;
return false;
}
function EmbedsContains(message, search) {
let embeds = message.embeds;
if (embeds.length === 0) return false;
return embeds.map(embed => {
if (embed.type !== "rich") return false;
if ((embed.title || "").includes(search)) return true;
if ((embed.description || "").includes(search)) return true;
if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true;
if (embed.fields.map(e => {
return e.value.includes(search) || e.name.includes(search);
}).includes(true)) return true;
return false;
}).includes(true);
}
/***/ }),
/***/ "./src/modules/CustomRichPresence.js":
/*!*******************************************!*\
!*** ./src/modules/CustomRichPresence.js ***!
\*******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default;
const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes;
const socketId = "lightcord-spoof-socket";
const pid = process.pid;
/* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence {
constructor() {
this.enabled = false;
this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"];
}
get formatedGame() {
if (!this.game) return null;
if (this.enabled === false) return null;
let game = {
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name,
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id,
details: this.game.details || undefined,
state: this.game.state || undefined,
timestamps: this.game["timestamps.start"] ? {
start: this.game["timestamps.start"]
} : undefined,
assets: this.game["assets.large"] ? {
large_image: this.game["assets.large"],
small_image: this.game["assets.small"] || undefined
} : undefined
};
return game;
}
sendGame() {
dispatcher.dispatch({
type: ActionTypes.LOCAL_ACTIVITY_UPDATE,
socketId,
pid,
activity: this.formatedGame
});
}
enable() {
if (this.enabled) return;
this.enabled = true;
console.log("Enabling custom RichPresence");
this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]));
this.sendGame();
}
disable() {
if (!this.enabled) return;
this.enabled = false;
console.log("Disabling custom RichPresence");
this.sendGame();
}
async fetchAssets(applicationId) {
let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId);
if (assets.undefined && typeof assets.undefined === "number") {
throw new Error("Unknown Application");
}
return assets;
}
set(activity) {
this.game = activity;
this.sendGame();
}
}());
/***/ }),
/***/ "./src/modules/bdApi.js":
/*!******************************!*\
!*** ./src/modules/bdApi.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
const BdApi = {
get React() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React;
},
get ReactDOM() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom;
},
get ReactComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent;
},
get WindowConfigFile() {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile;
},
get settings() {
return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"];
},
get emotes() {
return {};
},
// deprecated, deleted all emotes from betterdiscord.
get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
},
get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
};
BdApi.getAllWindowPreferences = function () {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences();
};
BdApi.getWindowPreference = function (key) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key);
};
BdApi.setWindowPreference = function (key, value) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value);
}; //Inject CSS to document head
//id = id of element
//css = custom css
BdApi.injectCSS = function (id, css) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css);
}; //Clear css/remove any element
//id = id of element
BdApi.clearCSS = function (id) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
}; //Inject CSS to document head
//id = id of element
//css = custom css
BdApi.linkJS = function (id, url) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url);
}; //Clear css/remove any element
//id = id of element
BdApi.unlinkJS = function (id) {
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
}; //Get another plugin
//name = name of plugin
BdApi.getPlugin = function (name) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) {
return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin;
}
return null;
}; //Get BetterDiscord Core
BdApi.getCore = function () {
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`);
return _core__WEBPACK_IMPORTED_MODULE_1__["default"];
};
/**
* Shows a generic but very customizable modal.
* @param {string} title - title of the modal
* @param {string} content - a string of text to display in the modal
*/
BdApi.alert = function (title, content) {
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, {
cancelText: null
});
};
/**
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
* @param {string} title - title of the modal
* @param {(string|ReactElement|Array<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);
/***/ }),
/***/ "./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 {
dispatch(eventName, ...args) {
this.emit(eventName, ...args);
}
off(eventName, eventAction) {
this.removeListener(eventName, eventAction);
}
}());
/***/ }),
/***/ "./src/modules/blurPrivate.js":
/*!************************************!*\
!*** ./src/modules/blurPrivate.js ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/**
* Credits to @hellbound1337 on github for the css
*/
let selectors;
const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa;
function getSelectors() {
let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0];
if (!standardSidebarView) return null;
let defaultClassName = removeDa(standardSidebarView.standardSidebarView);
let selects = [];
selects.push(`#app-mount .${defaultClassName} .payment-info .${removeDa(BDModules.get(e => e.description && typeof e.description === "string" && e.description.includes("formText"))[0].description)}`);
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.paymentSourceRow)[0].paymentSourceRow)} .${removeDa(BDModules.get(e => e.subText && e.descriptionWrapper)[0].subText)}`);
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.userSettingsAccount)[0].userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
return selects;
}
/* harmony default export */ __webpack_exports__["default"] = (new class BlurPrivate {
constructor() {
this.enabled = false;
}
enable() {
if (this.enabled) return;
this.enabled = true;
selectors = selectors || getSelectors();
if (!selectors) console.error(new Error("Couldn't find selectors to blur personnal informations."));
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("blurPrivate", `
${selectors[0]}, ${selectors[1]}, ${selectors[2]} {
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
filter: blur(4px);
opacity: .8;
}
${selectors[0]}:hover, ${selectors[1]}:hover, ${selectors[2]}:hover {
transition: all 150ms cubic-bezier(.55,.09,.68,.53);
filter: none;
opacity: 1;
}`);
}
disable() {
if (!this.enabled) return;
this.enabled = false;
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate");
}
}());
/***/ }),
/***/ "./src/modules/classNormalizer.js":
/*!****************************************!*\
!*** ./src/modules/classNormalizer.js ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
const normalizedPrefix = "da";
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
/* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer {
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: 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 _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");
const __non_webpack_require__ = window.require;
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 = /^\\@/;
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
constructor() {
this.timeCache = {};
this.watchers = {};
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/")));
}
watchContent(contentType) {
if (this.watchers[contentType]) return;
const isPlugin = contentType === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
this.watchers[contentType] = fs.watch(baseFolder, {
persistent: false
}, async (eventType, filename) => {
if (!eventType || !filename || !filename.endsWith(fileEnding)) return;
await new Promise(r => setTimeout(r, 50));
try {
fs.statSync(path.resolve(baseFolder, filename));
} catch (err) {
if (err.code !== "ENOENT") return;
delete this.timeCache[filename];
if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename);
return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename);
}
if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;
const stats = fs.statSync(path.resolve(baseFolder, filename));
if (!stats || !stats.mtime || !stats.mtime.getTime()) return;
if (typeof stats.mtime.getTime() !== "number") return;
if (this.timeCache[filename] == stats.mtime.getTime()) return;
this.timeCache[filename] = stats.mtime.getTime();
if (eventType == "rename") {
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename);
}
if (eventType == "change") {
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename);
}
});
}
unwatchContent(contentType) {
if (!this.watchers[contentType]) return;
this.watchers[contentType].close();
delete this.watchers[contentType];
}
extractMeta(content) {
const firstLine = content.split("\n")[0];
const hasOldMeta = firstLine.includes("//META");
if (hasOldMeta) return this.parseOldMeta(content);
const hasNewMeta = firstLine.includes("/**");
if (hasNewMeta) return this.parseNewMeta(content);
throw new MetaError("META was not found.");
}
parseOldMeta(content) {
const meta = content.split("\n")[0];
const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//"));
if (meta.indexOf("META") < 0) throw new MetaError("META was not found.");
const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta);
if (!parsed) throw new MetaError("META could not be parsed.");
if (!parsed.name) throw new MetaError("META missing name data.");
parsed.format = "json";
return parsed;
}
parseNewMeta(content) {
const block = content.split("/**", 2)[1].split("*/", 1)[0];
const out = {};
let field = "";
let accum = "";
for (const line of block.split(splitRegex)) {
if (line.length === 0) continue;
if (line.charAt(0) === "@" && line.charAt(1) !== " ") {
out[field] = accum;
const l = line.indexOf(" ");
field = line.substr(1, l - 1);
accum = line.substr(l + 1);
} else {
accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@");
}
}
out[field] = accum.trim();
delete out[""];
out.format = "jsdoc";
return out;
}
getContentRequire(type) {
const isPlugin = type === "plugin";
const self = this;
const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;
return function (module, filename) {
const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;
const possiblePath = path.resolve(baseFolder, path.basename(filename));
if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);
let content = fs.readFileSync(filename, "utf8");
content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content);
const stats = fs.statSync(filename);
const meta = self.extractMeta(content);
meta.filename = path.basename(filename);
meta.added = stats.atimeMs;
meta.modified = stats.mtimeMs;
meta.size = stats.size;
if (!isPlugin) {
meta.css = content;
if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n");
content = `module.exports = ${JSON.stringify(meta)};`;
}
if (isPlugin) {
module._compile(content, module.filename);
const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports);
if (didExport) {
meta.type = module.exports;
module.exports = meta;
content = "";
} else {
// Utils.warn("Module Not Exported", `${meta.name}, please start setting module.exports`);
content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`;
}
}
module._compile(content, filename);
};
}
makePlaceholderPlugin(data) {
return {
plugin: {
start: () => {},
getName: () => {
return data.name || data.filename;
},
getAuthor: () => {
return "???";
},
getDescription: () => {
return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates.";
},
getVersion: () => {
return "???";
}
},
name: data.name || data.filename,
filename: data.filename,
source: data.source ? data.source : "",
website: data.website ? data.website : ""
};
}
async loadContent(filename, type) {
if (typeof filename === "undefined" || typeof type === "undefined") return;
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
__non_webpack_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 = __non_webpack_require__(path.resolve(baseFolder, filename));
if (!content.name) return {
name: filename,
file: filename,
message: "Cannot escape the ID.",
error: {
message: "Cannot read property 'replace' of undefined",
stack: "Cannot read property 'replace' of undefined"
}
};
content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name);
if (isPlugin) {
if (!content.type) return;
try {
content.plugin = new content.type();
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()];
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()] = content;
} catch (error) {
return {
name: filename,
file: filename,
message: "Could not be constructed.",
error: {
message: error.message,
stack: error.stack
}
};
}
} else {
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name];
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name] = content;
}
}
unloadContent(filename, type) {
if (typeof filename === "undefined" || typeof type === "undefined") return;
const isPlugin = type === "plugin";
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
try {
delete __non_webpack_require__.cache[__non_webpack_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 {
__non_webpack_require__.cache[__non_webpack_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) {
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");
}
}());
/***/ }),
/***/ "./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__);
function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));
// this.init();
}
Core.prototype.setConfig = function (config) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
};
Core.prototype.init = async function () {
if (!Array.prototype.flat) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding.");
return;
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").<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;
}
const latestLocalVersion = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].updater ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].updater.LatestVersion : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].latestVersion;
if (latestLocalVersion > _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showConfirmationModal("Update Available", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, "You can either update and restart now, or later."], {
confirmText: "Update Now",
cancelText: "Maybe Later",
onConfirm: async () => {
const onUpdateFailed = () => {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Could Not Update", `Unable to update automatically, please download the installer and reinstall normally.<br /><br /><a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>Download Installer</a>`);
};
try {
const didUpdate = await this.updateInjector();
if (!didUpdate) return onUpdateFailed();
const app = __webpack_require__(/*! electron */ "electron").remote.app;
app.relaunch();
app.exit();
} catch (err) {
onUpdateFailed();
}
}
});
}
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings");
this.initSettings();
await this.checkForGuilds();
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings");
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins");
await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes");
await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes();
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss")));
window.addEventListener("beforeunload", function () {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click();
});
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon");
if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer");
this.initObserver(); // Show loading errors
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors");
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({
plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"],
themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"]
});
}
const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]);
}
const emojiModule = _emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"];
_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.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.checkForGuilds = function () {
let timesChecked = 0;
return new Promise(resolve => {
const checkForGuilds = function () {
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.wrapper.split(" ")[0];
if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++;
const guild = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.listItem.split(" ")[0];
const blob = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.blobContainer.split(" ")[0];
if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);
setTimeout(checkForGuilds, 100);
};
if (document.readyState != "loading") setTimeout(checkForGuilds, 100);
document.addEventListener("DOMContentLoaded", () => {
setTimeout(checkForGuilds, 100);
});
});
};
Core.prototype.injectExternals = async function () {
await _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript("ace-script", "https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js");
if (window.require.original) window.require = window.require.original;
};
Core.prototype.initSettings = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize();
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]);
}
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]);
}
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
} else {
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].loadSettings();
for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] == undefined) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"][setting];
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
}
}
}
};
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];
let [classNameLayer, classNameSocialLinks] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer, BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks];
if (node.classList.contains(classNameLayer)) {
if (node.getElementsByClassName("guild-settings-base-section").length) node.setAttribute("layer-id", "server-settings");
if (node.getElementsByClassName(classNameSocialLinks).length) {
node.setAttribute("layer-id", "user-settings");
node.setAttribute("id", "user-settings");
if (!document.getElementById("bd-settings-sidebar")) _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar();
}
}
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;
returnValue.props.className += " bd-guild";
if (guildData.unread) returnValue.props.className += " bd-unread";
if (guildData.selected) returnValue.props.className += " bd-selected";
if (guildData.audio) returnValue.props.className += " bd-audio";
if (guildData.video) returnValue.props.className += " bd-video";
if (guildData.badge) returnValue.props.className += " bd-badge";
if (guildData.animatable) returnValue.props.className += " bd-animatable";
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 => {
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("div", {
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;
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: "32px",
className: "bd-logo"
}))));
}
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
id: "badges-" + id
}));
applyBadges(id, user, false);
}
});
};
Core.prototype.updateInjector = async function () {
const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath;
if (!injectionPath) return false;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const rmrf = __webpack_require__(/*! rimraf */ "rimraf");
const yauzl = __webpack_require__(/*! yauzl */ "yauzl");
const mkdirp = __webpack_require__(/*! mkdirp */ "mkdirp");
const request =
/*require("request");*/
null;
const parentPath = path.resolve(injectionPath, "..");
const folderName = path.basename(injectionPath);
const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip";
const savedZip = path.resolve(parentPath, "injector.zip");
const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); // Download the injector zip file
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Downloading " + zipLink);
let success = await new Promise(resolve => {
request.get({
url: zipLink,
encoding: null
}, async (error, response, body) => {
if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy
const alreadyExists = await new Promise(res => fs.exists(savedZip, res));
if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res));
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Writing " + savedZip);
fs.writeFile(savedZip, body, err => resolve(!err));
});
});
if (!success) return success; // Check and delete rename extraction
const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res));
if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file
const zipfile = await new Promise(r => yauzl.open(savedZip, {
lazyEntries: true
}, (err, zip) => r(zip)));
zipfile.on("entry", function (entry) {
// Skip directories, they are handled with mkdirp
if (entry.fileName.endsWith("/")) return zipfile.readEntry();
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories
const fullPath = path.resolve(parentPath, entry.fileName);
mkdirp.sync(path.dirname(fullPath));
zipfile.openReadStream(entry, function (err, readStream) {
if (err) return success = false;
readStream.on("end", function () {
zipfile.readEntry();
}); // Go to next file after this
readStream.pipe(fs.createWriteStream(fullPath));
});
});
zipfile.readEntry(); // Start reading
// Wait for the final file to finish
await new Promise(resolve => zipfile.once("end", resolve)); // Save a backup in case something goes wrong during final step
const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`);
await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);
success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));
if (!success) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Failed to rename the final directory");
return success;
} // If rename had issues, delete what we tried to rename and restore backup
if (!success) {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Something went wrong... restoring backups.");
await new Promise(resolve => rmrf(extractedFolder, resolve));
await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve));
return success;
} // If we've gotten to this point, everything should have gone smoothly.
// Cleanup the backup folder then remove the zip
await new Promise(resolve => rmrf(backupFolder, resolve));
await new Promise(resolve => fs.unlink(savedZip, resolve));
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Injector Updated!");
return success;
};
/* harmony default export */ __webpack_exports__["default"] = (new Core());
/***/ }),
/***/ "./src/modules/dataStore.js":
/*!**********************************!*\
!*** ./src/modules/dataStore.js ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
const __non_webpack_require__ = window.require;
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable";
/* harmony default export */ __webpack_exports__["default"] = (new class DataStore {
constructor() {
this.data = {
settings: {
stable: {},
canary: {},
ptb: {}
}
};
this.pluginData = {};
}
initialize() {
try {
if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
const data = JSON.parse(fs.readFileSync(this.BDFile, "binary"));
if (data.hasOwnProperty("settings")) this.data = data;
if (!fs.existsSync(this.settingsFile)) return;
let settings = __non_webpack_require__(this.settingsFile);
fs.unlinkSync(this.settingsFile);
if (settings.hasOwnProperty("settings")) settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, {
[releaseChannel]: settings
});else settings = Object.assign({
stable: {},
canary: {},
ptb: {}
}, settings);
this.setBDData("settings", settings);
} catch (err) {
console.error(err);
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Corrupt Storage", "The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.");
}
}
get injectionPath() {
return this._injectionPath = null;
if (this._injectionPath) return this._injectionPath;
const electron = __webpack_require__(/*! electron */ "electron").remote.app;
const base = electron.getAppPath();
const roamingBase = electron.getPath("userData");
const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector");
const location = path.resolve(base, "..", "app");
const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null;
if (!realLocation) return this._injectionPath = null;
return this._injectionPath = realLocation;
}
get configFile() {
return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json"));
}
get BDFile() {
return this._BDFile || (this._BDFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdstorage.json"));
}
get settingsFile() {
return this._settingsFile || (this._settingsFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdsettings.json"));
}
getPluginFile(pluginName) {
return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_2__["default"].pluginsFolder, pluginName + ".config.json");
}
getSettingGroup(key) {
return this.data.settings[releaseChannel][key] || null;
}
setSettingGroup(key, data) {
this.data.settings[releaseChannel][key] = data;
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
}
getBDData(key) {
return this.data[key] || "";
}
setBDData(key, value) {
this.data[key] = value;
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
}
getPluginData(pluginName, key) {
if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key];
if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;
this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));
return this.pluginData[pluginName][key];
}
setPluginData(pluginName, key, value) {
if (value === undefined) return;
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
this.pluginData[pluginName][key] = value;
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
}
deletePluginData(pluginName, key) {
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
delete this.pluginData[pluginName][key];
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
}
}());
/***/ }),
/***/ "./src/modules/devMode.js":
/*!********************************!*\
!*** ./src/modules/devMode.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony 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 [classNameLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0].layer, BDModules.get(e => e.contextMenu)[0]];
function attach() {
let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + classItems.contextMenu.split(" ")[0]);
if (!cm) {
const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount");
const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classNameLayer}">`);
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.contextMenu} bd-context-menu"></div>`);
cmWrap.append(cm);
container.append(cmWrap);
cmWrap.style.top = e.clientY + "px";
cmWrap.style.left = e.clientX + "px";
cmWrap.style.zIndex = "1002";
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 = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + classNameLayer.split(" ")[0]);
const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.itemGroup}">`);
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.clickable}">`);
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);
cm.style.display = "none";
});
cmg.append(cmi);
cm.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() + (el.className || "").split(" ").map(e => "." + e).join("") + ":nth-child(" + c + ")");
}
el = el.parentNode;
}
}
return names.join(" > ");
}
return fullPath(element);
/*
const rules = this.getRules(element);
const latestRule = rules[rules.length - 1];
if (latestRule) return latestRule.selectorText;
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
return `.${Array.from(element.parentElement.classList).join(".")}`;*/
}
getRules(element, css = element.ownerDocument.styleSheets) {
//if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element);
const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp"));
const rules = sheets.map(s => [...(s.cssRules || [])]).flat();
const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*"));
return elementRules;
}
}());
/***/ }),
/***/ "./src/modules/distant.js":
/*!********************************!*\
!*** ./src/modules/distant.js ***!
\********************************/
/*! exports provided: uuidv4, default, Constants, Routes */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; });
/* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx");
/* harmony import */ var _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../svg/LightcordUser */ "./src/svg/LightcordUser.jsx");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-fetch */ "node-fetch");
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
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: {}
};
}
get cache() {
return this._cache;
}
set cache(data) {
if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data;
return this._cache = Object.assign(this._cache, data);
}
async delete() {
BdApi.showToast("Deleting all infos about you on Lightcord Servers...", {
type: "warn"
});
return handleRequest(Routes.delete, "delete").then(async res => {
if (res.status !== 200) {
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {
type: "error"
});
throw new Error(`Couldn't delete all informations: ${res.status + " " + res.statusText + " " + (await res.text())}`);
}
console.info(`Succesfully deleted informations.`);
BdApi.showToast("Succesfully deleted informations", {
type: "success"
});
window.Lightcord.Api.Authorization = null;
return res.json();
}).catch(err => {
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {
type: "error"
});
throw new Error(`Couldn't delete all informations: ${err.stack}`);
});
}
/**
* Get custom badges from the user ID.
* @param {string} user The user ID
* @returns {Promise<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 => {
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();
console.log(responseBody);
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
console.error(err);
users.forEach(data => {
data[1]([]); // resolve no badge fetched
});
});
}, 0);
});
for (let badge of fetchedBadges) {
if (!Constants.badges.find(e => e.id === badge)) continue; // We do not have the Component, skip it.
if (badges.find(e => e.id === badge)) continue; // Already inserted.
badges.push(Constants.badges.find(e => e.id === badge));
}
this.cache = {
badges: Object.assign(this.cache.badges, {
[user]: badges
})
};
setTimeout(() => {
delete this.cache.badges[user];
}, 600000);
resolve(badges);
delete awaitingBadgesPromises[user];
return badges;
}
}());
const handleRequest = function (route, method, data) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) {
console.warn(`Canceling request on ${route} with method ${method} and body`, data, "because of settings.");
return Promise.reject(new LightcordError("The current settings blocked the request."));
}
console.log(`Sending request on ${route} with method ${method} and body`, data);
return node_fetch__WEBPACK_IMPORTED_MODULE_2___default()(`${Constants.SERVER_URL}/api/v1${route}`, {
method,
headers: {
"CLIENT": "Lightcord",
"Authorization": window.Lightcord.Api.Authorization || "None::Anonymous"
},
...(data ? {
body: data
} : {})
});
};
class LightcordError extends Error {
constructor() {
super(...arguments);
this.name = "LightcordError";
}
}
const Constants = {
SERVER_URL: "http://127.0.0.1",
badges: [{
name: "Lightcord User",
id: "01cfa7b0-7cdb-4b0e-8258-9c6a78235c93",
defaultUsers: [],
scopes: ["user"],
component: _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__["default"]
}, {
name: "Lightcord Bug Hunter",
id: "f04698f5-816b-41e3-bd01-92291193d7a5",
defaultUsers: [],
scopes: [],
component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"],
href: "https://github.com/lightcord/lightcord/wiki/badges/bug_hunter"
}]
};
const Routes = {
badges: `/users/badges`,
delete: `/delete`
};
/***/ }),
/***/ "./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) {
if (!baseElement) baseElement = document;
return baseElement.querySelector(selector);
}
/**
* Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided
* `document` is used by default.
* @param {string} selector - Selector to query
* @param {Element} [baseElement] - Element to base the query from
* @returns {Array<Element>} - Array of all found elements
*/
static queryAll(selector, baseElement) {
if (!baseElement) baseElement = document;
return baseElement.querySelectorAll(selector);
}
/**
* Parses a string of HTML and returns the results. If the second parameter is true,
* the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.
* This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.
*
* If the second parameter is false, then the return value will be the list of parsed
* nodes and there were multiple top level nodes, otherwise the single node is returned.
* @param {string} html - HTML to be parsed
* @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`
* @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing
*/
static parseHTML(html, fragment = false) {
const template = document.createElement("template");
template.innerHTML = html;
const node = template.content.cloneNode(true);
if (fragment) return node;
return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];
}
/** Alternate name for {@link module:DOMTools.parseHTML} */
static createElement(html, fragment = false) {
return this.parseHTML(html, fragment);
}
/**
* Takes a string of html and escapes it using the brower's own escaping mechanism.
* @param {String} html - html to be escaped
*/
static escapeHTML(html) {
const textNode = document.createTextNode("");
const spanElement = document.createElement("span");
spanElement.append(textNode);
textNode.nodeValue = html;
return spanElement.innerHTML;
}
/**
* Adds a list of classes from the target element.
* @param {Element} element - Element to edit classes of
* @param {...string} classes - Names of classes to add
* @returns {Element} - `element` to allow for chaining
*/
static addClass(element, ...classes) {
classes = classes.flat().filter(c => c);
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
classes = classes.flat().filter(c => c);
element.classList.add(...classes);
return element;
}
/**
* Removes a list of classes from the target element.
* @param {Element} element - Element to edit classes of
* @param {...string} classes - Names of classes to remove
* @returns {Element} - `element` to allow for chaining
*/
static removeClass(element, ...classes) {
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
classes = classes.flat().filter(c => c);
element.classList.remove(...classes);
return element;
}
/**
* When only one argument is present: Toggle class value;
* i.e., if class exists then remove it and return false, if not, then add it and return true.
* When a second argument is present:
* If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.
* @param {Element} element - Element to edit classes of
* @param {string} classname - Name of class to toggle
* @param {boolean} [indicator] - Optional indicator for if the class should be toggled
* @returns {Element} - `element` to allow for chaining
*/
static toggleClass(element, classname, indicator) {
classname = classname.toString().split(" ").filter(c => c);
if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c));
return element;
}
/**
* Checks if an element has a specific class
* @param {Element} element - Element to edit classes of
* @param {string} classname - Name of class to check
* @returns {boolean} - `true` if the element has the class, `false` otherwise.
*/
static hasClass(element, classname) {
return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c));
}
/**
* Replaces one class with another
* @param {Element} element - Element to edit classes of
* @param {string} oldName - Name of class to replace
* @param {string} newName - New name for the class
* @returns {Element} - `element` to allow for chaining
*/
static replaceClass(element, oldName, newName) {
element.classList.replace(oldName, newName);
return element;
}
/**
* Appends `thisNode` to `thatNode`
* @param {Node} thisNode - Node to be appended to another node
* @param {Node} thatNode - Node for `thisNode` to be appended to
* @returns {Node} - `thisNode` to allow for chaining
*/
static appendTo(thisNode, thatNode) {
if (typeof thatNode == "string") thatNode = this.query(thatNode);
if (!thatNode) return null;
thatNode.append(thisNode);
return thisNode;
}
/**
* Prepends `thisNode` to `thatNode`
* @param {Node} thisNode - Node to be prepended to another node
* @param {Node} thatNode - Node for `thisNode` to be prepended to
* @returns {Node} - `thisNode` to allow for chaining
*/
static prependTo(thisNode, thatNode) {
if (typeof thatNode == "string") thatNode = this.query(thatNode);
if (!thatNode) return null;
thatNode.prepend(thisNode);
return thisNode;
}
/**
* Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.
* @param {Node} thisNode - The node to insert
* @param {Node} targetNode - Node to insert after in the tree
* @returns {Node} - `thisNode` to allow for chaining
*/
static insertAfter(thisNode, targetNode) {
targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);
return thisNode;
}
/**
* Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.
* @param {Node} thisNode - The node to insert
* @param {Node} newNode - Node to insert after in the tree
* @returns {Node} - `thisNode` to allow for chaining
*/
static after(thisNode, newNode) {
thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);
return thisNode;
}
/**
* Gets the next sibling element that matches the selector.
* @param {Element} element - Element to get the next sibling of
* @param {string} [selector=""] - Optional selector
* @returns {Element} - The sibling element
*/
static next(element, selector = "") {
return selector ? element.querySelector("+ " + selector) : element.nextElementSibling;
}
/**
* Gets all subsequent siblings.
* @param {Element} element - Element to get next siblings of
* @returns {NodeList} - The list of siblings
*/
static nextAll(element) {
return element.querySelectorAll("~ *");
}
/**
* Gets the subsequent siblings until an element matches the selector.
* @param {Element} element - Element to get the following siblings of
* @param {string} selector - Selector to stop at
* @returns {Array<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;
}
}
/***/ }),
/***/ "./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 _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 _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
//import DiscordCrypt from "./DiscordCrypt";
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();
}
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_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
if (!this.cancelEmojiRender) {
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
before: data => {
const message = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
if (!message) return;
const content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
if (!content || !content.length) return; // content = DiscordCrypt.decryptContent(content)
/**
* @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());
}
}
});
}
}
disable() {
if (!this.cancelEmoteRender) return;
this.cancelEmoteRender();
this.cancelEmoteRender = null;
}
}());
function D(e, t, n, r, o, i, s, u, l, c) {
if (null == n || 0 === n.length) return null;
var d = n.map(function (e, n) {
return React.createElement(u, Object.assign({
onClick: o,
onHover: r,
selected: t === n,
index: n
}, l(e, n)));
});
return [R(i, s, e, c), d];
}
function R(e, t, n, r) {
var a = n.length > 0 ? e.format({
prefix: r(n)
}) : t;
if (Array.isArray(a)) {
a.unshift(React.createElement("strong", {}, "[Lightcord] "));
} else {
a = "[LIGHTCORD] " + a;
}
return React.createElement(AutocompleteModule.default.Title, {
title: a
}, a);
}
R.displayName = "renderHeader";
let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled;
let isUsable = false;
let hasPatched = false;
function setEmojiUsable(usable) {
isUsable = usable;
if (hasPatched) return;
if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
if (!EmojiFilterModule) return;
if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled;
hasPatched = true;
EmojiFilterModule.default.isEmojiDisabled = function (emoji) {
if (isUsable) {
if (emoji.surrogates || emoji.diversity) return true;
return false;
}
return isEmojiDisabled.call(this, ...arguments);
};
}
/***/ }),
/***/ "./src/modules/pluginCertifier.js":
/*!****************************************!*\
!*** ./src/modules/pluginCertifier.js ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* 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");
const debug = true;
const cache = {};
const cache2 = {};
/*
const PinnedModule = BDModules.get(e => e.default && e.default.getPinnedMessages)[0].default
const ChannelModule = BDModules.get(e => e.default && e.default.getChannelId)[0].default
const fetchMessagesModule = BDModules.get(e => e.default && e.default.fetchMessages)[0].default
const fetchMessagesModule2 = BDModules.get(e => e.default && e.default.fetchMessages)[1].default
const getMessagesModule = BDModules.get(e => e.default && e.default.getMessages)[0].default*/
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
constructor() {}
patch(attachment, id) {
process.nextTick(() => {
processAttachment(attachment, id);
});
}
start() {
/*const dispatcher = window.Lightcord.DiscordModules.dispatcher
const constants = window.Lightcord.DiscordModules.constants
const originalFetchMessages = fetchMessagesModule.fetchMessages
fetchMessagesModule.fetchMessages = function(){
const returnValue = originalFetchMessages.apply(this, arguments)
if(returnValue instanceof Promise){
returnValue
.then(() => {
const ev = getMessagesModule.getMessages(ChannelModule.getChannelId())
process.nextTick(() => {
for(const message of ev._array){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
})
})
}
return returnValue
}
const originalFetchMessages2 = fetchMessagesModule2.fetchMessages
fetchMessagesModule2.fetchMessages = function(){
const returnValue = originalFetchMessages2.apply(this, arguments)
if(returnValue instanceof Promise){
returnValue
.then(() => {
const ev = getMessagesModule.getMessages(ChannelModule.getChannelId())
process.nextTick(() => {
for(const message of ev._array){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
})
})
}
return returnValue
}
const alreadyUsed = {}
const originalGetPinnedMessages = PinnedModule.getPinnedMessages.bind(PinnedModule)
PinnedModule.getPinnedMessages = function(){
const pinned = originalGetPinnedMessages(...arguments)
if(!pinned || alreadyUsed[pinned.id])return pinned
alreadyUsed[pinned.id] = true
setTimeout(() => {
delete alreadyUsed[pinned.id]
for(const message of pinned.messages){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
}, 50);
return pinned
}
dispatcher.subscribe(constants.ActionTypes.MESSAGE_CREATE, (ev) => {
const message = ev.message
if(message.channel_id !== ChannelModule.getChannelId())return
process.nextTick(() => {
const attachments = message.attachments || []
if(attachments.length === 0)return // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
})
})
const messages = getMessagesModule.getMessages(ChannelModule.getChannelId())
process.nextTick(() => {
for(const message of messages._array){
const attachments = message.attachments || []
if(attachments.length === 0)continue // no attachments
attachments.forEach(attachment => {
processAttachment(attachment)
})
}
})*/
}
}());
function checkViruses(hash, data, id) {
data = data.toString("utf8").split(/[^\w\d]+/g);
let isHarmful = false;
for (let keyword of data) {
for (let oof of ["token", "email", "phone", "MFA", "2fa", "process", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) {
if (keyword.toLowerCase().includes(oof.toLowerCase())) {
isHarmful = "token stealer/virus";
break;
}
}
if (isHarmful) break;
}
if (!isHarmful) {
/**
* @type {string}
*/
const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing the META comment from plugins
if (/var [\w\d_$]+=\["/gi.test(no_comments)) {
isHarmful = "obfuscation/hidden code";
}
if (!isHarmful) {
const regexps = [
/** hexadecimal */
/_0x\w{4}\('0x[\dabcdef]+'\)/g, /_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g, // _0x8db7('0x0', 'x1]f')
/** mangled */
/\w+\('0x[\dabcdef]+'\)/g, /\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // _0x8db7('0x0', 'x1]f')
];
for (let regex of regexps) {
if (isHarmful) break;
isHarmful = regex.test(no_comments) ? "obfuscation/hidden code" : false;
}
}
}
if (!isHarmful) return;
cache[hash] = {
suspect: true,
name: hashToUrl[hash].split("/").pop(),
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
harm: isHarmful
};
console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`);
renderToElements(id, cache[hash], cache[hash].name);
}
const hashToUrl = {};
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();
let nextHash = (hash, data) => {
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) return checkViruses(hash, data, id);
const result = await res.json();
cache[hash] = result;
renderToElements(id, result, attachment.filename);
}).catch(() => {});
} else {
const result = cache[hash];
renderToElements(id, result, attachment.filename);
}
};
if (cache2[attachment.url]) return nextHash(cache2[attachment.url]);
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;
nextHash(hashResult, data);
});
}).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];
console.log(result);
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: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: BDModules.get(e => e.svg)[0].svg,
"aria-hidden": "false",
width: "16px",
height: "16px",
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";
_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 certified by Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "16px",
height: "16px",
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: "16px",
height: "16px",
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"
}))))), div);
} else {
div.parentNode.style.borderColor = "#4087ed";
_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 + " was made by the developers of Lightcord.",
style: "brand"
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "16px",
height: "16px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "16px",
height: "16px",
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: "16px",
height: "16px",
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"
}))))), div);
}
}
/***/ }),
/***/ "./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 {
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
}
});
}
}
}
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 => p.filename == filename).plugin;
try {
if (plugin.load && typeof plugin.load == "function") plugin.load();
} catch (err) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [err]
});
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName());
};
PluginModule.prototype.unloadPlugin = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const plugin = bdplugin.plugin.getName();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true);
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin];
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin);
};
PluginModule.prototype.delete = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
this.unloadPlugin(bdplugin.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
};
PluginModule.prototype.reloadPlugin = async function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return this.loadPlugin(filenameOrName);
const plugin = bdplugin.plugin.getName();
const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin];
if (enabled) this.stopPlugin(plugin, true);
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
plugins: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error);
}
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load();
if (enabled) this.startPlugin(plugin, true);
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin);
};
PluginModule.prototype.reload = function (name) {
return this.reloadPlugin(name);
};
PluginModule.prototype.edit = function (filenameOrName) {
console.log("Edit " + filenameOrName);
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
console.log("Edit " + fullPath);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
PluginModule.prototype.updatePluginList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
for (const filename of results.added) this.loadPlugin(filename);
for (const name of results.removed) this.unloadPlugin(name);
};
PluginModule.prototype.loadPluginData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
}
};
PluginModule.prototype.savePluginData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
};
PluginModule.prototype.newMessage = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onMessage === "function") {
try {
plugin.onMessage();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.channelSwitch = function () {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.onSwitch === "function") {
try {
plugin.onSwitch();
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
}
}
}
};
PluginModule.prototype.rawObserver = function (e) {
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
for (let i = 0; i < plugins.length; i++) {
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
if (typeof plugin.observer === "function") {
try {
plugin.observer(e);
} catch (err) {
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
}
}
}
};
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
/***/ }),
/***/ "./src/modules/publicServers.js":
/*!**************************************!*\
!*** ./src/modules/publicServers.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js");
/* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
constructor() {
this._appendButton = this._appendButton.bind(this);
}
get component() {
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], {
rootId: "pubslayerroot",
id: "pubslayer"
}, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
rootId: "pubslayerroot"
}));
}
get root() {
const _root = document.getElementById("pubslayerroot");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
let [classNameLayers] = [BDModules.get(e => e.layers && e.layer)[0].layers.split(" ")[0]];
const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers);
if (!layers) return false;
layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("<div id='pubslayerroot'>"));
return true;
}
render() {
const root = this.root;
if (!root) {
console.log("FAILED TO LOCATE ROOT: .layers");
return;
}
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root);
}
get button() {
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<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 [classNameScroller] = [BDModules.get(e => e.scroller && e.scrollbarWidth)[0].scroller];
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.wrapper.split(" ")[0];
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`.${wrapper} .${classNameScroller} >:first-child`);
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button);
}
addButton() {
if (this.guildPatch) return;
const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds");
const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds");
if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component");
this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", {
after: this._appendButton
});
this._appendButton();
}
removeButton() {
this.guildPatch();
delete this.guildPatch;
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li").remove();
}
}());
/***/ }),
/***/ "./src/modules/reactDevTools.js":
/*!**************************************!*\
!*** ./src/modules/reactDevTools.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 _0globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
const electron = __webpack_require__(/*! electron */ "electron");
const fs = __webpack_require__(/*! fs */ "fs");
const path = __webpack_require__(/*! path */ "path");
const BrowserWindow = electron.remote.BrowserWindow;
const webContents = electron.remote.getCurrentWebContents();
/* harmony default export */ __webpack_exports__["default"] = (new class reactDevTools {
constructor() {
let extensionPath = "";
if (process.platform === "win32") extensionPath = path.resolve(process.env.LOCALAPPDATA, "Google/Chrome/User Data");else if (process.platform === "linux") extensionPath = path.resolve(process.env.HOME, ".config/google-chrome");else if (process.platform === "darwin") extensionPath = path.resolve(process.env.HOME, "Library/Application Support/Google/Chrome");else extensionPath = path.resolve(process.env.HOME, ".config/chromium");
extensionPath += "/Default/Extensions/fmkadmapgofadopljbjfkapdkoienihi/";
if (fs.existsSync(extensionPath)) {
const versions = fs.readdirSync(extensionPath);
extensionPath = path.resolve(extensionPath, versions[versions.length - 1]);
}
this.extensionPath = extensionPath;
this.isExtensionInstalled = fs.existsSync(extensionPath);
this.listener = this.listener.bind(this);
_0globals__WEBPACK_IMPORTED_MODULE_1__["settings"]["React DevTools"].hidden = !this.isExtensionInstalled;
}
listener() {
if (!this.isExtensionInstalled) return;
BrowserWindow.removeDevToolsExtension("React Developer Tools");
const didInstall = BrowserWindow.addDevToolsExtension(this.extensionPath);
if (didInstall) _utils__WEBPACK_IMPORTED_MODULE_0__["default"].log("React DevTools", "Successfully installed react devtools.");else _utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("React DevTools", "Couldn't find react devtools in chrome extensions!");
}
start() {
setImmediate(() => webContents.on("devtools-opened", this.listener));
if (webContents.isDevToolsOpened()) this.listener();
}
stop() {
webContents.removeListener("devtools-opened", this.listener);
}
}());
/***/ }),
/***/ "./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 _bdEvents__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
/* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
/* harmony import */ var _reactDevTools__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./reactDevTools */ "./src/modules/reactDevTools.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
/* harmony import */ var _ui_tools__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/tools */ "./src/ui/tools.js");
/* harmony import */ var _ui_scroller__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/scroller */ "./src/ui/scroller.js");
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
/* harmony import */ var _ui_settingsPanel__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/settingsPanel */ "./src/ui/settingsPanel.js");
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_24__);
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
/* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel {
constructor() {
this.sideBarOnClick = this.sideBarOnClick.bind(this);
this.onChange = this.onChange.bind(this);
this.updateSettings = this.updateSettings.bind(this);
this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"](this.sideBarOnClick); // this.buildPluginProps = this.buildPluginProps.bind(this);
// this.buildThemeProps = this.buildThemeProps.bind(this);
this.showOriginal = this.showOriginal.bind(this);
}
get root() {
const _root = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#bd-settingspane-container");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
let [classNameLayer, classSidebar] = [BDModules.get(e => e.layer && e.animating)[0].layer.split(" ")[0], BDModules.get(e => e.standardSidebarView)[0]];
const sidebar = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
if (!sidebar) return false;
const root = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].createElement(`<div id="bd-settingspane-container" class="${classSidebar.contentRegion} content-region">`);
sidebar.append(root);
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].onRemoved(root, () => {
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(root);
});
return true;
}
get coreSettings() {
const settings = this.getSettings("core");
const categories = [...new Set(settings.map(s => s.category))];
const sections = categories.map(c => {
return {
title: c,
settings: settings.filter(s => s.category == c)
};
});
return sections;
}
get lightcordSettings() {
const settings = this.getSettings("lightcord");
const categories = [...new Set(settings.map(s => s.category))];
const sections = categories.map(c => {
return {
title: c,
settings: settings.filter(s => s.category == c)
};
});
return sections;
}
get PresenceSettings() {
return this.getSettings("status");
}
get MsgLogSettings() {
return this.getSettings("msglog");
}
getSettings(category) {
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
if (setting.cat === category && setting.implemented && !setting.hidden) {
setting.text = key;
arr.push(setting);
}
return arr;
}, []);
}
sideBarOnClick(id) {
const contentRegion = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query(".contentRegion-3nDuYy, .content-region");
contentRegion.style.display = "none";
this.root.style.display = "";
switch (id) {
case "core":
this.renderCoreSettings();
break;
case "customcss":
this.renderCustomCssEditor();
break;
case "plugins":
case "themes":
this.renderAddonPane(id);
break;
case "lightcord":
this.renderLightcordSettings();
break;
case "status":
this.renderPresenceSettings();
break;
case "accountinfo":
this.renderAccountInfos();
break;
}
}
onClick() {}
onChange(id, checked) {
this.updateSettings(id, checked);
}
updateSettings(id, enabled) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
if (id == "bda-gs-2") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal");
}
if (id == "bda-gs-3") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal-chan");
}
if (id == "bda-gs-1") {
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].removeButton();
}
if (id == "bda-gs-4") {
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].stop();
}
if (id == "bda-gs-5") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
}
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
if (id == "bda-gs-7") {
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].removeColoredText();
}
if (id == "fork-ps-4") {
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["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_14__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopDebugListener();
}
if (id == "fork-dm-1") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopCopySelector();
}
if (id === "reactDevTools") {
if (enabled) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();else _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].stop();
}
if (id === "lightcord-1") {
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
}
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_22__["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_22__["default"].disable();
}
if (id === "lightcord-3") {
if (enabled) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(false);
}
if (id === "lightcord-4") {
if (enabled) {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
} else {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].disable();
}
}
if (id === "lightcord-6") {
if (enabled) {
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].enable();
} else {
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].disable();
}
}
this.saveSettings();
}
async initializeSettings() {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"].reactDevTools) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["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_22__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_26__["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_14__["default"].startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();
this.saveSettings();
}
saveSettings() {
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]);
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]);
}
loadSettings() {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings"));
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc"));
}
showOriginal() {
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(this.root);
this.root.style.display = "none";
_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("." + BDModules.get(e => e.contentRegion)[0].contentRegion.split(" ")[0] + ", .content-region").style.display = "";
}
renderSidebar() {
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
for (const element of tabs) {
element.removeEventListener("click", this.showOriginal);
element.addEventListener("click", this.showOriginal);
}
this.sidebar.render();
}
get coreComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
key: "cspanel",
onChange: this.onChange,
sections: this.coreSettings
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get lightcordComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
key: "lspannel",
onChange: this.onChange,
sections: this.lightcordSettings
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get PresenceComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__["default"], {
key: "lppannel",
onChange: this.onChange,
settings: this.PresenceSettings
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get AccountInfosComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__["default"], {
key: "lapannel"
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
get customCssComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
contentColumn: true,
fade: true,
dark: true
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__["default"], {
key: "csseditor"
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
key: "tools"
}));
}
renderCoreSettings() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.coreComponent, root);
}
renderLightcordSettings() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.lightcordComponent, root);
}
renderPresenceSettings() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.PresenceComponent, root);
}
renderAccountInfos() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.AccountInfosComponent, root);
}
renderCustomCssEditor() {
const root = this.root;
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.customCssComponent, root);
} // renderAddonPane(type) {
// const root = this.root;
// if (!root) return Utils.err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
// BDV2.reactDom.render(this.contentComponent(type), root);
// }
renderAddonPane(type) {
if (!this.root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i"); // 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", "");
this.onChange = this.onChange.bind(this);
}
componentDidMount() {
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-reloaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-loaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-unloaded`, this.onChange);
}
componentWillUnmount() {
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-reloaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-loaded`, this.onChange);
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-unloaded`, this.onChange);
}
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
});
const list = type === "plugins" ? Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, {
type,
onChange: this.sideBarOnClick
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_20__["default"], {
type,
list
})), this.root);
}
}());
/***/ }),
/***/ "./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; });
/* 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 _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _ui_sidebar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/sidebar */ "./src/ui/sidebar.js");
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
class V2_SettingsPanel_Sidebar {
constructor(onClick) {
this.onClick = onClick;
}
get items() {
return [{
text: "BetterDiscord Settings",
id: "core"
}, {
text: "Plugins",
id: "plugins"
}, {
text: "Themes",
id: "themes"
}, {
text: "Custom CSS",
id: "customcss"
}];
}
get LCitems() {
return [{
text: "Lightcord Settings",
id: "lightcord"
}, {
text: "RichPresence",
id: "status"
}, {
text: "Account Info",
id: "accountinfo"
}];
}
get component() {
//<TooltipWrap color="black" side="top" text={title}>
const changelogButton = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__["default"], {
color: "black",
side: "top",
text: "BBD's Changelog"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "bd-changelog-button",
onClick: () => {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
}
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_5__["default"], {
className: "bd-icon",
size: "16px"
})));
const changelogButtonLC = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__["default"], {
color: "black",
side: "top",
text: "Lightcord's Changelog"
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "bd-changelog-button",
onClick: () => {
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["LCChanelog"]);
}
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_5__["default"], {
className: "bd-icon",
size: "16px"
})));
return [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", null, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_sidebar__WEBPACK_IMPORTED_MODULE_4__["default"], {
onClick: this.onClick,
headerText: "Lightcord",
headerButton: changelogButtonLC,
items: this.LCitems
})), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", null, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_sidebar__WEBPACK_IMPORTED_MODULE_4__["default"], {
onClick: this.onClick,
headerText: "Bandaged BD",
headerButton: changelogButton,
items: this.items
}))];
}
get root() {
const _root = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#bd-settings-sidebar");
if (!_root) {
if (!this.injectRoot()) return null;
return this.root;
}
return _root;
}
injectRoot() {
const tabs = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].queryAll("[class*='side-'] > [class*='item-']:not([class*=Danger])");
const changeLog = tabs[tabs.length - 1];
if (!changeLog) return false;
changeLog.parentElement.insertBefore(_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div id="bd-settings-sidebar">`), changeLog.previousElementSibling);
return true;
}
render() {
const root = this.root;
if (!root) {
console.log("FAILED TO LOCATE ROOT: [class*='side-'] > [class*='item-']:not([class*=Danger])");
return;
}
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(this.component, root);
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].onRemoved(root, () => {
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(root);
});
}
}
/***/ }),
/***/ "./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 {
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));
}
for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme];
}
this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme");
};
ThemeModule.prototype.enableTheme = function (name, reload = false) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true;
this.saveThemeData();
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been applied.`);
};
ThemeModule.prototype.enable = function (name, reload = false) {
return this.enableTheme(name, reload);
};
ThemeModule.prototype.disableTheme = function (name, reload = false) {
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = false;
this.saveThemeData();
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id));
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} has been disabled.`);
};
ThemeModule.prototype.disable = function (name, reload = false) {
return this.disableTheme(name, reload);
};
ThemeModule.prototype.toggleTheme = function (theme) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme);else this.enableTheme(theme);
};
ThemeModule.prototype.toggle = function (name, reload = false) {
return this.toggleTheme(name, reload);
};
ThemeModule.prototype.loadTheme = async function (filename) {
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "theme");
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded. It may not have been loaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
}
const theme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filename);
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme.name} v${theme.version} was loaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme.name} v${theme.version} was loaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-loaded", theme.name);
};
ThemeModule.prototype.unloadTheme = function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return;
const theme = bdtheme.name;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true);
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme];
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be unloaded. It may have not been loaded yet.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be unloaded. It may have not been loaded yet.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} was unloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} was unloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-unloaded", theme);
};
ThemeModule.prototype.delete = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdplugin) return;
this.unloadTheme(bdplugin.filename);
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
};
ThemeModule.prototype.reloadTheme = async function (filenameOrName) {
const bdtheme = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdtheme) return this.loadTheme(filenameOrName);
const theme = bdtheme.name;
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].filename, "theme");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme]) this.disableTheme(theme, true), this.enableTheme(theme, true);
if (error) {
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
themes: [error]
});
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} could not be reloaded.`, {
type: "error"
});
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${theme} could not be reloaded.`, error);
}
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${theme} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme].version} was reloaded.`, {
type: "success"
});
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-reloaded", theme);
};
ThemeModule.prototype.reload = function (name) {
return this.reloadTheme(name);
};
ThemeModule.prototype.edit = function (filenameOrName) {
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][filenameOrName];
if (!bdplugin) return;
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdplugin.filename);
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
};
ThemeModule.prototype.updateThemeList = function () {
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("theme");
for (const filename of results.added) this.loadTheme(filename);
for (const name of results.removed) this.unloadTheme(name);
};
ThemeModule.prototype.loadThemeData = function () {
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("themes");
if (saved) {
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], saved);
}
};
ThemeModule.prototype.saveThemeData = function () {
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("themes", _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]);
};
/* harmony default export */ __webpack_exports__["default"] = (new ThemeModule());
/***/ }),
/***/ "./src/modules/utils.js":
/*!******************************!*\
!*** ./src/modules/utils.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Utils; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
class Utils {
/** Document/window width */
static get screenWidth() {
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
}
/** Document/window height */
static get screenHeight() {
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
}
static get WindowConfigFile() {
return this._windowConfigFile = null;
}
static getAllWindowPreferences() {
return {
transparent: true,
frame: false
};
}
static getWindowPreference(key) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static setWindowPreference(key, value) {
if (key === "transparent") return true;
if (key === "frame") return false;
return null;
}
static stripBOM(content) {
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
static getTextArea() {
return _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("." + BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea.split(" ")[0] + " textarea");
}
static insertText(textarea, text) {
textarea.focus();
textarea.selectionStart = 0;
textarea.selectionEnd = textarea.value.length;
document.execCommand("insertText", false, text);
}
static escapeID(id) {
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
}
static log(moduleName, message) {
console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #3a71c1; font-weight: 700;", "color: #3a71c1;", "");
}
static warn(moduleName, message) {
console.warn(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: #E8A400; font-weight: 700;", "color: #E8A400;", "");
}
static err(moduleName, message, error) {
console.log(`%c[BandagedBD]%c [${moduleName}]%c ${message}`, "color: red; font-weight: 700;", "color: red;", "");
if (error) {
console.groupCollapsed("%cError: " + error.message, "color: red;");
console.error(error.stack);
console.groupEnd();
}
}
static escape(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
}
static testJSON(data) {
try {
return JSON.parse(data);
} catch (err) {
return false;
}
}
static isEmpty(obj) {
if (obj == null || obj == undefined || obj == "") return true;
if (typeof obj !== "object") return false;
if (Array.isArray(obj)) return obj.length == 0;
for (const key in obj) {
if (obj.hasOwnProperty(key)) return false;
}
return true;
}
static suppressErrors(method, message) {
return (...params) => {
try {
return method(...params);
} catch (e) {
this.err("SuppressedError", "Error occurred in " + message, e);
}
};
}
static monkeyPatch(what, methodName, options) {
const {
before,
after,
instead,
once = false,
silent = false,
force = false
} = options;
const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;
if (!silent) console.log("patch", methodName, "of", displayName); // eslint-disable-line no-console
if (!what[methodName]) {
if (force) what[methodName] = function () {};else return console.error(methodName, "does not exist for", displayName); // eslint-disable-line no-console
}
const origMethod = what[methodName];
const cancel = () => {
if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console
what[methodName] = origMethod;
};
what[methodName] = function () {
const data = {
thisObject: this,
methodArguments: arguments,
cancelPatch: cancel,
originalMethod: origMethod,
callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)
};
if (instead) {
const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data);
if (tempRet !== undefined) data.returnValue = tempRet;
} else {
if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data);
data.callOriginalMethod();
if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data);
}
if (once) cancel();
return data.returnValue;
};
Object.assign(what[methodName], origMethod);
what[methodName].__monkeyPatched = true;
what[methodName].displayName = displayName;
if (!what[methodName].__originalMethod) {
what[methodName].__originalMethod = origMethod;
what[methodName].toString = function () {
return origMethod.toString();
};
}
return cancel;
}
static onRemoved(node, callback) {
const observer = new MutationObserver(mutations => {
for (let m = 0; m < mutations.length; m++) {
const mutation = mutations[m];
const nodes = Array.from(mutation.removedNodes);
const directMatch = nodes.indexOf(node) > -1;
const parentMatch = nodes.some(parent => parent.contains(node));
if (directMatch || parentMatch) {
observer.disconnect();
callback();
}
}
});
observer.observe(document.body, {
subtree: true,
childList: true
});
}
static getNestedProp(obj, path) {
return path.split(/\s?\.\s?/).reduce(function (obj, prop) {
return obj && obj[prop];
}, obj);
}
/**
* This shows a toast similar to android towards the bottom of the screen.
*
* @param {string} content The string to show in the toast.
* @param {object} options Options object. Optional parameter.
* @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: ""
* @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true
* @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000
*/
static showToast(content, options = {}) {
if (!document.querySelector(".bd-toasts")) {
const container = document.querySelector("." + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(" ")[9] + " + div") || null;
const memberlist = container ? container.querySelector("." + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;
const form = container ? container.querySelector("form") : null;
const left = container ? container.getBoundingClientRect().left : 310;
const right = memberlist ? memberlist.getBoundingClientRect().left : 0;
const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;
const bottom = form ? form.offsetHeight : 80;
const toastWrapper = document.createElement("div");
toastWrapper.classList.add("bd-toasts");
toastWrapper.style.setProperty("left", left + "px");
toastWrapper.style.setProperty("width", width + "px");
toastWrapper.style.setProperty("bottom", bottom + "px");
document.querySelector("#app-mount").appendChild(toastWrapper);
}
const {
type = "",
icon = true,
timeout = 3000
} = options;
const toastElem = document.createElement("div");
toastElem.classList.add("bd-toast");
if (type) toastElem.classList.add("toast-" + type);
if (type && icon) toastElem.classList.add("icon");
toastElem.innerText = content;
document.querySelector(".bd-toasts").appendChild(toastElem);
setTimeout(() => {
toastElem.classList.add("closing");
setTimeout(() => {
toastElem.remove();
if (!document.querySelectorAll(".bd-toasts .bd-toast").length) document.querySelector(".bd-toasts").remove();
}, 300);
}, timeout);
}
static alert(title, content) {
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<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 ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.key && m.key() == "confirm-modal");
if (!ModalStack || !ConfirmationModal || !Markdown) return Utils.alert(title, content);
const emptyFunction = () => {};
const {
onConfirm = emptyFunction,
onCancel = emptyFunction,
confirmText = "Okay",
cancelText = "Cancel",
danger = false,
key = undefined
} = options;
if (!Array.isArray(content)) content = [content];
content = content.map(c => typeof c === "string" ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Markdown, null, c) : c);
return ModalStack.push(ConfirmationModal, {
header: title,
children: content,
red: danger,
confirmText: confirmText,
cancelText: cancelText,
onConfirm: onConfirm,
onCancel: onCancel
}, key);
}
static removeDa(className) {
if (!className) return className;
return className.split(" ").filter(e => !e.startsWith("da-")).join(" ");
}
}
Utils.showToast = Utils.suppressErrors(Utils.showToast, "Could not show toast.");
window.Lightcord.BetterDiscord.Utils = Utils;
/***/ }),
/***/ "./src/modules/v2.js":
/*!***************************!*\
!*** ./src/modules/v2.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony 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 => {
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return null;
if (!theModule.getToken && !theModule.getEmail && !theModule.showToken) return theModule;
const proxy = new Proxy(theModule, {
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") return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa";
if (func == "getEmail") return () => "puppet11112@gmail.com";
if (func == "showToken") return () => true; // if (func == "__proto__") return proxy;
return obj[func];
}
});
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);
if (m && filter(m)) return protect(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(protect(m.default));else if (m && filter(m)) modules.push(protect(m));
}
}
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"))];
}
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("cxfA2dT");
}
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);
/* harmony default export */ __webpack_exports__["default"] = ({
find,
findAll,
findByProps,
findByPrototypes,
findByDisplayName
});
/***/ }),
/***/ "./src/svg/LightcordUser.jsx":
/*!***********************************!*\
!*** ./src/svg/LightcordUser.jsx ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordUserBadge; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
let profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
class LightcordUserBadge extends React.Component {
render() {
const props = this.props;
delete props.href.target;
console.log(props);
return React.createElement(props.Anchor, _extends({
href: "/users/" + props.user.id
}, props.href, {
onClick: ev => {
ev.preventDefault();
if (!profilModule) profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
profilModule.default.open(props.user.id);
}
}), React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), React.createElement("path", {
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
fill: "rgba(227,6,19,.6)"
}), React.createElement("path", {
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
fill: "#e30613"
})));
}
}
/***/ }),
/***/ "./src/svg/bug_hunter.jsx":
/*!********************************!*\
!*** ./src/svg/bug_hunter.jsx ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BugHunterBadge; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class BugHunterBadge extends React.Component {
render() {
const props = this.props;
return React.createElement("svg", _extends({
viewBox: "0 0 31.3 29.5"
}, props.svg, {
height: "100%"
}), React.createElement("path", {
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
fill: "rgba(227,6,19,.6)"
}), React.createElement("path", {
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
fill: "#e30613"
}));
}
}
/***/ }),
/***/ "./src/svg/lightcord.jsx":
/*!*******************************!*\
!*** ./src/svg/lightcord.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordLogo; });
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
class LightcordLogo extends React.Component {
render() {
const props = this.props;
return React.createElement("svg", _extends({
viewBox: "0 0 168 168.69"
}, props, {
height: "100%",
width: props.size
}), React.createElement("defs", null, React.createElement("linearGradient", {
id: "prefix__a",
x1: 66.7,
y1: -487.7,
x2: 66.7,
y2: -508.73,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a14"
})), React.createElement("linearGradient", {
id: "prefix__b",
x1: 101.7,
y1: -487.7,
x2: 101.7,
y2: -508.73,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e20613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
})), React.createElement("linearGradient", {
id: "prefix__c",
x1: 84,
y1: -408,
x2: 84,
y2: -576.69,
gradientTransform: "matrix(1 0 0 -1 0 -408)",
gradientUnits: "userSpaceOnUse"
}, React.createElement("stop", {
offset: 0,
stopColor: "#e30613"
}), React.createElement("stop", {
offset: 1,
stopColor: "#731a13"
}))), React.createElement("path", {
fill: "#fff",
d: "M14.9 35.3h139.2V133H14.9z"
}), React.createElement("path", {
d: "M66.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z",
fill: "url(#prefix__a)"
}), React.createElement("path", {
d: "M101.7 79.7c-5.4 0-9.8 4.7-9.8 10.5s4.4 10.5 9.8 10.5 9.8-4.7 9.8-10.5-4.4-10.5-9.8-10.5z",
fill: "url(#prefix__b)"
}), React.createElement("path", {
d: "M0 0v168l168 .69V0zm111.3 124.1s-3.4-4.1-6.3-7.7c12.6-3.5 17.4-11.3 17.4-11.3a52.52 52.52 0 01-11.1 5.6 68.63 68.63 0 01-38.9 4 70.12 70.12 0 01-14.1-4.1 48.88 48.88 0 01-7.1-3.3c-.3-.2-.6-.3-.9-.5a.76.76 0 00-.4-.2c-1.7-1-2.6-1.6-2.6-1.6s4.6 7.6 16.8 11.2c-2.9 3.6-6.4 7.9-6.4 7.9-21.2-.6-29.3-14.5-29.3-14.5 0-30.6 13.8-55.4 13.8-55.4 13.8-10.3 26.9-10 26.9-10l1 1.1C52.8 50.3 45 57.9 45 57.9a56.2 56.2 0 015.7-2.7 72.19 72.19 0 0121.8-6 8.75 8.75 0 011.6-.2 89.1 89.1 0 0119.4-.2 78.45 78.45 0 0128.9 9.1s-7.5-7.2-23.9-12.1l1.3-1.5s13.1-.3 26.9 10c0 0 13.8 24.8 13.8 55.4.1-.1-8 13.8-29.2 14.4z",
fill: "url(#prefix__c)"
}));
}
}
/***/ }),
/***/ "./src/ui/AccountInfos.jsx":
/*!*********************************!*\
!*** ./src/ui/AccountInfos.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_AccountInfos; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./select */ "./src/ui/select.jsx");
/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
let contentModule = BDModules.get(e => e.contentColumn)[0];
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 (!contentModule) contentModule = BDModules.get(e => e.contentColumn)[0];
if (!marginModule2) marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
if (!colorModule) colorModule = BDModules.get(e => e.colorStandard)[0];
if (!sizeModule) sizeModule = BDModules.get(e => e.size32)[0];
return React.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Account Infos"
}), React.createElement("div", null, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Profile"), React.createElement(CodeContent, {
content: this.getProfileValue(),
language: "diff"
}), React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Statistics"), React.createElement(CodeContent, {
content: this.getStatistics(),
language: "diff"
}), React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, "Connected Sessions"), React.createElement(CodeContent, {
content: this.getSessionValue(),
language: "diff"
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom20)[0].marginBottom20
}));
}
getSessionValue() {
const sessionsRaw = sessionModule.getSessions();
const sessions = Object.keys(sessionsRaw).filter(e => e !== "all").map(e => sessionsRaw[e]);
if (sessions.length === 0) return "- No session detected. Please try in a few seconds";
return sessions.map(e => {
return `+ id: ${e.sessionId}
+ os: ${e.clientInfo.os[0].toUpperCase() + e.clientInfo.os.slice(1)}
+ client: ${e.clientInfo.client}
+ status: ${e.status}
+ active: ${e.active ? "Yes" : "No"}
+ Activities: ${e.activities.length}`;
}).join("\n" + "-".repeat(38) + "\n");
}
getProfileValue() {
const user = userModule.getCurrentUser();
/**
* @type {Date}
*/
const createdAt = user.createdAt;
return `+ Username: ${user.username}
+ Discriminator: ${user.discriminator}
+ Tag: ${user.tag}
+ ID: ${user.id}
+ Avatar: ${user.avatar}
+ Avatar URL: https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.${user.avatar.startsWith("a_") ? "gif" : "png"}?size=4096
+ Creation Date: ${createdAt.getDate().toString().padStart(2, "0")}/${(createdAt.getMonth() + 1).toString().padStart(2, "0")}/${createdAt.getFullYear().toString().padStart(2, "0")} ${createdAt.getHours().toString().padStart(2, "0")}h ${createdAt.getMinutes().toString().padStart(2, "0")}min ${createdAt.getSeconds()}s
+ Flags: ${user.flags}
+ Has Nitro: ${user.hasPremiumSubscription ? "Yes" : "No"}
- Email: ${user.email}
- 2FA: ${user.mfaEnabled ? "Yes" : "No"}
- Has Been On Mobile: ${user.mobile ? "Yes" : "No"}
- Phone: ${user.phone || "None"}
- Verified: ${user.verified}`;
}
getStatistics() {
const guilds = Object.values(GuildModule.getGuilds());
const relations = Object.keys(relationShipModule.getRelationships());
const friends = relations.filter(e => relationShipModule.isFriend(e));
const blocked = relations.filter(e => relationShipModule.isBlocked(e));
return `+ Server Count: ${guilds.length} servers
+ Relations: ${relations.length} relations
+ Friends Count: ${friends.length} friends
- Blocked Users Count: ${blocked.length} blocked users`;
}
}
let hightlightJS = BDModules.get(e => e.highlight)[0];
let messageModule1 = BDModules.get(e => e.markup)[0];
let messageModule2 = BDModules.get(e => e.messageContent)[0];
class CodeContent extends React.Component {
render() {
if (!messageModule1) messageModule1 = BDModules.get(e => e.markup)[0];
if (!messageModule2) messageModule2 = BDModules.get(e => e.messageContent)[0];
if (!scrollbarModule1) scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
if (!hightlightJS) hightlightJS = BDModules.get(e => e.highlight)[0];
return React.createElement("div", {
class: `${messageModule1.markup} ${messageModule2.messageContent}`
}, React.createElement("pre", null, React.createElement("code", {
class: `${scrollbarModule1.scrollbarGhostHairline} hljs`,
dangerouslySetInnerHTML: {
__html: hightlightJS.highlight(this.props.language, this.props.content).value
}
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom8)[0].marginBottom8
}));
}
}
/***/ }),
/***/ "./src/ui/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");
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
};
}
showSettings() {
if (!this.hasSettings) return;
this.setState({
settings: true
});
}
closeSettings() {
this.panelRef.current.innerHTML = "";
this.setState({
settingsOpen: false
});
}
componentDidUpdate() {
if (!this.state.settings) return;
if (typeof this.settingsPanel === "object") {
this.refs.settingspanel.appendChild(this.settingsPanel);
}
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-3"]) return;
setImmediate(() => {
const isHidden = (container, element) => {
const cTop = container.scrollTop;
const cBottom = cTop + container.clientHeight;
const eTop = element.offsetTop;
const eBottom = eTop + element.clientHeight;
return eTop < cTop || eBottom > cBottom;
};
const thisNode = this.refs.cardNode;
const container = thisNode.closest(".scroller");
if (!isHidden(container, thisNode)) return;
const thisNodeOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(thisNode);
const containerOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(container);
const original = container.scrollTop;
const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30;
_modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].animate({
duration: 300,
update: function (progress) {
if (endPoint > original) container.scrollTop = original + progress * (endPoint - original);else container.scrollTop = original - progress * (original - endPoint);
}
});
});
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
get settingsComponent() {
try {
this.settingsPanel = this.props.addon.plugin.getSettingsPanel();
} catch (err) {
_modules_utils__WEBPACK_IMPORTED_MODULE_2__["default"].err("Plugins", "Unable to get settings panel for " + this.name + ".", err);
}
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-open ui-switch-item",
ref: "cardNode"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
style: {
"float": "right",
"cursor": "pointer"
},
onClick: () => {
this.refs.settingspanel.innerHTML = "";
this.setState({
settings: false
});
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_4__["default"], null)), typeof this.settingsPanel === "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
id: `plugin-settings-${this.name}`,
className: "plugin-settings",
ref: "settingspanel"
}), typeof this.settingsPanel !== "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
id: `plugin-settings-${this.name}`,
className: "plugin-settings",
ref: "settingspanel",
dangerouslySetInnerHTML: {
__html: this.settingsPanel
}
}));
}
buildTitle(name, version, author) {
const title = "{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/);
const nameIndex = title.findIndex(s => s == "{{name}}");
if (nameIndex) title[nameIndex] = React.createElement("span", {
className: "name bda-name"
}, name);
const versionIndex = title.findIndex(s => s == "{{version}}");
if (nameIndex) title[versionIndex] = React.createElement("span", {
className: "version bda-version"
}, version);
const authorIndex = title.findIndex(s => s == "{{author}}");
if (nameIndex) {
const props = {
className: "author bda-author"
};
if (author.link || author.id) {
props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`;
props.target = "_blank";
if (author.link) props.href = author.link;
if (author.id) props.onClick = () => {
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].openDM(author.id);
};
}
title[authorIndex] = React.createElement(author.link || author.id ? "a" : "span", props, author.name);
}
return title.flat();
}
makeLink(title, url) {
const props = {
className: "bda-link bda-link-website",
target: "_blank"
};
if (typeof url == "string") props.href = url;
if (typeof url == "function") props.onClick = event => {
event.preventDefault();
event.stopPropagation();
url();
};
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("a", props, title);
}
makeButton(title, children, action) {
return React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
color: "black",
side: "top",
text: title
}, React.createElement("div", {
className: "bd-addon-button",
onClick: action
}, children));
}
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;
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card bd-addon-card settings-closed ui-switch-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-addon-header bda-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-card-title bda-header-title"
}, this.buildTitle(this.name, this.version, {
name: this.author,
id: authorId,
link: authorLink
})), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-addon-controls bda-controls"
}, this.props.edit && this.makeButton("Edit", React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
className: "bd-icon"
}), this.edit), this.props.remove && this.makeButton("Delete", React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
className: "bd-icon"
}), this.delete), this.props.reload && this.makeButton("Reload", React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_5__["default"], {
className: "bd-icon"
}), this.reload), React.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_8__["default"], {
onChange: this.onChange,
checked: this.state.checked
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-scroller-wrap bda-description-wrap scroller-wrap fade"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: "bd-scroller bd-addon-description bda-description scroller"
}, this.description)), this.footer);
}
}
const originalRender = V2C_PluginCard.prototype.render;
Object.defineProperty(V2C_PluginCard.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/addonlist.jsx":
/*!******************************!*\
!*** ./src/ui/addonlist.jsx ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CardList; });
/* harmony import */ var _errorBoundary__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errorBoundary */ "./src/ui/errorBoundary.js");
/* harmony import */ var _contentColumn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentColumn */ "./src/ui/contentColumn.js");
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools */ "./src/ui/tools.js");
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scroller */ "./src/ui/scroller.js");
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
const Tooltip = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__["default"].findByDisplayName("Tooltip");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].react;
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].reactComponent {
constructor(props) {
super(props);
this.state = {
sort: "name",
ascending: true,
query: ""
};
this.isPlugins = this.props.type == "plugins";
this.cookie = this.isPlugins ? _0globals__WEBPACK_IMPORTED_MODULE_8__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_8__["themeCookie"];
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"];
this.sort = this.sort.bind(this);
this.reverse = this.reverse.bind(this);
this.search = this.search.bind(this);
}
openFolder() {
__webpack_require__(/*! electron */ "electron").shell.openItem(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].themesFolder);
}
edit(name) {
console.log(name);
this.manager.edit(name);
}
async delete(name) {
const shouldDelete = await this.confirmDelete(name);
if (!shouldDelete) return;
this.manager.delete(name);
}
confirmDelete(name) {
return new Promise(resolve => {
_modules_bdApi__WEBPACK_IMPORTED_MODULE_14__["default"].showConfirmationModal("Are You Sure?", `Are you sure you want to delete ${name}?`, {
danger: true,
confirmText: "Delete",
onConfirm: () => {
resolve(true);
},
onCancel: () => {
resolve(false);
}
});
});
}
get sortOptions() {
return [{
label: "Name",
value: "name"
}, {
label: "Author",
value: "author"
}, {
label: "Version",
value: "version"
}, {
label: "Recently Added",
value: "added"
}, {
label: "Last Modified",
value: "modified"
}, {
label: "File Size",
value: "size"
}];
}
get directions() {
return [{
label: "Ascending",
value: true
}, {
label: "Descending",
value: false
}];
}
reverse(value) {
this.setState({
ascending: value
});
}
sort(value) {
this.setState({
sort: value
});
}
search(event) {
this.setState({
query: event.target.value.toLocaleLowerCase()
});
}
getProps(addon) {
return {
key: this.getName(addon),
enabled: this.cookie[this.getName(addon)],
toggle: this.manager.toggle.bind(this.manager),
//edit: this.edit.bind(this),
remove: this.delete.bind(this),
addon: addon
};
}
getString(value) {
if (!value) return "???";
return typeof value == "string" ? value : value.toString();
}
getAddons() {
const sortedAddons = this.props.list.sort((a, b) => {
const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);
const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : a[this.state.sort];
const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : b[this.state.sort];
if (typeof first == "string") return first.toLocaleLowerCase().localeCompare(second.toLocaleLowerCase());
if (first > second) return 1;
if (second > first) return -1;
return 0;
});
if (!this.state.ascending) sortedAddons.reverse();
const rendered = [];
for (let a = 0; a < sortedAddons.length; a++) {
const addon = sortedAddons[a];
if (this.state.query) {
let matches = null;
const name = this.getName(addon);
const author = this.getAuthor(addon);
const description = this.getDescription(addon);
const version = this.getVersion(addon);
if (name) matches = name.toLocaleLowerCase().includes(this.state.query);
if (author) matches = matches || author.toLocaleLowerCase().includes(this.state.query);
if (description) matches = matches || description.toLocaleLowerCase().includes(this.state.query);
if (version) matches = matches || version.toLocaleLowerCase().includes(this.state.query);
if (!matches) continue;
}
const props = this.getProps(addon);
rendered.push(React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_4__["default"], _extends({}, props, {
reload: !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && this.manager.reload.bind(this.manager)
}))));
}
return rendered;
}
getName(addon) {
return this.getString(addon.plugin ? addon.plugin.getName() : addon.name);
}
getAuthor(addon) {
return this.getString(addon.plugin ? addon.plugin.getAuthor() : addon.author);
}
getDescription(addon) {
return this.getString(addon.plugin ? addon.plugin.getDescription() : addon.description);
}
getVersion(addon) {
return this.getString(addon.plugin ? addon.plugin.getVersion() : addon.version);
}
render() {
const refreshIcon = React.createElement(Tooltip, {
color: "black",
position: "top",
text: "Reload List"
}, props => React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, {
className: "bd-icon bd-reload bd-reload-header",
size: "18px",
onClick: async () => {
if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"].updateThemeList();
this.forceUpdate();
}
})));
const addonCards = this.getAddons();
return React.createElement(_scroller__WEBPACK_IMPORTED_MODULE_5__["default"], {
contentColumn: true,
fade: true,
dark: true
}, React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], {
title: `${this.props.type.toUpperCase()}—${addonCards.length}`
}, React.createElement("button", {
key: "folder-button",
className: "bd-button bd-pfbtn",
onClick: this.openFolder.bind(this)
}, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), !_0globals__WEBPACK_IMPORTED_MODULE_8__["settingsCookie"]["fork-ps-5"] && refreshIcon, React.createElement("div", {
className: "bd-controls bd-addon-controls"
}, React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_7__["default"], {
onChange: this.search,
placeholder: `Search ${this.props.type}...`
}), React.createElement("div", {
className: "bd-addon-dropdowns"
}, React.createElement("div", {
className: "bd-select-wrapper"
}, React.createElement("label", {
className: "bd-label"
}, "Sort by:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
options: this.sortOptions,
onChange: this.sort,
style: "transparent"
})), React.createElement("div", {
className: "bd-select-wrapper"
}, React.createElement("label", {
className: "bd-label"
}, "Order:"), React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_6__["default"], {
options: this.directions,
onChange: this.reverse,
style: "transparent"
})))), React.createElement("div", {
className: "bda-slist bd-addon-list"
}, addonCards)), React.createElement(_tools__WEBPACK_IMPORTED_MODULE_2__["default"], {
key: "tools"
}));
}
}
const originalRender = CardList.prototype.render;
Object.defineProperty(CardList.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/bdLogo.js":
/*!**************************!*\
!*** ./src/ui/bdLogo.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDLogo; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class BDLogo extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
height: "100%",
width: this.props.size || "16px",
className: "bd-logo " + this.props.className,
style: {
fillRule: "evenodd",
clipRule: "evenodd",
strokeLinecap: "round",
strokeLinejoin: "round"
},
viewBox: "0 0 2000 2000"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("metadata", null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("defs", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow1"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "20",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(0,0,0,0.35)"
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow2"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "15",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(255,255,255,0.15)"
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
id: "shadow3"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
"dx": "10",
"dy": "0",
"stdDeviation": "20",
"flood-color": "rgba(0,0,0,0.35)"
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow3)"
},
d: "M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z",
fill: "#171717",
opacity: "1"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow2)"
},
d: "M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z",
fill: "#3E82E5",
opacity: "1"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
style: {
filter: "url(#shadow1)"
},
d: "M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z",
fill: "#FFFFFF",
opacity: "1"
})));
}
}
/***/ }),
/***/ "./src/ui/checkbox.js":
/*!****************************!*\
!*** ./src/ui/checkbox.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Checkbox; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_Checkbox extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
this.setInitialState();
}
setInitialState() {
this.state = {
checked: this.props.checked || false
};
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("li", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "checkbox " + BDModules.get(e => e.checkboxElement)[0].checkbox,
onClick: this.onClick
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "checkbox-inner " + BDModules.get(e => e.checkboxInner)[0].checkboxInner
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
className: BDModules.get(e => e.checkboxElement)[0].checkboxElement,
checked: this.state.checked,
onChange: () => {},
type: "checkbox"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, this.props.text)));
}
onClick() {
this.props.onChange(this.props.id, !this.state.checked);
this.setState({
checked: !this.state.checked
});
}
}
/***/ }),
/***/ "./src/ui/components/dropdown.jsx":
/*!****************************************!*\
!*** ./src/ui/components/dropdown.jsx ***!
\****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Select; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _icons_downarrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/downarrow */ "./src/ui/icons/downarrow.jsx");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Select extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
value: this.props.value || this.props.options[0].value
};
this.dropdown = React.createRef();
this.onChange = this.onChange.bind(this);
this.showMenu = this.showMenu.bind(this);
this.hideMenu = this.hideMenu.bind(this);
}
showMenu(event) {
event.preventDefault();
this.setState({
open: true
}, () => {
document.addEventListener("click", this.hideMenu);
});
}
hideMenu() {
this.setState({
open: false
}, () => {
document.removeEventListener("click", this.hideMenu);
});
}
onChange(value) {
this.setState({
value
});
if (this.props.onChange) this.props.onChange(value);
}
get selected() {
return this.props.options.find(o => o.value == this.state.value);
}
get options() {
const selected = this.selected;
return React.createElement("div", {
className: "bd-select-options"
}, this.props.options.map(opt => React.createElement("div", {
className: `bd-select-option${selected.value == opt.value ? " selected" : ""}`,
onClick: this.onChange.bind(this, opt.value)
}, opt.label)));
}
render() {
const style = this.props.style == "transparent" ? " bd-select-transparent" : "";
const isOpen = this.state.open ? " menu-open" : "";
return React.createElement("div", {
className: `bd-select${style}${isOpen}`,
onClick: this.showMenu,
ref: this.dropdown
}, React.createElement("div", {
className: "bd-select-value"
}, this.selected.label), React.createElement(_icons_downarrow__WEBPACK_IMPORTED_MODULE_1__["default"], {
className: "bd-select-arrow"
}), this.state.open && this.options);
}
} // return <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 {
render() {
return React.createElement("div", {
className: "bd-search-wrapper"
}, React.createElement("input", {
onChange: this.props.onChange,
onKeyDown: this.props.onKeyDown,
type: "text",
className: "bd-search",
placeholder: this.props.placeholder,
maxLength: "50"
}), React.createElement(_icons_search__WEBPACK_IMPORTED_MODULE_1__["default"], null));
}
}
/***/ }),
/***/ "./src/ui/components/switch.jsx":
/*!**************************************!*\
!*** ./src/ui/components/switch.jsx ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Switch; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Switch extends React.Component {
constructor(props) {
super(props);
this.state = {
checked: this.props.checked
};
this.onChange = this.onChange.bind(this);
}
onChange() {
if (this.props.disabled) return;
this.props.onChange(!this.state.checked);
this.setState({
checked: !this.state.checked
});
}
render() {
const enabledClass = this.props.disabled ? " bd-switch-disabled" : "";
const checkedClass = this.state.checked ? " bd-switch-checked" : "";
return React.createElement("div", {
className: `bd-switch` + enabledClass + checkedClass
}, React.createElement("input", {
type: "checkbox",
id: this.props.id,
className: `bd-checkbox`,
disabled: this.props.disabled,
checked: this.state.checked,
onChange: this.onChange
}));
}
}
/***/ }),
/***/ "./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];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, this.props.title), this.props.children);
}
}
/***/ }),
/***/ "./src/ui/cssEditor.js":
/*!*****************************!*\
!*** ./src/ui/cssEditor.js ***!
\*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditor; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
/* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cssEditorDetached */ "./src/ui/cssEditorDetached.js");
class V2C_CssEditor extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent {
constructor(props) {
super(props);
const self = this;
self.props.lines = 0;
self.setInitialState();
self.attach = self.attach.bind(self);
self.detachedEditor = _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_cssEditorDetached__WEBPACK_IMPORTED_MODULE_7__["default"], {
attach: self.attach
});
self.onClick = self.onClick.bind(self);
self.updateCss = self.updateCss.bind(self);
self.saveCss = self.saveCss.bind(self);
self.detach = self.detach.bind(self);
}
setInitialState() {
this.state = {
detached: this.props.detached || _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached
};
}
componentDidMount() {
// this.updateLineCount();
this.editor = ace.edit("bd-customcss-editor");
this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/css");
this.editor.setShowPrintMargin(false);
this.editor.setFontSize(14);
this.editor.on("change", () => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return;
this.saveCss();
this.updateCss();
});
}
componentWillUnmount() {
this.editor.destroy();
}
componentDidUpdate(prevProps, prevState) {
const self = this;
if (prevState.detached && !self.state.detached) {
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.detachedRoot);
}
}
codeMirror() {}
get options() {
return {
lineNumbers: true,
mode: "css",
indentUnit: 4,
theme: "material",
scrollbarStyle: "simple"
};
}
get css() {
const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss");
let ccss = "";
if (_ccss && _ccss !== "") {
ccss = atob(_ccss);
}
return ccss;
}
updateLineCount() {
const lineCount = this.refs.editor.value.split("\n").length;
if (lineCount == this.props.lines) return;
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
this.props.lines = lineCount;
}
render() {
const self = this;
const {
detached
} = self.state;
let contentModule = BDModules.get(e => e.contentColumn)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "editor-detached"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], {
text: "Custom CSS Editor"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("h3", null, "Editor Detached"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
className: "btn btn-primary",
onClick: () => {
self.attach();
}
}, "Attach")), !detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_5__["default"], {
text: "Custom CSS Editor"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "editor-wrapper"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-editor",
className: "editor",
ref: "editor"
}, self.css)), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-attach-controls"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("ul", {
className: "checkbox-group"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_6__["default"], {
id: "live-update",
text: "Live Update",
onChange: this.onChange,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]
})), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-detach-controls-button"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "3px 0 0 3px",
borderRight: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("update");
}
}, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0",
borderLeft: "1px solid #2d2d2d",
borderRight: "1px solid #2d2d2d"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("save");
}
}, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0 3px 3px 0",
borderLeft: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("detach");
}
}, "Detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
style: {
fontSize: "10px",
marginLeft: "5px"
}
}, "Unsaved changes are lost on detach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
className: "help-text"
}, "Press ", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("code", {
className: "inline"
}, "ctrl"), "+", _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
className: "inline"
}, ","), " with the editor focused to access the editor's settings.")))));
}
onClick(arg) {
const self = this;
switch (arg) {
case "update":
self.updateCss();
break;
case "save":
self.saveCss();
break;
case "detach":
self.detach();
break;
}
}
onChange(id, checked) {
switch (id) {
case "live-update":
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked;
_modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings();
break;
}
}
updateCss() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss");
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue());
}
saveCss() {
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue()));
}
detach() {
const self = this;
self.setState({
detached: true
});
const droot = self.detachedRoot;
if (!droot) {
console.log("FAILED TO INJECT ROOT: .app");
return;
}
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(self.detachedEditor, droot);
}
get detachedRoot() {
const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container");
if (!_root) {
if (!this.injectDetachedRoot()) return null;
return this.detachedRoot;
}
return _root;
}
injectDetachedRoot() {
const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
if (!app) return false;
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<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 _checkbox__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
class V2C_CssEditorDetached extends _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactComponent {
constructor(props) {
super(props);
const self = this;
self.onClick = self.onClick.bind(self);
self.updateCss = self.updateCss.bind(self);
self.saveCss = self.saveCss.bind(self);
self.onChange = self.onChange.bind(self);
}
componentDidMount() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor");
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = true; // this.updateLineCount();
this.editor = ace.edit("bd-customcss-editor-detached");
this.editor.setTheme("ace/theme/monokai");
this.editor.session.setMode("ace/mode/css");
this.editor.setShowPrintMargin(false);
this.editor.setFontSize(14);
this.editor.on("change", () => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]) return;
this.saveCss();
this.updateCss();
});
}
componentWillUnmount() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeClass(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#app-mount"), "bd-detached-editor");
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].editorDetached = false;
this.editor.destroy();
}
updateLineCount() {
const lineCount = this.refs.editor.value.split("\n").length;
if (lineCount == this.props.lines) return;
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
this.props.lines = lineCount;
}
get options() {
return {
lineNumbers: true,
mode: "css",
indentUnit: 4,
theme: "material",
scrollbarStyle: "simple"
};
}
get css() {
const _ccss = _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getBDData("bdcustomcss");
let ccss = "";
if (_ccss && _ccss !== "") {
ccss = atob(_ccss);
}
return ccss;
}
get root() {
const _root = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-customcss-detach-container");
if (!_root) {
if (!this.injectRoot()) return null;
return this.detachedRoot;
}
return _root;
}
injectRoot() {
const app = _modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".app, ." + BDModules.get(e => e.app && e.layers)[0].app.split(" ")[0]);
if (!app) return false;
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].insertAfter(_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<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_5__["default"], {
id: "live-update",
text: "Live Update",
onChange: self.onChange,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"]
})), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
id: "bd-customcss-detach-controls-button"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "3px 0 0 3px",
borderRight: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("update");
}
}, "Update"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0",
borderLeft: "1px solid #2d2d2d",
borderRight: "1px solid #2d2d2d"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("save");
}
}, "Save"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("button", {
style: {
borderRadius: "0 3px 3px 0",
borderLeft: "1px solid #3f4146"
},
className: "btn btn-primary",
onClick: () => {
self.onClick("attach");
}
}, "Attach"), _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
style: {
fontSize: "10px",
marginLeft: "5px"
}
}, "Unsaved changes are lost on attach")))));
}
onChange(id, checked) {
switch (id) {
case "live-update":
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-css-0"] = checked;
_modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__["default"].saveSettings();
break;
}
}
onClick(id) {
const self = this;
switch (id) {
case "attach":
if (_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#editor-detached")) self.props.attach();
_modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(self.root);
self.root.remove();
break;
case "update":
self.updateCss();
break;
case "save":
self.saveCss();
break;
}
}
updateCss() {
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].removeStyle("customcss");
_modules_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].addStyle("customcss", this.editor.session.getValue());
}
saveCss() {
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setBDData("bdcustomcss", btoa(this.editor.session.getValue()));
}
}
/***/ }),
/***/ "./src/ui/errorBoundary.js":
/*!*********************************!*\
!*** ./src/ui/errorBoundary.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDErrorBoundary; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class BDErrorBoundary extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.state = {
hasError: false
};
}
componentDidCatch() {
this.setState({
hasError: true
});
}
render() {
if (this.state.hasError) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "react-error"
}, "Component Error");
return this.props.children;
}
}
const originalRender = BDErrorBoundary.prototype.render;
Object.defineProperty(BDErrorBoundary.prototype, "render", {
enumerable: false,
configurable: false,
set: function () {
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
},
get: () => originalRender
});
/***/ }),
/***/ "./src/ui/icons/delete.jsx":
/*!*********************************!*\
!*** ./src/ui/icons/delete.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Delete; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Delete extends React.Component {
render() {
const size = this.props.size || "24px";
return React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), React.createElement("path", {
d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z"
}), React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/downarrow.jsx":
/*!************************************!*\
!*** ./src/ui/icons/downarrow.jsx ***!
\************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DownArrow; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class DownArrow extends React.Component {
render() {
const size = this.props.size || "16px";
return React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, React.createElement("path", {
d: "M8.12 9.29L12 13.17l3.88-3.88c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41l-4.59 4.59c-.39.39-1.02.39-1.41 0L6.7 10.7c-.39-.39-.39-1.02 0-1.41.39-.38 1.03-.39 1.42 0z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/edit.jsx":
/*!*******************************!*\
!*** ./src/ui/icons/edit.jsx ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Edit; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Edit extends React.Component {
render() {
const size = this.props.size || "24px";
return React.createElement("svg", {
className: this.props.className || "",
viewBox: "0 0 24 24",
fill: "#FFFFFF",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
d: "M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"
}), React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/history.jsx":
/*!**********************************!*\
!*** ./src/ui/icons/history.jsx ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return History; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
{
/* <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 React.createElement("svg", {
viewBox: "0 0 24 24",
fill: "#FFFFFF",
className: this.props.className || "",
style: {
width: size,
height: size
},
onClick: this.props.onClick
}, React.createElement("path", {
d: "M0 0h24v24H0z",
fill: "none"
}), React.createElement("path", {
d: "M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"
}));
}
}
/***/ }),
/***/ "./src/ui/icons/search.jsx":
/*!*********************************!*\
!*** ./src/ui/icons/search.jsx ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Search; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
class Search extends React.Component {
render() {
const size = this.props.size || "16px";
return React.createElement("svg", {
className: this.props.className || "",
fill: "#FFFFFF",
viewBox: "0 0 24 24",
style: {
width: size,
height: size
}
}, React.createElement("path", {
fill: "none",
d: "M0 0h24v24H0V0z"
}), React.createElement("path", {
d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"
}));
}
}
/***/ }),
/***/ "./src/ui/presenceSettings.jsx":
/*!*************************************!*\
!*** ./src/ui/presenceSettings.jsx ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PresenceSettings; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./select */ "./src/ui/select.jsx");
/* harmony import */ var _timestampRender__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timestampRender */ "./src/ui/timestampRender.js");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_8__);
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
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();
}
}
/**
*
* @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: []
});
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();
}).catch(() => {
this.isfetching = false;
this.setState({
data: this.state.data,
assets: []
});
this.forceUpdate();
});
}
updatePreview(data) {
this.setState({
data
});
}
render() {
let contentModule = BDModules.get(e => e.contentColumn)[0];
return React.createElement("div", {
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
style: {
padding: "60px 40px 0px"
}
}, React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
title: "RichPresence Settings",
settings: this.props.settings,
onChange: this.props.onChange
}), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "RichPresence"
}), React.createElement("div", null, RPCProps.map(e => {
if (e.type === "text") {
return React.createElement(InputText, {
setting: e,
manager: this,
id: e.id
});
} else if (e.type === "number") {
let array = [React.createElement(InputNumber, {
setting: e,
manager: this,
id: e.id
})];
/*
if(e.id === "timestamps.start"){
array.unshift(<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 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.";
}
}
})), React.createElement("div", null, React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
text: "Preview"
}), React.createElement(RpcPreview, {
settings: this
})), React.createElement("div", {
className: BDModules.get(e => e.marginBottom20)[0].marginBottom20
}), React.createElement("button", {
style: {
opacity: 0.01
},
onClick: window.ohgodohfuck
}, "Oh god Oh fuck"), React.createElement("button", {
style: {
opacity: 0.01
},
onclick: () => {
electron__WEBPACK_IMPORTED_MODULE_8__["remote"].shell.openExternal("https://www.youtube.com/watch?v=LkYa7rps_g4", {
activate: true
});
}
}, "See ? I pulled a litle sneaky on ya"));
}
}
const RPCProps = [{
title: "Application ID",
id: "application_id",
type: "number"
}, {
title: "Name",
id: "name",
type: "text"
}, {
title: "Details",
id: "details",
type: "text"
}, {
title: "State",
id: "state",
type: "text"
}, {
title: "Timestamp Start",
id: "timestamps.start",
type: "number"
}, {
title: "LargeAsset",
id: "assets.large",
type: "choice"
}, {
title: "SmallAsset",
id: "assets.small",
type: "choice"
}];
class InputText extends React.Component {
render() {
let setting = this.props.setting;
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
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 flexModule = BDModules.get(e => e._horizontal)[0];
let inputModule = BDModules.get(e => e.inputMini)[0];
let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement("div", {
className: inputModule.inputWrapper
}, React.createElement("input", {
class: `${inputModule.inputDefault} ${sizeModule2.size16}`,
name: "state",
type: "text",
placeholder: "",
maxlength: "999",
value: this.props.manager.state.data[setting.id],
onChange: ev => {
this.props.manager.onChange(this, ev.target.value);
}
}))), React.createElement("div", {
class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`
}));
}
}
class InputNumber extends React.Component {
render() {
let setting = this.props.setting;
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
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 flexModule = BDModules.get(e => e._horizontal)[0];
let inputModule = BDModules.get(e => e.inputMini)[0];
let sizeModule2 = BDModules.get(e => e.size16 && e.size20)[0];
let euhModule1 = BDModules.get(e => e.colorTransparent)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement("div", {
className: inputModule.inputWrapper
}, React.createElement("input", {
class: `${inputModule.inputDefault} ${sizeModule2.size16}`,
name: "state",
type: "text",
placeholder: "",
maxlength: "999",
value: this.props.manager.state.data[setting.id],
onChange: ev => {
let newValue = ev.target.value.replace(/[^\d]+/g, "");
if (newValue !== ev.target.value) {
ev.target.value = newValue;
}
this.props.manager.onChange(this, newValue);
}
})), setting.id === "timestamps.start" ? React.createElement("div", {
className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper
}, React.createElement("button", {
type: "button",
class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,
style: {
flex: "0 1 auto"
},
onClick: () => {
DiscordNative.clipboard.copy(Date.now() + "");
}
}, React.createElement("div", {
class: euhModule1.contents
}, "Copy current timestamp"))) : null), React.createElement("div", {
class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].dividerDefault}`
}));
}
}
class InputChoice extends React.Component {
onChange(data) {
this.props.manager.onChange(this, data.value === "none" ? null : data.value.replace("asset-", ""));
}
render() {
let setting = this.props.setting;
let rowModule = BDModules.get(e => e.removeKeybind)[0];
let marginModule = BDModules.get(e => e.marginBottom20)[0];
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 flexModule = BDModules.get(e => e._horizontal)[0];
let options = this.props.choices;
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("h5", {
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
}, setting.title), React.createElement(_select__WEBPACK_IMPORTED_MODULE_6__["default"], {
value: "asset-" + this.props.manager.state.data[setting.id] || false,
onChange: this.onChange.bind(this),
options: options
})), React.createElement("div", {
class: `${BDModules.get(e => e.divider && Object.keys(e).length === 1)[0].divider} ${BDModules.get(e => e.dividerDefault)[0].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];
let euhModule1 = BDModules.get(e => e.colorTransparent)[0];
return React.createElement("div", {
className: rowModule.row + " " + marginModule.marginBottom20
}, React.createElement("div", {
className: `${rowModule.item} ${flexModule.flexChild}`
}, React.createElement("div", {
className: BDModules.get(e => e.buttonWrapper)[0].buttonWrapper
}, React.createElement("button", {
type: "button",
class: `${flexModule.flexChild} ${euhModule1.button} ${euhModule1.lookFilled} ${euhModule1.colorBrand} ${euhModule1.sizeSmall} ${euhModule1.grow}`,
style: {
flex: "0 1 auto"
},
onClick: this.onClick
}, React.createElement("div", {
class: euhModule1.contents
}, this.props.title)))));
}
}
class RpcPreview extends React.Component {
constructor(props = {}) {
super(props);
this.state = {
active: "profile"
};
this.tabs = [];
this.props.settings.preview = this;
}
changeTab(tab) {
let ancientTab = this.state.active;
if (ancientTab === tab.props.id) return;
this.tabs.forEach(e => {
e.setActive(false);
});
tab.setActive(true);
this.setState({
active: tab.props.id
});
}
render() {
let preview = new this.preview({
preview: this
});
preview.setState(this.state.rpc);
return React.createElement("div", {
className: "lc-tabWrapper"
}, React.createElement("div", {
className: "lc-tabnav",
style: {
flex: "0 1 auto"
}
}, React.createElement(Tab, {
preview: this,
title: "Full Profile",
id: "profile"
}), React.createElement(Tab, {
preview: this,
title: "User Popout",
id: "popout"
})), preview.render());
}
isActive(tab) {
return this.state.active === tab;
}
get preview() {
if (this.state.active === "profile") return Profile;
return Popout;
}
}
class Tab extends React.Component {
constructor(props) {
super(props);
this.state = {
active: props.preview.isActive(props.id)
};
props.preview.tabs.push(this);
}
setActive(isActive) {
this.setState({
active: !!isActive
});
}
render() {
let className = `lc-navItem`;
if (this.state.active) {
className += ` lc-navItemActive`;
} else {
className += ` lc-navItemInactive`;
}
return React.createElement("div", {
className: className,
onClick: () => {
this.props.preview.changeTab(this);
}
}, this.props.title);
}
}
class Popout extends React.Component {
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1] = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0]];
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
timestampClass = timestampClass || activityModule1.timestamp;
return React.createElement("div", {
className: "lc-userPopout"
}, React.createElement("div", {
class: rootModule1.userPopout,
role: "dialog",
tabindex: "-1"
}, React.createElement("div", {
class: rootModule1.headerPlaying
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: rootModule1.avatarWrapperNormal,
role: "button",
tabindex: "0"
}, React.createElement("div", {
class: avatarModule1,
role: "img",
style: {
width: "80px",
height: "80px"
}
}, React.createElement("svg", {
width: "92",
height: "80",
viewBox: "0 0 92 80",
class: `${avatarModule1.mask} ${avatarModule1.svg}`
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("img", {
src: avatarURL,
alt: " ",
class: avatarModule1.avatar
})), React.createElement(Status, null))), React.createElement("svg", {
width: "80",
height: "80",
class: rootModule1.avatarHint,
viewBox: "0 0 80 80"
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("div", {
class: rootModule1.avatarHintInner
}, Messages.VIEW_PROFILE)))), React.createElement("div", {
class: rootModule1.headerText
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`
}, React.createElement("span", {
class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`
}, user.username), React.createElement("span", null, "#", user.discriminator))))), React.createElement("div", {
class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`
}, React.createElement("h3", {
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
class: activityModule1.bodyNormal
}, (() => {
if (!data["assets.large"]) return null;
let images = [];
if (data["assets.large"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
class: `${activityModule1.assetsLargeImageUserPopout} ${data["assets.small"] ? activityModule1.assetsLargeMaskUserPopout : ""}`
}));
}
if (data["assets.small"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
class: activityModule1.assetsSmallImageUserPopout
}));
}
return React.createElement("div", {
class: activityModule1.assets
}, images);
})(), React.createElement("div", {
class: activityModule1.contentImagesUserPopout,
style: {
flex: "1 1 auto"
}
}, (() => {
if (!data.name) return null;
return React.createElement("h3", {
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
title: data.name
}, React.createElement("span", {
class: activityModule1.activityName
}, data.name));
})(), (() => {
if (!data.details) return null;
return React.createElement("div", {
title: data.title,
class: activityModule1.details
}, data.details);
})(), (() => {
if (!data.state) return null;
return React.createElement("div", {
class: activityModule1.state
}, React.createElement("span", {
title: data.state
}, data.state));
})(), (() => {
if (!data["timestamps.start"]) return null;
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__["default"])(Timestamp, Messages);
return React.createElement("div", {
class: activityModule1.timestamp
}, React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
}));
})())))), React.createElement("div", {
class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`
}, React.createElement("div", {
class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`
}, React.createElement("div", {
class: rootModule1.bodyTitle
}, Messages.NOTE), React.createElement("div", {
class: `${noteModule1.note} ${rootModule1.note}`
}, React.createElement("textarea", {
placeholder: Messages.NOTE_PLACEHOLDER,
maxlength: "256",
autocorrect: "off",
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
style: {
height: "36px"
},
disabled: true
})))), React.createElement("div", {
class: rootModule1.footer
}, React.createElement("div", {
class: `${rootModule1.protip} ${protipModule1.inline}`
}, React.createElement("h3", {
class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,
style: {
color: "rgb(67, 181, 129)"
}
}, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement("div", {
class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`
}, Messages.CONTEXT_MENU_HINT)))));
}
}
class Status extends React.Component {
render() {
let status = BDModules.get(e => e.default && e.default.getPresence)[0].default.getPresence().status;
if (status === "invisible") status = "offline";
let className = BDModules.get(e => e.pointerEvents)[0].pointerEvents;
return React.createElement("rect", {
width: "16",
height: "16",
x: "60",
y: "60",
fill: "#ffffff",
mask: `url(#svg-mask-status-${status})`,
className: className
});
}
}
let timestampClass = "";
class Profile extends React.Component {
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages];
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
timestampClass = timestampClass || activityModule1.timestamp;
return [React.createElement("div", {
className: "lc-tab"
}, React.createElement("div", {
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.root}`,
style: {
flex: "1 1 auto"
}
}, React.createElement("div", {
class: rootModule1.topSectionPlaying
}, React.createElement("header", {
class: rootModule1.header
}, React.createElement("div", {
class: `${rootModule1.avatar} ${avatarModule1.wrapper}`,
role: "img",
style: {
width: "80px",
height: "80px"
}
}, React.createElement("svg", {
width: "92",
height: "80",
viewBox: "0 0 92 80",
class: `${avatarModule1.mask} ${avatarModule1.svg}`
}, React.createElement("foreignObject", {
x: "0",
y: "0",
width: "80",
height: "80",
mask: "url(#svg-mask-avatar-status-round-80)"
}, React.createElement("img", {
src: avatarURL,
alt: " ",
class: avatarModule1.avatar
})), React.createElement(Status, null))), React.createElement("div", {
class: `${rootModule1.headerInfo}`
}, React.createElement("div", {
class: `${rootModule1.nameTag} ${nameTagModule1.nameTag}`
}, React.createElement("span", {
class: `${rootModule1.username} ${rootModule1.username}`
}, user.username), React.createElement("span", {
class: rootModule1.discriminator
}, "#", user.discriminator)), React.createElement("div", {
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignStretch} ${stylingModule1.noWrap} ${rootModule1.profileBadges}`,
style: {
flex: "1 1 auto"
}
}, React.createElement(Badges, null)))), React.createElement("div", {
class: rootModule1.headerFill
}, React.createElement("div", {
class: `${activityModule1.activityProfile} ${rootModule1.activity}`
}, React.createElement("h3", {
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
class: activityModule1.bodyNormal
}, (() => {
if (!data["assets.large"]) return null;
let images = [];
if (data["assets.large"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
class: `${activityModule1.assetsLargeImageProfile} ${data["assets.small"] ? activityModule1.assetsLargeMaskProfile : ""}`
}));
}
if (data["assets.small"]) {
images.push(React.createElement("img", {
alt: "",
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
class: activityModule1.assetsSmallImageProfile
}));
}
return React.createElement("div", {
class: activityModule1.assets
}, images);
})(), React.createElement("div", {
class: activityModule1.contentImagesProfile,
style: {
flex: "1 1 auto"
}
}, (() => {
if (!data.name) return null;
return React.createElement("h3", {
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
title: data.name
}, React.createElement("span", {
class: activityModule1.activityName
}, data.name));
})(), (() => {
if (!data.details) return null;
return React.createElement("div", {
title: data.title,
class: activityModule1.details
}, data.details);
})(), (() => {
if (!data.state) return null;
return React.createElement("div", {
class: activityModule1.state
}, React.createElement("span", {
title: data.state
}, data.state));
})(), (() => {
if (!data["timestamps.start"]) return null;
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_7__["default"])(Timestamp, Messages);
return React.createElement("div", {
class: activityModule1.timestamp
}, React.createElement(timeComponent, {
timestamps: {
end: null,
start: data["timestamps.start"]
}
}));
})()))))), React.createElement("div", {
class: rootModule1.body
}, React.createElement("div", {
class: `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerFade}`
}, React.createElement("div", {
class: scrollerModule1.scroller
}, React.createElement("div", {
class: rootModule1.userInfoSection
}, React.createElement("div", {
class: rootModule1.userInfoSectionHeader
}, Messages.NOTE), React.createElement("div", {
class: `${rootModule1.note} ${noteModule1.note}`
}, React.createElement("textarea", {
placeholder: Messages.NOTE_PLACEHOLDER,
maxlength: "256",
autocorrect: "off",
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
style: {
height: "40px"
},
disabled: true
}))), React.createElement(ConnectedAccounts, null)))))), React.createElement("div", {
class: "lc- "
})];
}
}
class ConnectedAccounts extends React.Component {
render() {
let accounts = [];
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default;
let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1);
for (let acc of accs) {
accounts.push(React.createElement(ConnectedAccount, {
acc: acc
}));
}
if (accounts.length > 0) {
return React.createElement("div", {
class: rootModule1.userInfoSection
}, React.createElement("div", {
class: rootModule1.connectedAccounts
}, accounts));
}
return null;
}
}
class ConnectedAccount extends React.Component {
render() {
let [flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants] = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default];
let acc = this.props.acc;
let constantsSocial = SocialConstants.get(acc.type);
return React.createElement("div", {
class: `${flexModule1.flex} ${flexModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.connectedAccount}`,
style: {
flex: "0 1 auto"
}
}, React.createElement("img", {
alt: `Logo ${constantsSocial.name}`,
class: rootModule1.connectedAccountIcon,
src: constantsSocial.icon.color || constantsSocial.icon.white || constantsSocial.icon.grey
}), React.createElement("div", {
class: rootModule1.connectedAccountNameInner
}, React.createElement("div", {
class: rootModule1.connectedAccountName
}, acc.name), acc.verified ? React.createElement("span", null, React.createElement("div", {
class: `${flowerModule1.flowerStarContainer} ${rootModule1.connectedAccountVerifiedIcon}`,
style: {
width: "16px",
height: "16px"
}
}, React.createElement("svg", {
class: flowerModule1.flowerStar,
width: "16",
height: "16",
viewBox: "0 0 16 15.2"
}, React.createElement("path", {
fill: "#4f545c",
"fill-rule": "evenodd",
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
})), React.createElement("div", {
class: flowerModule1.childContainer
}, React.createElement("svg", {
width: "16",
height: "16",
viewBox: "0 0 16 15.2"
}, React.createElement("path", {
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z",
fill: "#ffffff"
}))))) : null), React.createElement("a", {
class: `${anchorModule1.anchor} ${anchorModule1.anchorUnderlineOnHover}`,
rel: "noreferrer noopener",
target: "_blank",
role: "button",
tabindex: "0"
}, React.createElement("svg", {
class: rootModule1.connectedAccountOpenIcon,
width: "24",
height: "24",
viewBox: "0 0 24 24"
}, React.createElement("path", {
fill: "currentColor",
d: "M10 5V3H5.375C4.06519 3 3 4.06519 3 5.375V18.625C3 19.936 4.06519 21 5.375 21H18.625C19.936 21 21 19.936 21 18.625V14H19V19H5V5H10Z"
}), React.createElement("path", {
fill: "currentColor",
d: "M21 2.99902H14V4.99902H17.586L9.29297 13.292L10.707 14.706L19 6.41302V9.99902H21V2.99902Z"
}))));
}
}
class Badges extends React.Component {
render() {
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
let rootModule = BDModules.get(e => e.topSectionStreaming)[0];
let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags;
let badges = [];
let serialized = [];
for (let flagName in UserFlags) {
if (user.hasFlag(UserFlags[flagName])) serialized.push(flagName);
}
for (let flagName of serialized) {
let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, " ").split(" ").map(e => e[0].toUpperCase() + e.slice(1)).join("")}`;
searchable = searchable.replace("HypesquadOnline", "HypeSquadOnline");
if (!rootModule[searchable]) continue;
badges.push(React.createElement(Badge, {
name: searchable
}));
}
if (user.hasPremiumSubscription) {
badges.push(React.createElement(Badge, {
name: "profileBadgePremium"
}));
}
return badges;
}
}
class Badge extends React.Component {
render() {
let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0];
return React.createElement("div", {
class: rootModule1.profileBadgeWrapper
}, React.createElement("div", null, React.createElement("div", {
class: "",
role: "button",
tabindex: "0"
}, React.createElement("div", {
class: `${rootModule1.profileBadge} ${rootModule1[this.props.name]}`
}))));
}
}
class Timestamp extends React.Component {
render() {
return React.createElement("div", {
className: timestampClass
}, this.props.message);
}
}
/***/ }),
/***/ "./src/ui/publicservers/layer.js":
/*!***************************************!*\
!*** ./src/ui/publicservers/layer.js ***!
\***************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js");
class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.keyupListener = this.keyupListener.bind(this);
}
keyupListener(e) {
if (e.which === 27) {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode);
}
}
componentDidMount() {
window.addEventListener("keyup", this.keyupListener);
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`;
thisNode.style.opacity = progress;
if (progress == 1) {
setImmediate(() => {
thisNode.style.transform = "";
thisNode.style.opacity = "";
});
}
}
});
}
componentWillUnmount() {
window.removeEventListener("keyup", this.keyupListener);
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`;
thisNode.style.opacity = 1 - progress;
if (progress == 1) {
setImmediate(() => {
thisNode.remove();
});
}
}
});
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen");
layer.classList.remove("publicServersOpen");
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`;
layer.style.opacity = progress;
if (progress == 1) {
setImmediate(() => {
layer.style.transform = "";
layer.style.opacity = "";
});
}
}
});
}
componentWillMount() {
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]");
layer.classList.add("publicServersOpen");
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
duration: 200,
update: function (progress) {
layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`;
layer.style.opacity = 1 - progress;
}
});
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer,
id: this.props.id,
ref: "root",
style: {
opacity: 0,
transform: "scale(1.1) translateZ(0px)"
}
}, this.props.children);
}
}
/***/ }),
/***/ "./src/ui/publicservers/publicServers.js":
/*!***********************************************!*\
!*** ./src/ui/publicservers/publicServers.js ***!
\***********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js");
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js");
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js");
/* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js");
/* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js");
class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.setInitialState();
this.close = this.close.bind(this);
this.changeCategory = this.changeCategory.bind(this);
this.search = this.search.bind(this);
this.searchKeyDown = this.searchKeyDown.bind(this);
this.checkConnection = this.checkConnection.bind(this);
this.join = this.join.bind(this);
this.connect = this.connect.bind(this);
this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]);
this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]);
this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
}
componentDidMount() {
this.checkConnection();
}
setInitialState() {
this.state = {
selectedCategory: -1,
title: "Loading...",
loading: true,
servers: [],
next: null,
connection: {
state: 0,
user: null
}
};
}
close() {
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId));
}
search(query, clear) {
const self = this;
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
method: "get"
}).then(async res => {
if (res.status !== 200) throw await res.text();
let data = await res.json();
let servers = data.results.reduce((arr, server) => {
server.joined = false;
arr.push(server); // arr.push(<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
});
if (clear) {
//console.log(self);
self.refs.sbv.refs.contentScroller.scrollTop = 0;
}
}).catch(err => {
console.error(err);
return self.setState({
loading: false,
title: "Failed to load servers. Check console for details"
});
});
}
async join(serverCard) {
if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);
await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`, {
method: "GET",
credentials: "include",
mode: "cors",
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
serverCard.setState({
joined: true
});
}
connect() {
const self = this;
const options = self.windowOptions;
options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);
options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);
self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options);
const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info";
self.joinWindow.webContents.on("did-navigate", (event, url) => {
if (url != "https://auth.discordservers.com/info") return;
self.joinWindow.close();
self.checkConnection();
});
self.joinWindow.loadURL(url);
}
get windowOptions() {
return {
width: 500,
height: 550,
backgroundColor: "#282b30",
show: true,
resizable: false,
maximizable: false,
minimizable: false,
alwaysOnTop: true,
frame: false,
center: false,
webPreferences: {
nodeIntegration: false
}
};
}
get bdServer() {
const server = {
name: "BetterDiscord",
online: "7500+",
members: "20000+",
categories: ["community", "programming", "support"],
description: "Official BetterDiscord server for support etc",
identifier: "86004744966914048",
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
nativejoin: true,
invite_code: "0Tmfo5ZbORCRqbAd",
pinned: true
};
const server2 = {
name: "Lightcord",
online: "30+",
members: "50+",
categories: ["community", "programming", "support"],
description: "Official Lightcord server for support etc",
identifier: "86004744966914048",
iconUrl: "https://cdn.discordapp.com/icons/705908350218666117/05a5652f7d1d0ae328ca7d6e2354a82a.webp",
nativejoin: true,
invite_code: "7eFff2A",
pinned: true
};
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
server: server2,
pinned: true,
join: this.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
server: server,
pinned: true,
join: this.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
})];
}
get endPoint() {
return "https://search.discordservers.com";
}
get joinEndPoint() {
return "https://j.discordservers.com";
}
get connectEndPoint() {
return "https://join.discordservers.com/connect";
}
async checkConnection() {
const self = this;
try {
const response = await fetch(`https://auth.discordservers.com/info`, {
method: "GET",
credentials: "include",
mode: "cors",
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
}
});
const data = await response.json();
self.setState({
selectedCategory: 0,
connection: {
state: 2,
user: data
}
});
self.search("", true);
} catch (error) {
console.error(error);
self.setState({
title: "Not connected to discordservers.com!",
loading: true,
selectedCategory: -1,
connection: {
state: 1,
user: null
}
});
}
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], {
ref: "sbv"
}, this.component);
}
get component() {
return {
sidebar: {
component: this.sidebar
},
content: {
component: this.content
},
tools: {
component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], {
key: "pt",
ref: "tools",
onClick: this.close
})
}
};
}
get sidebar() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "sidebar",
key: "ps"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar SIDE"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header",
style: {
fontSize: "16px"
}
}, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Categories"
}), this.categoryButtons.map((value, index) => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], {
id: index,
onClick: this.changeCategory,
key: index,
text: value,
selected: this.state.selectedCategory === index
});
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection));
}
get searchInput() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-form-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-text-input flex-vertical",
style: {
width: "172px",
marginLeft: "10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
ref: "searchinput",
onKeyDown: this.searchKeyDown,
onChange: () => {},
type: "text",
className: "input default",
placeholder: "Search...",
maxLength: "50"
})));
}
searchKeyDown(e) {
const self = this;
if (self.state.loading || e.which !== 13) return;
self.setState({
loading: true,
title: "Loading...",
term: e.target.value
});
let query = `?term=${e.target.value}`;
if (self.state.selectedCategory !== 0) {
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
}
self.search(query, true);
}
get categoryButtons() {
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
}
changeCategory(id) {
const self = this;
if (self.state.loading) return;
self.refs.searchinput.value = "";
self.setState({
loading: true,
selectedCategory: id,
title: "Loading...",
term: null
});
if (id === 0) {
self.search("", true);
return;
}
self.search(`?category=${self.categoryButtons[id]}`, true);
}
get content() {
const self = this;
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
if (self.state.connection.state === 1) return self.notConnected;
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
ref: "content",
key: "pc",
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: self.state.title
}), self.bdServer, self.state.servers.map(server => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
key: server.identifier,
server: server,
join: self.join,
guildList: guildList,
fallback: defaultList[Math.floor(Math.random() * 5)]
});
}), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
onClick: () => {
if (self.state.loading) return;
self.setState({
loading: true
});
self.search(self.state.next, false);
},
className: "ui-button filled brand small grow",
style: {
width: "100%",
marginTop: "10px",
marginBottom: "10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: self.state.title
}))];
}
get notConnected() {
const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "ncc",
ref: "content",
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20"
}, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
onClick: self.connect,
type: "button",
className: "ui-button filled brand small grow",
style: {
display: "inline-block",
minHeight: "18px",
marginLeft: "10px",
lineHeight: "14px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Connect"))), self.bdServer)];
}
get footer() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", {
href: "https://discordservers.com",
target: "_blank"
}, "Discordservers.com"));
}
get connection() {
const self = this;
const {
connection
} = self.state;
if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null);
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", {
style: {
color: "#b9bbbe",
fontSize: "10px",
marginLeft: "10px"
}
}, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
style: {
padding: "5px 10px 0 10px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
style: {
width: "100%",
minHeight: "20px"
},
type: "button",
className: "ui-button filled brand small grow"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents",
onClick: self.connect
}, "Reconnect"))));
}
}
/***/ }),
/***/ "./src/ui/publicservers/serverCard.js":
/*!********************************************!*\
!*** ./src/ui/publicservers/serverCard.js ***!
\********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;
this.state = {
imageError: false,
joined: this.props.guildList.includes(this.props.server.identifier)
};
}
render() {
const {
server
} = this.props;
let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0];
let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0];
let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to
{
className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}`
}, // BDV2.react.createElement(
// "div",
// { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" },
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", {
ref: "img",
className: "bd-server-image",
src: server.iconUrl,
onError: this.handleError.bind(this)
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.flexChild + " bd-server-content"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"
}, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"
}, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: flexModule.horizontal + " " + wrapModule.noWrap
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scroller-2FKFPG scroller bd-server-description"
}, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "flexChild-faoVW3 bd-server-tags",
style: {
flex: "1 1 auto"
}
}, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",
style: {
minHeight: "12px",
marginTop: "4px",
backgroundColor: "#3ac15c"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",
style: {
minHeight: "12px",
marginTop: "4px",
backgroundColor: "#c13a3a"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
type: "button",
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",
style: {
minHeight: "12px",
marginTop: "4px"
},
onClick: () => {
this.join();
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-button-contents"
}, "Join")))) // )
);
}
handleError() {
this.props.server.iconUrl = this.props.fallback;
this.setState({
imageError: true
});
}
join() {
this.props.join(this); //this.setState({joined: true});
}
}
/***/ }),
/***/ "./src/ui/publicservers/sidebarView.js":
/*!*********************************************!*\
!*** ./src/ui/publicservers/sidebarView.js ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js");
class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
sidebar,
content,
tools
} = this.props.children;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "standardSidebarView-3F1I7i ui-standard-sidebar-view"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "sidebarRegion-VFTUkN sidebar-region"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], {
key: "sidebarScroller",
ref: "sidebarScroller",
sidebar: true,
fade: sidebar.fade || true,
dark: sidebar.dark || true
}, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentRegion-3nDuYy content-region"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentTransitionWrap-3hqOEW content-transition-wrap"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller",
ref: "contentScroller"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default"
}, content.component), tools.component)))));
}
}
/***/ }),
/***/ "./src/ui/reloadIcon.js":
/*!******************************!*\
!*** ./src/ui/reloadIcon.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 24 24",
fill: "#dcddde",
className: "bd-reload " + this.props.className,
onClick: this.props.onClick,
style: {
width: this.props.size || "24px",
height: this.props.size || "24px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
fill: "none",
d: "M0 0h24v24H0z"
}));
}
}
/***/ }),
/***/ "./src/ui/scroller.js":
/*!****************************!*\
!*** ./src/ui/scroller.js ***!
\****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
//scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y
let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0];
let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0];
let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`;
let scrollerClass = scrollerModule1.scroller + " scroller";
/* fuck */
if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`;
if (this.props.contentColumn) {
scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller";
/* fuck */
wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`;
}
const {
children
} = this.props;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "scrollerwrap",
className: wrapperClass
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
key: "scroller",
ref: "scroller",
className: scrollerClass
}, children));
}
}
/***/ }),
/***/ "./src/ui/sectionedSettingsPanel.js":
/*!******************************************!*\
!*** ./src/ui/sectionedSettingsPanel.js ***!
\******************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SectionedSettingsPanel; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
}, this.props.sections.map(section => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, {
onChange: this.props.onChange
}));
}));
}
}
/***/ }),
/***/ "./src/ui/select.jsx":
/*!***************************!*\
!*** ./src/ui/select.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");
/**
* @type {typeof import("react")}
*/
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
class Select extends React.Component {
handleChange(value) {
this.props.value = value;
if (typeof this.props.onChange == "function") this.props.onChange(value, this);
this.forceUpdate();
}
render() {
let flex = BDModules.get(e => e.default && e.default.Wrap && e.default.Direction && e.default.Child)[0].default;
let nativeSelect = BDModules.get(e => e.default && e.default.displayName === "SelectTempWrapper")[0].default;
return React.createElement("flex", {
direction: flex.Direction.HORIZONTAL,
align: flex.Align.CENTER
}, React.createElement(nativeSelect, Object.assign({}, this.props, {
onChange: this.handleChange.bind(this)
})));
/*
return BDFDB.ReactUtils.createElement(InternalComponents.LibraryComponents.Flex, {
className: BDFDB.disCN.selectwrapper,
direction: InternalComponents.LibraryComponents.Flex.Direction.HORIZONTAL,
align: InternalComponents.LibraryComponents.Flex.Align.CENTER,
children: BDFDB.ReactUtils.createElement(InternalComponents.NativeSubComponents.Select, Object.assign({}, this.props, {
onChange: this.handleChange.bind(this)
}))
});*/
}
}
;
/***/ }),
/***/ "./src/ui/settingsGroup.js":
/*!*********************************!*\
!*** ./src/ui/settingsGroup.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
title,
settings,
button
} = this.props;
const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
key: "title-button",
className: "bd-pfbtn",
onClick: button.onClick
}, button.title) : null;
return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: title
}), buttonComponent, settings.map(setting => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
onChange: (id, checked) => {
this.props.onChange(id, checked);
}
});
})];
}
}
/***/ }),
/***/ "./src/ui/settingsPanel.js":
/*!*********************************!*\
!*** ./src/ui/settingsPanel.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_SettingsPanel; });
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
class V2C_SettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
const {
settings
} = this.props;
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: this.props.title
}), this.props.button && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
key: "title-button",
className: "bd-pfbtn",
onClick: this.props.button.onClick
}, this.props.button.title), settings.map(setting => {
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
id: setting.id,
key: setting.id,
data: setting,
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
onChange: (id, checked) => {
this.props.onChange(id, checked);
}
});
}));
}
}
/***/ }),
/***/ "./src/ui/settingsTitle.js":
/*!*********************************!*\
!*** ./src/ui/settingsTitle.js ***!
\*********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
} //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
className: "ui-form-title h2 margin-reset margin-bottom-20 " + BDModules.get(e => e.marginTop60)[0].marginTop60
}, this.props.text);
}
}
/***/ }),
/***/ "./src/ui/sidebar.js":
/*!***************************!*\
!*** ./src/ui/sidebar.js ***!
\***************************/
/*! exports provided: default, setUnselected */
/***/ (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_SideBar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUnselected", function() { return setUnselected; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabBarSeparator */ "./src/ui/tabBarSeparator.js");
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tabBarHeader */ "./src/ui/tabBarHeader.js");
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tabBarItem */ "./src/ui/tabBarItem.js");
class V2C_SideBar extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
const si = document.querySelector("[class*=side-] > [class*=selected]");
if (si) this.scn = si.className;
const ns = document.querySelector("[class*=side-] > [class*='item-']:not([class*=selected])");
if (ns) this.nscn = ns.className;
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
for (const element of tabs) {
element.addEventListener("click", () => {
this.setState({
selected: null
});
});
}
this.setInitialState();
this.onClick = this.onClick.bind(this);
this.setSelected = this.setSelected.bind(this);
sidebars.push(this);
}
setInitialState() {
const self = this;
self.state = {
selected: null,
items: self.props.items
};
const initialSelection = self.props.items.find(item => {
return item.selected;
});
if (initialSelection) {
self.state.selected = initialSelection.id;
}
}
render() {
const self = this;
const {
headerText
} = self.props;
const {
items,
selected
} = self.state;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_2__["default"], {
text: headerText,
button: this.props.headerButton
}), items.map(item => {
const {
id,
text
} = item;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_3__["default"], {
key: id,
selected: selected === id,
text: text,
id: id,
onClick: self.onClick
});
}));
}
setSelected(e) {
e.target.className = this.scn;
}
onClick(id) {
const si = document.querySelector("[class*=side] > [class*=selected]");
if (si) {
si.removeEventListener("click", this.setSelected);
si.addEventListener("click", this.setSelected);
si.className = this.nscn;
}
setUnselected();
this.setState({
selected: id
});
if (this.props.onClick) this.props.onClick(id);
}
componentWillUnmount() {
let sidebarIndex = sidebars.findIndex(e => e === this);
if (sidebarIndex) sidebars.splice(sidebarIndex, 1);
}
}
const sidebars = [];
function setUnselected() {
sidebars.forEach(sidebar => {
if (!sidebar.state.selected) return;
sidebar.setState({
selected: null
});
});
}
/***/ }),
/***/ "./src/ui/switch.js":
/*!**************************!*\
!*** ./src/ui/switch.js ***!
\**************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
class SwitchItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
}
onChange() {
this.props.checked = !this.props.checked;
this.props.onChange(this.props.id, this.props.checked);
}
render() {
const {
text,
info
} = this.props.data;
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h3", {
className: "ui-form-title h3 margin-reset margin-reset ui-flex-child"
}, text), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_1__["default"], {
onChange: this.onChange,
checked: this.props.checked
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-form-text style-description margin-top-4",
style: {
flex: "1 1 auto"
}
}, info));
}
}
/***/ }),
/***/ "./src/ui/tabBarHeader.js":
/*!********************************!*\
!*** ./src/ui/tabBarHeader.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarHeader; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarHeader extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-header"
}, this.props.text, this.props.button);
}
}
/***/ }),
/***/ "./src/ui/tabBarItem.js":
/*!******************************!*\
!*** ./src/ui/tabBarItem.js ***!
\******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarItem; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.setInitialState();
this.onClick = this.onClick.bind(this);
}
setInitialState() {
this.state = {
selected: this.props.selected || false
};
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: `ui-tab-bar-item${this.props.selected ? " selected" : ""}`,
onClick: this.onClick
}, this.props.text);
}
onClick() {
if (this.props.onClick) {
this.props.onClick(this.props.id);
}
}
}
/***/ }),
/***/ "./src/ui/tabBarSeparator.js":
/*!***********************************!*\
!*** ./src/ui/tabBarSeparator.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarSeparator; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_TabBarSeparator extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "ui-tab-bar-separator margin-top-8 margin-bottom-8"
});
}
}
/***/ }),
/***/ "./src/ui/timestampRender.js":
/*!***********************************!*\
!*** ./src/ui/timestampRender.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
const intervalModule1 = BDModules.get(e => e.Interval)[0];
/* harmony default export */ __webpack_exports__["default"] = (function (component, Messages) {
class TimeRender extends React.PureComponent {
constructor(props) {
super(props);
this._interval = new intervalModule1.Interval();
this.state = Object.assign({}, this.getUpdatedTime());
}
componentDidMount() {
let self = this;
this._interval.start(1e3, function () {
return self.setState(self.getUpdatedTime());
});
}
componentWillUnmount() {
this._interval.stop();
}
componentDidUpdate(activity) {
if (activity.timestamps.end === this.props.timestamps.end && activity.timestamps.start === this.props.timestamps.start) return;
this.setState(this.getUpdatedTime());
}
getUpdatedTime() {
let timestamps = this.props.timestamps;
let now = Date.now() / 1e3;
if (null != timestamps.end) {
return this.getDiff(now, checkUnix(timestamps.end) / 1e3);
}
if (null != timestamps.start) {
return this.getDiff(checkUnix(timestamps.start) / 1e3, now);
}
return {
hours: 0,
minutes: 0,
seconds: 0
};
}
renderTime(number, removeZero) {
if (removeZero === undefined) removeZero = false;
if (removeZero && number <= 0) return -1;
if (number < 10) return "0" + number;
return number;
}
getDiff(timestamp, now) {
let hours = Math.max(now - timestamp, 0);
let seconds = Math.floor(hours) % 60;
let minutes = Math.floor(hours / 60) % 60;
return {
hours: Math.floor(hours / 3600) % 24,
minutes,
seconds
};
}
render() {
let props = this.props;
let timestamps = props.timestamps;
let usedProps = function (props, items) {
if (null == props) return {};
let timestamps = {};
let keys = Object.keys(props);
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
if (!items.indexOf(key) >= 0) {
timestamps[key] = props[key];
}
}
return timestamps;
}(props, ["timestamps"]);
let state = this.state;
let hours = state.hours;
let minutes = state.minutes;
let seconds = state.seconds;
let data = {
hours: this.renderTime(hours, !0),
minutes: this.renderTime(minutes),
seconds: this.renderTime(seconds)
};
if (timestamps.end !== null) {
return React.createElement(component, Object.assign({}, usedProps, {
message: Messages.USER_ACTIVITY_TIMESTAMP_END.format(data)
}));
}
if (timestamps.start !== null) {
return React.createElement(component, Object.assign({}, usedProps, {
message: Messages.USER_ACTIVITY_TIMESTAMP_START.format(data)
}));
}
return null;
}
}
return TimeRender;
});
;
function checkUnix(e) {
return ("" + e).length < 13 ? 1e3 * e : e;
}
/***/ }),
/***/ "./src/ui/tools.js":
/*!*************************!*\
!*** ./src/ui/tools.js ***!
\*************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Tools; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js");
class V2C_Tools extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
}
render() {
let toolsModule = BDModules.get(e => e.toolsContainer)[0];
let containerModule = BDModules.get(e => e.container && e.closeButton && e.closeButtonBold)[0];
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "tools-container " + toolsModule.toolsContainer
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "tools " + toolsModule.tools
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: containerModule.container
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "btn-close " + containerModule.closeButton,
onClick: this.onClick
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_1__["default"], null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
className: "esc-text " + containerModule.keybind
}, "ESC"))));
}
onClick() {
if (this.props.onClick) {
this.props.onClick();
}
const closeButton = document.querySelector("." + BDModules.get(e => e.closeButton && e.keybindBold)[0].closeButton.split(" ")[0]);
if (closeButton) closeButton.click();
}
}
/***/ }),
/***/ "./src/ui/tooltip.js":
/*!***************************!*\
!*** ./src/ui/tooltip.js ***!
\***************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EmulatedTooltip; });
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
/**
* Tooltip that automatically show and hide themselves on mouseenter and mouseleave events.
* Will also remove themselves if the node to watch is removed from DOM through
* a MutationObserver.
*
* Note this is not using Discord's internals but normal DOM manipulation and emulates
* Discord's own tooltips as closely as possible.
*
* @module EmulatedTooltip
* @version 0.0.1
*/
//<div class="layer-v9HyYc disabledPointerEvents-1ptgTB" style="position: absolute; left: 237px; bottom: 51px;">
// <div class="tooltip-2QfLtc tooltipTop-XDDSxx tooltipBlack-PPG47z tooltipDisablePointerEvents-3eaBGN" style="opacity: 1; transform: none;">
// <div class="tooltipPointer-3ZfirK"></div>
// <div class="tooltipContent-bqVLWK">User Settings</div>
// </div>
//</div>
//<div class="layer-v9HyYc" style="top: 860px; left: 632.5px;">
// <div class="tooltip-2QfLtc tooltipBlack-PPG47z tooltipTop-XDDSxx">
// <div class="tooltipPointer-3ZfirK"></div>
// Changelog
// </div>
//</div>
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`;
};
/* <div class="layer-v9HyYc da-layer" style="left: 234.5px; bottom: 51px;">
<div class="tooltip-2QfLtc da-tooltip tooltipTop-XDDSxx tooltipBlack-PPG47z">
<div class="tooltipPointer-3ZfirK da-tooltipPointer"></div>
User Settings
</div>
</div> */
class EmulatedTooltip {
/**
*
* @constructor
* @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on
* @param {string} tip - string to show in the tooltip
* @param {object} options - additional options for the tooltip
* @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow)
* @param {string} [options.side=top] - can be any of top, right, bottom, left
* @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen
* @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover
*/
constructor(node, text, options = {}) {
const {
style = "black",
side = "top",
preventFlip = false,
disabled = false
} = options;
this.node = node instanceof jQuery ? node[0] : node;
this.label = text;
this.style = style.toLowerCase();
this.side = side.toLowerCase();
this.preventFlip = preventFlip;
this.disabled = disabled;
if (!classExists(this.side)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Side ${this.side} does not exist.`);
if (!classExists(this.style)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Style ${this.style} does not exist.`);
this.element = document.createElement("div");
this.element.className = getTooltipLayers().layer + " " + getTooltipLayers().disabledPointerEvents;
this.tooltipElement = document.createElement("div");
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
this.labelElement = document.createElement("div");
this.labelElement.className = getTooltipClasses().tooltipContent;
const pointerElement = document.createElement("div");
pointerElement.className = getTooltipClasses().tooltipPointer;
this.tooltipElement.append(pointerElement);
this.tooltipElement.append(this.labelElement);
this.element.append(this.tooltipElement);
this.node.addEventListener("mouseenter", () => {
if (this.disabled) return;
this.show();
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
const nodes = Array.from(mutation.removedNodes);
const directMatch = nodes.indexOf(this.node) > -1;
const parentMatch = nodes.some(parent => parent.contains(this.node));
if (directMatch || parentMatch) {
this.hide();
observer.disconnect();
}
});
});
observer.observe(document.body, {
subtree: true,
childList: true
});
});
this.node.addEventListener("mouseleave", () => {
this.hide();
});
}
/** Container where the tooltip will be appended. */
get container() {
return document.querySelector("." + BDModules.get(e => e.popouts)[0].popouts.split(" ")[0] + " ~ ." + BDModules.get(e => e.layerContainer)[0].layerContainer.split(" ")[0]);
}
/** Boolean representing if the tooltip will fit on screen above the element */
get canShowAbove() {
return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0;
}
/** Boolean representing if the tooltip will fit on screen below the element */
get canShowBelow() {
return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenHeight;
}
/** Boolean representing if the tooltip will fit on screen to the left of the element */
get canShowLeft() {
return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0;
}
/** Boolean representing if the tooltip will fit on screen to the right of the element */
get canShowRight() {
return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenWidth;
}
/** Hides the tooltip. Automatically called on mouseleave. */
hide() {
this.element.remove();
this.tooltipElement.className = this._className;
}
/** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */
show() {
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
this.labelElement.textContent = this.label;
this.container.append(this.element);
if (this.side == "top") {
if (this.canShowAbove || !this.canShowAbove && this.preventFlip) this.showAbove();else this.showBelow();
}
if (this.side == "bottom") {
if (this.canShowBelow || !this.canShowBelow && this.preventFlip) this.showBelow();else this.showAbove();
}
if (this.side == "left") {
if (this.canShowLeft || !this.canShowLeft && this.preventFlip) this.showLeft();else this.showRight();
}
if (this.side == "right") {
if (this.canShowRight || !this.canShowRight && this.preventFlip) this.showRight();else this.showLeft();
}
}
/** Force showing the tooltip above the node. */
showAbove() {
this.tooltipElement.classList.add(getClass("top"));
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10));
this.centerHorizontally();
}
/** Force showing the tooltip below the node. */
showBelow() {
this.tooltipElement.classList.add(getClass("bottom"));
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10));
this.centerHorizontally();
}
/** Force showing the tooltip to the left of the node. */
showLeft() {
this.tooltipElement.classList.add(getClass("left"));
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10));
this.centerVertically();
}
/** Force showing the tooltip to the right of the node. */
showRight() {
this.tooltipElement.classList.add(getClass("right"));
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10));
this.centerVertically();
}
centerHorizontally() {
const nodecenter = this.node.getBoundingClientRect().left + this.node.offsetWidth / 2;
this.element.style.setProperty("left", toPx(nodecenter - this.element.offsetWidth / 2));
}
centerVertically() {
const nodecenter = this.node.getBoundingClientRect().top + this.node.offsetHeight / 2;
this.element.style.setProperty("top", toPx(nodecenter - this.element.offsetHeight / 2));
}
}
/***/ }),
/***/ "./src/ui/tooltipWrap.js":
/*!*******************************!*\
!*** ./src/ui/tooltipWrap.js ***!
\*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
/* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js");
/* harmony default export */ __webpack_exports__["default"] = (class extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
async componentDidMount() {
const {
style = "black",
side = "top",
text = ""
} = this.props;
this.node = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.findDOMNode(this);
this.tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_1__["default"](this.node, text, {
style,
side
});
}
componentWillUnmount() {
this.tooltip.hide();
delete this.tooltip;
}
render() {
return this.props.children;
}
});
/***/ }),
/***/ "./src/ui/xSvg.js":
/*!************************!*\
!*** ./src/ui/xSvg.js ***!
\************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_XSvg; });
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
class V2C_XSvg extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
constructor(props) {
super(props);
}
render() {
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
xmlns: "http://www.w3.org/2000/svg",
viewBox: "0 0 12 12",
style: {
width: "18px",
height: "18px"
}
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", {
className: "background",
fill: "none",
fillRule: "evenodd"
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
d: "M0 0h12v12H0"
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
className: "fill",
fill: "#dcddde",
d: "M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"
})));
}
}
/***/ }),
/***/ "crypto":
/*!*************************!*\
!*** external "crypto" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("crypto");
/***/ }),
/***/ "electron":
/*!***************************!*\
!*** external "electron" ***!
\***************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("electron");
/***/ }),
/***/ "events":
/*!*************************!*\
!*** external "events" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("events");
/***/ }),
/***/ "fs":
/*!*********************!*\
!*** external "fs" ***!
\*********************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("fs");
/***/ }),
/***/ "mkdirp":
/*!*************************!*\
!*** external "mkdirp" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("mkdirp");
/***/ }),
/***/ "module":
/*!*************************!*\
!*** external "module" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("module");
/***/ }),
/***/ "node-fetch":
/*!*****************************!*\
!*** external "node-fetch" ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("node-fetch");
/***/ }),
/***/ "path":
/*!***********************!*\
!*** external "path" ***!
\***********************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("path");
/***/ }),
/***/ "request":
/*!**************************!*\
!*** external "request" ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("request");
/***/ }),
/***/ "rimraf":
/*!*************************!*\
!*** external "rimraf" ***!
\*************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("rimraf");
/***/ }),
/***/ "yauzl":
/*!************************!*\
!*** external "yauzl" ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = require("yauzl");
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3JlYWN0RGV2VG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2xpZ2h0Y29yZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BY2NvdW50SW5mb3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wcmVzZW5jZVNldHRpbmdzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NlcnZlckNhcmQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NpZGViYXJWaWV3LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Njcm9sbGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NlbGVjdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc0dyb3VwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc3dpdGNoLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySGVhZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFySXRlbS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhclNlcGFyYXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RpbWVzdGFtcFJlbmRlci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXBXcmFwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkveFN2Zy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImVsZWN0cm9uXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImV2ZW50c1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJta2RpcnBcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibW9kdWxlXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm5vZGUtZmV0Y2hcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicGF0aFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJyZXF1ZXN0XCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJpbXJhZlwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJ5YXV6bFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJMQ0NoYW5lbG9nIiwiZGVzY3JpcHRpb24iLCJjaGFuZ2VzIiwidGl0bGUiLCJpdGVtcyIsImltYWdlIiwic3VidGl0bGUiLCJyZW1vdGUiLCJnZXRHbG9iYWwiLCJ2ZXJzaW9uIiwiZm9vdGVyIiwiVGV4dEVsZW1lbnQiLCJXZWJwYWNrTW9kdWxlcyIsImZpbmRCeURpc3BsYXlOYW1lIiwiTW9kYWxTdGFjayIsImZpbmRCeVByb3BzIiwiQW5jaG9yIiwiZmluZCIsIm0iLCJkaXNwbGF5TmFtZSIsIkFuY2hvckNsYXNzZXMiLCJhbmNob3IiLCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyIiwiam9pblN1cHBvcnRTZXJ2ZXIiLCJjbGljayIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwicG9wIiwiQkRWMiIsImpvaW5MQyIsInN1cHBvcnRMaW5rIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50Iiwib25DbGljayIsImNsYXNzTmFtZSIsInNpemUiLCJTaXplcyIsIlNNQUxMIiwiY29sb3IiLCJDb2xvcnMiLCJTVEFOREFSRCIsImJiZENoYW5nZWxvZyIsInR5cGUiLCJzZXR0aW5ncyIsImlkIiwiaW5mbyIsImltcGxlbWVudGVkIiwiaGlkZGVuIiwiY2F0IiwiY2F0ZWdvcnkiLCJkZWZhdWx0Q29va2llIiwic2V0dGluZ3NDb29raWUiLCJzZXR0aW5nc1JQQyIsImRlZmF1bHRSUEMiLCJEYXRlIiwibm93IiwiYmRwbHVnaW5FcnJvcnMiLCJiZHRoZW1lRXJyb3JzIiwiYmRDb25maWciLCJPYmplY3QiLCJjcmVhdGUiLCJCZXR0ZXJEaXNjb3JkQ29uZmlnIiwiYmR0aGVtZXMiLCJiZHBsdWdpbnMiLCJwbHVnaW5Db29raWUiLCJ0aGVtZUNvb2tpZSIsImxvY2FsU3RvcmFnZUZpeCIsImxvYWRpbmdJY29uIiwiZGVwcmVjYXRlR2xvYmFsIiwia2V5IiwidmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsIlV0aWxzIiwid2FybiIsImdsb2JhbEtleXMiLCJrZXlzIiwiR2xvYmFscyIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwic2V0Q29uZmlnIiwiaW5pdCIsInJlcXVpcmUiLCJ2MkxvYWRlciIsImRvY3VtZW50IiwiYm9keSIsImFwcGVuZENoaWxkIiwiY29udGVudFdpbmRvd0dldHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwicHJvdG90eXBlIiwiY29udGVudFdpbmRvdyIsIlJlZmxlY3QiLCJhcHBseSIsImFyZ3VtZW50cyIsIlByb3h5Iiwib2JqIiwicHJvcCIsInVuZGVmaW5lZCIsInZhbCIsImJpbmQiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsIkZ1bmN0aW9uIiwib09wZW4iLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJ1cmwiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiVEZIb3VyIiwiaW5qZWN0MjRIb3VyIiwiY2FuY2VsMjRIb3VyIiwidHdlbHZlSG91ciIsIlJlZ0V4cCIsImNvbnZlcnQiLCJkYXRhIiwibWF0Y2hlZCIsInJldHVyblZhbHVlIiwibWF0Y2giLCJsZW5ndGgiLCJyZXBsYWNlIiwicGFkU3RhcnQiLCJwYXJzZUludCIsImNhbmNlbENvenkiLCJtb25rZXlQYXRjaCIsIlRpbWVGb3JtYXR0ZXIiLCJhZnRlciIsImNhbmNlbENvbXBhY3QiLCJyZW1vdmUyNEhvdXIiLCJkaXNwYXRjaGVyIiwiTGlnaHRjb3JkIiwiRGlzY29yZE1vZHVsZXMiLCJDaGFubmVsTW9kdWxlIiwiQkRNb2R1bGVzIiwiZSIsImRlZmF1bHQiLCJnZXRDaGFubmVsIiwiaGFzQ2hhbm5lbCIsInJlbGF0aW9uU2hpcE1vZHVsZSIsImFkZFJlbGF0aW9uc2hpcCIsIkRNTW9kdWxlIiwiY2xvc2VQcml2YXRlQ2hhbm5lbCIsImJsb2NrZWQiLCJ1c2VyTW9kdWxlIiwiZ2V0Q3VycmVudFVzZXIiLCJBbnRpQm90RE0iLCJhbnRpRE0iLCJlbmFibGVkIiwiZW5hYmxlIiwic3Vic2NyaWJlIiwiZGlzYWJsZSIsInVuc3Vic2NyaWJlIiwiZXYiLCJtZXNzYWdlIiwiYXV0aG9yIiwiYm90IiwiZ3VpbGRfaWQiLCJjaGFubmVsIiwiY2hhbm5lbF9pZCIsInNjYW5NZXNzYWdlIiwic2hvd1RvYXN0IiwidXNlcm5hbWUiLCJkaXNjcmltaW5hdG9yIiwibG9jYXRpb24iLCJ0ZXN0IiwiY29udGVudCIsIkVtYmVkc0NvbnRhaW5zIiwic2VhcmNoIiwiZW1iZWRzIiwibWFwIiwiZW1iZWQiLCJ0ZXh0IiwiZmllbGRzIiwibmFtZSIsIkRpc3BhdGNoZXIiLCJkaXNwYXRjaCIsIkFjdGlvblR5cGVzIiwic29ja2V0SWQiLCJwaWQiLCJwcm9jZXNzIiwiQ3VzdG9tUmljaFByZXNlbmNlIiwiZ2FtZSIsImZvcm1hdGVkR2FtZSIsImFwcGxpY2F0aW9uX2lkIiwiZGV0YWlscyIsInN0YXRlIiwidGltZXN0YW1wcyIsInN0YXJ0IiwiYXNzZXRzIiwibGFyZ2VfaW1hZ2UiLCJzbWFsbF9pbWFnZSIsInNlbmRHYW1lIiwiTE9DQUxfQUNUSVZJVFlfVVBEQVRFIiwiYWN0aXZpdHkiLCJjb25zb2xlIiwibG9nIiwic2V0IiwiZmV0Y2hBc3NldHMiLCJhcHBsaWNhdGlvbklkIiwiZ2V0QXNzZXRzIiwiRXJyb3IiLCJSZWFjdERPTSIsIlJlYWN0RG9tIiwiUmVhY3RDb21wb25lbnQiLCJXaW5kb3dDb25maWdGaWxlIiwiZW1vdGVzIiwic2NyZWVuV2lkdGgiLCJNYXRoIiwibWF4IiwiZG9jdW1lbnRFbGVtZW50IiwiY2xpZW50V2lkdGgiLCJpbm5lcldpZHRoIiwic2NyZWVuSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyIsImdldFdpbmRvd1ByZWZlcmVuY2UiLCJzZXRXaW5kb3dQcmVmZXJlbmNlIiwiaW5qZWN0Q1NTIiwiY3NzIiwiRE9NIiwiYWRkU3R5bGUiLCJlc2NhcGVJRCIsImNsZWFyQ1NTIiwicmVtb3ZlU3R5bGUiLCJsaW5rSlMiLCJhZGRTY3JpcHQiLCJ1bmxpbmtKUyIsInJlbW92ZVNjcmlwdCIsImdldFBsdWdpbiIsImhhc093blByb3BlcnR5IiwicGx1Z2luIiwiZ2V0Q29yZSIsIm1haW5Db3JlIiwiYWxlcnQiLCJzaG93Q29uZmlybWF0aW9uTW9kYWwiLCJjYW5jZWxUZXh0Iiwib3B0aW9ucyIsImZpbmRNb2R1bGUiLCJmaWx0ZXIiLCJmaW5kQWxsTW9kdWxlcyIsImZpbmRBbGwiLCJmaW5kTW9kdWxlQnlQcm9wcyIsInByb3BzIiwiZmluZEJ5VW5pcXVlUHJvcGVydGllcyIsImZpbmRNb2R1bGVCeVByb3RvdHlwZXMiLCJwcm90b3MiLCJmaW5kQnlQcm90b3R5cGVzIiwiZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkV2ZW50RW1pdHRlciIsImV2ZW50TmFtZSIsImFyZ3MiLCJlbWl0Iiwib2ZmIiwiZXZlbnRBY3Rpb24iLCJyZW1vdmVMaXN0ZW5lciIsInNlbGVjdG9ycyIsInJlbW92ZURhIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwicHVzaCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidXNlclNldHRpbmdzQWNjb3VudCIsInZpZXdCb2R5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicGF0Y2hDbGFzc01vZHVsZXMiLCJub3JtYWxpemVFbGVtZW50IiwicGF0Y2hET01NZXRob2RzIiwibW9kdWxlcyIsIm1vZHVsZSIsInBhdGNoQ2xhc3NNb2R1bGUiLCJ1bnBhdGNoQ2xhc3NNb2R1bGUiLCJzaG91bGRJZ25vcmUiLCJpc05hTiIsImVuZHNXaXRoIiwic3RhcnRzV2l0aCIsIkFycmF5IiwiaXNBcnJheSIsIl9fZXNNb2R1bGUiLCJiYXNlQ2xhc3NOYW1lIiwic3BsaXQiLCJjb21wb25lbnROYW1lIiwiY2xhc3NOYW1lcyIsImNsYXNzTGlzdCIsIm5vcm1hbENsYXNzIiwiY2FtZWxDYXNlIiwicyIsImkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiam9pbiIsIm5ld1N0cmluZyIsInRyaW0iLCJlbGVtZW50IiwiY2xhc3NlcyIsImMiLCJjbGVuIiwibmV3Q2xhc3MiLCJhZGQiLCJjaGlsZCIsImNoaWxkcmVuIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidG9SZW1vdmUiLCJyZW1vdmUiLCJjb250YWlucyIsIkRPTVRva2VuTGlzdCIsInRva2VuIiwidG9rZW5zIiwidCIsIkNvbG9yZWRUZXh0IiwiaW5qZWN0Q29sb3JlZFRleHQiLCJjYW5jZWxDb2xvcmVkVGV4dCIsIk1lc3NhZ2VDb21wb25lbnQiLCJiZWZvcmUiLCJtZXRob2RBcmd1bWVudHMiLCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50IiwibWVzc2FnZUNvbnRlbnQiLCJvcmlnaW5hbFR5cGUiLCJfX29yaWdpbmFsTWV0aG9kIiwicm9sZUNvbG9yIiwiY29sb3JTdHJpbmciLCJzdHlsZSIsImFzc2lnbiIsInJlbW92ZUNvbG9yZWRUZXh0IiwiY2xhc3NOYW1lTWFya3VwIiwibWFya3VwIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtIiwic2V0UHJvcGVydHkiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsInBhdGgiLCJmcyIsIk1vZHVsZSIsImdsb2JhbFBhdGhzIiwicmVzb2x2ZSIsImFwcCIsImdldEFwcFBhdGgiLCJNZXRhRXJyb3IiLCJvcmlnaW5hbEpTUmVxdWlyZSIsIl9leHRlbnNpb25zIiwib3JpZ2luYWxDU1NSZXF1aXJlIiwic3BsaXRSZWdleCIsImVzY2FwZWRBdFJlZ2V4IiwidGltZUNhY2hlIiwid2F0Y2hlcnMiLCJnZXRDb250ZW50UmVxdWlyZSIsInBsdWdpbnNGb2xkZXIiLCJfcGx1Z2luc0ZvbGRlciIsInJlYWxwYXRoU3luYyIsImRhdGFQYXRoIiwidGhlbWVzRm9sZGVyIiwiX3RoZW1lc0ZvbGRlciIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwiZmlsZSIsInN0YWNrIiwidW5sb2FkQ29udGVudCIsImNhY2hlIiwiaXNMb2FkZWQiLCJyZWxvYWRDb250ZW50IiwiY2FudFVubG9hZCIsImxvYWROZXdDb250ZW50IiwiYmFzZWRpciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJjb250ZW50TGlzdCIsInZhbHVlcyIsInJlbW92ZWQiLCJmIiwibG9hZEFsbENvbnRlbnQiLCJlcnJvcnMiLCJsb2FkUGx1Z2lucyIsImxvYWRUaGVtZXMiLCJjb25maWciLCJmbGF0IiwiRUQiLCJXZWJTb2NrZXQiLCJsYXRlc3RMb2NhbFZlcnNpb24iLCJ1cGRhdGVyIiwiTGF0ZXN0VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJjb25maXJtVGV4dCIsIm9uQ29uZmlybSIsIm9uVXBkYXRlRmFpbGVkIiwiZGlkVXBkYXRlIiwidXBkYXRlSW5qZWN0b3IiLCJyZWxhdW5jaCIsImV4aXQiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJhdG9iIiwiYWRkRXZlbnRMaXN0ZW5lciIsIlBsdWdpbkNlcnRpZmllciIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJpbml0T2JzZXJ2ZXIiLCJzaG93Q29udGVudEVycm9ycyIsInBsdWdpbnMiLCJ0aGVtZXMiLCJwcmV2aW91c1ZlcnNpb24iLCJzaG93Q2hhbmdlbG9nTW9kYWwiLCJlbW9qaU1vZHVsZSIsIkVtb2ppTW9kdWxlIiwicGF0Y2hTb2NpYWwiLCJwYXRjaEd1aWxkUGlsbHMiLCJwYXRjaEd1aWxkTGlzdEl0ZW1zIiwicGF0Y2hHdWlsZFNlcGFyYXRvciIsInBhdGNoTWVzc2FnZUhlYWRlciIsInBhdGNoTWVtYmVyTGlzdCIsInBhdGNoQXR0YWNobWVudCIsImhhdmVJbnN0YWxsZWREZWZhdWx0Iiwib25DbG9zZSIsImxvZ28iLCJpbm5lckhUTUwiLCJ0aW1lc0NoZWNrZWQiLCJ3cmFwcGVyIiwiZ3VpbGRDbGFzc2VzIiwiZ3VpbGQiLCJsaXN0SXRlbSIsImJsb2IiLCJibG9iQ29udGFpbmVyIiwiZGVmZXJMb2FkZWQiLCJyZWFkeVN0YXRlIiwiaW5qZWN0RXh0ZXJuYWxzIiwib3JpZ2luYWwiLCJnZXRTZXR0aW5nR3JvdXAiLCJzYXZlU2V0dGluZ3MiLCJsb2FkU2V0dGluZ3MiLCJzZXR0aW5nIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImNsYXNzTmFtZUxheWVyIiwiY2xhc3NOYW1lU29jaWFsTGlua3MiLCJsYXllciIsImFuaW1hdGluZyIsInNvY2lhbExpbmtzIiwic2V0QXR0cmlidXRlIiwiZ2V0RWxlbWVudEJ5SWQiLCJyZW5kZXJTaWRlYmFyIiwicGFyZW50RWxlbWVudCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic29jaWFsUGF0Y2giLCJUYWJCYXIiLCJ0b1N0cmluZyIsInNvY2lhbE1vZHVsZTEiLCJuZXdPbmUiLCJyZXR1cm5WYWwiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJsaW5rIiwiaHJlZiIsInRhcmdldCIsIkxpZ2h0Y29yZExvZ28iLCJCRExvZ28iLCJjbGFzc05hbWVDb2xvck11dGVkIiwic2l6ZXMiLCJjbGFzc05hbWVWZXJzaW9uSGFzaCIsImNvbG9yTXV0ZWQiLCJzaXplMzIiLCJ2ZXJzaW9uSGFzaCIsImhhc2giLCJicmFuY2giLCJhZGRpdGlvbmFsIiwicmVhY3QiLCJzaXplMTIiLCJlbGVjdHJvbiIsImNvbW1pdCIsIm9yaWdpbmFsVmVyc2lvbnMiLCJzcGxpY2UiLCJnZXRHdWlsZENsYXNzZXMiLCJndWlsZHNXcmFwcGVyIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInV1aWR2NCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImRpc3BsYXkiLCJhcHBseUJhZGdlcyIsInVzZXIiLCJjaGF0IiwibmV4dFRpY2siLCJkaXYiLCJjaGlsZE5vZGVzIiwiZGlzdGFudCIsImdldEJhZGdlcyIsInRoZW4iLCJiYWRnZXMiLCJzdmciLCJ3aWR0aCIsInNjb3BlcyIsInNjb3BlIiwiY29tcG9uZW50IiwiZGl2MiIsInJlYWN0RG9tIiwicmVuZGVyIiwibWVtYmVyTGlzdFBhdGNoIiwiTWVtYmVyTGlzdEl0ZW0iLCJyZW5kZXJEZWNvcmF0b3JzIiwiaW5qZWN0aW9uUGF0aCIsInJtcmYiLCJ5YXV6bCIsIm1rZGlycCIsInJlcXVlc3QiLCJwYXJlbnRQYXRoIiwiZm9sZGVyTmFtZSIsInppcExpbmsiLCJzYXZlZFppcCIsImV4dHJhY3RlZEZvbGRlciIsInN1Y2Nlc3MiLCJlbmNvZGluZyIsInJlc3BvbnNlIiwic3RhdHVzQ29kZSIsImFscmVhZHlFeGlzdHMiLCJyZXMiLCJleGlzdHMiLCJyZW5hbWUiLCJyb3VuZCIsInBlcmZvcm1hbmNlIiwid3JpdGVGaWxlIiwiemlwZmlsZSIsImxhenlFbnRyaWVzIiwiemlwIiwib24iLCJlbnRyeSIsImZpbGVOYW1lIiwicmVhZEVudHJ5IiwiZnVsbFBhdGgiLCJzeW5jIiwiZGlybmFtZSIsIm9wZW5SZWFkU3RyZWFtIiwicmVhZFN0cmVhbSIsInBpcGUiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIm9uY2UiLCJiYWNrdXBGb2xkZXIiLCJ1bmxpbmsiLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsInN0YWJsZSIsImNhbmFyeSIsInB0YiIsInBsdWdpbkRhdGEiLCJCREZpbGUiLCJ3cml0ZUZpbGVTeW5jIiwicGFyc2UiLCJzZXR0aW5nc0ZpbGUiLCJ1bmxpbmtTeW5jIiwiX2luamVjdGlvblBhdGgiLCJiYXNlIiwicm9hbWluZ0Jhc2UiLCJnZXRQYXRoIiwicm9hbWluZ0xvY2F0aW9uIiwicmVhbExvY2F0aW9uIiwiY29uZmlnRmlsZSIsIl9jb25maWdGaWxlIiwiX0JERmlsZSIsIl9zZXR0aW5nc0ZpbGUiLCJnZXRQbHVnaW5GaWxlIiwic2V0U2V0dGluZ0dyb3VwIiwiRGV2TW9kZSIsImRlYnVnTGlzdGVuZXIiLCJjb3B5U2VsZWN0b3JMaXN0ZW5lciIsInN0YXJ0RGVidWdMaXN0ZW5lciIsInN0YXJ0Q29weVNlbGVjdG9yIiwic3RvcERlYnVnTGlzdGVuZXIiLCJzdG9wQ29weVNlbGVjdG9yIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIndoaWNoIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwic2VsZWN0b3IiLCJnZXRTZWxlY3RvciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJjb250ZXh0TWVudSIsImF0dGFjaCIsImNtIiwicXVlcnkiLCJjb250YWluZXIiLCJjbVdyYXAiLCJhcHBlbmQiLCJ0b3AiLCJjbGllbnRZIiwibGVmdCIsImNsaWVudFgiLCJ6SW5kZXgiLCJyZW1vdmVDTSIsImtleUNvZGUiLCJjbWciLCJpdGVtR3JvdXAiLCJjbWkiLCJpdGVtIiwiY2xpY2thYmxlIiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5Iiwic2Nyb2xsSGVpZ2h0IiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJmcm9tIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJnZXRSdWxlcyIsInN0eWxlU2hlZXRzIiwic2hlZXRzIiwicnVsZXMiLCJjc3NSdWxlcyIsImVsZW1lbnRSdWxlcyIsInNlbGVjdG9yVGV4dCIsIm1hdGNoZXMiLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwiZGVsZXRlIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJBcGkiLCJBdXRob3JpemF0aW9uIiwianNvbiIsImNhdGNoIiwibmV3UHJvbWlzZSIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJ1c2VycyIsInJlc3BvbnNlQm9keSIsInByb21pc2UiLCJ1c2VyX2lkIiwicm91dGUiLCJyZWplY3QiLCJMaWdodGNvcmRFcnJvciIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiTGlnaHRjb3JkVXNlckJhZGdlIiwiQnVnSHVudGVyQmFkZ2UiLCJoZWFkIiwic2NyaXB0Iiwic3JjIiwib25sb2FkIiwiYW5pbWF0ZSIsInRpbWluZyIsIl8iLCJ1cGRhdGUiLCJkdXJhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInRpbWUiLCJ0aW1lRnJhY3Rpb24iLCJwcm9ncmVzcyIsIlEiLCJwYXJzZUhUTUwiLCJpc0hUTUwiLCJOb2RlTGlzdCIsInNvbWUiLCJuIiwibm9kZVR5cGUiLCJiYXNlRWxlbWVudCIsInF1ZXJ5QWxsIiwiaHRtbCIsImZyYWdtZW50IiwidGVtcGxhdGUiLCJjbG9uZU5vZGUiLCJlc2NhcGVIVE1MIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInNwYW5FbGVtZW50Iiwibm9kZVZhbHVlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiY2xhc3NuYW1lIiwiaW5kaWNhdG9yIiwiaGFzQ2xhc3MiLCJldmVyeSIsInJlcGxhY2VDbGFzcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiYXBwZW5kVG8iLCJ0aGlzTm9kZSIsInRoYXROb2RlIiwicHJlcGVuZFRvIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwidGFyZ2V0Tm9kZSIsImluc2VydEJlZm9yZSIsIm5leHRTaWJsaW5nIiwibmV3Tm9kZSIsIm5leHQiLCJuZXh0QWxsIiwibmV4dFVudGlsIiwicHJldmlvdXMiLCJwcmV2aW91c0FsbCIsInByZXZpb3VzVW50aWwiLCJpbmRleEluUGFyZW50IiwibnVtIiwiaW5kZXgiLCJwYXJlbnQiLCJmaW5kQ2hpbGQiLCJmaW5kQ2hpbGRyZW4iLCJwYXJlbnRzIiwiY2xvc2VzdCIsInBhcmVudHNVbnRpbCIsInNpYmxpbmdzIiwiYXR0cmlidXRlIiwiZ2xvYmFsIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImhlaWdodCIsInRleHRDb250ZW50Iiwib3V0ZXJXaWR0aCIsIm9mZnNldFdpZHRoIiwib3V0ZXJIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsaXN0ZW5lcnMiLCJfbGlzdGVuZXJzIiwiZXZlbnQiLCJkZWxlZ2F0ZSIsIm5hbWVzcGFjZSIsImhhc0RlbGVnYXRlIiwiZXZlbnRGdW5jIiwiY2FuY2VsIiwibmV3Q2FuY2VsIiwiZmluZEluZGV4IiwiX19vZmZBbGwiLCJtYXRjaEZpbHRlciIsImxpc3RlbmVyIiwiZGVmYXVsdEZpbHRlciIsIm9uTW91bnRDaGFuZ2UiLCJvbk1vdW50Iiwid3JhcHBlZENhbGxiYWNrIiwib2JzZXJ2ZXIiLCJub2RlcyIsInJlbW92ZWROb2RlcyIsImRpcmVjdE1hdGNoIiwicGFyZW50TWF0Y2giLCJvblVubW91bnQiLCJvbkFkZGVkIiwid3JhcCIsImVsZW1lbnRzIiwiZG9tV3JhcHBlciIsInJlc29sdmVFbGVtZW50IiwiRW1vamlSZWdleCIsIkN1c3RvbUVtb2ppTW9kdWxlIiwiQ3VzdG9tRW1vamkiLCJFbW9qaU1vZHVsZUFwaSIsImdldEN1c3RvbUVtb2ppQnlJZCIsIkF1dG9jb21wbGV0ZU1vZHVsZSIsIkF1dG9Db21wbGV0aW9uVGVtcGxhdGVzIiwiZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyIsIkVtb2ppTW9kdWxlUXVlcnkiLCJxdWVyeUVtb2ppUmVzdWx0cyIsIk1lc3NhZ2VzIiwiRU1PSklfTUFUQ0hJTkciLCJndWlsZE1vZHVsZSIsImdldEd1aWxkIiwiZ2V0R3VpbGRzIiwiaXNGZXRjaGluZyIsImVtb2ppU2VhcmNoIiwiZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dCIsImVuc3VyZUV4cG9ydGVkIiwiY2FsbCIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImRlYnVnIiwiY2FjaGUyIiwicHJvY2Vzc0F0dGFjaG1lbnQiLCJjaGVja1ZpcnVzZXMiLCJpc0hhcm1mdWwiLCJrZXl3b3JkIiwib29mIiwibm9fY29tbWVudHMiLCJyZWdleHBzIiwicmVnZXgiLCJzdXNwZWN0IiwiaGFzaFRvVXJsIiwiaGFybSIsInJlbmRlclRvRWxlbWVudHMiLCJuZXh0SGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsInJlc3VsdCIsImNyeXB0byIsIkJ1ZmZlciIsImFsbG9jIiwiY2h1bmsiLCJjb25jYXQiLCJoYXNoUmVzdWx0IiwiZGlnZXN0IiwiZmxvd2VyU3Rhck1vZHVsZSIsImZsb3dlclN0YXJDb250YWluZXIiLCJjaGlsZE1vZHVsZSIsImNoaWxkQ29udGFpbmVyIiwiYm9yZGVyQ29sb3IiLCJuZXh0Tm9kZSIsImRhbmdlciIsIm9uQ2FuY2VsIiwic2hlbGwiLCJvcGVuRXh0ZXJuYWwiLCJ0b29sdGlwV3JhcCIsInZpZXdCb3giLCJ4IiwieSIsIm1hc2siLCJmaWxsIiwicG9pbnRlckV2ZW50cyIsIm9mZmljaWFsIiwiZmxvd2VyU3RhciIsInN0cm9rZSIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsIlYyX1B1YmxpY1NlcnZlcnMiLCJfYXBwZW5kQnV0dG9uIiwiTGF5ZXIiLCJyb290SWQiLCJWMkNfUHVibGljU2VydmVycyIsInJvb3QiLCJfcm9vdCIsImluamVjdFJvb3QiLCJjbGFzc05hbWVMYXllcnMiLCJsYXllcnMiLCJidXR0b24iLCJidG4iLCJjaXJjbGVCdXR0b25NYXNrIiwiY2xhc3NOYW1lU2Nyb2xsZXIiLCJzY3JvbGxlciIsInNjcm9sbGJhcldpZHRoIiwiYWRkQnV0dG9uIiwiZ3VpbGRQYXRjaCIsIkd1aWxkTGlzdCIsIndlYnBhY2tNb2R1bGVzIiwiR3VpbGRMaXN0T2xkIiwicmVtb3ZlQnV0dG9uIiwiQnJvd3NlcldpbmRvdyIsIndlYkNvbnRlbnRzIiwicmVhY3REZXZUb29scyIsImV4dGVuc2lvblBhdGgiLCJwbGF0Zm9ybSIsImVudiIsIkxPQ0FMQVBQREFUQSIsIkhPTUUiLCJ2ZXJzaW9ucyIsImlzRXh0ZW5zaW9uSW5zdGFsbGVkIiwicmVtb3ZlRGV2VG9vbHNFeHRlbnNpb24iLCJkaWRJbnN0YWxsIiwiYWRkRGV2VG9vbHNFeHRlbnNpb24iLCJzZXRJbW1lZGlhdGUiLCJpc0RldlRvb2xzT3BlbmVkIiwiVjJfU2V0dGluZ3NQYW5lbCIsInNpZGVCYXJPbkNsaWNrIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwic2hvd09yaWdpbmFsIiwiY2xhc3NTaWRlYmFyIiwiY29udGVudFJlZ2lvbiIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJjb3JlU2V0dGluZ3MiLCJnZXRTZXR0aW5ncyIsImNhdGVnb3JpZXMiLCJTZXQiLCJzZWN0aW9ucyIsImxpZ2h0Y29yZFNldHRpbmdzIiwiUHJlc2VuY2VTZXR0aW5ncyIsIk1zZ0xvZ1NldHRpbmdzIiwicmVuZGVyQ29yZVNldHRpbmdzIiwicmVuZGVyQ3VzdG9tQ3NzRWRpdG9yIiwicmVuZGVyQWRkb25QYW5lIiwicmVuZGVyTGlnaHRjb3JkU2V0dGluZ3MiLCJyZW5kZXJQcmVzZW5jZVNldHRpbmdzIiwicmVuZGVyQWNjb3VudEluZm9zIiwiY2hlY2tlZCIsInB1YmxpY1NlcnZlcnNNb2R1bGUiLCJ2b2ljZU1vZGUiLCJ0ZkhvdXIiLCJjb2xvcmVkVGV4dCIsImRNb2RlIiwiU2V0dGluZ3MiLCJkZXZNb2RlIiwiY2FsbFJpbmdpbmdCZWF0Iiwic2V0dGluZ3NTdG9yZSIsInNob3dDdXJyZW50R2FtZSIsInVwZGF0ZVJlbW90ZVNldHRpbmdzIiwiZ2V0Q3VycmVudFdpbmRvdyIsInNldEFsd2F5c09uVG9wIiwiQW50aUFkRE0iLCJibHVyUHJpdmF0ZSIsInRhYnMiLCJjb3JlQ29tcG9uZW50IiwiU2Nyb2xsZXIiLCJjb250ZW50Q29sdW1uIiwiZmFkZSIsImRhcmsiLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiVG9vbHMiLCJsaWdodGNvcmRDb21wb25lbnQiLCJQcmVzZW5jZUNvbXBvbmVudCIsIlYyQ19QcmVzZW5jZVNldHRpbmdzIiwiQWNjb3VudEluZm9zQ29tcG9uZW50IiwiVjJDX0FjY291bnRJbmZvcyIsImN1c3RvbUNzc0NvbXBvbmVudCIsIkNzc0VkaXRvciIsIkNvbnRlbnRMaXN0IiwiQ29tcG9uZW50IiwiY29tcG9uZW50RGlkTW91bnQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIm9yaWdpbmFsUmVuZGVyIiwiZW51bWVyYWJsZSIsIkNhcmRMaXN0IiwiTENpdGVtcyIsImNoYW5nZWxvZ0J1dHRvbiIsIkhpc3RvcnkiLCJjaGFuZ2Vsb2dCdXR0b25MQyIsIlNpZGVCYXIiLCJoZWFkZXJUZXh0IiwiaGVhZGVyQnV0dG9uIiwiY2hhbmdlTG9nIiwiVGhlbWVNb2R1bGUiLCJsb2FkVGhlbWVEYXRhIiwidGhlbWUiLCJ1bmVzY2FwZSIsInNhdmVUaGVtZURhdGEiLCJlbmFibGVUaGVtZSIsImRpc2FibGVUaGVtZSIsInRvZ2dsZVRoZW1lIiwiYmR0aGVtZSIsInVwZGF0ZVRoZW1lTGlzdCIsIl93aW5kb3dDb25maWdGaWxlIiwidHJhbnNwYXJlbnQiLCJmcmFtZSIsImNoYXJDb2RlQXQiLCJnZXRUZXh0QXJlYSIsImNoYW5uZWxUZXh0QXJlYSIsInRpdGxlV3JhcHBlciIsImluc2VydFRleHQiLCJ0ZXh0YXJlYSIsImZvY3VzIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJleGVjQ29tbWFuZCIsIm1vZHVsZU5hbWUiLCJncm91cENvbGxhcHNlZCIsImdyb3VwRW5kIiwiZXNjYXBlIiwicGFyYW1zIiwiaW5zdGVhZCIsInNpbGVudCIsImZvcmNlIiwib3JpZ01ldGhvZCIsImNhbmNlbFBhdGNoIiwib3JpZ2luYWxNZXRob2QiLCJjYWxsT3JpZ2luYWxNZXRob2QiLCJ0ZW1wUmV0IiwiX19tb25rZXlQYXRjaGVkIiwiZGlzY29ubmVjdCIsImhhc05vdGljZSIsIm1lbWJlcmxpc3QiLCJtZW1iZXJzV3JhcCIsImZvcm0iLCJyaWdodCIsImJvdHRvbSIsInRvYXN0V3JhcHBlciIsImljb24iLCJ0aW1lb3V0IiwidG9hc3RFbGVtIiwiaW5uZXJUZXh0IiwibW9kYWxNb2R1bGUiLCJtb2RhbCIsImlubmVyIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsInJlc3BvbnNpdmVXaWR0aE1vYmlsZSIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJDaGFuZ2Vsb2dDbGFzc2VzIiwiRmxleENoaWxkIiwiVGl0bGVzIiwiQ2hhbmdlbG9nIiwiZGVmYXVsdFByb3BzIiwic2VsZWN0YWJsZSIsIk1hcmtkb3duUGFyc2VyIiwiY2UiLCJjaGFuZ2Vsb2dJdGVtcyIsIm1hcmdpbiIsIm1hcmdpblRvcCIsInJlbmRlckhlYWRlciIsIkNoaWxkIiwiZ3JvdyIsInNocmluayIsInRhZyIsIlRhZ3MiLCJINCIsImRhdGUiLCJyZW5kZXJGb290ZXIiLCJqb2luQkQyIiwiZGVmYXVsdEZvb3RlciIsIm9uU2Nyb2xsIiwiTWFya2Rvd24iLCJDb25maXJtYXRpb25Nb2RhbCIsImVtcHR5RnVuY3Rpb24iLCJyZWQiLCJCZXR0ZXJEaXNjb3JkIiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsInByb3h5IiwiZnVuYyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwicHJvZmlsTW9kdWxlIiwiZmV0Y2hNdXR1YWxGcmllbmRzIiwiY29udGVudE1vZHVsZSIsIm1hcmdpbk1vZHVsZTIiLCJkZWZhdWx0TWFyZ2luaDUiLCJjb2xvck1vZHVsZSIsImNvbG9yU3RhbmRhcmQiLCJzaXplTW9kdWxlIiwic2Nyb2xsYmFyTW9kdWxlMSIsInNjcm9sbGJhckdob3N0SGFpcmxpbmUiLCJHdWlsZE1vZHVsZSIsImdldFJlbGF0aW9uc2hpcHMiLCJzZXNzaW9uTW9kdWxlIiwiZ2V0U2Vzc2lvbnMiLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsInBhZGRpbmciLCJzaXplMTQiLCJoNSIsImdldFByb2ZpbGVWYWx1ZSIsImdldFN0YXRpc3RpY3MiLCJnZXRTZXNzaW9uVmFsdWUiLCJtYXJnaW5Cb3R0b20yMCIsInNlc3Npb25zUmF3Iiwic2Vzc2lvbnMiLCJzZXNzaW9uSWQiLCJjbGllbnRJbmZvIiwib3MiLCJjbGllbnQiLCJhY3RpdmUiLCJhY3Rpdml0aWVzIiwicmVwZWF0IiwiY3JlYXRlZEF0IiwiYXZhdGFyIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZmxhZ3MiLCJoYXNQcmVtaXVtU3Vic2NyaXB0aW9uIiwiZW1haWwiLCJtZmFFbmFibGVkIiwibW9iaWxlIiwicGhvbmUiLCJ2ZXJpZmllZCIsInJlbGF0aW9ucyIsImZyaWVuZHMiLCJpc0ZyaWVuZCIsImlzQmxvY2tlZCIsImhpZ2h0bGlnaHRKUyIsImhpZ2hsaWdodCIsIm1lc3NhZ2VNb2R1bGUxIiwibWVzc2FnZU1vZHVsZTIiLCJDb2RlQ29udGVudCIsIl9faHRtbCIsImxhbmd1YWdlIiwibWFyZ2luQm90dG9tOCIsIlYyQ19QbHVnaW5DYXJkIiwic2hvd1NldHRpbmdzIiwic2V0SW5pdGlhbFN0YXRlIiwiaGFzU2V0dGluZ3MiLCJhZGRvbiIsImdldFNldHRpbmdzUGFuZWwiLCJyZWxvYWRzIiwic2V0U3RhdGUiLCJjbG9zZVNldHRpbmdzIiwicGFuZWxSZWYiLCJzZXR0aW5nc09wZW4iLCJjb21wb25lbnREaWRVcGRhdGUiLCJyZWZzIiwic2V0dGluZ3NwYW5lbCIsImlzSGlkZGVuIiwiY1RvcCIsInNjcm9sbFRvcCIsImNCb3R0b20iLCJlVG9wIiwib2Zmc2V0VG9wIiwiZUJvdHRvbSIsImNhcmROb2RlIiwidGhpc05vZGVPZmZzZXQiLCJjb250YWluZXJPZmZzZXQiLCJlbmRQb2ludCIsImdldFN0cmluZyIsInNldHRpbmdzQ29tcG9uZW50IiwicmVmIiwiWFN2ZyIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiYnVpbGRUaXRsZSIsIm5hbWVJbmRleCIsInZlcnNpb25JbmRleCIsImF1dGhvckluZGV4IiwicG9wTGF5ZXIiLCJtYWtlTGluayIsIm1ha2VCdXR0b24iLCJhY3Rpb24iLCJsaW5rcyIsImludml0ZSIsInRlc3RlciIsImRvbmF0ZSIsInBhdHJlb24iLCJkaXNhYmxlZCIsImF1dGhvcklkIiwiYXV0aG9yTGluayIsIlN3aXRjaCIsIlRvb2x0aXAiLCJhc2NlbmRpbmciLCJpc1BsdWdpbnMiLCJyZXZlcnNlIiwib3BlbkZvbGRlciIsInNob3VsZERlbGV0ZSIsImNvbmZpcm1EZWxldGUiLCJzb3J0T3B0aW9ucyIsImRpcmVjdGlvbnMiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImdldFByb3BzIiwiZ2V0QWRkb25zIiwic29ydGVkQWRkb25zIiwiYiIsImNhcCIsImZpcnN0Iiwic2Vjb25kIiwibG9jYWxlQ29tcGFyZSIsInJlbmRlcmVkIiwicmVmcmVzaEljb24iLCJmb3JjZVVwZGF0ZSIsImFkZG9uQ2FyZHMiLCJmaWxsUnVsZSIsImNsaXBSdWxlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwib3BhY2l0eSIsIlYyQ19DaGVja2JveCIsImNoZWNrYm94RWxlbWVudCIsImNoZWNrYm94IiwiY2hlY2tib3hJbm5lciIsIlNlbGVjdCIsImRyb3Bkb3duIiwiY3JlYXRlUmVmIiwic2hvd01lbnUiLCJoaWRlTWVudSIsIm9wdCIsImlzT3BlbiIsIlNlYXJjaCIsIm9uS2V5RG93biIsInBsYWNlaG9sZGVyIiwiZW5hYmxlZENsYXNzIiwiY2hlY2tlZENsYXNzIiwiVjJDX0NvbnRlbnRDb2x1bW4iLCJWMkNfQ3NzRWRpdG9yIiwibGluZXMiLCJkZXRhY2hlZEVkaXRvciIsIlYyQ19Dc3NFZGl0b3JEZXRhY2hlZCIsInVwZGF0ZUNzcyIsInNhdmVDc3MiLCJkZXRhY2giLCJkZXRhY2hlZCIsImVkaXRvciIsImFjZSIsInNldFRoZW1lIiwic2Vzc2lvbiIsInNldE1vZGUiLCJzZXRTaG93UHJpbnRNYXJnaW4iLCJzZXRGb250U2l6ZSIsImRlc3Ryb3kiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJkZXRhY2hlZFJvb3QiLCJjb2RlTWlycm9yIiwibGluZU51bWJlcnMiLCJtb2RlIiwiaW5kZW50VW5pdCIsInNjcm9sbGJhclN0eWxlIiwiX2Njc3MiLCJjY3NzIiwidXBkYXRlTGluZUNvdW50IiwibGluZUNvdW50IiwiU2V0dGluZ3NUaXRsZSIsIkNoZWNrYm94IiwiYm9yZGVyUmFkaXVzIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJMZWZ0IiwiZm9udFNpemUiLCJtYXJnaW5MZWZ0IiwiYXJnIiwiZ2V0VmFsdWUiLCJidG9hIiwiZHJvb3QiLCJpbmplY3REZXRhY2hlZFJvb3QiLCJCREVycm9yQm91bmRhcnkiLCJoYXNFcnJvciIsImNvbXBvbmVudERpZENhdGNoIiwiRGVsZXRlIiwiRG93bkFycm93IiwiRWRpdCIsImRhdGFTdG9yZSIsInByZXZpZXciLCJpc2ZldGNoaW5nIiwiZGVmYXVsdFNldHRpbmciLCJSUENQcm9wcyIsImFzc2V0IiwidXBkYXRlUHJldmlldyIsImFycmF5Iiwib2hnb2RvaGZ1Y2siLCJhY3RpdmF0ZSIsIklucHV0VGV4dCIsInJvd01vZHVsZSIsInJlbW92ZUtleWJpbmQiLCJtYXJnaW5Nb2R1bGUiLCJmbGV4TW9kdWxlIiwiX2hvcml6b250YWwiLCJpbnB1dE1vZHVsZSIsImlucHV0TWluaSIsInNpemVNb2R1bGUyIiwic2l6ZTE2Iiwic2l6ZTIwIiwicm93IiwiZmxleENoaWxkIiwiaW5wdXRXcmFwcGVyIiwiaW5wdXREZWZhdWx0IiwiZGl2aWRlciIsImRpdmlkZXJEZWZhdWx0IiwiSW5wdXROdW1iZXIiLCJldWhNb2R1bGUxIiwiY29sb3JUcmFuc3BhcmVudCIsIm5ld1ZhbHVlIiwiYnV0dG9uV3JhcHBlciIsImxvb2tGaWxsZWQiLCJjb2xvckJyYW5kIiwic2l6ZVNtYWxsIiwiZmxleCIsImNsaXBib2FyZCIsImNvbnRlbnRzIiwiSW5wdXRDaG9pY2UiLCJjaG9pY2VzIiwiRGlzY29yZEJ1dHRvbiIsIlJwY1ByZXZpZXciLCJjaGFuZ2VUYWIiLCJ0YWIiLCJhbmNpZW50VGFiIiwic2V0QWN0aXZlIiwicnBjIiwiaXNBY3RpdmUiLCJQcm9maWxlIiwiUG9wb3V0IiwiVGFiIiwiYXZhdGFyVVJMIiwiZ2V0QXZhdGFyVVJMIiwicm9vdE1vZHVsZTEiLCJmbGV4TW9kdWxlMSIsInN0eWxpbmdNb2R1bGUxIiwibmFtZVRhZ01vZHVsZTEiLCJhY3Rpdml0eU1vZHVsZTEiLCJ0ZXh0TW9kdWxlMSIsInNpemVNb2R1bGUxIiwic2Nyb2xsZXJNb2R1bGUxIiwibm90ZU1vZHVsZTEiLCJwcm90aXBNb2R1bGUxIiwiY29sb3JNb2R1bGUxIiwiYXZhdGFyTW9kdWxlMSIsInVzZXJQb3BvdXQiLCJ2ZXJ0aWNhbCIsImFsaWduU3RyZXRjaCIsInN0cmVhbWVyTW9kZUVuYWJsZWRCdG4iLCJhY3Rpdml0eVVzZXJQb3BvdXQiLCJtdXRlZCIsInRoZW1lR2hvc3RIYWlybGluZUNoYW5uZWxzIiwibm90ZSIsInBybyIsImlubGluZSIsInRpbWVzdGFtcENsYXNzIiwidGltZXN0YW1wIiwiaGVhZGVyUGxheWluZyIsImp1c3RpZnlDZW50ZXIiLCJhbGlnbkNlbnRlciIsIm5vV3JhcCIsImhlYWRlclRvcCIsImF2YXRhcldyYXBwZXJOb3JtYWwiLCJhdmF0YXJIaW50IiwiYXZhdGFySGludElubmVyIiwiVklFV19QUk9GSUxFIiwiaG9yaXpvbnRhbCIsImp1c3RpZnlTdGFydCIsImhlYWRlclRhZ05vTmlja25hbWUiLCJuYW1lVGFnIiwiaGVhZGVyVGFnVXNlcm5hbWVOb05pY2tuYW1lIiwiaGVhZGVyVGV4dE5vcm1hbCIsIlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkciLCJib2R5Tm9ybWFsIiwiaW1hZ2VzIiwiYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXQiLCJhc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IiwiYXNzZXRzU21hbGxJbWFnZVVzZXJQb3BvdXQiLCJjb250ZW50SW1hZ2VzVXNlclBvcG91dCIsIm5hbWVOb3JtYWwiLCJhY3Rpdml0eU5hbWUiLCJ0aW1lQ29tcG9uZW50IiwidGltZXN0YW1wUmVuZGVyIiwiVGltZXN0YW1wIiwiZW5kIiwic2Nyb2xsZXJXcmFwIiwic2Nyb2xsZXJUaGVtZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmUiLCJzY3JvbGxlckZhZGUiLCJib2R5SW5uZXIiLCJib2R5VGl0bGUiLCJOT1RFIiwiTk9URV9QTEFDRUhPTERFUiIsInByb3RpcCIsIlBJTk5FRF9NRVNTQUdFU19QUk9fVElQIiwidGlwIiwiQ09OVEVYVF9NRU5VX0hJTlQiLCJTdGF0dXMiLCJnZXRQcmVzZW5jZSIsInRvcFNlY3Rpb25TdHJlYW1pbmciLCJhY3Rpdml0eVByb2ZpbGUiLCJ0b3BTZWN0aW9uUGxheWluZyIsImhlYWRlckluZm8iLCJwcm9maWxlQmFkZ2VzIiwiaGVhZGVyRmlsbCIsImFzc2V0c0xhcmdlSW1hZ2VQcm9maWxlIiwiYXNzZXRzTGFyZ2VNYXNrUHJvZmlsZSIsImFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlIiwiY29udGVudEltYWdlc1Byb2ZpbGUiLCJ1c2VySW5mb1NlY3Rpb24iLCJ1c2VySW5mb1NlY3Rpb25IZWFkZXIiLCJDb25uZWN0ZWRBY2NvdW50cyIsImFjY291bnRzIiwiQWNjb3VudE1vZHVsZTEiLCJnZXRBY2NvdW50cyIsImFjY3MiLCJ2aXNpYmlsaXR5IiwiYWNjIiwiY29ubmVjdGVkQWNjb3VudHMiLCJDb25uZWN0ZWRBY2NvdW50IiwiZmxvd2VyTW9kdWxlMSIsImFuY2hvck1vZHVsZTEiLCJTb2NpYWxDb25zdGFudHMiLCJjb25zdGFudHNTb2NpYWwiLCJjb25uZWN0ZWRBY2NvdW50IiwiY29ubmVjdGVkQWNjb3VudEljb24iLCJ3aGl0ZSIsImdyZXkiLCJjb25uZWN0ZWRBY2NvdW50TmFtZUlubmVyIiwiY29ubmVjdGVkQWNjb3VudE5hbWUiLCJjb25uZWN0ZWRBY2NvdW50VmVyaWZpZWRJY29uIiwiY29ubmVjdGVkQWNjb3VudE9wZW5JY29uIiwiQmFkZ2VzIiwicm9vdE1vZHVsZSIsIlVzZXJGbGFncyIsInNlcmlhbGl6ZWQiLCJmbGFnTmFtZSIsImhhc0ZsYWciLCJzZWFyY2hhYmxlIiwiQmFkZ2UiLCJwcm9maWxlQmFkZ2VXcmFwcGVyIiwicHJvZmlsZUJhZGdlIiwiVjJDX0xheWVyIiwia2V5dXBMaXN0ZW5lciIsInRyYW5zZm9ybSIsImNvbXBvbmVudFdpbGxNb3VudCIsImNoYW5nZUNhdGVnb3J5Iiwic2VhcmNoS2V5RG93biIsImNoZWNrQ29ubmVjdGlvbiIsImNvbm5lY3QiLCJHdWlsZFN0b3JlIiwiQXZhdGFyRGVmYXVsdHMiLCJTb3J0ZWRHdWlsZFN0b3JlIiwic2VsZWN0ZWRDYXRlZ29yeSIsImxvYWRpbmciLCJzZXJ2ZXJzIiwiY29ubmVjdGlvbiIsImZldGNoIiwic2VydmVyIiwiam9pbmVkIiwidGVybSIsImNhdGVnb3J5QnV0dG9ucyIsInRvdGFsIiwic2J2IiwiY29udGVudFNjcm9sbGVyIiwic2VydmVyQ2FyZCIsInBpbm5lZCIsImFjY2VwdEludml0ZSIsImludml0ZV9jb2RlIiwiam9pbkVuZFBvaW50IiwiaWRlbnRpZmllciIsImNyZWRlbnRpYWxzIiwid2luZG93T3B0aW9ucyIsInNjcmVlblgiLCJzY3JlZW5ZIiwiam9pbldpbmRvdyIsImxvYWRVUkwiLCJiYWNrZ3JvdW5kQ29sb3IiLCJyZXNpemFibGUiLCJtYXhpbWl6YWJsZSIsIm1pbmltaXphYmxlIiwiYWx3YXlzT25Ub3AiLCJjZW50ZXIiLCJ3ZWJQcmVmZXJlbmNlcyIsIm5vZGVJbnRlZ3JhdGlvbiIsImJkU2VydmVyIiwib25saW5lIiwibWVtYmVycyIsImljb25VcmwiLCJuYXRpdmVqb2luIiwic2VydmVyMiIsImd1aWxkTGlzdCIsImdldEZsYXR0ZW5lZEd1aWxkSWRzIiwiZGVmYXVsdExpc3QiLCJERUZBVUxUX0FWQVRBUlMiLCJTZXJ2ZXJDYXJkIiwiZmFsbGJhY2siLCJmbG9vciIsImNvbm5lY3RFbmRQb2ludCIsIlNpZGViYXJWaWV3IiwidG9vbHMiLCJUYWJCYXJTZXBhcmF0b3IiLCJzZWFyY2hJbnB1dCIsIlRhYkJhckhlYWRlciIsIlRhYkJhckl0ZW0iLCJtYXhMZW5ndGgiLCJzZWFyY2hpbnB1dCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1hcmdpbkJvdHRvbSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJWMkNfU2lkZWJhclZpZXciLCJWMkNfUmVsb2FkSWNvbiIsInhtbG5zIiwiVjJDX1Njcm9sbGVyIiwic2Nyb2xsZXJIb3Jpem9udGFsIiwic2Nyb2xsZXJNb2R1bGUyIiwic2lkZWJhclJlZ2lvblNjcm9sbGVyIiwid3JhcHBlckNsYXNzIiwic2Nyb2xsZXJDbGFzcyIsImNvbnRlbnRSZWdpb25TY3JvbGxlciIsImNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAiLCJ0aGVtZUdob3N0Iiwic2Nyb2xsZXJUcmFjayIsIlYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwic2VjdGlvbiIsIlNldHRpbmdzR3JvdXAiLCJoYW5kbGVDaGFuZ2UiLCJXcmFwIiwiRGlyZWN0aW9uIiwibmF0aXZlU2VsZWN0IiwiSE9SSVpPTlRBTCIsIkFsaWduIiwiQ0VOVEVSIiwiVjJDX1NldHRpbmdzR3JvdXAiLCJidXR0b25Db21wb25lbnQiLCJWMkNfU2V0dGluZ3NQYW5lbCIsIlYyQ19TZXR0aW5nc1RpdGxlIiwibWFyZ2luVG9wNjAiLCJWMkNfU2lkZUJhciIsInNpIiwic2NuIiwibnMiLCJuc2NuIiwic2V0U2VsZWN0ZWQiLCJzaWRlYmFycyIsImluaXRpYWxTZWxlY3Rpb24iLCJzZXRVbnNlbGVjdGVkIiwic2lkZWJhckluZGV4IiwiU3dpdGNoSXRlbSIsIlYyQ19UYWJCYXJIZWFkZXIiLCJWMkNfVGFiQmFySXRlbSIsIlYyQ19UYWJCYXJTZXBhcmF0b3IiLCJpbnRlcnZhbE1vZHVsZTEiLCJJbnRlcnZhbCIsIlRpbWVSZW5kZXIiLCJQdXJlQ29tcG9uZW50IiwiX2ludGVydmFsIiwiZ2V0VXBkYXRlZFRpbWUiLCJnZXREaWZmIiwiY2hlY2tVbml4IiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsInJlbmRlclRpbWUiLCJudW1iZXIiLCJyZW1vdmVaZXJvIiwidXNlZFByb3BzIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfRU5EIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfU1RBUlQiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwiRW11bGF0ZWRUb29sdGlwIiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsInRvb2x0aXAiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwibGF5ZXJDb250YWluZXIiLCJjYW5TaG93QWJvdmUiLCJjYW5TaG93QmVsb3ciLCJjYW5TaG93TGVmdCIsImNhblNob3dSaWdodCIsIl9jbGFzc05hbWUiLCJzaG93QWJvdmUiLCJzaG93QmVsb3ciLCJzaG93TGVmdCIsInNob3dSaWdodCIsImNlbnRlckhvcml6b250YWxseSIsImNlbnRlclZlcnRpY2FsbHkiLCJub2RlY2VudGVyIiwiZmluZERPTU5vZGUiLCJWMkNfWFN2ZyJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtR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Q0FBQ3FrQixLQUFMLENBQVdqa0IsYUFBWCxDQUNILEtBREcsRUFFSDtBQUFDd3JELFdBQUssRUFBRSw0QkFBUjtBQUFzQ2x0QixhQUFPLEVBQUUsV0FBL0M7QUFBNERsb0IsV0FBSyxFQUFFO0FBQUNrUixhQUFLLEVBQUUsTUFBUjtBQUFnQm1PLGNBQU0sRUFBRTtBQUF4QjtBQUFuRSxLQUZHLEVBR0g3MUIsbURBQUksQ0FBQ3FrQixLQUFMLENBQVdqa0IsYUFBWCxDQUNJLEdBREosRUFFSTtBQUFDRSxlQUFTLEVBQUUsWUFBWjtBQUEwQncrQixVQUFJLEVBQUUsTUFBaEM7QUFBd0NzWixjQUFRLEVBQUU7QUFBbEQsS0FGSixFQUdJcDRDLG1EQUFJLENBQUNxa0IsS0FBTCxDQUFXamtCLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ3U3QixPQUFDLEVBQUU7QUFBSixLQUFqQyxDQUhKLEVBSUkzN0IsbURBQUksQ0FBQ3FrQixLQUFMLENBQVdqa0IsYUFBWCxDQUF5QixNQUF6QixFQUFpQztBQUFDRSxlQUFTLEVBQUUsTUFBWjtBQUFvQncrQixVQUFJLEVBQUUsU0FBMUI7QUFBcUNuRCxPQUFDLEVBQUU7QUFBeEMsS0FBakMsQ0FKSixDQUhHLENBQVA7QUFVSDs7QUFoQnFELEM7Ozs7Ozs7Ozs7O0FDRjFELG1DOzs7Ozs7Ozs7OztBQ0FBLHFDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLCtCOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLHVDOzs7Ozs7Ozs7OztBQ0FBLGlDOzs7Ozs7Ozs7OztBQ0FBLG9DOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLGtDIiwiZmlsZSI6Im1haW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9pbmRleC5qc1wiKTtcbiIsImltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcblxyXG4vLyB2YXIgc2V0dGluZ3NQYW5lbCwgdm9pY2VNb2RlLCBwbHVnaW5Nb2R1bGUsIHRoZW1lTW9kdWxlLCBkTW9kZSwgcHVibGljU2VydmVyc01vZHVsZSwgbWFpbkNvcmUsIEJEVjI7XHJcbmV4cG9ydCBjb25zdCBtaW5pbXVtRGlzY29yZFZlcnNpb24gPSBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IGN1cnJlbnREaXNjb3JkVmVyc2lvbiA9ICh3aW5kb3cuRGlzY29yZE5hdGl2ZSAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24gJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwLmdldFZlcnNpb24oKSkgfHwgXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBtaW5TdXBwb3J0ZWRWZXJzaW9uID0gXCIwLjMuMFwiO1xyXG5leHBvcnQgY29uc3QgYmJkVmVyc2lvbiA9IFwiMC4zLjRcIjtcclxuZXhwb3J0IGNvbnN0IExDQ2hhbmVsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJMaWdodGNvcmQncyBjaGFuZ2Vsb2dcIixcclxuICAgIGNoYW5nZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIldoYXQncyBOZXc/XCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCBpcyBub3cgYXZhaWxhYmxlICFcIixcclxuICAgICAgICAgICAgICAgIFwiV2UgcmVtb3ZlZCBlbW90ZXMuIFRoYXQncyBzYWQgZm9yIHBlb3BsZSB3aG8gd2VyZSBhY3R1YWxseSB1c2luZyBpdCwgYnV0IGl0IHdhcyBsZWFkaW5nIHRvIG1vcmUgbG9hZGluZyB0aW1lIGFuZCBzb21lIGJhc2ljIHdvcmRzIHdlcmUgZW1vdGUuXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIF0sXHJcbiAgICBpbWFnZTogXCJodHRwczovL2kuaW1ndXIuY29tL3NmTmhxd1AucG5nXCIsXHJcbiAgICB0aXRsZTogXCJMaWdodGNvcmRcIixcclxuICAgIHN1YnRpdGxlOiBcInZcIityZW1vdGUuZ2V0R2xvYmFsKFwiQnVpbGRJbmZvXCIpLnZlcnNpb24sXHJcbiAgICBmb290ZXI6IChmdW5jdGlvbigpe1xyXG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGlmKCFUZXh0RWxlbWVudCB8fCAhTW9kYWxTdGFjaylyZXR1cm4gbnVsbFxyXG5cclxuICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xyXG4gICAgICAgIGNvbnN0IGpvaW5TdXBwb3J0U2VydmVyID0gKGNsaWNrKSA9PiB7XHJcbiAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBNb2RhbFN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICBCRFYyLmpvaW5MQygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7b25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0RWxlbWVudCwge3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XHJcbiAgICB9KSgpXHJcbn1cclxuZXhwb3J0IGNvbnN0IGJiZENoYW5nZWxvZyA9IHtcclxuICAgIGRlc2NyaXB0aW9uOiBcIkJCRCdzIGNoYW5nZWxvZy5cIixcclxuICAgIGNoYW5nZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIldoYXQncyBOZXc/XCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIioqTGlnaHRjb3JkKiogaXMgbm93IHVzaW5nIEJhbmRhZ2VkQkQuIFRoYXQgbWVhbnMgYWxsIHBsdWdpbnMgeW91IHdlcmUgdXNpbmcgY2FuIGJlIHVzZWQgdG9vICFcIixcclxuICAgICAgICAgICAgICAgIFwiKipXaW5kb3cgVHJhbnNwYXJlbmN5KiogY2hhbmdlcyB3ZXJlIG1hZGUgdG8gbW9yZSBjb21wYXRpYmxlIHdpdGggZXh0ZXJuYWwgd2luZG93IG1hbmFnZXJzIGFuZCBhZGRvbnMgbGlrZSBHbGFzc2NvcmQuXCIsXHJcbiAgICAgICAgICAgICAgICBcIkluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGhhcyBvbmNlIGFnYWluIGJlZW4gY2hhbmdlZCBzbGlnaHRseSB0byBob3BlZnVsbHkgaW1wcm92ZSBsb2FkaW5nIHRpbWVzLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiQnVnIEZpeGVzXCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiU29tZSBmaXhlcyByZWxhdGVkIHRvIHNob3dpbmcgbW9kYWxzIGluIHRoZSBgQmRBcGlgLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3MgPSB7XHJcbiAgICBcIkN1c3RvbSBjc3MgbGl2ZSB1cGRhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTBcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkN1c3RvbSBjc3MgYXV0byB1ZHBhdGVcIjogICAgIHtpZDogXCJiZGEtY3NzLTFcIiwgaW5mbzogXCJcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCAgY2F0OiBcImNvcmVcIn0sXHJcbiAgICBcIkJldHRlckRpc2NvcmQgQmx1ZVwiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtYlwiLCAgaW5mbzogXCJSZXBsYWNlIERpc2NvcmQgYmx1ZSB3aXRoIEJEIEJsdWVcIiwgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiBmYWxzZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCJ9LFxyXG5cclxuICAgIC8qIENvcmUgKi9cclxuICAgIC8qID09PT09PSAqL1xyXG4gICAgXCJQdWJsaWMgU2VydmVyc1wiOiAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTFcIiwgIGluZm86IFwiRGlzcGxheSBwdWJsaWMgc2VydmVycyBidXR0b25cIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk1pbmltYWwgTW9kZVwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMlwiLCAgaW5mbzogXCJIaWRlIGVsZW1lbnRzIGFuZCByZWR1Y2UgdGhlIHNpemUgb2YgZWxlbWVudHMuXCIsICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgTW9kZVwiOiAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy00XCIsICBpbmZvOiBcIk9ubHkgc2hvdyB2b2ljZSBjaGF0XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJIaWRlIENoYW5uZWxzXCI6ICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTNcIiwgIGluZm86IFwiSGlkZSBjaGFubmVscyBpbiBtaW5pbWFsIG1vZGVcIiwgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkRhcmsgTW9kZVwiOiAgICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNVwiLCAgaW5mbzogXCJNYWtlIGNlcnRhaW4gZWxlbWVudHMgZGFyayBieSBkZWZhdWx0KHdpcClcIiwgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiVm9pY2UgRGlzY29ubmVjdFwiOiAgICAgICAgICAge2lkOiBcImJkYS1kYy0wXCIsICBpbmZvOiBcIkRpc2Nvbm5lY3QgZnJvbSB2b2ljZSBzZXJ2ZXIgd2hlbiBjbG9zaW5nIERpc2NvcmRcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCIyNCBIb3VyIFRpbWVzdGFtcHNcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLTZcIiwgIGluZm86IFwiUmVwbGFjZSAxMmhyIHRpbWVzdGFtcHMgd2l0aCBwcm9wZXIgb25lc1wiLCAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkNvbG9yZWQgVGV4dFwiOiAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtN1wiLCAgaW5mbzogXCJNYWtlIHRleHQgY29sb3IgdGhlIHNhbWUgYXMgcm9sZSBjb2xvclwiLCAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTm9ybWFsaXplIENsYXNzZXNcIjogICAgICAgICAge2lkOiBcImZvcmstcHMtNFwiLCBpbmZvOiBcIkFkZHMgc3RhYmxlIGNsYXNzZXMgdG8gZWxlbWVudHMgdG8gaGVscCB0aGVtZXMuIChlLmcuIGFkZHMgLmRhLWNoYW5uZWxzIHRvIC5jaGFubmVscy1JZTJsNkEpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuXHJcbiAgICAvKiBDb250ZW50ICovXHJcbiAgICBcIkNvbnRlbnQgRXJyb3IgTW9kYWxcIjogICAgICAgIHtpZDogXCJmb3JrLXBzLTFcIiwgaW5mbzogXCJTaG93cyBhIG1vZGFsIHdpdGggcGx1Z2luL3RoZW1lIGVycm9yc1wiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2hvdyBUb2FzdHNcIjogICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtMlwiLCBpbmZvOiBcIlNob3dzIGEgc21hbGwgbm90aWZpY2F0aW9uIGZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjcm9sbCBUbyBTZXR0aW5nc1wiOiAgICAgICAgIHtpZDogXCJmb3JrLXBzLTNcIiwgaW5mbzogXCJBdXRvLXNjcm9sbHMgdG8gYSBwbHVnaW4ncyBzZXR0aW5ncyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZCAob25seSBpZiBvdXQgb2YgdmlldylcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkF1dG9tYXRpYyBMb2FkaW5nXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTVcIiwgaW5mbzogXCJBdXRvbWF0aWNhbGx5IGxvYWRzLCByZWxvYWRzLCBhbmQgdW5sb2FkcyBwbHVnaW5zIGFuZCB0aGVtZXNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcblxyXG4gICAgLyogRGV2ZWxvcGVyICovXHJcbiAgICBcIkRldmVsb3BlciBNb2RlXCI6ICAgICAgICAgXHQgIHtpZDogXCJiZGEtZ3MtOFwiLCBpbmZvOiBcIkRldmVsb3BlciBNb2RlIFRvZ2dsZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJDb3B5IFNlbGVjdG9yXCI6XHRcdFx0ICB7aWQ6IFwiZm9yay1kbS0xXCIsIGluZm86IFwiQWRkcyBhIFxcXCJDb3B5IFNlbGVjdG9yXFxcIiBvcHRpb24gdG8gY29udGV4dCBtZW51cyB3aGVuIGRldmVsb3BlciBtb2RlIGlzIGFjdGl2ZVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiZGV2ZWxvcGVyIHNldHRpbmdzXCJ9LFxyXG4gICAgXCJSZWFjdCBEZXZUb29sc1wiOlx0XHRcdCAge2lkOiBcInJlYWN0RGV2VG9vbHNcIiwgaW5mbzogXCJBZGRzIHJlYWN0IGRldmVsb3BlciB0b29scyB0byB0aGUgZGV2dG9vbHMuIE11c3QgYmUgaW5zdGFsbGVkIGluIEdvb2dsZSBDaHJvbWUgb24geW91ciBwYy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkICovXHJcbiAgICBcIkRpc2FibGUgQmV0dGVyRGlzY29yZFwiOiAgICAgIHtpZDogXCJiZC1kaXNhYmxlXCIsICBpbmZvOiBcIkRpc2FibGUgQmV0dGVyZGlzY29yZCAocGx1Z2lucywgdGhlbWVzLCBldGMpLlwiLCBpbXBsZW1lbnRlZDogZmFsc2UsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJCbHVyIFBlcnNvbm5hbCBJbmZvcm1hdGlvbnNcIjp7aWQ6IFwibGlnaHRjb3JkLTZcIiwgaW5mbzogXCJCbHVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbnMgbGlrZSBlbWFpbCwgcGF5bWVudCBpbmZvcyBhbmQgbW9yZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJDYWxsaW5nIFJpbmcgQmVhdFwiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTJcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIHNwZWNpYWwgY2FsbGluZyBiZWF0LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRldmVsb3BlciBPcHRpb25zXCI6ICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtMVwiLCBpbmZvOiBcIkVuYWJsZSBEaXNjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiIGFuZCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIuIChtdXN0IGNsb3NlIGFuZCByZW9wZW4gc2V0dGluZ3MpXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQWQgQmxvY2tcIjogICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC00XCIsIGluZm86IFwiQmxvY2sgYW55IEJPVCB0aGF0IGRtIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXHJcbiAgICBcIkFsd2F5cy1vbi1Ub3BcIjogICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtM1wiLCBpbmZvOiBcIkVuYWJsZSB3aW5kb3cncyBBbHdheXMtb24tVG9wIG1vZGUsIHdoZXJlIExpZ2h0Y29yZCBzdGF5cyBvbiB0b3Agb2Ygb3RoZXIgYXBwbGljYXRpb25zLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJXaW5kb3dcIn0sXHJcbiAgICBcclxuICAgIC8qKiBSaWNoUHJlc2VuY2UgKi9cclxuICAgIFwiRW5hYmxlXCI6ICAgICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCIsIGluZm86IFwiRW5hYmxlIFJpY2hQcmVzZW5jZSBiZWxvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJzdGF0dXNcIn1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29va2llID0ge1xyXG4gICAgXCJiZGEtZ3MtMVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtMlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTNcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtNlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTdcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy04XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0wXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0yXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtN1wiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtYlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWRjLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWRtLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTJcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTVcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1lcy0yXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWVzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay13cC0xXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLXdwLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstYmV0YVwiOiB0cnVlLFxyXG4gICAgXCJyZWFjdERldlRvb2xzXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTJcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0zXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNFwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTVcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLTZcIjogdHJ1ZVxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc0Nvb2tpZSA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzUlBDID0ge307XHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0UlBDID0ge1xyXG4gICAgXCJuYW1lXCI6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICBcImFwcGxpY2F0aW9uX2lkXCI6IFwiNzExNDE2OTU3NzE4NzU3NDE4XCIsXHJcbiAgICBcInN0YXRlXCI6IFwiTGlnaHRjb3JkIENsaWVudFwiLFxyXG4gICAgXCJkZXRhaWxzXCI6IFwiQnJvd3NpbmcgRGlzY29yZFwiLFxyXG4gICAgXCJ0aW1lc3RhbXBzLnN0YXJ0XCI6IERhdGUubm93KCksXHJcbiAgICBcImFzc2V0cy5zbWFsbFwiOiBudWxsLFxyXG4gICAgXCJhc3NldHMubGFyZ2VcIjogXCI3MTIzMjM4MjEwMzc2ODI3OTFcIlxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmRwbHVnaW5FcnJvcnMgPSBbXTtcclxuZXhwb3J0IGNvbnN0IGJkdGhlbWVFcnJvcnMgPSBbXTsgLy8gZGVmaW5lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkQ29uZmlnID0gT2JqZWN0LmNyZWF0ZShCZXR0ZXJEaXNjb3JkQ29uZmlnKTtcclxuXHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lcyA9IHt9O1xyXG5leHBvcnQgY29uc3QgYmRwbHVnaW5zID0ge307XHJcblxyXG5leHBvcnQgY29uc3QgcGx1Z2luQ29va2llID0ge307XHJcbmV4cG9ydCBjb25zdCB0aGVtZUNvb2tpZSA9IHt9OyIsImltcG9ydCBsb2NhbFN0b3JhZ2VGaXggZnJvbSBcIi4vbG9jYWxTdG9yYWdlRml4XCI7XHJcbmltcG9ydCBsb2FkaW5nSWNvbiBmcm9tIFwiLi9sb2FkaW5nSWNvblwiO1xyXG5sb2NhbFN0b3JhZ2VGaXgoKTtcclxubG9hZGluZ0ljb24oKTtcclxuXHJcbmNvbnN0IGRlcHJlY2F0ZUdsb2JhbCA9IChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAvLyB2YWx1ZSA9IHR5cGVvZih2YWx1ZSkgIT09IFwib2JqZWN0XCIgPyB2YWx1ZSA6IG5ldyBQcm94eSh2YWx1ZSwge1xyXG4gICAgLy8gICAgIGdldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgIC8vICAgICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkobW9kKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIG9ialttb2RdO1xyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgc2V0OiBmdW5jdGlvbihvYmosIG1vZCkge1xyXG4gICAgLy8gICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiBVdGlscy5lcnIoXCJEZXByZWNhdGVkIEdsb2JhbFwiLCBcIlRyeWluZyB0byBvdmVyd3JpdGUgZGVwcmVjYXRlZCBCRCBnbG9iYWxzXCIpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XHJcbiAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgYFwiJHtrZXl9XCIgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gUGxlYXNlIG9ubHkgdXNlIEJkQXBpLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7ICBcclxufTtcclxuXHJcblxyXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBnbG9iYWxLZXlzID0gT2JqZWN0LmtleXMoR2xvYmFscyk7XHJcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XHJcblxyXG5cclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9tb2R1bGVzL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcclxuXHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJEVjJcIiwgQkRWMik7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJ0aGVtZU1vZHVsZVwiLCB0aGVtZU1vZHVsZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIlV0aWxzXCIsIFV0aWxzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJzZXR0aW5nc1BhbmVsXCIsIHNldHRpbmdzUGFuZWwpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJEYXRhU3RvcmVcIiwgRGF0YVN0b3JlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJDbGFzc05vcm1hbGl6ZXJcIiwgQ2xhc3NOb3JtYWxpemVyKTtcclxuXHJcbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xyXG5cclxuaW1wb3J0IENvcmUgZnJvbSBcIi4vbW9kdWxlcy9jb3JlXCI7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3JlV3JhcHBlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihiZENvbmZpZykge1xyXG4gICAgICAgIENvcmUuc2V0Q29uZmlnKGJkQ29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xyXG4gICAgICAgIENvcmUuaW5pdCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBwYXRjaE1vZHVsZUxvYWQoKSB7XHJcbi8vICAgICBjb25zdCBuYW1lc3BhY2UgPSBcImJldHRlcmRpc2NvcmRcIjtcclxuLy8gICAgIGNvbnN0IHByZWZpeCA9IGAke25hbWVzcGFjZX0vYDtcclxuLy8gICAgIGNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIik7XHJcbi8vICAgICBjb25zdCBsb2FkID0gTW9kdWxlLl9sb2FkO1xyXG4vLyAgICAgLy8gY29uc3QgcmVzb2x2ZUZpbGVuYW1lID0gTW9kdWxlLl9yZXNvbHZlRmlsZW5hbWU7XHJcblxyXG4vLyAgICAgTW9kdWxlLl9sb2FkID0gZnVuY3Rpb24ocmVxdWVzdCkge1xyXG4vLyAgICAgICAgIGlmIChyZXF1ZXN0ID09PSBuYW1lc3BhY2UgfHwgcmVxdWVzdC5zdGFydHNXaXRoKHByZWZpeCkpIHtcclxuLy8gICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkID0gcmVxdWVzdC5zdWJzdHIocHJlZml4Lmxlbmd0aCk7XHJcbi8vICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWQgPT0gXCJhcGlcIikgcmV0dXJuIEJkQXBpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcmV0dXJuIGxvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuLy8gICAgIH07XHJcblxyXG4vLyAgICAgLy8gTW9kdWxlLl9yZXNvbHZlRmlsZW5hbWUgPSBmdW5jdGlvbiAocmVxdWVzdCwgcGFyZW50LCBpc01haW4pIHtcclxuLy8gICAgIC8vICAgICBpZiAocmVxdWVzdCA9PT0gXCJiZXR0ZXJkaXNjb3JkXCIgfHwgcmVxdWVzdC5zdGFydHNXaXRoKFwiYmV0dGVyZGlzY29yZC9cIikpIHtcclxuLy8gICAgIC8vICAgICAgICAgY29uc3QgY29udGVudFBhdGggPSBQbHVnaW5NYW5hZ2VyLmdldFBsdWdpblBhdGhCeU1vZHVsZShwYXJlbnQpO1xyXG4vLyAgICAgLy8gICAgICAgICBpZiAoY29udGVudFBhdGgpIHJldHVybiByZXF1ZXN0O1xyXG4vLyAgICAgLy8gICAgIH1cclxuXHJcbi8vICAgICAvLyAgICAgcmV0dXJuIHJlc29sdmVGaWxlbmFtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4vLyAgICAgLy8gfTtcclxuXHJcbi8vICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbi8vICAgICAgICAgTW9kdWxlLl9sb2FkID0gbG9hZDtcclxuLy8gICAgIH07XHJcbi8vIH1cclxuXHJcbi8vIHBhdGNoTW9kdWxlTG9hZCgpO1xyXG5cclxuLy8gdmFyIHNldHRpbmdzUGFuZWwsIHZvaWNlTW9kZSwsIGRNb2RlLCBwdWJsaWNTZXJ2ZXJzTW9kdWxlO1xyXG4vLyB2YXIgYmRDb25maWcgPSBudWxsO1xyXG5cclxucmVxdWlyZShcInJlcXVlc3RcIikvLyBqdXN0IGluIGNhY2hlIHNvIHBsdWdpbiBjYW4gcmVxdWlyZSBpdCB0b28iLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoZW1iZWQuZmllbGRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuaW5jbHVkZXMoc2VhcmNoKSB8fCBlLm5hbWUuaW5jbHVkZXMoc2VhcmNoKVxyXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcclxufSIsImltcG9ydCB7c2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxyXG5jb25zdCBBY3Rpb25UeXBlcyA9IEJETW9kdWxlcy5nZXQobT0+bS5BY3Rpb25UeXBlcylbMF0uQWN0aW9uVHlwZXNcclxuXHJcbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcclxuY29uc3QgcGlkID0gcHJvY2Vzcy5waWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBzZXR0aW5nc1JQQ1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgZm9ybWF0ZWRHYW1lKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcclxuICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnYW1lXHJcbiAgICB9XHJcblxyXG4gICAgc2VuZEdhbWUoKXtcclxuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuTE9DQUxfQUNUSVZJVFlfVVBEQVRFLFxyXG4gICAgICAgICAgICBzb2NrZXRJZCxcclxuICAgICAgICAgICAgcGlkLFxyXG4gICAgICAgICAgICBhY3Rpdml0eTogdGhpcy5mb3JtYXRlZEdhbWVcclxuICAgICAgICB9KSAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRW5hYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNldChzZXR0aW5nc1JQQyB8fCBPYmplY3QuY3JlYXRlKGRlZmF1bHRSUEMpKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZldGNoQXNzZXRzKGFwcGxpY2F0aW9uSWQpe1xyXG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxyXG4gICAgICAgIGlmKGFzc2V0cy51bmRlZmluZWQgJiYgdHlwZW9mIGFzc2V0cy51bmRlZmluZWQgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEFwcGxpY2F0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NldHNcclxuICAgIH1cclxuXHJcbiAgICBzZXQoYWN0aXZpdHkpe1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGFjdGl2aXR5XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIHt9fSwgLy8gZGVwcmVjYXRlZCwgZGVsZXRlZCBhbGwgZW1vdGVzIGZyb20gYmV0dGVyZGlzY29yZC5cclxuICAgIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH0sXHJcbiAgICBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XHJcbn07XHJcblxyXG5CZEFwaS5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgIHJldHVybiBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmluamVjdENTUyA9IGZ1bmN0aW9uIChpZCwgY3NzKSB7XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSwgY3NzKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS5jbGVhckNTUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmxpbmtKUyA9IGZ1bmN0aW9uIChpZCwgdXJsKSB7XHJcbiAgICBET00uYWRkU2NyaXB0KERPTS5lc2NhcGVJRChpZCksIHVybCk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkudW5saW5rSlMgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0dldCBhbm90aGVyIHBsdWdpblxyXG4vL25hbWUgPSBuYW1lIG9mIHBsdWdpblxyXG5CZEFwaS5nZXRQbHVnaW4gPSBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgaWYgKGJkcGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBiZHBsdWdpbnNbbmFtZV0ucGx1Z2luO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG4vL0dldCBCZXR0ZXJEaXNjb3JkIENvcmVcclxuQmRBcGkuZ2V0Q29yZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGlvbiBOb3RpY2VcIiwgYEJkQXBpLmdldENvcmUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLmApO1xyXG4gICAgcmV0dXJuIG1haW5Db3JlO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgbW9kYWwuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIGEgc3RyaW5nIG9mIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbW9kYWxcclxuICovXHJcbkJkQXBpLmFsZXJ0ID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCB7Y2FuY2VsVGV4dDogbnVsbH0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vL1Nob3cgdG9hc3QgYWxlcnRcclxuQmRBcGkuc2hvd1RvYXN0ID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBVdGlscy5zaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZSA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRBbGxNb2R1bGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQWxsKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvcHMgPSBmdW5jdGlvbiguLi5wcm9wcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhwcm9wcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm90b3R5cGVzID0gZnVuY3Rpb24oLi4ucHJvdG9zKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlQcm90b3R5cGVzKHByb3Rvcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlEaXNwbGF5TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKG5hbWUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyByZWFjdCBpbnN0YW5jZVxyXG5CZEFwaS5nZXRJbnRlcm5hbEluc3RhbmNlID0gZnVuY3Rpb24obm9kZSkge1xyXG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5qUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpIG5vZGUgPSBub2RlWzBdO1xyXG4gICAgcmV0dXJuIEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShub2RlKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5sb2FkRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXREYXRhID0gQmRBcGkubG9hZERhdGE7XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2F2ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0RGF0YSA9IEJkQXBpLnNhdmVEYXRhO1xyXG5cclxuLy8gRGVsZXRlcyBkYXRhXHJcbkJkQXBpLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuLy8gUGF0Y2hlcyBvdGhlciBmdW5jdGlvbnNcclxuQmRBcGkubW9ua2V5UGF0Y2ggPSBmdW5jdGlvbih3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gVXRpbHMubW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBFdmVudCB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG5CZEFwaS5vblJlbW92ZWQgPSBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm9uUmVtb3ZlZChub2RlLCBjYWxsYmFjayk7XHJcbn07XHJcblxyXG4vLyBXcmFwcyBmdW5jdGlvbiBpbiB0cnkuLmNhdGNoXHJcbkJkQXBpLnN1cHByZXNzRXJyb3JzID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKTtcclxufTtcclxuXHJcbi8vIFRlc3RzIGZvciB2YWxpZCBKU09OXHJcbkJkQXBpLnRlc3RKU09OID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnRlc3RKU09OKGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuaXNQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhcGx1Z2luQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNUaGVtZUVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISF0aGVtZUNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzU2V0dGluZ0VuYWJsZWQgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuICEhc2V0dGluZ3NDb29raWVbaWRdO1xyXG59O1xyXG5cclxuQmRBcGkuZW5hYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgdHJ1ZSk7XHJcbn07XHJcblxyXG5CZEFwaS5kaXNhYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgZmFsc2UpO1xyXG59O1xyXG5cclxuQmRBcGkudG9nZ2xlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgIXNldHRpbmdzQ29va2llW2lkXSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkuZ2V0QkREYXRhID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldEJERGF0YShrZXkpO1xyXG59O1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNldEJERGF0YSA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRCRERhdGEoa2V5LCBkYXRhKTtcclxufTtcclxuXHJcblxyXG5cclxuY29uc3QgbWFrZUFkZG9uQVBJID0gKGNvb2tpZSwgbGlzdCwgbWFuYWdlcikgPT4gbmV3IGNsYXNzIEFkZG9uQVBJIHtcclxuXHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBtYW5hZ2VyLmZvbGRlcjt9XHJcblxyXG4gICAgaXNFbmFibGVkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gISFjb29raWVbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZGlzYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGUobmFtZSkge1xyXG4gICAgICAgIGlmIChjb29raWVbbmFtZV0pIHRoaXMuZGlzYWJsZShuYW1lKTtcclxuICAgICAgICBlbHNlIHRoaXMuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIucmVsb2FkKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldChuYW1lKSB7XHJcbiAgICAgICAgaWYgKGxpc3QuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxpc3RbbmFtZV0ucGx1Z2luKSByZXR1cm4gbGlzdFtuYW1lXS5wbHVnaW47XHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGwoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChrID0+IHRoaXMuZ2V0KGspKS5maWx0ZXIoYSA9PiBhKTtcclxuICAgIH1cclxufTtcclxuXHJcbkJkQXBpLlBsdWdpbnMgPSBtYWtlQWRkb25BUEkocGx1Z2luQ29va2llLCBiZHBsdWdpbnMsIHBsdWdpbk1vZHVsZSk7XHJcbkJkQXBpLlRoZW1lcyA9IG1ha2VBZGRvbkFQSSh0aGVtZUNvb2tpZSwgYmR0aGVtZXMsIHRoZW1lTW9kdWxlKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJkQXBpOyIsIi8qIEJERXZlbnRzICovXHJcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCREV2ZW50cyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBkaXNwYXRjaChldmVudE5hbWUsIC4uLmFyZ3MpIHt0aGlzLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTt9XHJcbiAgICBvZmYoZXZlbnROYW1lLCBldmVudEFjdGlvbikge3RoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEFjdGlvbik7fVxyXG59OyIsIi8qKlxyXG4gKiBDcmVkaXRzIHRvIEBoZWxsYm91bmQxMzM3IG9uIGdpdGh1YiBmb3IgdGhlIGNzc1xyXG4gKi9cclxuXHJcbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi9kb210b29sc1wiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5sZXQgc2VsZWN0b3JzXHJcbmNvbnN0IHJlbW92ZURhID0gVXRpbHMucmVtb3ZlRGFcclxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKCl7XHJcbiAgICBsZXQgc3RhbmRhcmRTaWRlYmFyVmlldyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXHJcbiAgICBpZighc3RhbmRhcmRTaWRlYmFyVmlldylyZXR1cm4gbnVsbFxyXG4gICAgbGV0IGRlZmF1bHRDbGFzc05hbWUgPSByZW1vdmVEYShzdGFuZGFyZFNpZGViYXJWaWV3LnN0YW5kYXJkU2lkZWJhclZpZXcpXHJcbiAgICBsZXQgc2VsZWN0cyA9IFtdXHJcbiAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLnBheW1lbnQtaW5mbyAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZXNjcmlwdGlvbiAmJiB0eXBlb2YgZS5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiAmJiBlLmRlc2NyaXB0aW9uLmluY2x1ZGVzKFwiZm9ybVRleHRcIikpWzBdLmRlc2NyaXB0aW9uKX1gKVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnBheW1lbnRTb3VyY2VSb3cpWzBdLnBheW1lbnRTb3VyY2VSb3cpfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdWJUZXh0ICYmIGUuZGVzY3JpcHRpb25XcmFwcGVyKVswXS5zdWJUZXh0KX1gKVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJTZXR0aW5nc0FjY291bnQpWzBdLnVzZXJTZXR0aW5nc0FjY291bnQpfSBkaXY6bnRoLWNoaWxkKDIpPmRpdjpudGgtY2hpbGQoMik+LiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUudmlld0JvZHkpWzBdLnZpZXdCb2R5KX1gKVxyXG4gICAgcmV0dXJuIHNlbGVjdHNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJsdXJQcml2YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycyB8fCBnZXRTZWxlY3RvcnMoKVxyXG5cclxuICAgICAgICBpZighc2VsZWN0b3JzKWNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBzZWxlY3RvcnMgdG8gYmx1ciBwZXJzb25uYWwgaW5mb3JtYXRpb25zLlwiKSlcclxuICAgICAgICBET01Ub29scy5hZGRTdHlsZShcImJsdXJQcml2YXRlXCIsIGBcclxuJHtzZWxlY3RvcnNbMF19LCAke3NlbGVjdG9yc1sxXX0sICR7c2VsZWN0b3JzWzJdfSB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDg1LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBibHVyKDRweCk7XHJcbiAgICBvcGFjaXR5OiAuODtcclxufVxyXG5cclxuJHtzZWxlY3RvcnNbMF19OmhvdmVyLCAke3NlbGVjdG9yc1sxXX06aG92ZXIsICR7c2VsZWN0b3JzWzJdfTpob3ZlciB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDksLjY4LC41Myk7XHJcbiAgICBmaWx0ZXI6IG5vbmU7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG59YClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIERPTVRvb2xzLnJlbW92ZVN0eWxlKFwiYmx1clByaXZhdGVcIilcclxuICAgIH1cclxufSIsImltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IFwiZGFcIjtcclxuY29uc3QgcmFuZENsYXNzID0gbmV3IFJlZ0V4cChgXig/ISR7bm9ybWFsaXplZFByZWZpeH0tKSgoPzpbQS1aYS16XXxbMC05XXwtKSspLSg/OltBLVphLXpdfFswLTldfC18Xyl7Nn0kYCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ2xhc3NOb3JtYWxpemVyIHtcclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy51bnBhdGNoQ2xhc3NNb2R1bGVzKFdlYnBhY2tNb2R1bGVzLmZpbmRBbGwodGhpcy5tb2R1bGVGaWx0ZXIuYmluZCh0aGlzKSkpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJ0RWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XHJcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5ub3JtYWxpemVFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGF0Y2hET01NZXRob2RzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVucGF0Y2hDbGFzc01vZHVsZXMobW9kdWxlcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcclxuICAgICAgICAgICAgdGhpcy51bnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkSWdub3JlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5lbmRzV2l0aChcInB4XCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiY2hcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJlbVwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcIm1zXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcImxheWVyQ29udGFpbmVyLVwiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCIjXCIpICYmICh2YWx1ZS5sZW5ndGggPT0gNyB8fCB2YWx1ZS5sZW5ndGggPT0gNCkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhcImNhbGMoXCIpIHx8IHZhbHVlLmluY2x1ZGVzKFwicmdiYVwiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIG1vZHVsZUZpbHRlcihtb2R1bGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG1vZHVsZSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAobW9kdWxlLl9fZXNNb2R1bGUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG1vZHVsZSkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIG1vZHVsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1vZHVsZVtiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLnNwbGl0KFwiLVwiKS5sZW5ndGggPT09IDEpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdCh2YWx1ZS5zcGxpdChcIiBcIilbMF0pKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlKGNvbXBvbmVudE5hbWUsIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5vcm1hbENsYXNzLm1hdGNoKHJhbmRDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5sZW5ndGggfHwgbWF0Y2gubGVuZ3RoIDwgMikgY29udGludWU7IC8vIFNob3VsZG4ndCBldmVyIGhhcHBlbiBzaW5jZSB0aGV5IHBhc3NlZCB0aGUgbW9kdWxlRmlsdGVyLCBidXQgeW91IG5ldmVyIGtub3dcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVsQ2FzZSA9IG1hdGNoWzFdLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gKz0gYCAke2NvbXBvbmVudE5hbWV9LSR7Y2FtZWxDYXNlfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlKGNvbXBvbmVudE5hbWUsIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gY2xhc3NOYW1lcykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBsZXQgbmV3U3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbENsYXNzLnN0YXJ0c1dpdGgoYCR7Y29tcG9uZW50TmFtZX0tYCkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nICs9IGAgJHtub3JtYWxDbGFzc31gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZXNbYmFzZUNsYXNzTmFtZV0gPSBuZXdTdHJpbmcudHJpbSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBub3JtYWxpemVFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcclxuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDAsIGNsZW4gPSBjbGFzc2VzLmxlbmd0aDsgYyA8IGNsZW47IGMrKykge1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KGNsYXNzZXNbY10pKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjbGFzc2VzW2NdLm1hdGNoKHJhbmRDbGFzcylbMV07XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NsYXNzID0gbWF0Y2guc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYCR7bm9ybWFsaXplZFByZWZpeH0tJHtuZXdDbGFzc31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbGVtZW50LmNoaWxkcmVuKSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoY2hpbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldmVydEVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5jaGlsZHJlblswXSk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB0aGlzLnJldmVydEVsZW1lbnQoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBpZiAoY2xhc3Nlc1tjXS5zdGFydHNXaXRoKGAke25vcm1hbGl6ZWRQcmVmaXh9LWApKSB0b1JlbW92ZS5wdXNoKGNsYXNzZXNbY10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4udG9SZW1vdmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoRE9NTWV0aG9kcygpIHtcclxuICAgICAgICBjb25zdCBjb250YWlucyA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuY29udGFpbnM7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHRva2VuKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHRva2VucyA9IHRva2VuLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoY29udGFpbnMsIHRoaXMsIFt0b2tlbi5zcGxpdChcIiBcIilbMF1dKTtcclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRva2Vucy5ldmVyeSh0ID0+IGNvbnRhaW5zLmNhbGwodGhpcywgdCkpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZCA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGFkZCwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCByZW1vdmUgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZTtcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zW3RdID0gdG9rZW5zW3RdLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShyZW1vdmUsIHRoaXMsIHRva2Vucyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbG9yZWRUZXh0IHtcclxuICAgIGluamVjdENvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbENvbG9yZWRUZXh0KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFCRFYyLk1lc3NhZ2VDb21wb25lbnQpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5jYW5jZWxDb2xvcmVkVGV4dCA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHtiZWZvcmU6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF07XHJcbiAgICAgICAgICAgIGlmICghcHJvcHMgfHwgIXByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUNvbnRlbnQgPSBwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFtZXNzYWdlQ29udGVudC50eXBlIHx8ICFtZXNzYWdlQ29udGVudC50eXBlLnR5cGUgfHwgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLmRpc3BsYXlOYW1lICE9IFwiTWVzc2FnZUNvbnRlbnRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFR5cGUgPSBtZXNzYWdlQ29udGVudC50eXBlLnR5cGU7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFR5cGUuX19vcmlnaW5hbE1ldGhvZCkgcmV0dXJuOyAvLyBEb24ndCBwYXRjaCBhZ2FpblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUgPSBmdW5jdGlvbihwcm9wcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBvcmlnaW5hbFR5cGUocHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZUNvbG9yID0gc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSA/IHByb3BzLm1lc3NhZ2UuY29sb3JTdHJpbmcgfHwgXCJcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5wcm9wcy5zdHlsZSA9IHtjb2xvcjogcm9sZUNvbG9yfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5fX29yaWdpbmFsTWV0aG9kID0gb3JpZ2luYWxUeXBlO1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSwgb3JpZ2luYWxUeXBlKTtcclxuICAgICAgICB9fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQ29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZU1hcmt1cCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF0ubWFya3VwXHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5cIitjbGFzc05hbWVNYXJrdXAuc3BsaXQoXCIgXCIpWzBdKS5mb3JFYWNoKGVsZW0gPT4ge1xyXG4gICAgICAgICAgICBlbGVtLnN0eWxlLnNldFByb3BlcnR5KFwiY29sb3JcIiwgXCJcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn07IiwiY29uc3QgX19ub25fd2VicGFja19yZXF1aXJlX18gPSB3aW5kb3cucmVxdWlyZVxyXG5pbXBvcnQge2JkQ29uZmlnLCBiZHBsdWdpbnMsIGJkdGhlbWVzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgTW9kdWxlID0gcmVxdWlyZShcIm1vZHVsZVwiKS5Nb2R1bGU7XHJcbk1vZHVsZS5nbG9iYWxQYXRocy5wdXNoKHBhdGgucmVzb2x2ZShyZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcC5nZXRBcHBQYXRoKCksIFwibm9kZV9tb2R1bGVzXCIpKTtcclxuY2xhc3MgTWV0YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTWV0YUVycm9yXCI7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb3JpZ2luYWxKU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuanNcIl07XHJcbmNvbnN0IG9yaWdpbmFsQ1NTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPyBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdIDogKCkgPT4ge3JldHVybiBudWxsO307XHJcbmNvbnN0IHNwbGl0UmVnZXggPSAvW15cXFNcXHJcXG5dKj8oPzpcXHJcXG58XFxuKVteXFxTXFxyXFxuXSo/XFwqW15cXFNcXHJcXG5dPy87XHJcbmNvbnN0IGVzY2FwZWRBdFJlZ2V4ID0gL15cXFxcQC87XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENvbnRlbnRNYW5hZ2VyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRpbWVDYWNoZSA9IHt9O1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnMgPSB7fTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuanNcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwicGx1Z2luXCIpO1xyXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwidGhlbWVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBsdWdpbnNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3BsdWdpbnNGb2xkZXIgfHwgKHRoaXMuX3BsdWdpbnNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJwbHVnaW5zL1wiKSkpO31cclxuICAgIGdldCB0aGVtZXNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3RoZW1lc0ZvbGRlciB8fCAodGhpcy5fdGhlbWVzRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwidGhlbWVzL1wiKSkpO31cclxuXHJcbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAodGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IGNvbnRlbnRUeXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0gPSBmcy53YXRjaChiYXNlRm9sZGVyLCB7cGVyc2lzdGVudDogZmFsc2V9LCBhc3luYyAoZXZlbnRUeXBlLCBmaWxlbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICB0cnkge2ZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSBcIkVOT0VOVFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVNb2R1bGUudW5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMubXRpbWUgfHwgIXN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9PSBzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID0gc3RhdHMubXRpbWUuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUucmVsb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW53YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0uY2xvc2UoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgaGFzT2xkTWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8vTUVUQVwiKTtcclxuICAgICAgICBpZiAoaGFzT2xkTWV0YSkgcmV0dXJuIHRoaXMucGFyc2VPbGRNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XHJcbiAgICAgICAgaWYgKGhhc05ld01ldGEpIHJldHVybiB0aGlzLnBhcnNlTmV3TWV0YShjb250ZW50KTtcclxuICAgICAgICB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU9sZE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IHJhd01ldGEgPSBtZXRhLnN1YnN0cmluZyhtZXRhLmxhc3RJbmRleE9mKFwiLy9NRVRBXCIpICsgNiwgbWV0YS5sYXN0SW5kZXhPZihcIiovL1wiKSk7XHJcbiAgICAgICAgaWYgKG1ldGEuaW5kZXhPZihcIk1FVEFcIikgPCAwKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcclxuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgY291bGQgbm90IGJlIHBhcnNlZC5cIik7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQubmFtZSkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgbWlzc2luZyBuYW1lIGRhdGEuXCIpO1xyXG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcclxuICAgICAgICByZXR1cm4gcGFyc2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlTmV3TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LnNwbGl0KFwiLyoqXCIsIDIpWzFdLnNwbGl0KFwiKi9cIiwgMSlbMF07XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XHJcbiAgICAgICAgbGV0IGZpZWxkID0gXCJcIjtcclxuICAgICAgICBsZXQgYWNjdW0gPSBcIlwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xyXG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFwiQFwiICYmIGxpbmUuY2hhckF0KDEpICE9PSBcIiBcIikge1xyXG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IGxpbmUuaW5kZXhPZihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICBmaWVsZCA9IGxpbmUuc3Vic3RyKDEsIGwgLSAxKTtcclxuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcclxuICAgICAgICBkZWxldGUgb3V0W1wiXCJdO1xyXG4gICAgICAgIG91dC5mb3JtYXQgPSBcImpzZG9jXCI7XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gc2VsZi5wbHVnaW5zRm9sZGVyIDogc2VsZi50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwb3NzaWJsZVBhdGgpIHx8IGZpbGVuYW1lICE9PSBmcy5yZWFscGF0aFN5bmMocG9zc2libGVQYXRoKSkgcmV0dXJuIFJlZmxlY3QuYXBwbHkob3JpZ2luYWxSZXF1aXJlLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgICAgIG1ldGEuZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgbWV0YS5hZGRlZCA9IHN0YXRzLmF0aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLnNpemUgPSBzdGF0cy5zaXplO1xyXG4gICAgICAgICAgICBpZiAoIWlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YS5mb3JtYXQgPT0gXCJqc29uXCIpIG1ldGEuY3NzID0gbWV0YS5jc3Muc3BsaXQoXCJcXG5cIikuc2xpY2UoMSkuam9pbihcIlxcblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBgbW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIG1vZHVsZS5maWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlkRXhwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YS50eXBlID0gbW9kdWxlLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXRpbHMud2FybihcIk1vZHVsZSBOb3QgRXhwb3J0ZWRcIiwgYCR7bWV0YS5uYW1lfSwgcGxlYXNlIHN0YXJ0IHNldHRpbmcgbW9kdWxlLmV4cG9ydHNgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGBcXG5tb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O1xcbm1vZHVsZS5leHBvcnRzLnR5cGUgPSAke21ldGEuZXhwb3J0cyB8fCBtZXRhLm5hbWV9O2A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIGZpbGVuYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHtwbHVnaW46IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcclxuICAgICAgICAgICAgICAgIGdldEF1dGhvcjogKCkgPT4ge3JldHVybiBcIj8/P1wiO30sXHJcbiAgICAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogKCkgPT4ge3JldHVybiBkYXRhLm1lc3NhZ2UgPyBkYXRhLm1lc3NhZ2UgOiBcIlRoaXMgcGx1Z2luIHdhcyB1bmFibGUgdG8gYmUgbG9hZGVkLiBDaGVjayB0aGUgYXV0aG9yJ3MgcGFnZSBmb3IgdXBkYXRlcy5cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGEuc291cmNlID8gZGF0YS5zb3VyY2UgOiBcIlwiLFxyXG4gICAgICAgICAgICB3ZWJzaXRlOiBkYXRhLndlYnNpdGUgPyBkYXRhLndlYnNpdGUgOiBcIlwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge19fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29tcGlsZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICBpZighY29udGVudC5uYW1lKXJldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNhbm5vdCBlc2NhcGUgdGhlIElELlwiLCBlcnJvcjoge21lc3NhZ2U6IFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwiLCBzdGFjazogXCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkXCJ9fVxyXG4gICAgICAgIGNvbnRlbnQuaWQgPSBVdGlscy5lc2NhcGVJRChjb250ZW50Lm5hbWUpO1xyXG4gICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQudHlwZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV07XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbnN0cnVjdGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBiZHRoZW1lc1tjb250ZW50Lm5hbWVdO1xyXG4gICAgICAgICAgICBiZHRoZW1lc1tjb250ZW50Lm5hbWVdID0gY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgX19ub25fd2VicGFja19yZXF1aXJlX18uY2FjaGVbX19ub25fd2VicGFja19yZXF1aXJlX18ucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgdW5sb2FkZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fTt9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMb2FkZWQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHtfX25vbl93ZWJwYWNrX3JlcXVpcmVfXy5jYWNoZVtfX25vbl93ZWJwYWNrX3JlcXVpcmVfXy5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiBmYWxzZTt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGNhbnRVbmxvYWQgPSB0aGlzLnVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgICAgIGlmIChjYW50VW5sb2FkKSByZXR1cm4gY2FudFVubG9hZDtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoYmFzZWRpcik7XHJcbiAgICAgICAgY29uc3QgY29udGVudExpc3QgPSBPYmplY3QudmFsdWVzKGlzUGx1Z2luID8gYmRwbHVnaW5zIDogYmR0aGVtZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcclxuICAgICAgICBjb25zdCBhZGRlZCA9IGZpbGVzLmZpbHRlcihmID0+ICFjb250ZW50TGlzdC5maW5kKHQgPT4gdC5maWxlbmFtZSA9PSBmKSAmJiBmLmVuZHNXaXRoKGZpbGVFbmRpbmcpICYmIGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmKSkuaXNGaWxlKCkpO1xyXG4gICAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBbGxDb250ZW50KHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cclxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XHJcbn07IiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgTGlnaHRjb3JkTG9nbyBmcm9tIFwiLi4vc3ZnL2xpZ2h0Y29yZFwiO1xyXG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XHJcbmltcG9ydCBFbW9qaU1vZHVsZSBmcm9tIFwiLi9lbW9qaU1vZHVsZVwiXHJcbmltcG9ydCB7cmVtb3RlIGFzIGVsZWN0cm9ufSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5cclxuZnVuY3Rpb24gQ29yZSgpIHtcclxuICAgIC8vIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKERhdGFTdG9yZS5jb25maWdGaWxlKSk7XHJcbiAgICAvLyB0aGlzLmluaXQoKTtcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKCFBcnJheS5wcm90b3R5cGUuZmxhdCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmJkVmVyc2lvbiArIFwiIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvbGQgdmVyc2lvbiAoXCIgKyBjdXJyZW50RGlzY29yZFZlcnNpb24gKyBcIikgb2YgRGlzY29yZC4gUGxlYXNlIHVwZGF0ZSB5b3VyIERpc2NvcmQgaW5zdGFsbGF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuRUQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LldlYlNvY2tldCAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUgJiYgd2luZG93LldlYlNvY2tldC5uYW1lLmluY2x1ZGVzKFwiUGF0Y2hlZFwiKSkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIFBvd2VyY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxhdGVzdExvY2FsVmVyc2lvbiA9IGJkQ29uZmlnLnVwZGF0ZXIgPyBiZENvbmZpZy51cGRhdGVyLkxhdGVzdFZlcnNpb24gOiBiZENvbmZpZy5sYXRlc3RWZXJzaW9uO1xyXG4gICAgaWYgKGxhdGVzdExvY2FsVmVyc2lvbiA+IGJkQ29uZmlnLnZlcnNpb24pIHtcclxuICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJVcGRhdGUgQXZhaWxhYmxlXCIsIFtgVGhlcmUgaXMgYW4gdXBkYXRlIGF2YWlsYWJsZSBmb3IgQmFuZGFnZWRCRCdzIEluamVjdG9yICgke2xhdGVzdExvY2FsVmVyc2lvbn0pLmAsIFwiWW91IGNhbiBlaXRoZXIgdXBkYXRlIGFuZCByZXN0YXJ0IG5vdywgb3IgbGF0ZXIuXCJdLCB7XHJcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIlVwZGF0ZSBOb3dcIixcclxuICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJNYXliZSBMYXRlclwiLFxyXG4gICAgICAgICAgICBvbkNvbmZpcm06IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9uVXBkYXRlRmFpbGVkID0gKCkgPT4ge1V0aWxzLmFsZXJ0KFwiQ291bGQgTm90IFVwZGF0ZVwiLCBgVW5hYmxlIHRvIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LCBwbGVhc2UgZG93bmxvYWQgdGhlIGluc3RhbGxlciBhbmQgcmVpbnN0YWxsIG5vcm1hbGx5LjxiciAvPjxiciAvPjxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvcmVsZWFzZXMvbGF0ZXN0JyB0YXJnZXQ9J19ibGFuayc+RG93bmxvYWQgSW5zdGFsbGVyPC9hPmApO307XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZFVwZGF0ZSA9IGF3YWl0IHRoaXMudXBkYXRlSW5qZWN0b3IoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZSkgcmV0dXJuIG9uVXBkYXRlRmFpbGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHA7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwLnJlbGF1bmNoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwLmV4aXQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZUZhaWxlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIGF0b2IoRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpKSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBQbHVnaW5DZXJ0aWZpZXIuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpLmxlbmd0aCkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpWzBdLnJlbW92ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xyXG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcclxuXHJcbiAgICAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcclxuICAgICAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiQ29sbGVjdGluZyBTdGFydHVwIEVycm9yc1wiKTtcclxuICAgICAgICBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogYmRwbHVnaW5FcnJvcnMsIHRoZW1lczogYmR0aGVtZUVycm9yc30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xyXG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcclxuICAgICAgICBpZiAoYmJkQ2hhbmdlbG9nKSB0aGlzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJ2ZXJzaW9uXCIsIGJiZFZlcnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVtb2ppTW9kdWxlID0gRW1vamlNb2R1bGVcclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoU29jaWFsLmJpbmQodGhpcyksIFwiQkQgU29jaWFsIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRQaWxscy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFBpbGxzIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRTZXBhcmF0b3IuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBTZXBhcmF0b3IgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZXNzYWdlSGVhZGVyLmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgQ2hhdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dGFjaG1lbnQuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xyXG4gICAgICAgIGxldCBhbGVydCA9IFV0aWxzLmFsZXJ0KFwiRmlyc3QgSW5zdGFsbGF0aW9uXCIsIFwiQXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGluc3RhbGwgTGlnaHRjb3JkLCBXZSBhZGRlZCB0d28gZGVmYXVsdCB0aGVtZXMgYW5kIG9uZSBkZWZhdWx0IHBsdWdpbiBpbiB5b3VyIHBsdWdpbi90aGVtZSBmb2xkZXIuIENoZWNrIGl0IGluIHRoZSBQbHVnaW4vVGhlbWUgc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxyXG4gICAgaWYobG9nbyl7XHJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cclxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ0LjgxLDkuNjdWNi4zM2MwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxQTMuNTMsMy41MywwLDAsMCw0Ni4yLDNjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNjdjMCwyLjIxLDEuODksMy4zMywzLjc3LDMuMzNhMy44NywzLjg3LDAsMCwwLDMuNDUtMi4xOGwtMi4xMi0xQzQ3LDExLjE3LDQ0LjgxLDEwLjg1LDQ0LjgxLDkuNjdaTTEwLjY4LDEyLjg5aDIuNDFWMy4xN0gxMC42OFpNNzEuNzYsMy4xNEg2OC4xOVY3LjIzTDcwLjU3LDkuNHYtNGgxLjI3Yy44MSwwLDEuMjEuNDEsMS4yMSwxdjNjMCwuNjMtLjM4LDEuMDUtMS4yMSwxLjA1SDY4LjE4djIuMzFoMy41N2MxLjkyLDAsMy43Mi0xLDMuNzItMy4yVjYuMzlDNzUuNDgsNC4xMyw3My42OCwzLjE0LDcxLjc2LDMuMTRaTTU0LjIyLDNjLTIsMC00LDEuMS00LDMuMzRWOS42NmMwLDIuMjMsMiwzLjM0LDQsMy4zNHMzLjk1LTEuMTEsMy45NS0zLjM0VjYuMzRDNTguMTksNC4xMSw1Ni4yLDMsNTQuMjIsM1ptMS41NSw2LjY2YzAsLjctLjc4LDEuMDYtMS41NCwxLjA2cy0xLjU1LS4zNS0xLjU1LTEuMDZWNi4zNGMwLS43Mi43NS0xLjEsMS41LTEuMXMxLjU5LjM1LDEuNTksMS4xWk02Ni44NCw2LjM0YzAtMi4yOS0xLjU4LTMuMi0zLjU1LTMuMkg1OS40NnY5LjczaDIuNDVWOS43N2guNDNsMi4yMiwzLjA5aDNMNjUsOS41MkM2Ni4xMyw5LjE1LDY2Ljg0LDguMTQsNjYuODQsNi4zNFpNNjMuMzMsNy42NUg2MS45MVY1LjQzaDEuNDJBMS4xMSwxLjExLDAsMSwxLDYzLjMzLDcuNjVaTTI5LjgzLDEzaDIuNDJWMy4wNkgyOS44M1Y2LjczbC0zLDBWMy4wOUgyNC43djkuNzhoMi4xNFY4LjY4bDMsMFpNMTcuMTYsOS43NlY2LjQyYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFhMy41NSwzLjU1LDAsMCwwLTMuMzYtMi4yNGMtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS43NmMwLDIuMjEsMiwzLjE1LDMuOSwzLjE1czMuNTgtMSwzLjU4LTNWNy41OEgxOC43OWwwLDEuMzZIMjAuM3YuNzdDMjAuMywxMC45MiwxNy4xNiwxMC45NCwxNy4xNiw5Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi45MyAtMylcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMzUuOTEgMC4wNiAzOC40MyAwLjA2IDM4LjQzIDEuODQgMzUuOTIgMS44MSAzNS45NyAxMCAzMy41NSAxMCAzMy40OSAxLjc1IDMwLjk4IDEuNzQgMzAuOTggMC4wNiAzMy40OSAwLjA2IDM1LjkxIDAuMDZcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XHJcbjwvc3ZnPmBcclxuICAgIH1cclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdGltZXNDaGVja2VkID0gMDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBjb25zdCBjaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt3cmFwcGVyfWApLmxlbmd0aCA+IDApIHRpbWVzQ2hlY2tlZCsrO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZCA9IEJEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn0gLiR7Z3VpbGR9IC4ke2Jsb2J9YCkubGVuZ3RoID4gMCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGltZXNDaGVja2VkID49IDUwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gXCJsb2FkaW5nXCIpIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge3NldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7fSk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluamVjdEV4dGVybmFscyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgYXdhaXQgRE9NLmFkZFNjcmlwdChcImFjZS1zY3JpcHRcIiwgXCJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9hY2UvMS4yLjkvYWNlLmpzXCIpO1xyXG4gICAgaWYgKHdpbmRvdy5yZXF1aXJlLm9yaWdpbmFsKSB3aW5kb3cucmVxdWlyZSA9IHdpbmRvdy5yZXF1aXJlLm9yaWdpbmFsO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdFNldHRpbmdzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLmluaXRpYWxpemUoKTtcclxuICAgIGlmKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikgJiYgIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikpe1xyXG4gICAgICAgIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIGRlZmF1bHRDb29raWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgZGVmYXVsdFJQQyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldHRpbmdzUGFuZWwubG9hZFNldHRpbmdzKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIGluIGRlZmF1bHRDb29raWUpIHtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW3NldHRpbmddID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPSBkZWZhdWx0Q29va2llW3NldHRpbmddO1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IG1haW5PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG1sZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbWxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdWdpbk1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIikgcGx1Z2luTW9kdWxlLnJhd09ic2VydmVyKG11dGF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBub3RoaW5nIGFkZGVkLCBza2lwXHJcbiAgICAgICAgICAgIGlmICghbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggfHwgIShtdXRhdGlvbi5hZGRlZE5vZGVzWzBdIGluc3RhbmNlb2YgRWxlbWVudCkpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG11dGF0aW9uLmFkZGVkTm9kZXNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXIsIFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lU29jaWFsTGlua3NcclxuICAgICAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLFxyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zb2NpYWxMaW5rcyAmJiB0eXBlb2YgZS5zb2NpYWxMaW5rcyA9PT0gXCJzdHJpbmdcIilbMF0uc29jaWFsTGlua3NcclxuICAgICAgICAgICAgXVxyXG5cclxuICAgICAgICAgICAgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZUxheWVyKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImd1aWxkLXNldHRpbmdzLWJhc2Utc2VjdGlvblwiKS5sZW5ndGgpIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJzZXJ2ZXItc2V0dGluZ3NcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTb2NpYWxMaW5rcykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInVzZXItc2V0dGluZ3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJkLXNldHRpbmdzLXNpZGViYXJcIikpIHNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnRFbGVtZW50ID09IGRvY3VtZW50LmJvZHkgJiYgbm9kZS5xdWVyeVNlbGVjdG9yKFwiI2FjZV9zZXR0aW5nc21lbnVcIikpIG5vZGUuaWQgPSBcImFjZV9zZXR0aW5nc21lbnVfY29udGFpbmVyXCI7XHJcblxyXG4gICAgICAgICAgICAvLyBFbW9qaSBQaWNrZXJcclxuICAgICAgICAgICAgLy9ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJlbW9qaVBpY2tlci0zbTFTLWpcIikubGVuZ3RoICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuZW1vamlQaWNrZXItM20xUy1qXCIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5pbWF0b3JMZWZ0LTFFUXhVMFwiKVxyXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWFpbk9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5zaG93Q2hhbmdlbG9nTW9kYWwgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hTb2NpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnNvY2lhbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFUYWJCYXIpIHJldHVybjtcclxuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPCAzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKEFuY2hvcikge1xyXG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGU7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld09uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZSA9IG5ld09uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIHNpemVzLFxyXG4gICAgICAgICAgICBjbGFzc05hbWVWZXJzaW9uSGFzaFxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yTXV0ZWQpWzBdLmNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYExpZ2h0Y29yZCAke2VsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCBgKCR7KGVsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS5jb21taXQgfHwgXCJVbmtub3duXCIpLnNsaWNlKDAsIDcpfSlgKSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcclxuICAgICAgICBdXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2lvbnMgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlO1xyXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgIH07XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRHdWlsZENsYXNzZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIndyYXBwZXJcIiwgXCJ1bnJlYWRNZW50aW9uc0JhclwiKTtcclxuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcclxuICAgIGNvbnN0IHBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImJsb2JDb250YWluZXJcIik7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRMaXN0SXRlbXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xyXG4gICAgY29uc3QgbGlzdEl0ZW1DbGFzcyA9IEd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IEd1aWxkQ29tcG9uZW50ID0gcmVhY3RJbnN0YW5jZS5yZXR1cm4udHlwZTtcclxuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkUGlsbHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkUGlsbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xyXG4gICAgaWYgKCFndWlsZFBpbGwpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRQaWxsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChndWlsZFBpbGwsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuc2VsZWN0ZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcclxuICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcclxuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBndWlsZENvbXBvbmVudHMuU2VwYXJhdG9yKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlblszXS50eXBlID0gR3VpbGRTZXBhcmF0b3I7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgQXR0YWNobWVudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF0dGFjaG1lbnRcIilbMF0gLy8gdGVtcG9yYXJ5XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuQXR0YWNobWVudFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goQXR0YWNobWVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0gfHwgbnVsbFxyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdHRhY2htZW50IHx8ICFhdHRhY2htZW50LnVybClyZXR1cm5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgIGlkOiBcImNlcnRpZmllZC1cIitpZFxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcclxuICAgIH19KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lc3NhZ2VIZWFkZXIgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lc3NhZ2VIZWFkZXIgfHwgIU1lc3NhZ2VIZWFkZXIuZGVmYXVsdCkgcmV0dXJuO1xyXG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dGhvciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwibWVzc2FnZS5hdXRob3JcIik7XHJcbiAgICAgICAgLy8gY29uc3QgaGVhZGVyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHNcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF1dGhvciB8fCAhYXV0aG9yLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAoYXV0aG9yLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIGF1dGhvciwgdHJ1ZSlcclxuICAgIH19KTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGFwcGx5QmFkZ2VzKGlkLCB1c2VyLCBjaGF0KXtcclxuICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmFkZ2VzLVwiK2lkKVxyXG4gICAgICAgIGlmKCFkaXYgfHwgZGl2LmNoaWxkTm9kZXMubGVuZ3RoID4gMClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcblxyXG4gICAgICAgIGRpc3RhbnQuZ2V0QmFkZ2VzKHVzZXIuaWQpXHJcbiAgICAgICAgLnRoZW4oYmFkZ2VzID0+IHtcclxuICAgICAgICAgICAgYmFkZ2VzLmZvckVhY2goYmFkZ2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ZnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFwiMTZweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLWxvZ29cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTZweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBiYWRnZS5zY29wZXMuZm9yRWFjaChzY29wZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoc2NvcGUgPT09IFwidXNlclwiKXsvLyByZXF1aXJlIHVzZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudXNlciA9IHVzZXJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSBcclxuICAgICAgICAgICAgICAgIGlmKCFiYWRnZS5ocmVmKXtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5BbmNob3IgPSBBbmNob3JcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5ocmVmID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBiYWRnZS5uYW1lfSxcclxuICAgICAgICAgICAgICAgICAgICBiYWRnZS5ocmVmID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBiYWRnZS5ocmVmLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNoYXQgPyBcImJkLWNoYXQtYmFkZ2VcIiA6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYmFkZ2UubmFtZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKSkgOiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoYmFkZ2UuY29tcG9uZW50LCBwcm9wcylcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpdjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihlbGVtZW50LCBkaXYyKVxyXG4gICAgICAgICAgICAgICAgZGl2Mi5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lbWJlckxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lbWJlckxpc3RQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVtYmVyTGlzdEl0ZW0gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1lbWJlckxpc3RJdGVtXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVtYmVyTGlzdEl0ZW0gfHwgIU1lbWJlckxpc3RJdGVtLnByb3RvdHlwZSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLnJlbmRlckRlY29yYXRvcnMpIHJldHVybjtcclxuICAgIHRoaXMubWVtYmVyTGlzdFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlLCBcInJlbmRlckRlY29yYXRvcnNcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEudGhpc09iamVjdCwgXCJwcm9wcy51c2VyXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIXVzZXIgfHwgIXVzZXIuaWQpcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh1c2VyLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCB1c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLW1lbWJlci1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMzJweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJhZGdlcy1cIitpZH0pXHJcbiAgICAgICAgKVxyXG4gICAgICAgIGFwcGx5QmFkZ2VzKGlkLCB1c2VyLCBmYWxzZSlcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnVwZGF0ZUluamVjdG9yID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBpbmplY3Rpb25QYXRoID0gRGF0YVN0b3JlLmluamVjdGlvblBhdGg7XHJcbiAgICBpZiAoIWluamVjdGlvblBhdGgpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuICAgIGNvbnN0IHJtcmYgPSByZXF1aXJlKFwicmltcmFmXCIpO1xyXG4gICAgY29uc3QgeWF1emwgPSByZXF1aXJlKFwieWF1emxcIik7XHJcbiAgICBjb25zdCBta2RpcnAgPSByZXF1aXJlKFwibWtkaXJwXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IC8qcmVxdWlyZShcInJlcXVlc3RcIik7Ki8gbnVsbFxyXG5cclxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLnJlc29sdmUoaW5qZWN0aW9uUGF0aCwgXCIuLlwiKTtcclxuICAgIGNvbnN0IGZvbGRlck5hbWUgPSBwYXRoLmJhc2VuYW1lKGluamVjdGlvblBhdGgpO1xyXG4gICAgY29uc3QgemlwTGluayA9IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9hcmNoaXZlL2luamVjdG9yLnppcFwiO1xyXG4gICAgY29uc3Qgc2F2ZWRaaXAgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJpbmplY3Rvci56aXBcIik7XHJcbiAgICBjb25zdCBleHRyYWN0ZWRGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgXCJCZXR0ZXJEaXNjb3JkQXBwLWluamVjdG9yXCIpO1xyXG5cclxuICAgIC8vIERvd25sb2FkIHRoZSBpbmplY3RvciB6aXAgZmlsZVxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJEb3dubG9hZGluZyBcIiArIHppcExpbmspO1xyXG4gICAgbGV0IHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICByZXF1ZXN0LmdldCh7dXJsOiB6aXBMaW5rLCBlbmNvZGluZzogbnVsbH0sIGFzeW5jIChlcnJvciwgcmVzcG9uc2UsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZW9uZSBoYXMgdGhlaXIgb3duIGNvcHlcclxuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoc2F2ZWRaaXAsIHJlcykpO1xyXG4gICAgICAgICAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShzYXZlZFppcCwgYCR7c2F2ZWRaaXB9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcblxyXG4gICAgICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIldyaXRpbmcgXCIgKyBzYXZlZFppcCk7XHJcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZShzYXZlZFppcCwgYm9keSwgZXJyID0+IHJlc29sdmUoIWVycikpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBzdWNjZXNzO1xyXG5cclxuICAgIC8vIENoZWNrIGFuZCBkZWxldGUgcmVuYW1lIGV4dHJhY3Rpb25cclxuICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKGV4dHJhY3RlZEZvbGRlciwgcmVzKSk7XHJcbiAgICBpZiAoYWxyZWFkeUV4aXN0cykgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGAke2V4dHJhY3RlZEZvbGRlcn0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gLCByZXMpKTtcclxuICAgIFxyXG4gICAgLy8gVW56aXAgdGhlIGRvd25sb2FkZWQgemlwIGZpbGVcclxuICAgIGNvbnN0IHppcGZpbGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHlhdXpsLm9wZW4oc2F2ZWRaaXAsIHtsYXp5RW50cmllczogdHJ1ZX0sIChlcnIsIHppcCkgPT4gIHIoemlwKSkpO1xyXG4gICAgemlwZmlsZS5vbihcImVudHJ5XCIsIGZ1bmN0aW9uKGVudHJ5KSB7XHJcbiAgICAgICAgLy8gU2tpcCBkaXJlY3RvcmllcywgdGhleSBhcmUgaGFuZGxlZCB3aXRoIG1rZGlycFxyXG4gICAgICAgIGlmIChlbnRyeS5maWxlTmFtZS5lbmRzV2l0aChcIi9cIikpIHJldHVybiB6aXBmaWxlLnJlYWRFbnRyeSgpO1xyXG5cclxuICAgICAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkV4dHJhY3RpbmcgXCIgKyBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgLy8gTWFrZSBhbnkgbmVlZGVkIHBhcmVudCBkaXJlY3Rvcmllc1xyXG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGVudHJ5LmZpbGVOYW1lKTtcclxuICAgICAgICBta2RpcnAuc3luYyhwYXRoLmRpcm5hbWUoZnVsbFBhdGgpKTtcclxuICAgICAgICB6aXBmaWxlLm9wZW5SZWFkU3RyZWFtKGVudHJ5LCBmdW5jdGlvbihlcnIsIHJlYWRTdHJlYW0pIHtcclxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbigpIHt6aXBmaWxlLnJlYWRFbnRyeSgpO30pOyAvLyBHbyB0byBuZXh0IGZpbGUgYWZ0ZXIgdGhpc1xyXG4gICAgICAgICAgICByZWFkU3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oZnVsbFBhdGgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgemlwZmlsZS5yZWFkRW50cnkoKTsgLy8gU3RhcnQgcmVhZGluZ1xyXG5cclxuICAgIC8vIFdhaXQgZm9yIHRoZSBmaW5hbCBmaWxlIHRvIGZpbmlzaFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB6aXBmaWxlLm9uY2UoXCJlbmRcIiwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZmluYWwgc3RlcFxyXG4gICAgY29uc3QgYmFja3VwRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIGAke2ZvbGRlck5hbWV9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCk7XHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShpbmplY3Rpb25QYXRoLCBiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBSZW5hbWUgdGhlIGV4dHJhY3RlZCBmb2xkZXIgdG8gd2hhdCBpdCBzaG91bGQgYmVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIGBSZW5hbWluZyAke3BhdGguYmFzZW5hbWUoZXh0cmFjdGVkRm9sZGVyKX0gdG8gJHtmb2xkZXJOYW1lfWApO1xyXG4gICAgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgZXJyID0+IHJlc29sdmUoIWVycikpKTtcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiRmFpbGVkIHRvIHJlbmFtZSB0aGUgZmluYWwgZGlyZWN0b3J5XCIpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHJlbmFtZSBoYWQgaXNzdWVzLCBkZWxldGUgd2hhdCB3ZSB0cmllZCB0byByZW5hbWUgYW5kIHJlc3RvcmUgYmFja3VwXHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIlNvbWV0aGluZyB3ZW50IHdyb25nLi4uIHJlc3RvcmluZyBiYWNrdXBzLlwiKTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoZXh0cmFjdGVkRm9sZGVyLCByZXNvbHZlKSk7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoYmFja3VwRm9sZGVyLCBpbmplY3Rpb25QYXRoLCByZXNvbHZlKSk7XHJcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgd2UndmUgZ290dGVuIHRvIHRoaXMgcG9pbnQsIGV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgZ29uZSBzbW9vdGhseS5cclxuICAgIC8vIENsZWFudXAgdGhlIGJhY2t1cCBmb2xkZXIgdGhlbiByZW1vdmUgdGhlIHppcFxyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy51bmxpbmsoc2F2ZWRaaXAsIHJlc29sdmUpKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkluamVjdG9yIFVwZGF0ZWQhXCIpO1xyXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpOyIsImNvbnN0IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fID0gd2luZG93LnJlcXVpcmVcclxuXHJcbmltcG9ydCB7YmRDb25maWd9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcblxyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCByZWxlYXNlQ2hhbm5lbCA9IERpc2NvcmROYXRpdmUuZ2xvYmFscyA/IERpc2NvcmROYXRpdmUuZ2xvYmFscy5yZWxlYXNlQ2hhbm5lbCA6IERpc2NvcmROYXRpdmUuYXBwID8gRGlzY29yZE5hdGl2ZS5hcHAuZ2V0UmVsZWFzZUNoYW5uZWwoKSA6IFwic3RhYmxlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGF0YVN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHtzZXR0aW5nczoge3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGEgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLkJERmlsZSkpIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5CREZpbGUsIFwiYmluYXJ5XCIpKVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZnMudW5saW5rU3luYyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCB7W3JlbGVhc2VDaGFubmVsXTogc2V0dGluZ3N9KTtcclxuICAgICAgICAgICAgZWxzZSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCBzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QkREYXRhKFwic2V0dGluZ3NcIiwgc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgVXRpbHMuYWxlcnQoXCJDb3JydXB0IFN0b3JhZ2VcIiwgXCJUaGUgYmQgc3RvcmFnZSBoYXMgc29tZWhvdyBiZWNvbWUgY29ycnVwdC4gWW91IG1heSBlaXRoZXIgdHJ5IHRvIHNhbHZhZ2UgdGhlIGZpbGUgb3IgZGVsZXRlIGl0IHRoZW4gcmVsb2FkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGluamVjdGlvblBhdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3Rpb25QYXRoKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aDtcclxuICAgICAgICBjb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBlbGVjdHJvbi5nZXRBcHBQYXRoKCk7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0Jhc2UgPSBlbGVjdHJvbi5nZXRQYXRoKFwidXNlckRhdGFcIik7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0xvY2F0aW9uID0gcGF0aC5yZXNvbHZlKHJvYW1pbmdCYXNlLCBlbGVjdHJvbi5nZXRWZXJzaW9uKCksIFwibW9kdWxlc1wiLCBcImRpc2NvcmRfZGVza3RvcF9jb3JlXCIsIFwiaW5qZWN0b3JcIik7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBwYXRoLnJlc29sdmUoYmFzZSwgXCIuLlwiLCBcImFwcFwiKTtcclxuICAgICAgICBjb25zdCByZWFsTG9jYXRpb24gPSBmcy5leGlzdHNTeW5jKGxvY2F0aW9uKSA/IGxvY2F0aW9uIDogZnMuZXhpc3RzU3luYyhyb2FtaW5nTG9jYXRpb24pID8gcm9hbWluZ0xvY2F0aW9uIDogbnVsbDtcclxuICAgICAgICBpZiAoIXJlYWxMb2NhdGlvbikgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gcmVhbExvY2F0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWdGaWxlKCkge3JldHVybiB0aGlzLl9jb25maWdGaWxlIHx8ICh0aGlzLl9jb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMuaW5qZWN0aW9uUGF0aCwgXCJiZXR0ZXJkaXNjb3JkXCIsIFwiY29uZmlnLmpzb25cIikpO31cclxuICAgIGdldCBCREZpbGUoKSB7cmV0dXJuIHRoaXMuX0JERmlsZSB8fCAodGhpcy5fQkRGaWxlID0gcGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoLCBcImJkc3RvcmFnZS5qc29uXCIpKTt9XHJcbiAgICBnZXQgc2V0dGluZ3NGaWxlKCkge3JldHVybiB0aGlzLl9zZXR0aW5nc0ZpbGUgfHwgKHRoaXMuX3NldHRpbmdzRmlsZSA9IHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCwgXCJiZHNldHRpbmdzLmpzb25cIikpO31cclxuICAgIGdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkge3JldHVybiBwYXRoLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgcGx1Z2luTmFtZSArIFwiLmNvbmZpZy5qc29uXCIpO31cclxuXHJcbiAgICBnZXRTZXR0aW5nR3JvdXAoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNldHRpbmdHcm91cChrZXksIGRhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gPSBkYXRhO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJERGF0YShrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW2tleV0gfHwgXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRCRERhdGEoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTGlzdGVuZXIgPSB0aGlzLmRlYnVnTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSB0aGlzLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0Q29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0xpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTE5IHx8IGUud2hpY2ggPT0gMTE4KSB7Ly9GOFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Z2dlcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1kZWJ1Z2dlclxyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3B5U2VsZWN0b3JMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IoZS50YXJnZXQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWVMYXllciwgXHJcbiAgICAgICAgICAgICAgICBjbGFzc0l0ZW1zXHJcbiAgICAgICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuZGlzYWJsZWRQb2ludGVyRXZlbnRzKVswXS5sYXllcixcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUuY29udGV4dE1lbnUpWzBdLFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhdHRhY2goKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY20gPSBET00ucXVlcnkoXCIuXCIrY2xhc3NJdGVtcy5jb250ZXh0TWVudS5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5xdWVyeShcIiNhcHAtbW91bnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzTmFtZUxheWVyfVwiPmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMuY29udGV4dE1lbnV9IGJkLWNvbnRleHQtbWVudVwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5hcHBlbmQoY20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY21XcmFwKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS56SW5kZXggPSBcIjEwMDJcIjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDTSA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSAmJiBlLmtleUNvZGUgIT09IDI3KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtV3JhcC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLnF1ZXJ5KFwiLlwiK2NsYXNzTmFtZUxheWVyLnNwbGl0KFwiIFwiKVswXSlcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgY21nID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMuaXRlbUdyb3VwfVwiPmApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY21pID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMuaXRlbX0gJHtjbGFzc0l0ZW1zLmNsaWNrYWJsZX1cIj5gKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubGFiZWx9XCI+Q29weSBTZWxlY3RvcjwvZGl2PmApKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuTmF0aXZlTW9kdWxlLmNvcHkoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xyXG4gICAgICAgICAgICAgICAgY20uYXBwZW5kKGNtZyk7XHJcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZyBcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSAoY21XcmFwLnN0eWxlLnRvcCAtIGNtZy5jbGllbnRIZWlnaHQpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgc2V0VGltZW91dChhdHRhY2gsIDEpO1xyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RvcihlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHJldHVybiBgIyR7ZWxlbWVudC5pZH1gO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGxQYXRoKGVsKXtcclxuICAgICAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcclxuICAgICAgICAgICAgICBpZiAoZWwuaWQpe1xyXG4gICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdCgnIycrZWwuaWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWw9PWVsLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKStBcnJheS5mcm9tKGVsLmNsYXNzTGlzdC5lbnRyaWVzKCkpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0xLGU9ZWw7ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2U9ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLGMrKyk7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpKyhlbC5jbGFzc05hbWUgfHwgXCJcIikuc3BsaXQoXCIgXCIpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikrXCI6bnRoLWNoaWxkKFwiK2MrXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWw9ZWwucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzLmpvaW4oXCIgPiBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLmdldFJ1bGVzKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdFJ1bGUgPSBydWxlc1tydWxlcy5sZW5ndGggLSAxXTtcclxuICAgICAgICBpZiAobGF0ZXN0UnVsZSkgcmV0dXJuIGxhdGVzdFJ1bGUuc2VsZWN0b3JUZXh0O1xyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCkgcmV0dXJuIGAuJHtBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KS5qb2luKFwiLlwiKX1gO1xyXG4gICAgICAgIHJldHVybiBgLiR7QXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0KS5qb2luKFwiLlwiKX1gOyovXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UnVsZXMoZWxlbWVudCwgY3NzID0gZWxlbWVudC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzKSB7XHJcbiAgICAgICAgLy9pZiAod2luZG93LmdldE1hdGNoZWRDU1NSdWxlcykgcmV0dXJuIHdpbmRvdy5nZXRNYXRjaGVkQ1NTUnVsZXMoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRzID0gWy4uLmNzc10uZmlsdGVyKHMgPT4gIXMuaHJlZiB8fCAhcy5ocmVmLmluY2x1ZGVzKFwiQmV0dGVyRGlzY29yZEFwcFwiKSk7XHJcbiAgICAgICAgY29uc3QgcnVsZXMgPSBzaGVldHMubWFwKHMgPT4gWy4uLihzLmNzc1J1bGVzIHx8IFtdKV0pLmZsYXQoKTtcclxuICAgICAgICBjb25zdCBlbGVtZW50UnVsZXMgPSBydWxlcy5maWx0ZXIociA9PiByICYmIHIuc2VsZWN0b3JUZXh0ICYmIGVsZW1lbnQubWF0Y2hlcyhyLnNlbGVjdG9yVGV4dCkgJiYgci5zdHlsZS5sZW5ndGggJiYgci5zZWxlY3RvclRleHQuc3BsaXQoXCIsIFwiKS5sZW5ndGggPCA4ICYmICFyLnNlbGVjdG9yVGV4dC5zcGxpdChcIiwgXCIpLmluY2x1ZGVzKFwiKlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRSdWxlcztcclxuICAgIH1cclxufTsiLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IExpZ2h0Y29yZFVzZXJCYWRnZSBmcm9tIFwiLi4vc3ZnL0xpZ2h0Y29yZFVzZXJcIjtcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXVpZHY0KCkgeyAvLyBHZW5lcmF0ZSBVVUlEIChObyBjcnlwdG8gcm5nKVxyXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xyXG4gICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICB9KTtcclxufSAgXHJcblxyXG5jb25zdCBhd2FpdGluZ0JhZGdlc1Byb21pc2VzID0ge31cclxubGV0IGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERpc3RhbnRTZXJ2ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLl9jYWNoZSA9IHtcclxuICAgICAgICAgICAgYmFkZ2VzOiB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYWNoZSgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZVxyXG4gICAgfVxyXG5cclxuICAgIHNldCBjYWNoZShkYXRhKXtcclxuICAgICAgICBpZih0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgdGhpcy5fY2FjaGUgIT09IFwib2JqZWN0XCIpcmV0dXJuIHRoaXMuX2NhY2hlID0gZGF0YVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZSA9IE9iamVjdC5hc3NpZ24odGhpcy5fY2FjaGUsIGRhdGEpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlKCl7XHJcbiAgICAgICAgQmRBcGkuc2hvd1RvYXN0KFwiRGVsZXRpbmcgYWxsIGluZm9zIGFib3V0IHlvdSBvbiBMaWdodGNvcmQgU2VydmVycy4uLlwiLCB7dHlwZTogXCJ3YXJuXCJ9KVxyXG4gICAgICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KFJvdXRlcy5kZWxldGUsIFwiZGVsZXRlXCIpXHJcbiAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXtcclxuICAgICAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQsIGNvdWxkbid0IGRlbGV0ZSBpbmZvcm1hdGlvbnMuIFNlZSBjb25zb2xlIGZvciBtb3JlIGluZm9zXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHsocmVzLnN0YXR1cytcIiBcIityZXMuc3RhdHVzVGV4dCtcIiBcIithd2FpdCByZXMudGV4dCgpKX1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgU3VjY2VzZnVsbHkgZGVsZXRlZCBpbmZvcm1hdGlvbnMuYClcclxuICAgICAgICAgICAgQmRBcGkuc2hvd1RvYXN0KFwiU3VjY2VzZnVsbHkgZGVsZXRlZCBpbmZvcm1hdGlvbnNcIiwge3R5cGU6IFwic3VjY2Vzc1wifSlcclxuICAgICAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiA9IG51bGxcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKClcclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQsIGNvdWxkbid0IGRlbGV0ZSBpbmZvcm1hdGlvbnMuIFNlZSBjb25zb2xlIGZvciBtb3JlIGluZm9zXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGRlbGV0ZSBhbGwgaW5mb3JtYXRpb25zOiAke2Vyci5zdGFja31gKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgY3VzdG9tIGJhZGdlcyBmcm9tIHRoZSB1c2VyIElELlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgVGhlIHVzZXIgSUQgXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb25zdGFudHNbXCJiYWRnZXNcIl0+fVxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYWRnZXModXNlcil7XHJcbiAgICAgICAgaWYodGhpcy5jYWNoZS5iYWRnZXNbdXNlcl0pcmV0dXJuIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgaWYoYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSlyZXR1cm4gYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG5cclxuICAgICAgICBsZXQgcmVzb2x2ZVxyXG4gICAgICAgIGNvbnN0IG5ld1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiAocmVzb2x2ZSA9IHJlcykpXHJcbiAgICAgICAgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXSA9IG5ld1Byb21pc2VcclxuXHJcbiAgICAgICAgY29uc3QgYmFkZ2VzID0gW11cclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIENvbnN0YW50cy5iYWRnZXMpe1xyXG4gICAgICAgICAgICBpZihiYWRnZS5kZWZhdWx0VXNlcnMuaW5jbHVkZXModXNlcikpYmFkZ2VzLnB1c2goYmFkZ2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZldGNoZWRCYWRnZXMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBiYWRnZXNUb0ZldGNoLnB1c2goW3VzZXIsIHJlc29sdmVdKVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IGJhZGdlc1RvRmV0Y2hcclxuICAgICAgICAgICAgICAgIGlmKHVzZXJzLmxlbmd0aCA9PT0gMClyZXR1cm5cclxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChSb3V0ZXMuYmFkZ2VzLCBcIlBPU1RcIiwgSlNPTi5zdHJpbmdpZnkodXNlcnMubWFwKGUgPT4gZVswXSkpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2VCb2R5KVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHVzZXJzLmZpbmQocHJvbWlzZSA9PiBwcm9taXNlWzBdID09PSB1c2VyLnVzZXJfaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VbMV0odXNlci5iYWRnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoIUNvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBXZSBkbyBub3QgaGF2ZSB0aGUgQ29tcG9uZW50LCBza2lwIGl0LlxyXG4gICAgICAgICAgICBpZihiYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBBbHJlYWR5IGluc2VydGVkLlxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIH0sIDYwMDAwMCk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxyXG4gICAgICAgIGRlbGV0ZSBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XHJcbiAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSl7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBDYW5jZWxpbmcgcmVxdWVzdCBvbiAke3JvdXRlfSB3aXRoIG1ldGhvZCAke21ldGhvZH0gYW5kIGJvZHlgLCBkYXRhLCBcImJlY2F1c2Ugb2Ygc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBMaWdodGNvcmRFcnJvcihcIlRoZSBjdXJyZW50IHNldHRpbmdzIGJsb2NrZWQgdGhlIHJlcXVlc3QuXCIpKVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coYFNlbmRpbmcgcmVxdWVzdCBvbiAke3JvdXRlfSB3aXRoIG1ldGhvZCAke21ldGhvZH0gYW5kIGJvZHlgLCBkYXRhKVxyXG4gICAgcmV0dXJuIG5vZGVGZXRjaChgJHtDb25zdGFudHMuU0VSVkVSX1VSTH0vYXBpL3YxJHtyb3V0ZX1gLCB7XHJcbiAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDTElFTlRcIjogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gfHwgXCJOb25lOjpBbm9ueW1vdXNcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uKGRhdGEgPyB7XHJcbiAgICAgICAgICAgIGJvZHk6IGRhdGFcclxuICAgICAgICB9IDoge30pXHJcbiAgICB9KVxyXG59XHJcblxyXG5jbGFzcyBMaWdodGNvcmRFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTGlnaHRjb3JkRXJyb3JcIlxyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgU0VSVkVSX1VSTDogXCJodHRwOi8vMTI3LjAuMC4xXCIsXHJcbiAgICBiYWRnZXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIFVzZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiMDFjZmE3YjAtN2NkYi00YjBlLTgyNTgtOWM2YTc4MjM1YzkzXCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW10sXHJcbiAgICAgICAgICAgIHNjb3BlczogW1xyXG4gICAgICAgICAgICAgICAgXCJ1c2VyXCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBMaWdodGNvcmRVc2VyQmFkZ2VcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiZjA0Njk4ZjUtODE2Yi00MWUzLWJkMDEtOTIyOTExOTNkN2E1XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW10sXHJcbiAgICAgICAgICAgIHNjb3BlczogW10sXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogQnVnSHVudGVyQmFkZ2UsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC9saWdodGNvcmQvd2lraS9iYWRnZXMvYnVnX2h1bnRlclwiXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUm91dGVzID0ge1xyXG4gICAgYmFkZ2VzOiBgL3VzZXJzL2JhZGdlc2AsXHJcbiAgICBkZWxldGU6IGAvZGVsZXRlYFxyXG59IiwiLyoqXHJcbiAqIENvcHlyaWdodCAyMDE4IFphY2hhcnkgUmF1ZW5cclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXHJcbiAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLFxyXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxyXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkXHJcbiAqIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCxcclxuICogSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEFcclxuICogUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVFxyXG4gKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0ZcclxuICogQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFXHJcbiAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxyXG4gKiBcclxuICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQkRQbHVnaW5MaWJyYXJ5XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBpbnRlcmZhY2VcclxuICogQG5hbWUgT2Zmc2V0XHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUb3Agb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJpZ2h0IC0gUmlnaHQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBvZmZzZXQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVmdCAtIExlZnQgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIE91dGVyIGhlaWdodCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCAtIE91dGVyIHdpZHRoIG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICovXHJcblxyXG4gLyoqXHJcbiAqIEZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSByZW1vdmVzIGFkZGVkIGxpc3RlbmVyLlxyXG4gKiBAY2FsbGJhY2sgbW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyXHJcbiAqL1xyXG4gXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERPTVRvb2xzIHtcclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlSUQoaWQpIHtcclxuICAgICAgICByZXR1cm4gaWQucmVwbGFjZSgvXlteYS16XSt8W15cXHctXSsvZ2ksIFwiLVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBBZGRzIGEgc3R5bGUgdG8gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGlkZW50aWZpZXIgdG8gdXNlIGFzIHRoZSBlbGVtZW50IGlkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNzcyAtIGNzcyB0byBhZGQgdG8gdGhlIGRvY3VtZW50XHJcblx0ICovXHJcblx0c3RhdGljIGFkZFN0eWxlKGlkLCBjc3MpIHtcclxuXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kKERPTVRvb2xzLmNyZWF0ZUVsZW1lbnQoYDxzdHlsZSBpZD1cIiR7aWR9XCI+JHtjc3N9PC9zdHlsZT5gKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgc3R5bGUgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVN0eWxlKGlkKSB7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzL3JlcXVpcmVzIGEgcmVtb3RlIHNjcmlwdCB0byBiZSBsb2FkZWRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgdGhpcyBzY3JpcHRcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gdXJsIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgc2NyaXB0XHJcblx0ICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzY3JpcHQgaXMgbG9hZGVkXHJcblx0ICovXHJcblx0c3RhdGljIGFkZFNjcmlwdChpZCwgdXJsKSB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcblx0XHRcdGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcblx0XHRcdHNjcmlwdC5pZCA9IGlkO1xyXG5cdFx0XHRzY3JpcHQuc3JjID0gdXJsO1xyXG5cdFx0XHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XHJcblx0XHRcdHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xyXG5cdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIGEgcmVtb3RlIHNjcmlwdCBmcm9tIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBvcmlnaW5hbCBpZGVudGlmaWVyIHVzZWRcclxuXHQgKi9cclxuXHRzdGF0aWMgcmVtb3ZlU2NyaXB0KGlkKSB7XHJcbiAgICAgICAgaWQgPSB0aGlzLmVzY2FwZUlEKGlkKTtcclxuXHRcdGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcblx0XHRpZiAoZWxlbWVudCkgZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gaHR0cHM6Ly9qYXZhc2NyaXB0LmluZm8vanMtYW5pbWF0aW9uXHJcbiAgICBzdGF0aWMgYW5pbWF0ZSh7dGltaW5nID0gXyA9PiBfLCB1cGRhdGUsIGR1cmF0aW9ufSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICAgIFxyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBhbmltYXRlKHRpbWUpIHtcclxuICAgICAgICAgIC8vIHRpbWVGcmFjdGlvbiBnb2VzIGZyb20gMCB0byAxXHJcbiAgICAgICAgICBsZXQgdGltZUZyYWN0aW9uID0gKHRpbWUgLSBzdGFydCkgLyBkdXJhdGlvbjtcclxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPiAxKSB0aW1lRnJhY3Rpb24gPSAxO1xyXG4gICAgICBcclxuICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGVcclxuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGltaW5nKHRpbWVGcmFjdGlvbik7XHJcbiAgICAgIFxyXG4gICAgICAgICAgdXBkYXRlKHByb2dyZXNzKTsgLy8gZHJhdyBpdFxyXG4gICAgICBcclxuICAgICAgICAgIGlmICh0aW1lRnJhY3Rpb24gPCAxKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgbXkgc2hpdCB2ZXJzaW9uIG9mIG5vdCBoYXZpbmcgdG8gdXNlIGAkYCBmcm9tIGpRdWVyeS4gTWVhbmluZ1xyXG4gICAgICogdGhhdCB5b3UgY2FuIHBhc3MgYSBzZWxlY3RvciBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5fS5cclxuICAgICAqIEl0IGFsc28gbWVhbnMgdGhhdCB5b3UgY2FuIHBhc3MgYSBzdHJpbmcgb2YgaHRtbCBhbmQgaXQgd2lsbCBwZXJmb3JtIGFuZCByZXR1cm4gYHBhcnNlSFRNTGAuXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5wYXJzZUhUTUxcclxuICAgICAqIEBzZWUgbW9kdWxlOkRPTVRvb2xzLnF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeSBvciBIVE1MIHRvIHBhcnNlXHJcbiAgICAgKiBAcmV0dXJucyB7KERvY3VtZW50RnJhZ21lbnR8Tm9kZUxpc3R8SFRNTEVsZW1lbnQpfSAtIEVpdGhlciB0aGUgcmVzdWx0IG9mIGBwYXJzZUhUTUxgIG9yIGBxdWVyeWBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFEoc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUhUTUwoc2VsZWN0b3IpO1xyXG4gICAgICAgIGNvbnN0IGlzSFRNTCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IEFycmF5LmZyb20oZWxlbWVudCkuc29tZShuID0+IG4ubm9kZVR5cGUgPT09IDEpIDogZWxlbWVudC5ub2RlVHlwZSA9PT0gMTtcclxuICAgICAgICBpZiAoaXNIVE1MKSByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMgeyhFbGVtZW50fG51bGwpfSAtIFRoZSBmb3VuZCBlbGVtZW50IG9yIG51bGwgaWYgbm90IGZvdW5kXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeShzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSBiYXNlRWxlbWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzc2VudGlhbGx5IGEgc2hvcnRoYW5kIGZvciBgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbGAuIElmIHRoZSBgYmFzZUVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZFxyXG4gICAgICogYGRvY3VtZW50YCBpcyB1c2VkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBxdWVyeVxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBbYmFzZUVsZW1lbnRdIC0gRWxlbWVudCB0byBiYXNlIHRoZSBxdWVyeSBmcm9tXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gQXJyYXkgb2YgYWxsIGZvdW5kIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeUFsbChzZWxlY3RvciwgYmFzZUVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSBiYXNlRWxlbWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHJldHVybiBiYXNlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlcyBhIHN0cmluZyBvZiBIVE1MIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyB0cnVlLFxyXG4gICAgICogdGhlIHBhcnNlZCBIVE1MIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBkb2N1bWVudCBmcmFnbWVudCB7QHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnRGcmFnbWVudH0uXHJcbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgaWYgeW91IGhhdmUgYSBsaXN0IG9mIGVsZW1lbnRzIGF0IHRoZSB0b3AgbGV2ZWwsIHRoZXkgY2FuIHRoZW4gYmUgYXBwZW5kZWQgYWxsIGF0IG9uY2UgdG8gYW5vdGhlciBub2RlLlxyXG4gICAgICogXHJcbiAgICAgKiBJZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIGxpc3Qgb2YgcGFyc2VkXHJcbiAgICAgKiBub2RlcyBhbmQgdGhlcmUgd2VyZSBtdWx0aXBsZSB0b3AgbGV2ZWwgbm9kZXMsIG90aGVyd2lzZSB0aGUgc2luZ2xlIG5vZGUgaXMgcmV0dXJuZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIEhUTUwgdG8gYmUgcGFyc2VkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcmFnbWVudD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuIHNob3VsZCBiZSB0aGUgcmF3IGBEb2N1bWVudEZyYWdtZW50YFxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBUaGUgcmVzdWx0IG9mIEhUTUwgcGFyc2luZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcGFyc2VIVE1MKGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcclxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSB0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKTtcclxuICAgICAgICBpZiAoZnJhZ21lbnQpIHJldHVybiBub2RlO1xyXG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID4gMSA/IG5vZGUuY2hpbGROb2RlcyA6IG5vZGUuY2hpbGROb2Rlc1swXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWx0ZXJuYXRlIG5hbWUgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MfSAqL1xyXG4gICAgc3RhdGljIGNyZWF0ZUVsZW1lbnQoaHRtbCwgZnJhZ21lbnQgPSBmYWxzZSkge3JldHVybiB0aGlzLnBhcnNlSFRNTChodG1sLCBmcmFnbWVudCk7fVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGVzY2FwZXMgaXQgdXNpbmcgdGhlIGJyb3dlcidzIG93biBlc2NhcGluZyBtZWNoYW5pc20uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaHRtbCAtIGh0bWwgdG8gYmUgZXNjYXBlZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZXNjYXBlSFRNTChodG1sKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcclxuICAgICAgICBjb25zdCBzcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgIHNwYW5FbGVtZW50LmFwcGVuZCh0ZXh0Tm9kZSk7XHJcbiAgICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gaHRtbDtcclxuICAgICAgICByZXR1cm4gc3BhbkVsZW1lbnQuaW5uZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3Qgb2YgY2xhc3NlcyBmcm9tIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gY2xhc3NlcyAtIE5hbWVzIG9mIGNsYXNzZXMgdG8gYWRkXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhZGRDbGFzcyhlbGVtZW50LCAuLi5jbGFzc2VzKSB7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIHJlbW92ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7IGMrKykgY2xhc3Nlc1tjXSA9IGNsYXNzZXNbY10udG9TdHJpbmcoKS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmxhdCgpLmZpbHRlcihjID0+IGMpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc2VzKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gb25seSBvbmUgYXJndW1lbnQgaXMgcHJlc2VudDogVG9nZ2xlIGNsYXNzIHZhbHVlO1xyXG4gICAgICogaS5lLiwgaWYgY2xhc3MgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0IGFuZCByZXR1cm4gZmFsc2UsIGlmIG5vdCwgdGhlbiBhZGQgaXQgYW5kIHJldHVybiB0cnVlLlxyXG4gICAgICogV2hlbiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50OlxyXG4gICAgICogSWYgdGhlIHNlY29uZCBhcmd1bWVudCBldmFsdWF0ZXMgdG8gdHJ1ZSwgYWRkIHNwZWNpZmllZCBjbGFzcyB2YWx1ZSwgYW5kIGlmIGl0IGV2YWx1YXRlcyB0byBmYWxzZSwgcmVtb3ZlIGl0LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc25hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHRvZ2dsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW5kaWNhdG9yXSAtIE9wdGlvbmFsIGluZGljYXRvciBmb3IgaWYgdGhlIGNsYXNzIHNob3VsZCBiZSB0b2dnbGVkXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc25hbWUsIGluZGljYXRvcikge1xyXG4gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBpZiAodHlwZW9mKGluZGljYXRvcikgIT09IFwidW5kZWZpbmVkXCIpIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMsIGluZGljYXRvcikpO1xyXG4gICAgICAgIGVsc2UgY2xhc3NuYW1lLmZvckVhY2goYyA9PiBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYykpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaGFzIGEgc3BlY2lmaWMgY2xhc3NcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byBjaGVja1xyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IC0gYHRydWVgIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgY2xhc3MsIGBmYWxzZWAgb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaGFzQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS50b1N0cmluZygpLnNwbGl0KFwiIFwiKS5maWx0ZXIoYyA9PiBjKS5ldmVyeShjID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGMpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIG9uZSBjbGFzcyB3aXRoIGFub3RoZXJcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkTmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gcmVwbGFjZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld05hbWUgLSBOZXcgbmFtZSBmb3IgdGhlIGNsYXNzXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBgZWxlbWVudGAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXBsYWNlQ2xhc3MoZWxlbWVudCwgb2xkTmFtZSwgbmV3TmFtZSkge1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlcGxhY2Uob2xkTmFtZSwgbmV3TmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBlbmRzIGB0aGlzTm9kZWAgdG8gYHRoYXROb2RlYFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIE5vZGUgdG8gYmUgYXBwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBhcHBlbmRlZCB0b1xyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFwcGVuZFRvKHRoaXNOb2RlLCB0aGF0Tm9kZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGhhdE5vZGUpID09IFwic3RyaW5nXCIpIHRoYXROb2RlID0gdGhpcy5xdWVyeSh0aGF0Tm9kZSk7XHJcbiAgICAgICAgaWYgKCF0aGF0Tm9kZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhhdE5vZGUuYXBwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIHByZXBlbmRlZCB0byBhbm90aGVyIG5vZGVcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhhdE5vZGUgLSBOb2RlIGZvciBgdGhpc05vZGVgIHRvIGJlIHByZXBlbmRlZCB0b1xyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLnByZXBlbmQodGhpc05vZGUpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50Lmluc2VydEFmdGVyKG90aGVyRWxlbWVudClgLlxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGlzTm9kZSAtIFRoZSBub2RlIHRvIGluc2VydFxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXROb2RlIC0gTm9kZSB0byBpbnNlcnQgYWZ0ZXIgaW4gdGhlIHRyZWVcclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbnNlcnRBZnRlcih0aGlzTm9kZSwgdGFyZ2V0Tm9kZSkge1xyXG4gICAgICAgIHRhcmdldE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpc05vZGUsIHRhcmdldE5vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc2VydCBhZnRlciBhIHNwZWNpZmljIGVsZW1lbnQsIHNpbWlsYXIgdG8galF1ZXJ5J3MgYHRoaXNFbGVtZW50LmFmdGVyKG5ld0VsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWZ0ZXIodGhpc05vZGUsIG5ld05vZGUpIHtcclxuICAgICAgICB0aGlzTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCB0aGlzTm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gc2VsZWN0b3IgPyBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIrIFwiICsgc2VsZWN0b3IpIDogZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzdWJzZXF1ZW50IHNpYmxpbmdzLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgbmV4dCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0QWxsKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwifiAqXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgc3Vic2VxdWVudCBzaWJsaW5ncyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGZvbGxvd2luZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBuZXh0VW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gW107IFxyXG4gICAgICAgIHdoaWxlIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIG5leHQucHVzaChlbGVtZW50ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJldmlvdXMgc2libGluZyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIlwiXSAtIE9wdGlvbmFsIHNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgc2libGluZyBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91cyhlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHJldHVybiBwcmV2aW91cyAmJiBwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSA/IHByZXZpb3VzIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBwcmVjZWVkaW5nIHNpYmxpbmdzLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHJldHVybnMge05vZGVMaXN0fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c0FsbChlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZWNlZWRpbmcgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBzdG9wIGF0XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2Ygc2libGluZ3NcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHByZXZpb3VzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmICFlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcubWF0Y2hlcyhzZWxlY3RvcikpIHByZXZpb3VzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCB3aGljaCBpbmRleCBpbiBjaGlsZHJlbiBhIGNlcnRhaW4gbm9kZSBpcy4gU2ltaWxhciB0byBqUXVlcnkncyBgJC5pbmRleCgpYFxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHRvIGZpbmQgaXRzIGluZGV4IGluIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gSW5kZXggb2YgdGhlIG5vZGVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGluZGV4SW5QYXJlbnQobm9kZSkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgbGV0IG51bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0gPT0gbm9kZSkgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09IDEpIG51bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5pbmRleEluUGFyZW50fSAqL1xyXG4gICAgc3RhdGljIGluZGV4KG5vZGUpIHtyZXR1cm4gdGhpcy5pbmRleEluUGFyZW50KG5vZGUpO31cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudCBpZiBpdCBtYXRjaGVzIHRoZSBzZWxlY3RvcixcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBwYXJlbnQgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBTZWxlY3RvciB0byBtYXRjaCBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgc2libGluZyBlbGVtZW50IG9yIG51bGxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudChlbGVtZW50LCBzZWxlY3RvciA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdG9yIHx8IGVsZW1lbnQucGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSA/IGVsZW1lbnQucGFyZW50RWxlbWVudCA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBjaGlsZHJlbiBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIGNoaWxkcmVuIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgY2hpbGRyZW4gdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZmluZENoaWxkKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IFwiICsgc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGFuY2VzdG9ycyBvZiBFbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGlmIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHBhcmVudHMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgcGFyZW50cyB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG4gICAgICAgIGlmIChzZWxlY3Rvcikgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xvc2VzdChzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKTtcclxuICAgICAgICBlbHNlIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFuY2VzdG9ycyB1bnRpbCBhbiBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIGFuY2VzdG9ycyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHBhcmVudHNcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcmVudHNVbnRpbChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmICFlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHBhcmVudHMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gcGFyZW50cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIHNpYmxpbmdzIG9mIHRoZSBlbGVtZW50IHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgYWxsIHNpYmxpbmdzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiKlwiXSAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBzaWJsaW5ncyB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaWJsaW5ncyhlbGVtZW50LCBzZWxlY3RvciA9IFwiKlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoZSA9PiBlICE9IGVsZW1lbnQgJiYgZS5tYXRjaGVzKHNlbGVjdG9yKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgY3NzIHN0eWxlcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50LiBJZiBgdmFsdWVgIGlzIHByb3ZpZGVkXHJcbiAgICAgKiB0aGVuIGl0IHNldHMgdGhlIHN0eWxlIGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdHlsZS4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSAtIEF0dHJpYnV0ZSB0byBnZXQgb3Igc2V0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFZhbHVlIHRvIHNldCBmb3IgYXR0cmlidXRlXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY3NzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClbYXR0cmlidXRlXTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlW2F0dHJpYnV0ZV0gPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgd2lkdGggZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSB3aWR0aCBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgd2lkdGguICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gV2lkdGggdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd2lkdGgoZWxlbWVudCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSA9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS53aWR0aCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIHRoZSBoZWlnaHQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBoZWlnaHQgYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIGhlaWdodC4gIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIENTUyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBIZWlnaHQgdG8gc2V0XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudHxzdHJpbmd9IC0gV2hlbiBzZXR0aW5nIGEgdmFsdWUsIGVsZW1lbnQgaXMgcmV0dXJuZWQgZm9yIGNoYWluaW5nLCBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHJldHVybmVkLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaGVpZ2h0KGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0KTtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgaW5uZXIgdGV4dCBvZiBhbiBlbGVtZW50IGlmIGdpdmVuIGEgdmFsdWUsIG90aGVyd2lzZSByZXR1cm5zIGl0LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXQgdGhlIHRleHQgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGV4dF0gLSBDb250ZW50IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBFaXRoZXIgdGhlIHN0cmluZyBzZXQgYnkgdGhpcyBjYWxsIG9yIHRoZSBjdXJyZW50IHRleHQgY29udGVudCBvZiB0aGUgbm9kZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHRleHQoZWxlbWVudCwgdGV4dCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodGV4dCkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5uZXJXaWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgd2lkdGggb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgd2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbm5lcldpZHRoKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVySGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBpbm5lciBoZWlnaHQgb2ZcclxuICAgICAqIEByZXR1cm4ge251bWJlcn0gLSBUaGUgaW5uZXIgaGVpZ2h0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJIZWlnaHQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG91dGVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb3V0ZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgb3V0ZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIG91dGVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIHBhZ2UuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBvZmZzZXQgb2ZcclxuICAgICAqIEByZXR1cm4ge09mZnNldH0gLSBUaGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvZmZzZXQoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgbGlzdGVuZXJzKCkgeyByZXR1cm4gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb25gIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXHJcbiAgICAgKiBcclxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVzIHdoZW4gdGhlIHRhcmdldCBpcyBhIGAuYmxvY2tgIGVsZW1lbnQuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBcIi5ibG9ja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImNsaWNrZWQhXCIpO30pO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIGFkZCBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyBvbmNlLlxyXG4gICAgICogYGNvbnN0IGNhbmNlbCA9IERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiZmlyZWQhXCIpOyBjYW5jZWwoKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYWRkIGxpc3RlbmVyIHRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCB0byBsaXN0ZW4gdG8gd2l0aCBvcHRpb24gbmFtZXNwYWNlIChlLmcuIFwiZXZlbnQubmFtZXNwYWNlXCIpXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8Y2FsbGFibGUpfSBkZWxlZ2F0ZSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHttb2R1bGU6RE9NVG9vbHN+Q2FuY2VsTGlzdGVuZXJ9IC0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgdW5kbyB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9uKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gY2FsbGJhY2sgOiBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jdGlvbmFsaXR5IGZvciB0aGlzIG1ldGhvZCBtYXRjaGVzIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub259IGJ1dCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmXHJcbiAgICAgKiBhbmQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgdXBvbiB0aGUgZmlyc3QgZmlyaW5nIG9mIHRoZSBkZXNpcmVkIGV2ZW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbmNlKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBoYXNEZWxlZ2F0ZSA9IGRlbGVnYXRlICYmIGNhbGxiYWNrO1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gZGVsZWdhdGU7XHJcbiAgICAgICAgY29uc3QgZXZlbnRGdW5jID0gIWhhc0RlbGVnYXRlID8gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9IDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0pIHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gPSBbXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnNwbGljZSh0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLmZpbmRJbmRleChsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCksIDEpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBuZXdDYW5jZWxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdDYW5jZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5jZWw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIF9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgbGV0IG1hdGNoRmlsdGVyID0gbGlzdGVuZXIgPT4gbGlzdGVuZXIuZXZlbnQgPT0gdHlwZSwgZGVmYXVsdEZpbHRlciA9IF8gPT4gXztcclxuICAgICAgICBpZiAoZWxlbWVudCkgbWF0Y2hGaWx0ZXIgPSBsID0+IGwuZXZlbnQgPT0gdHlwZSAmJiBsLmVsZW1lbnQgPT0gZWxlbWVudCwgZGVmYXVsdEZpbHRlciA9IGwgPT4gbC5lbGVtZW50ID09IGVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXSB8fCBbXTtcclxuICAgICAgICBjb25zdCBsaXN0ID0gdHlwZSA/IGxpc3RlbmVycy5maWx0ZXIobWF0Y2hGaWx0ZXIpIDogbGlzdGVuZXJzLmZpbHRlcihkZWZhdWx0RmlsdGVyKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGxpc3QubGVuZ3RoOyBjKyspIGxpc3RbY10uY2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGpRdWVyeSdzIGBvZmZgIGZ1bmN0aW9uIGFuZCBjYW4gKmhvcGVmdWxseSogYmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkuXHJcbiAgICAgKiBcclxuICAgICAqIFJhdGhlciB0aGFuIGF0dGVtcHQgdG8gZXhwbGFpbiwgSSdsbCBzaG93IHNvbWUgZXhhbXBsZSB1c2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyIGNhbGxlZCBgb25DbGlja2AgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAgdGhhdCBvbmx5IGZpcmVkIHdoZW4gdGhlIHRhcmdldCBpcyBhIGAuYmxvY2tgIGVsZW1lbnQuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGlja1wiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBjbGljayBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCJjbGljay5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycyBpbiBuYW1lc3BhY2UgYG15UGx1Z2luYCBmcm9tICphbGwgZWxlbWVudHMqLlxyXG4gICAgICogYERPTVRvb2xzLm9mZihcIi5teVBsdWdpblwiKTtgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7KEVsZW1lbnR8c3RyaW5nKX0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmVtb3ZlIGxpc3RlbmVyIGZyb21cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRdIC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gW2RlbGVnYXRlXSAtIFNlbGVjdG9yIHRvIHJ1biBvbiBlbGVtZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW2NhbGxiYWNrXSAtIEZ1bmN0aW9uIHRvIGZpcmUgb24gZXZlbnRcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBvcmlnaW5hbCBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2ZmKGVsZW1lbnQsIGV2ZW50LCBkZWxlZ2F0ZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAodHlwZW9mKGVsZW1lbnQpID09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHJldHVybiB0aGlzLl9fb2ZmQWxsKGV2ZW50LCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgZm9yIHdoZW4gdGhlIG5vZGUgaXMgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCBib2R5LlxyXG4gICAgICogVGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB1cG9uIGZpcmluZy5cclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBub2RlIHRvIHdhaXQgZm9yXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBjYWxsYmFjayAtIGZ1bmN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBldmVudFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbk1vdW50IC0gZGV0ZXJtaW5lcyBpZiBpdCBzaG91bGQgZmlyZSBvbiBNb3VudCBvciBvbiBVbm1vdW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50Q2hhbmdlKG5vZGUsIGNhbGxiYWNrLCBvbk1vdW50ID0gdHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci51bnN1YnNjcmliZSh3cmFwcGVkQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5vYnNlcnZlci5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrLCBtdXRhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShvbk1vdW50ID8gbXV0YXRpb24uYWRkZWROb2RlcyA6IG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGB0cnVlYCAqL1xyXG4gICAgc3RhdGljIG9uTW91bnQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogU2hvcnRoYW5kIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnRDaGFuZ2V9IHdpdGggdGhpcmQgcGFyYW1ldGVyIGBmYWxzZWAgKi9cclxuICAgIHN0YXRpYyBvblVubW91bnQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgZmFsc2UpOyB9XHJcblxyXG4gICAgLyoqIEFsaWFzIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9uTW91bnR9ICovXHJcbiAgICBzdGF0aWMgb25BZGRlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vbk1vdW50KG5vZGUsIGNhbGxiYWNrKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vblVubW91bnR9ICovXHJcbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uVW5tb3VudChub2RlLCBjYWxsYmFjaywgZmFsc2UpOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggY29tYmluZXMgbXVsdGlwbGUgZWxlbWVudHMgaW50byBvbmUgcGFyZW50IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBlbGVtZW50cyAtIGFycmF5IG9mIGVsZW1lbnRzIHRvIHB1dCBpbnRvIGEgc2luZ2xlIHBhcmVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd3JhcChlbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IGRvbVdyYXBwZXIgPSB0aGlzLnBhcnNlSFRNTChgPGRpdiBjbGFzcz1cImRvbS13cmFwcGVyXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBlbGVtZW50cy5sZW5ndGg7IGUrKykgZG9tV3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50c1tlXSk7XHJcbiAgICAgICAgcmV0dXJuIGRvbVdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNvbHZlcyB0aGUgbm9kZSB0byBhbiBIVE1MRWxlbWVudC4gVGhpcyBpcyBtYWlubHkgdXNlZCBieSBsaWJyYXJ5IG1vZHVsZXMuXHJcbiAgICAgKiBAcGFyYW0geyhqUXVlcnl8RWxlbWVudCl9IG5vZGUgLSBub2RlIHRvIHJlc29sdmVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlc29sdmVFbGVtZW50KG5vZGUpIHtcclxuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtiZENvbmZpZywgc2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuLy9pbXBvcnQgRGlzY29yZENyeXB0IGZyb20gXCIuL0Rpc2NvcmRDcnlwdFwiO1xyXG5cclxuY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgRW1vamlSZWdleDogLzxhP1xcLihcXHcrKVxcLihcXGQrKT4vZ1xyXG59XHJcblxyXG5sZXQgQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxubGV0IEVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG5sZXQgQXV0b2NvbXBsZXRlTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpWzBdXHJcbmxldCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpWzBdXHJcbmxldCBFbW9qaU1vZHVsZVF1ZXJ5ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpWzBdXHJcbmxldCBNZXNzYWdlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylbMF1cclxubGV0IGd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpWzBdXHJcbmxldCBlbW9qaVNlYXJjaCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRW1vamlNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmluaXQoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICAvKiogRW1vamkgQXV0b0NvbXBsZXRlICovXHJcbiAgICAgICAgaWYoIUF1dG9jb21wbGV0ZU1vZHVsZSlBdXRvY29tcGxldGVNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXHJcbiAgICAgICAgaWYoIUVtb2ppTW9kdWxlUXVlcnkpRW1vamlNb2R1bGVRdWVyeSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylcclxuICAgICAgICBpZighTWVzc2FnZXMpTWVzc2FnZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVxyXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcclxuICAgICAgICBpZighZW1vamlTZWFyY2gpZW1vamlTZWFyY2ggPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuICAgICAgICBpZihBdXRvY29tcGxldGVNb2R1bGUgJiYgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgJiYgRW1vamlNb2R1bGVRdWVyeSAmJiBNZXNzYWdlcyAmJiBndWlsZE1vZHVsZSAmJiBlbW9qaVNlYXJjaCl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQYXRjaGluZyBnZXRBdXRvY29tcGxldGVPcHRpb25zIG9mIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzYCwgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMpXHJcbiAgICAgICAgICAgIGNvbnN0IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zXHJcbiAgICAgICAgICAgIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBmdW5jdGlvbihlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgICAgIHZhbHVlLkxJR0hUQ09SRF9FTU9KSVMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyhhcmcxLCBhcmcyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9IGFyZzIubGVuZ3RoID4gMSAmJiBcIi5cIiA9PT0gYXJnMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFbW9qaVVzYWJsZShjb25kaXRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cyh0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBFbW9qaU1vZHVsZVF1ZXJ5LmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHModCwgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclJlc3VsdHMoZSwgdCwgbiwgciwgYSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEKGUsIHQsIGEuZW1vamlzLCBuLCByLCBNZXNzYWdlcy5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HLCBNZXNzYWdlcy5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJLCBBdXRvY29tcGxldGVNb2R1bGUuZGVmYXVsdC5FbW9qaSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlLmlkIHx8IGUudW5pcXVlTmFtZSB8fCBlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWw6IFwiLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWxkOiBudWxsICE9IGUuZ3VpbGRJZCA/IGd1aWxkTW9kdWxlLmRlZmF1bHQuZ2V0R3VpbGQoZS5ndWlsZElkKSA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBlICsgXCIuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRQbGFpblRleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmF3VGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBzdGFydCBhdXRvY29tcGxldGlvbiBvZiBMaWdodGNvcmQncyBlbW9qaXMuXCIpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEVtb2ppIGRpc3BsYXkgKi9cclxuICAgICAgICB3aGlsZSAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW9qaVJlbmRlcil7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlXCIpXHJcbiAgICAgICAgICAgICAgICBpZighbWVzc2FnZSlyZXR1cm5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIWNvbnRlbnQgfHwgIWNvbnRlbnQubGVuZ3RoKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50ID0gRGlzY29yZENyeXB0LmRlY3J5cHRDb250ZW50KGNvbnRlbnQpXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge3tcclxuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgaWQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgICogfVtdfVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihub2RlKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJzZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IEVtb2ppTW9kdWxlQXBpLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKHBhcnNlZFsyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVtb2ppKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW1vamkubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBwYXJzZWRbMF0uc3RhcnRzV2l0aChcIjxhXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWRbMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihoYXNQYXJzZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmQpcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzLmZpbmQoZSA9PiBlLnJhdyA9PSB3b3JkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighQ3VzdG9tRW1vamlNb2R1bGUpQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUVtb2ppTW9kdWxlLkN1c3RvbUVtb2ppLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYC4ke2Vtb2ppLm5hbWV9LmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppSWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bWJvYWJsZTogYXJyLmxlbmd0aCA9PT0gMSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZXZpb3VzLmxlbmd0aCA9PT0gMClyZXR1cm4gW2N1cnJlbnRdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gKz0gYCAke2N1cnJlbnR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIitjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIiwgY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKC4uLndvcmRzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShuZXdDb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQucHVzaChuZXdDb250ZW50LnNoaWZ0KCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vdGVSZW5kZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEQoZSwgdCwgbiwgciwgbywgaSwgcywgdSwgbCwgYykge1xyXG4gICAgaWYgKG51bGwgPT0gbiB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICB2YXIgZCA9IG4ubWFwKChmdW5jdGlvbihlLCBuKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodSwgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgIG9uQ2xpY2s6IG8sXHJcbiAgICAgICAgICAgIG9uSG92ZXI6IHIsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0ID09PSBuLFxyXG4gICAgICAgICAgICBpbmRleDogblxyXG4gICAgICAgIH0sIGwoZSwgbikpKVxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIFtSKGksIHMsIGUsIGMpLCBkXVxyXG59XHJcblxyXG5mdW5jdGlvbiBSKGUsIHQsIG4sIHIpIHtcclxuICAgIHZhciBhID0gKG4ubGVuZ3RoID4gMCA/IGUuZm9ybWF0KHtcclxuICAgICAgICBwcmVmaXg6IHIobilcclxuICAgIH0pIDogdClcclxuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpe1xyXG4gICAgICAgIGEudW5zaGlmdChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIHt9LCBcIltMaWdodGNvcmRdIFwiKSlcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGEgPSBcIltMSUdIVENPUkRdIFwiK2FcclxuICAgIH1cclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LlRpdGxlLCB7XHJcbiAgICAgICAgdGl0bGU6IGFcclxuICAgIH0sIGEpXHJcbn1cclxuUi5kaXNwbGF5TmFtZSA9IFwicmVuZGVySGVhZGVyXCI7XHJcblxyXG5sZXQgRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbmxldCBpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZSAmJiBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5sZXQgaXNVc2FibGUgPSBmYWxzZVxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcblxyXG5mdW5jdGlvbiBzZXRFbW9qaVVzYWJsZSh1c2FibGUpe1xyXG4gICAgaXNVc2FibGUgPSB1c2FibGVcclxuICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpcmV0dXJuXHJcbiAgICBpZighaXNFbW9qaURpc2FibGVkKWlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcblxyXG4gICAgaGFzUGF0Y2hlZCA9IHRydWVcclxuICAgIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkID0gZnVuY3Rpb24oZW1vamkpe1xyXG4gICAgICAgIGlmKGlzVXNhYmxlKXtcclxuICAgICAgICAgICAgaWYoZW1vamkuc3Vycm9nYXRlcyB8fCBlbW9qaS5kaXZlcnNpdHkpcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0Vtb2ppRGlzYWJsZWQuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgbm9kZUZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcclxuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiXHJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxuY29uc3QgZGVidWcgPSB0cnVlXHJcbmNvbnN0IGNhY2hlID0ge31cclxuY29uc3QgY2FjaGUyID0ge31cclxuLypcclxuY29uc3QgUGlubmVkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UGlubmVkTWVzc2FnZXMpWzBdLmRlZmF1bHRcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWxJZClbMF0uZGVmYXVsdFxyXG5jb25zdCBmZXRjaE1lc3NhZ2VzTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZmV0Y2hNZXNzYWdlcylbMF0uZGVmYXVsdFxyXG5jb25zdCBmZXRjaE1lc3NhZ2VzTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmZldGNoTWVzc2FnZXMpWzFdLmRlZmF1bHRcclxuY29uc3QgZ2V0TWVzc2FnZXNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRNZXNzYWdlcylbMF0uZGVmYXVsdCovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgUGx1Z2luQ2VydGlmaWVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7fVxyXG5cclxuICAgIHBhdGNoKGF0dGFjaG1lbnQsIGlkKXtcclxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG4gICAgICAgIC8qY29uc3QgZGlzcGF0Y2hlciA9IHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlclxyXG4gICAgICAgIGNvbnN0IGNvbnN0YW50cyA9IHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuY29uc3RhbnRzXHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmV0Y2hNZXNzYWdlcyA9IGZldGNoTWVzc2FnZXNNb2R1bGUuZmV0Y2hNZXNzYWdlc1xyXG4gICAgICAgIGZldGNoTWVzc2FnZXNNb2R1bGUuZmV0Y2hNZXNzYWdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxGZXRjaE1lc3NhZ2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcclxuICAgICAgICAgICAgaWYocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKXtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlXHJcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXYgPSBnZXRNZXNzYWdlc01vZHVsZS5nZXRNZXNzYWdlcyhDaGFubmVsTW9kdWxlLmdldENoYW5uZWxJZCgpKVxyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IoY29uc3QgbWVzc2FnZSBvZiBldi5fYXJyYXkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdHRhY2htZW50cy5sZW5ndGggPT09IDApY29udGludWUgLy8gbm8gYXR0YWNobWVudHNcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbEZldGNoTWVzc2FnZXMyID0gZmV0Y2hNZXNzYWdlc01vZHVsZTIuZmV0Y2hNZXNzYWdlc1xyXG4gICAgICAgIGZldGNoTWVzc2FnZXNNb2R1bGUyLmZldGNoTWVzc2FnZXMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsRmV0Y2hNZXNzYWdlczIuYXBwbHkodGhpcywgYXJndW1lbnRzKVxyXG4gICAgICAgICAgICBpZihyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIFByb21pc2Upe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWVcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldiA9IGdldE1lc3NhZ2VzTW9kdWxlLmdldE1lc3NhZ2VzKENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbElkKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjb25zdCBtZXNzYWdlIG9mIGV2Ll9hcnJheSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgfHwgW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCljb250aW51ZSAvLyBubyBhdHRhY2htZW50c1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFscmVhZHlVc2VkID0ge31cclxuICAgICAgICBjb25zdCBvcmlnaW5hbEdldFBpbm5lZE1lc3NhZ2VzID0gUGlubmVkTW9kdWxlLmdldFBpbm5lZE1lc3NhZ2VzLmJpbmQoUGlubmVkTW9kdWxlKVxyXG4gICAgICAgIFBpbm5lZE1vZHVsZS5nZXRQaW5uZWRNZXNzYWdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHBpbm5lZCA9IG9yaWdpbmFsR2V0UGlubmVkTWVzc2FnZXMoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICBpZighcGlubmVkIHx8IGFscmVhZHlVc2VkW3Bpbm5lZC5pZF0pcmV0dXJuIHBpbm5lZFxyXG4gICAgICAgICAgICBhbHJlYWR5VXNlZFtwaW5uZWQuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWxyZWFkeVVzZWRbcGlubmVkLmlkXVxyXG4gICAgICAgICAgICAgICAgZm9yKGNvbnN0IG1lc3NhZ2Ugb2YgcGlubmVkLm1lc3NhZ2VzKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgfHwgW11cclxuICAgICAgICAgICAgICAgICAgICBpZihhdHRhY2htZW50cy5sZW5ndGggPT09IDApY29udGludWUgLy8gbm8gYXR0YWNobWVudHNcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgNTApO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHBpbm5lZFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGlzcGF0Y2hlci5zdWJzY3JpYmUoY29uc3RhbnRzLkFjdGlvblR5cGVzLk1FU1NBR0VfQ1JFQVRFLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2Lm1lc3NhZ2VcclxuICAgICAgICAgICAgaWYobWVzc2FnZS5jaGFubmVsX2lkICE9PSBDaGFubmVsTW9kdWxlLmdldENoYW5uZWxJZCgpKXJldHVyblxyXG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXVxyXG4gICAgICAgICAgICAgICAgaWYoYXR0YWNobWVudHMubGVuZ3RoID09PSAwKXJldHVybiAvLyBubyBhdHRhY2htZW50c1xyXG5cclxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBnZXRNZXNzYWdlc01vZHVsZS5nZXRNZXNzYWdlcyhDaGFubmVsTW9kdWxlLmdldENoYW5uZWxJZCgpKVxyXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICBmb3IoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcy5fYXJyYXkpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdXHJcbiAgICAgICAgICAgICAgICBpZihhdHRhY2htZW50cy5sZW5ndGggPT09IDApY29udGludWUgLy8gbm8gYXR0YWNobWVudHNcclxuXHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkqL1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgaWQpe1xyXG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpLnNwbGl0KC9bXlxcd1xcZF0rL2cpXHJcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcclxuICAgIGZvcihsZXQga2V5d29yZCBvZiBkYXRhKXtcclxuICAgICAgICBmb3IobGV0IG9vZiBvZiBbXHJcbiAgICAgICAgICAgIFwidG9rZW5cIixcclxuICAgICAgICAgICAgXCJlbWFpbFwiLFxyXG4gICAgICAgICAgICBcInBob25lXCIsXHJcbiAgICAgICAgICAgIFwiTUZBXCIsXHJcbiAgICAgICAgICAgIFwiMmZhXCIsXHJcbiAgICAgICAgICAgIFwicHJvY2Vzc1wiLFxyXG4gICAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJldmFsXCIsXHJcbiAgICAgICAgICAgIFwiZ2V0R2xvYmFsXCIsXHJcbiAgICAgICAgICAgIFwiQnJvd3NlcldpbmRvd1wiXHJcbiAgICAgICAgXSl7XHJcbiAgICAgICAgICAgIGlmKGtleXdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhvb2YudG9Mb3dlckNhc2UoKSkpe1xyXG4gICAgICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJ0b2tlbiBzdGVhbGVyL3ZpcnVzXCJcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgbm9fY29tbWVudHMgPSBkYXRhLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98KFteXFxcXDpdfF4pXFwvXFwvLiokL2dtLCBcIlwiKS50cmltKCkvLyByZW1vdmluZyB0aGUgTUVUQSBjb21tZW50IGZyb20gcGx1Z2luc1xyXG4gICAgICAgIGlmKCgvdmFyIFtcXHdcXGRfJF0rPVxcW1wiL2dpKS50ZXN0KG5vX2NvbW1lbnRzKSl7XHJcbiAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4cHMgPSBbXHJcbiAgICAgICAgICAgICAgICAvKiogaGV4YWRlY2ltYWwgKi9cclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIF8weDhkYjcoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgICAgIC8qKiBtYW5nbGVkICovXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydcXCkvZyxcclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIF8weDhkYjcoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBmb3IobGV0IHJlZ2V4IG9mIHJlZ2V4cHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSByZWdleC50ZXN0KG5vX2NvbW1lbnRzKSA/IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIiA6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bClyZXR1cm5cclxuICAgIGNhY2hlW2hhc2hdID0ge1xyXG4gICAgICAgIHN1c3BlY3Q6IHRydWUsXHJcbiAgICAgICAgbmFtZTogaGFzaFRvVXJsW2hhc2hdLnNwbGl0KFwiL1wiKS5wb3AoKSxcclxuICAgICAgICB0eXBlOiBoYXNoVG9VcmxbaGFzaF0uZW5kc1dpdGgoXCIuanNcIikgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwiLFxyXG4gICAgICAgIGhhcm06IGlzSGFybWZ1bFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhgRm91bmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzICR7Y2FjaGVbaGFzaF0udHlwZS50b0xvd2VyQ2FzZSgpfTogJHtjYWNoZVtoYXNoXS5uYW1lfWApXHJcblxyXG4gICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgY2FjaGVbaGFzaF0sIGNhY2hlW2hhc2hdLm5hbWUpXHJcbn1cclxuXHJcbmNvbnN0IGhhc2hUb1VybCA9IHt9XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZCl7XHJcbiAgICBpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKXJldHVyblxyXG4gICAgaWYoIWF0dGFjaG1lbnQudXJsLnN0YXJ0c1dpdGgoXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9cIikpcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKVxyXG4gICAgaWYoIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpICYmICFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcblxyXG4gICAgbGV0IG5leHRIYXNoID0gKGhhc2gsIGRhdGEpID0+IHtcclxuICAgICAgICBpZighY2FjaGVbaGFzaF0pe1xyXG4gICAgICAgICAgICBub2RlRmV0Y2goXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvTGlnaHRjb3JkL2ZpbGVoYXNoZXNAbWFzdGVyL2hhc2hlcy9cIitoYXNoLCB7IC8vIFVzaW5nIG5vZGUtZmV0Y2ggdG8gYnlwYXNzIGNvcnNcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnVzZXJBZ2VudCAvLyBoYXZlIHRvIHNldCB1c2VyLWFnZW50XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMClyZXR1cm4gY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIGlkKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxyXG5cclxuICAgICAgICAgICAgICAgIGNhY2hlW2hhc2hdID0gcmVzdWx0XHJcblxyXG4gICAgICAgICAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICB9KS5jYXRjaCgoKT0+e30pXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhY2hlW2hhc2hdXHJcblxyXG4gICAgICAgICAgICByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGF0dGFjaG1lbnQuZmlsZW5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKGNhY2hlMlthdHRhY2htZW50LnVybF0pcmV0dXJuIG5leHRIYXNoKGNhY2hlMlthdHRhY2htZW50LnVybF0pXHJcblxyXG4gICAgbm9kZUZldGNoKGF0dGFjaG1lbnQudXJsLCB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnVzZXJBZ2VudFxyXG4gICAgICAgIH1cclxuICAgIH0pLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiRmlsZSBkb2Vzbid0IGV4aXN0LlwiKVxyXG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxyXG4gICAgICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXHJcbiAgICAgICAgcmVzLmJvZHkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcclxuICAgICAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcclxuICAgICAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXMuYm9keS5vbihcImVuZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKVxyXG5cclxuICAgICAgICAgICAgY2FjaGUyW2F0dGFjaG1lbnQudXJsXSA9IGhhc2hSZXN1bHRcclxuICAgICAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gYXR0YWNobWVudC51cmxcclxuXHJcbiAgICAgICAgICAgIG5leHRIYXNoKGhhc2hSZXN1bHQsIGRhdGEpXHJcbiAgICAgICAgfSlcclxuICAgIH0pLmNhdGNoKCgpPT57fSlcclxufVxyXG5cclxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgZmlsZW5hbWUpe1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXHJcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxyXG5cclxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcbiAgICBcclxuXHJcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpXHJcbiAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBcclxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09IFwiQVwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgKipcIitmaWxlbmFtZStcIioqIG1pZ2h0IGJlIGRhbmdlcm91cyAqKihcIityZXN1bHQuaGFybStcIikqKi4gXFxuXFxuKipXZSBkb24ndCByZWNvbW1hbmQgdG8gZG93bmxvYWQgaXQqKi4gSG93ZXZlciwgeW91IGNhbiBzdGlsbCBkbyBpdCBiZWxvdy5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBBbnl3YXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJEb24ndCAhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXh0Tm9kZShkaXYucGFyZW50Tm9kZSlcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLlwifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMTZweFwiLCBoZWlnaHQ6IFwiMTZweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuc3ZnKVswXS5zdmcsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIxNnB4XCIsaGVpZ2h0OlwiMTZweFwiLHZpZXdCb3g6XCIwIDAgNDAgMzJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC0zMilcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDpcIiNmMDQ3NDdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOkJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLnBvaW50ZXJFdmVudHNcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIxNnB4XCIsaGVpZ2h0OlwiMTZweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiIzRmNTQ1Y1wiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIHdhcyBtYWRlIGJ5IHRoZSBkZXZlbG9wZXJzIG9mIExpZ2h0Y29yZC5cIixzdHlsZTpcImJyYW5kXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIxNnB4XCIsaGVpZ2h0OlwiMTZweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwiLHN0cm9rZTpcIiMzNjM5M2ZcIixzdHlsZTp7Y29sb3I6XCIjNDA4N2VkXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiY3VycmVudENvbG9yXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMTZweFwiLGhlaWdodDpcIjE2cHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNMTAuNyw1LjI4YTIuOSwyLjksMCwwLDAtMi4xMS44Ni4xMS4xMSwwLDAsMCwwLC4xNmwxLjA1Ljk0YS4xMS4xMSwwLDAsMCwuMTUsMCwxLjI3LDEuMjcsMCwwLDEsLjktLjMzYy42NSwwLC42NS43My42NS43M2EuNjQuNjQsMCwwLDEtLjY1LjY1LDEuNzMsMS43MywwLDAsMS0xLjE4LS41NGMtLjMxLS4yNi0uMzYtLjMyLS43My0uNjZTNy4wNiw1LjI4LDUuNjUsNS4yOEEyLjI2LDIuMjYsMCwwLDAsMy4zNyw3LjU2LDIuNTksMi41OSwwLDAsMCwzLjgyLDlhMi4xOCwyLjE4LDAsMCwwLDEuODMuODksMi45NCwyLjk0LDAsMCwwLDIuMS0uODEuMTEuMTEsMCwwLDAsMC0uMTZMNi43NCw4QS4xMS4xMSwwLDAsMCw2LjYsOGExLjU4LDEuNTgsMCwwLDEtLjk0LjI5aDBBLjcxLjcxLDAsMCwxLDUsNy41Nkg1YS42My42MywwLDAsMSwuNjUtLjY0Yy43MSwwLDEuNDIuNzUsMS45NCwxLjI3Ljc1Ljc2LDEuNjYsMS43OSwzLjExLDEuNzRBMi4yOCwyLjI4LDAsMCwwLDEzLDcuNjRhMi41OSwyLjU5LDAsMCwwLS40NS0xLjQ3QTIuMTQsMi4xNCwwLDAsMCwxMC43LDUuMjhaXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICksIGRpdilcclxuICAgIH1cclxufSIsImltcG9ydCB7YmRwbHVnaW5FcnJvcnMsIHBsdWdpbkNvb2tpZSwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jbGFzcyBQbHVnaW5Nb2R1bGUge1xyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlcjt9XHJcbn1cclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbnMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmxvYWRQbHVnaW5EYXRhKCk7XHJcbiAgICBiZHBsdWdpbkVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRQbHVnaW5zKCkpKTtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHBsdWdpbiwgbmFtZTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgIGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBsb2FkZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJsb2FkKCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW25hbWVdKSBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHBsdWdpbkNvb2tpZVtuYW1lXSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcGx1Z2luLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcInN0YXJ0KCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG5cclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkub24oXCJkaWQtbmF2aWdhdGUtaW4tcGFnZVwiLCB0aGlzLmNoYW5uZWxTd2l0Y2guYmluZCh0aGlzKSk7XHJcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RhcnRQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0YXJ0ZWQuYCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RhcnRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBwbHVnaW4gKyBcIiBjb3VsZCBub3QgYmUgc3RhcnRlZC5cIiwgZXJyKTtcclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RvcFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0b3AoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdG9wcGVkLmApO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0b3BwZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKSArIFwiIGNvdWxkIG5vdCBiZSBzdG9wcGVkLlwiLCBlcnIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XHJcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IHRydWU7XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcbiAgICB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xyXG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbik7XHJcbiAgICBlbHNlIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy50b2dnbGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lKS5wbHVnaW47XHJcbiAgICB0cnkgeyBpZiAocGx1Z2luLmxvYWQgJiYgdHlwZW9mKHBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIHBsdWdpbi5sb2FkKCk7fVxyXG4gICAgY2F0Y2ggKGVycikge2lmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJdfSk7fVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1sb2FkZWRcIiwgcGx1Z2luLmdldE5hbWUoKSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVubG9hZFBsdWdpbiA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luLnBsdWdpbi5nZXROYW1lKCk7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGRlbGV0ZSBiZHBsdWdpbnNbcGx1Z2luXTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi11bmxvYWRlZFwiLCBwbHVnaW4pO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICB0aGlzLnVubG9hZFBsdWdpbihiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm4gdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luLnBsdWdpbi5nZXROYW1lKCk7XHJcbiAgICBjb25zdCBlbmFibGVkID0gcGx1Z2luQ29va2llW3BsdWdpbl07XHJcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLnJlbG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgaWYgKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkICYmIHR5cGVvZihiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCgpO1xyXG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1yZWxvYWRlZFwiLCBwbHVnaW4pO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRQbHVnaW4obmFtZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZnVsbFBhdGgpO1xyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKGAke2Z1bGxQYXRofWApO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51cGRhdGVQbHVnaW5MaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVzdWx0cy5yZW1vdmVkKSB0aGlzLnVubG9hZFBsdWdpbihuYW1lKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIpO1xyXG4gICAgaWYgKHNhdmVkKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwbHVnaW5Db29raWUsIHNhdmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc2F2ZVBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiLCBwbHVnaW5Db29raWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5uZXdNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vbk1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25NZXNzYWdlKCk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25NZXNzYWdlIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuY2hhbm5lbFN3aXRjaCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25Td2l0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25Td2l0Y2goKTsgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvblN3aXRjaCBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJhd09ic2VydmVyID0gZnVuY3Rpb24oZSkge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vYnNlcnZlcihlKTsgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvYnNlcnZlciBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgUGx1Z2luTW9kdWxlKCk7IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFYyQ19QdWJsaWNTZXJ2ZXJzIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnNcIjtcclxuaW1wb3J0IExheWVyIGZyb20gXCIuLi91aS9wdWJsaWNzZXJ2ZXJzL2xheWVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfUHVibGljU2VydmVycyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uID0gdGhpcy5fYXBwZW5kQnV0dG9uLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KExheWVyLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIiwgaWQ6IFwicHVic2xheWVyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1B1YmxpY1NlcnZlcnMsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwifSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwdWJzbGF5ZXJyb290XCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyc1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVycyAmJiBlLmxheWVyKVswXS5sYXllcnMuc3BsaXQoXCIgXCIpWzBdXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGNvbnN0IGxheWVycyA9IERPTS5xdWVyeShcIi5sYXllcnMsIC5cIitjbGFzc05hbWVMYXllcnMpO1xyXG4gICAgICAgIGlmICghbGF5ZXJzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbGF5ZXJzLmFwcGVuZChET00uY3JlYXRlRWxlbWVudChcIjxkaXYgaWQ9J3B1YnNsYXllcnJvb3QnPlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXJzXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHRoaXMuY29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnV0dG9uKCkge1xyXG4gICAgICAgIGNvbnN0IGJ0biA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWxpXCIgY2xhc3M9XCIke0JEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtfVwiPmApO1xyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgYnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtcHViLWJ1dHRvblwiIGNsYXNzPVwiJHtcIndyYXBwZXItMjVlVkluIFwiICsgQkRWMi5ndWlsZENsYXNzZXMuY2lyY2xlQnV0dG9uTWFza31cIj5wdWJsaWM8L2Rpdj5gKTtcclxuICAgICAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge3RoaXMucmVuZGVyKCk7fSk7XHJcbiAgICAgICAgYnRuLmFwcGVuZChsYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGJ0bjtcclxuICAgIH1cclxuXHJcbiAgICBfYXBwZW5kQnV0dG9uKCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZVNjcm9sbGVyXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIgJiYgZS5zY3JvbGxiYXJXaWR0aClbMF0uc2Nyb2xsZXJcclxuICAgICAgICBdXHJcbiAgICAgICAgaWYgKERPTS5xdWVyeShcIiNiZC1wdWItbGlcIikpIHJldHVybjtcclxuICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gRE9NLnF1ZXJ5KGAuJHt3cmFwcGVyfSAuJHtjbGFzc05hbWVTY3JvbGxlcn0gPjpmaXJzdC1jaGlsZGApO1xyXG4gICAgICAgIERPTS5hZnRlcihndWlsZHMsIHRoaXMuYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3VpbGRQYXRjaCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdCA9IHdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTmF2aWdhYmxlR3VpbGRzXCIpO1xyXG4gICAgICAgIGNvbnN0IEd1aWxkTGlzdE9sZCA9IHdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgICAgIGlmICghR3VpbGRMaXN0ICYmICFHdWlsZExpc3RPbGQpIFV0aWxzLndhcm4oXCJQdWJsaWNTZXJ2ZXJcIiwgXCJDYW4ndCBmaW5kIEd1aWxkTGlzdCBjb21wb25lbnRcIik7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goR3VpbGRMaXN0ID8gR3VpbGRMaXN0IDogR3VpbGRMaXN0T2xkLnByb3RvdHlwZSwgR3VpbGRMaXN0ID8gXCJkZWZhdWx0XCIgOiBcInJlbmRlclwiLCB7YWZ0ZXI6IHRoaXMuX2FwcGVuZEJ1dHRvbn0pO1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUJ1dHRvbigpIHtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2goKTtcclxuICAgICAgICBkZWxldGUgdGhpcy5ndWlsZFBhdGNoO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNiZC1wdWItbGlcIikucmVtb3ZlKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCB7c2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZWxlY3Ryb24gPSByZXF1aXJlKFwiZWxlY3Ryb25cIik7XHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcblxyXG5jb25zdCBCcm93c2VyV2luZG93ID0gZWxlY3Ryb24ucmVtb3RlLkJyb3dzZXJXaW5kb3c7XHJcbmNvbnN0IHdlYkNvbnRlbnRzID0gZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyByZWFjdERldlRvb2xzIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGxldCBleHRlbnNpb25QYXRoID0gXCJcIjtcclxuICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkxPQ0FMQVBQREFUQSwgXCJHb29nbGUvQ2hyb21lL1VzZXIgRGF0YVwiKTtcclxuICAgICAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImxpbnV4XCIpIGV4dGVuc2lvblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuSE9NRSwgXCIuY29uZmlnL2dvb2dsZS1jaHJvbWVcIik7XHJcbiAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJkYXJ3aW5cIikgZXh0ZW5zaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FLCBcIkxpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9Hb29nbGUvQ2hyb21lXCIpO1xyXG4gICAgICAgIGVsc2UgZXh0ZW5zaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FLCBcIi5jb25maWcvY2hyb21pdW1cIik7XHJcbiAgICAgICAgZXh0ZW5zaW9uUGF0aCArPSBcIi9EZWZhdWx0L0V4dGVuc2lvbnMvZm1rYWRtYXBnb2ZhZG9wbGpiamZrYXBka29pZW5paGkvXCI7XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uUGF0aCkpIHtcclxuICAgICAgICAgICAgY29uc3QgdmVyc2lvbnMgPSBmcy5yZWFkZGlyU3luYyhleHRlbnNpb25QYXRoKTtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShleHRlbnNpb25QYXRoLCB2ZXJzaW9uc1t2ZXJzaW9ucy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uUGF0aCA9IGV4dGVuc2lvblBhdGg7XHJcbiAgICAgICAgdGhpcy5pc0V4dGVuc2lvbkluc3RhbGxlZCA9IGZzLmV4aXN0c1N5bmMoZXh0ZW5zaW9uUGF0aCk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lciA9IHRoaXMubGlzdGVuZXIuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgc2V0dGluZ3NbXCJSZWFjdCBEZXZUb29sc1wiXS5oaWRkZW4gPSAhdGhpcy5pc0V4dGVuc2lvbkluc3RhbGxlZDtcclxuICAgIH1cclxuXHJcbiAgICBsaXN0ZW5lcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNFeHRlbnNpb25JbnN0YWxsZWQpIHJldHVybjtcclxuICAgICAgICBCcm93c2VyV2luZG93LnJlbW92ZURldlRvb2xzRXh0ZW5zaW9uKFwiUmVhY3QgRGV2ZWxvcGVyIFRvb2xzXCIpO1xyXG4gICAgICAgIGNvbnN0IGRpZEluc3RhbGwgPSBCcm93c2VyV2luZG93LmFkZERldlRvb2xzRXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uUGF0aCk7XHJcblxyXG4gICAgICAgIGlmIChkaWRJbnN0YWxsKSBVdGlscy5sb2coXCJSZWFjdCBEZXZUb29sc1wiLCBcIlN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgcmVhY3QgZGV2dG9vbHMuXCIpO1xyXG4gICAgICAgIGVsc2UgVXRpbHMuZXJyKFwiUmVhY3QgRGV2VG9vbHNcIiwgXCJDb3VsZG4ndCBmaW5kIHJlYWN0IGRldnRvb2xzIGluIGNocm9tZSBleHRlbnNpb25zIVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gd2ViQ29udGVudHMub24oXCJkZXZ0b29scy1vcGVuZWRcIiwgdGhpcy5saXN0ZW5lcikpO1xyXG4gICAgICAgIGlmICh3ZWJDb250ZW50cy5pc0RldlRvb2xzT3BlbmVkKCkpIHRoaXMubGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHdlYkNvbnRlbnRzLnJlbW92ZUxpc3RlbmVyKFwiZGV2dG9vbHMtb3BlbmVkXCIsIHRoaXMubGlzdGVuZXIpO1xyXG4gICAgfVxyXG59OyAgIiwiaW1wb3J0IHtzZXR0aW5ncywgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2lucywgYmR0aGVtZXMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsU2lkZWJhclwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgY29sb3JlZFRleHQgZnJvbSBcIi4vY29sb3JlZFRleHRcIjtcclxuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcclxuaW1wb3J0IHJlYWN0RGV2VG9vbHMgZnJvbSBcIi4vcmVhY3REZXZUb29sc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgcHVibGljU2VydmVyc01vZHVsZSBmcm9tIFwiLi9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCB2b2ljZU1vZGUgZnJvbSBcIi4vdm9pY2VNb2RlXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XHJcbmltcG9ydCBkTW9kZSBmcm9tIFwiLi9kZXZNb2RlXCI7XHJcblxyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4uL3VpL3Rvb2xzXCI7XHJcbmltcG9ydCBTY3JvbGxlciBmcm9tIFwiLi4vdWkvc2Nyb2xsZXJcIjtcclxuaW1wb3J0IFNlY3Rpb25lZFNldHRpbmdzUGFuZWwgZnJvbSBcIi4uL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IFNldHRpbmdzUGFuZWwgZnJvbSBcIi4uL3VpL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XHJcbmltcG9ydCBDYXJkTGlzdCBmcm9tIFwiLi4vdWkvYWRkb25saXN0XCI7XHJcbmltcG9ydCBWMkNfUHJlc2VuY2VTZXR0aW5ncyBmcm9tIFwiLi4vdWkvcHJlc2VuY2VTZXR0aW5nc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xyXG5pbXBvcnQgVjJDX0FjY291bnRJbmZvcyBmcm9tIFwiLi4vdWkvQWNjb3VudEluZm9zXCI7XHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcclxuaW1wb3J0IGJsdXJQcml2YXRlIGZyb20gXCIuL2JsdXJQcml2YXRlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5zaWRlQmFyT25DbGljayA9IHRoaXMuc2lkZUJhck9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MgPSB0aGlzLnVwZGF0ZVNldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaWRlYmFyID0gbmV3IFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhcih0aGlzLnNpZGVCYXJPbkNsaWNrKTtcclxuICAgICAgICAvLyB0aGlzLmJ1aWxkUGx1Z2luUHJvcHMgPSB0aGlzLmJ1aWxkUGx1Z2luUHJvcHMuYmluZCh0aGlzKTtcclxuICAgICAgICAvLyB0aGlzLmJ1aWxkVGhlbWVQcm9wcyA9IHRoaXMuYnVpbGRUaGVtZVByb3BzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93T3JpZ2luYWwgPSB0aGlzLnNob3dPcmlnaW5hbC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLXNldHRpbmdzcGFuZS1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXIsXHJcbiAgICAgICAgICAgIGNsYXNzU2lkZWJhclxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmxheWVyICYmIGUuYW5pbWF0aW5nKVswXS5sYXllci5zcGxpdChcIiBcIilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGNvbnN0IHNpZGViYXIgPSBET00ucXVlcnkoXCIuXCIrY2xhc3NOYW1lTGF5ZXIrXCIgLlwiK2NsYXNzU2lkZWJhci5zdGFuZGFyZFNpZGViYXJWaWV3LnNwbGl0KFwiIFwiKVswXStcIiwgLlwiK2NsYXNzTmFtZUxheWVyK1wiIC51aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIik7XHJcbiAgICAgICAgaWYgKCFzaWRlYmFyKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtc2V0dGluZ3NwYW5lLWNvbnRhaW5lclwiIGNsYXNzPVwiJHtjbGFzc1NpZGViYXIuY29udGVudFJlZ2lvbn0gY29udGVudC1yZWdpb25cIj5gKTtcclxuICAgICAgICBzaWRlYmFyLmFwcGVuZChyb290KTtcclxuXHJcbiAgICAgICAgVXRpbHMub25SZW1vdmVkKHJvb3QsICgpID0+IHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHJvb3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb3JlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwiY29yZVwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpZ2h0Y29yZFNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImxpZ2h0Y29yZFwiKTtcclxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gWy4uLm5ldyBTZXQoc2V0dGluZ3MubWFwKHMgPT4gcy5jYXRlZ29yeSkpXTtcclxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGNhdGVnb3JpZXMubWFwKGMgPT4ge3JldHVybiB7dGl0bGU6IGMsIHNldHRpbmdzOiBzZXR0aW5ncy5maWx0ZXIocyA9PiBzLmNhdGVnb3J5ID09IGMpfTt9KTtcclxuICAgICAgICByZXR1cm4gc2VjdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IFByZXNlbmNlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJzdGF0dXNcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTXNnTG9nU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2V0dGluZ3MoXCJtc2dsb2dcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXR0aW5ncyhjYXRlZ29yeSkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXRlZ29yeSAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lkZUJhck9uQ2xpY2soaWQpIHtcclxuICAgICAgICBjb25zdCBjb250ZW50UmVnaW9uID0gRE9NLnF1ZXJ5KFwiLmNvbnRlbnRSZWdpb24tM25EdVl5LCAuY29udGVudC1yZWdpb25cIik7XHJcbiAgICAgICAgY29udGVudFJlZ2lvbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgdGhpcy5yb290LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImNvcmVcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ29yZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImN1c3RvbWNzc1wiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDdXN0b21Dc3NFZGl0b3IoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwicGx1Z2luc1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwidGhlbWVzXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckFkZG9uUGFuZShpZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImxpZ2h0Y29yZFwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJMaWdodGNvcmRTZXR0aW5ncygpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICBjYXNlIFwic3RhdHVzXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclByZXNlbmNlU2V0dGluZ3MoKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgY2FzZSBcImFjY291bnRpbmZvXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckFjY291bnRJbmZvcygpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge31cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoaWQsIGNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVNldHRpbmdzKGlkLCBlbmFibGVkKSB7XHJcbiAgICAgICAgc2V0dGluZ3NDb29raWVbaWRdID0gZW5hYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0xXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHB1YmxpY1NlcnZlcnNNb2R1bGUuYWRkQnV0dG9uKCk7XHJcbiAgICAgICAgICAgIGVsc2UgcHVibGljU2VydmVyc01vZHVsZS5yZW1vdmVCdXR0b24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy00XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHZvaWNlTW9kZS5zdGFydCgpO1xyXG4gICAgICAgICAgICBlbHNlIHZvaWNlTW9kZS5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcclxuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZGEtZGFya1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbmFibGVkICYmIGlkID09IFwiYmRhLWdzLTZcIikgdGZIb3VyLmluamVjdDI0SG91cigpO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtN1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBjb2xvcmVkVGV4dC5pbmplY3RDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgICAgICBlbHNlIGNvbG9yZWRUZXh0LnJlbW92ZUNvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgQ2xhc3NOb3JtYWxpemVyLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgQ2xhc3NOb3JtYWxpemVyLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLnVud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay13cC0xXCIpIHtcclxuICAgICAgICAgICAgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcInRyYW5zcGFyZW50XCIsIGVuYWJsZWQpO1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBudWxsKTtcclxuICAgICAgICAgICAgZWxzZSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIFwiIzJmMzEzNlwiKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtOFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1kbS0xXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09PSBcInJlYWN0RGV2VG9vbHNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVhY3REZXZUb29scy5zdGFydCgpO1xyXG4gICAgICAgICAgICBlbHNlIHJlYWN0RGV2VG9vbHMuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzU3RvcmUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIHR5cGVvZiBlLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJzaG93Q3VycmVudEdhbWVcIiBpbiBlLmRlZmF1bHQpWzBdXHJcbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncylbMF0uZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50R2FtZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgICAgIGVsc2UgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIEFudGlBZERNLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNlwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llLnJlYWN0RGV2VG9vbHMpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtM1wiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNVwiXSkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTZcIl0pIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTRcIl0pIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0xXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCJdKSBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtM1wiXSkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC02XCJdKSBibHVyUHJpdmF0ZS5lbmFibGUoKVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIHtcclxuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy04XCJdKSBkTW9kZS5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIGRNb2RlLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZVNldHRpbmdzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiLCBzZXR0aW5nc0Nvb2tpZSk7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFNldHRpbmdzKCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd09yaWdpbmFsKCkge1xyXG4gICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLnJvb3QpO1xyXG4gICAgICAgIHRoaXMucm9vdC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRSZWdpb24pWzBdLmNvbnRlbnRSZWdpb24uc3BsaXQoXCIgXCIpWzBdK1wiLCAuY29udGVudC1yZWdpb25cIikuc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyU2lkZWJhcigpIHtcclxuICAgICAgICBjb25zdCB0YWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltjbGFzcyo9J3NpZGUtJ10gPiBbY2xhc3MqPSdpdGVtLSddXCIpO1xyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0YWJzKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuc2hvd09yaWdpbmFsKTtcclxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5zaG93T3JpZ2luYWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVuZGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvcmVDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxlciwge2NvbnRlbnRDb2x1bW46IHRydWUsIGZhZGU6IHRydWUsIGRhcms6IHRydWV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCwge2tleTogXCJjc3BhbmVsXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBzZWN0aW9uczogdGhpcy5jb3JlU2V0dGluZ3N9KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInRvb2xzXCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpZ2h0Y29yZENvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImxzcGFubmVsXCIsIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBzZWN0aW9uczogdGhpcy5saWdodGNvcmRTZXR0aW5nc30pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgUHJlc2VuY2VDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxlciwge2NvbnRlbnRDb2x1bW46IHRydWUsIGZhZGU6IHRydWUsIGRhcms6IHRydWV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1ByZXNlbmNlU2V0dGluZ3MsIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJscHBhbm5lbFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuUHJlc2VuY2VTZXR0aW5nc1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInRvb2xzXCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IEFjY291bnRJbmZvc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQWNjb3VudEluZm9zLCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwibGFwYW5uZWxcIlxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInRvb2xzXCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1c3RvbUNzc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDc3NFZGl0b3IsIHtrZXk6IFwiY3NzZWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xzLCB7a2V5OiBcInRvb2xzXCJ9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQ29yZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb3JlQ29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJMaWdodGNvcmRTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkgcmV0dXJuIFV0aWxzLmVycihcIlNldHRpbmdzUGFuZWxcIiwgXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IC5sYXllci0zUXJVZUcgLnN0YW5kYXJkU2lkZWJhclZpZXctM0YxSTdpXCIpO1xyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHRoaXMubGlnaHRjb3JkQ29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJQcmVzZW5jZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5QcmVzZW5jZUNvbXBvbmVudCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQWNjb3VudEluZm9zKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckN1c3RvbUNzc0VkaXRvcigpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkgcmV0dXJuIFV0aWxzLmVycihcIlNldHRpbmdzUGFuZWxcIiwgXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IC5sYXllci0zUXJVZUcgLnN0YW5kYXJkU2lkZWJhclZpZXctM0YxSTdpXCIpO1xyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZW5kZXJBZGRvblBhbmUodHlwZSkge1xyXG4gICAgLy8gICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAvLyAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAvLyAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb250ZW50Q29tcG9uZW50KHR5cGUpLCByb290KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICByZW5kZXJBZGRvblBhbmUodHlwZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5yb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgLy8gSSBrbm93IHRoaXMgc2hvdWxkbid0IGJlIGhlcmUsIGJ1dCB3aGVuIGl0IGlzbid0LFxyXG4gICAgICAgIC8vIFJlYWN0IHJlZnVzZXMgdG8gY2hhbmdlIHRoZSBidXR0b24gd2hlbiBnb2luZ1xyXG4gICAgICAgIC8vIGJldHdlZW4gcGx1Z2lucyBhbmQgdGhlbWVzIHBhZ2UuLi4gc29tZXRoaW5nXHJcbiAgICAgICAgLy8gdG8gZGVidWcgbGF0ZXIuXHJcbiAgICAgICAgY2xhc3MgQ29udGVudExpc3QgZXh0ZW5kcyBCRFYyLnJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMucHJvcHMudHlwZS5yZXBsYWNlKFwic1wiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgICAgICAgICBCREV2ZW50cy5vbihgJHt0aGlzLnByZWZpeH0tcmVsb2FkZWRgLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIEJERXZlbnRzLm9uKGAke3RoaXMucHJlZml4fS1sb2FkZWRgLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIEJERXZlbnRzLm9uKGAke3RoaXMucHJlZml4fS11bmxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub2ZmKGAke3RoaXMucHJlZml4fS1yZWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub2ZmKGAke3RoaXMucHJlZml4fS1sb2FkZWRgLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIEJERXZlbnRzLm9mZihgJHt0aGlzLnByZWZpeH0tdW5sb2FkZWRgLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy50eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICByZW5kZXIoKSB7cmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47fVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlbmRlciA9IENvbnRlbnRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnRlbnRMaXN0LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0eXBlID09PSBcInBsdWdpbnNcIiA/IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKSA6IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlLCBvbkNoYW5nZTogdGhpcy5zaWRlQmFyT25DbGlja30sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDYXJkTGlzdCwge3R5cGUsIGxpc3R9KSksIHRoaXMucm9vdCk7XHJcbiAgICB9XHJcbn07XHJcbiIsImltcG9ydCB7YmJkQ2hhbmdlbG9nLCBMQ0NoYW5lbG9nfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBTaWRlQmFyIGZyb20gXCIuLi91aS9zaWRlYmFyXCI7XHJcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob25DbGljaykge1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IG9uQ2xpY2s7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGl0ZW1zKCkge1xyXG4gICAgICAgIHJldHVybiBbe1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkJldHRlckRpc2NvcmQgU2V0dGluZ3NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImNvcmVcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJQbHVnaW5zXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJwbHVnaW5zXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiVGhlbWVzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJ0aGVtZXNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJDdXN0b20gQ1NTXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjdXN0b21jc3NcIlxyXG4gICAgICAgIH1dO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBMQ2l0ZW1zKCl7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIC8vPFRvb2x0aXBXcmFwIGNvbG9yPVwiYmxhY2tcIiBzaWRlPVwidG9wXCIgdGV4dD17dGl0bGV9PlxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNoYW5nZWxvZ0J1dHRvbiA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQkJEJ3MgQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2hhbmdlbG9nLWJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7VXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKGJiZENoYW5nZWxvZyk7fX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nQnV0dG9uTEMgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCdzIENoYW5nZWxvZ1wifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNoYW5nZWxvZy1idXR0b25cIiwgb25DbGljazogKCkgPT4ge1V0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChMQ0NoYW5lbG9nKTt9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChIaXN0b3J5LCB7Y2xhc3NOYW1lOiBcImJkLWljb25cIiwgc2l6ZTogXCIxNnB4XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTaWRlQmFyLCB7b25DbGljazogdGhpcy5vbkNsaWNrLCBoZWFkZXJUZXh0OiBcIkxpZ2h0Y29yZFwiLCBoZWFkZXJCdXR0b246IGNoYW5nZWxvZ0J1dHRvbkxDLCBpdGVtczogdGhpcy5MQ2l0ZW1zfSkpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTaWRlQmFyLCB7b25DbGljazogdGhpcy5vbkNsaWNrLCBoZWFkZXJUZXh0OiBcIkJhbmRhZ2VkIEJEXCIsIGhlYWRlckJ1dHRvbjogY2hhbmdlbG9nQnV0dG9uLCBpdGVtczogdGhpcy5pdGVtc30pKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1zZXR0aW5ncy1zaWRlYmFyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBET00ucXVlcnlBbGwoXCJbY2xhc3MqPSdzaWRlLSddID4gW2NsYXNzKj0naXRlbS0nXTpub3QoW2NsYXNzKj1EYW5nZXJdKVwiKTtcclxuICAgICAgICBjb25zdCBjaGFuZ2VMb2cgPSB0YWJzW3RhYnMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgaWYgKCFjaGFuZ2VMb2cpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjaGFuZ2VMb2cucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1zZXR0aW5ncy1zaWRlYmFyXCI+YCksIGNoYW5nZUxvZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IFtjbGFzcyo9J3NpZGUtJ10gPiBbY2xhc3MqPSdpdGVtLSddOm5vdChbY2xhc3MqPURhbmdlcl0pXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHRoaXMuY29tcG9uZW50LCByb290KTtcclxuICAgICAgICBVdGlscy5vblJlbW92ZWQocm9vdCwgKCkgPT4ge1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUocm9vdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge2JkdGhlbWVFcnJvcnMsIHRoZW1lQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jbGFzcyBUaGVtZU1vZHVsZSB7XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXI7fVxyXG59XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFRoZW1lRGF0YSgpO1xyXG4gICAgYmR0aGVtZUVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRUaGVtZXMoKSkpO1xyXG4gICAgY29uc3QgdGhlbWVzID0gT2JqZWN0LmtleXMoYmR0aGVtZXMpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhlbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZXNbaV1dO1xyXG4gICAgICAgIGlmICghdGhlbWVDb29raWVbdGhlbWUubmFtZV0pIHRoZW1lQ29va2llW3RoZW1lLm5hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHRoZW1lIGluIHRoZW1lQ29va2llKSB7XHJcbiAgICAgICAgaWYgKCFiZHRoZW1lc1t0aGVtZV0pIGRlbGV0ZSB0aGVtZUNvb2tpZVt0aGVtZV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBhcHBsaWVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUpO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC4gSXQgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtbG9hZGVkXCIsIHRoZW1lLm5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVubG9hZFRoZW1lID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBkZWxldGUgYmR0aGVtZXNbdGhlbWVdO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgdGhpcy51bmxvYWRUaGVtZShiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm4gdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLnJlbG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpLCB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXJlbG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS51cGRhdGVUaGVtZUxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInRoZW1lXCIpO1xyXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVzdWx0cy5yZW1vdmVkKSB0aGlzLnVubG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZURhdGEgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInRoZW1lc1wiKTtcclxuICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhlbWVDb29raWUsIHNhdmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5zYXZlVGhlbWVEYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInRoZW1lc1wiLCB0aGVtZUNvb2tpZSk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgVGhlbWVNb2R1bGUoKTsiLCJpbXBvcnQge2JiZFZlcnNpb24sIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcclxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cclxuICAgIHN0YXRpYyBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9XHJcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xyXG4gICAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd0NvbmZpZ0ZpbGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIHNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN0cmlwQk9NKGNvbnRlbnQpIHtcclxuICAgICAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcclxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRUZXh0QXJlYSgpIHtcclxuICAgICAgICByZXR1cm4gRE9NLnF1ZXJ5KFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoYW5uZWxUZXh0QXJlYSAmJiBlLnRpdGxlV3JhcHBlcilbMF0uY2hhbm5lbFRleHRBcmVhLnNwbGl0KFwiIFwiKVswXStcIiB0ZXh0YXJlYVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xyXG4gICAgICAgIHRleHRhcmVhLmZvY3VzKCk7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xyXG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydFRleHRcIiwgZmFsc2UsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xyXG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgd2Fybihtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjRThBNDAwOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjRThBNDAwO1wiLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXJyKG1vZHVsZU5hbWUsIG1lc3NhZ2UsIGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogcmVkO1wiLCBcIlwiKTtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcIiVjRXJyb3I6IFwiICsgZXJyb3IubWVzc2FnZSwgXCJjb2xvcjogcmVkO1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZShzKSB7XHJcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHRlc3RKU09OKGRhdGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgdGhpcy5lcnIoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwicGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xyXG4gICAgICAgICAgICBlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKG1ldGhvZE5hbWUsIFwiZG9lcyBub3QgZXhpc3QgZm9yXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xyXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwidW5wYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICAgIHdoYXRbbWV0aG9kTmFtZV0gPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKGluc3RlYWQsIFwiYGluc3RlYWRgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcFJldCAhPT0gdW5kZWZpbmVkKSBkYXRhLnJldHVyblZhbHVlID0gdGVtcFJldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcclxuICAgICAgICAgICAgICAgIGlmIChhZnRlcikgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHdoYXRbbWV0aG9kTmFtZV0sIG9yaWdNZXRob2QpO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19tb25rZXlQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kID0gb3JpZ01ldGhvZDtcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge3JldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbXV0YXRpb25zLmxlbmd0aDsgbSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1ttXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3Byb3BdO1xyXG4gICAgICAgIH0sIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHNob3dzIGEgdG9hc3Qgc2ltaWxhciB0byBhbmRyb2lkIHRvd2FyZHMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IFRoZSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9hc3QuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC4gT3B0aW9uYWwgcGFyYW1ldGVyLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBDaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZSB0b2FzdCBzdHlsaXN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkuIENob2ljZXM6IFwiXCIsIFwiaW5mb1wiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIi9cImVycm9yXCIsIFwid2FybmluZ1wiL1wid2FyblwiLiBEZWZhdWx0OiBcIlwiXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuaWNvbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIHNob3cgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZS4gQSB0b2FzdCB3aXRob3V0IHR5cGUgd2lsbCBhbHdheXMgaGF2ZSBubyBpY29uLiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aW1lb3V0IEFkanVzdHMgdGhlIHRpbWUgKGluIG1zKSB0aGUgdG9hc3Qgc2hvdWxkIGJlIHNob3duIGZvciBiZWZvcmUgZGlzYXBwZWFyaW5nIGF1dG9tYXRpY2FsbHkuIERlZmF1bHQ6IDMwMDBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNob3dUb2FzdChjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhciAmJiBlLmhhc05vdGljZSlbMF0uc2lkZWJhci5zcGxpdChcIiBcIilbOV0rXCIgKyBkaXZcIikgfHwgbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbWVtYmVybGlzdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLm1lbWJlcnNXcmFwKVswXS5tZW1iZXJzV3JhcCkgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJmb3JtXCIpIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogMzEwO1xyXG4gICAgICAgICAgICBjb25zdCByaWdodCA9IG1lbWJlcmxpc3QgPyBtZW1iZXJsaXN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHJpZ2h0ID8gcmlnaHQgLSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IFV0aWxzLnNjcmVlbldpZHRoIC0gbGVmdCAtIDI0MDtcclxuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gZm9ybSA/IGZvcm0ub2Zmc2V0SGVpZ2h0IDogODA7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RzXCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIGxlZnQgKyBcInB4XCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImJvdHRvbVwiLCBib3R0b20gKyBcInB4XCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKS5hcHBlbmRDaGlsZCh0b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7dHlwZSA9IFwiXCIsIGljb24gPSB0cnVlLCB0aW1lb3V0ID0gMzAwMH0gPSBvcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IHRvYXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdFwiKTtcclxuICAgICAgICBpZiAodHlwZSkgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJ0b2FzdC1cIiArIHR5cGUpO1xyXG4gICAgICAgIGlmICh0eXBlICYmIGljb24pIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiaWNvblwiKTtcclxuICAgICAgICB0b2FzdEVsZW0uaW5uZXJUZXh0ID0gY29udGVudDtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5hcHBlbmRDaGlsZCh0b2FzdEVsZW0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJkLXRvYXN0cyAuYmQtdG9hc3RcIikubGVuZ3RoKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICB9LCB0aW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWxlcnQodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcclxuICAgICAgICBjb25zdCBjbG9zaW5nTGlzdGVuZXJzID0gW11cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbG9zZTogKGxpc3RlbmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBwbHVnaW5FcnJvcnMgPSBbXSwgdGhlbWVzOiB0aGVtZUVycm9ycyA9IFtdfSkge1xyXG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzIHx8ICF0aGVtZUVycm9ycykgcmV0dXJuO1xyXG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzLmxlbmd0aCAmJiAhdGhlbWVFcnJvcnMubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCBiZC1jb250ZW50LW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj48ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250ZW50IEVycm9yczwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgVE9QXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlBsdWdpbnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+VGhlbWVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj5OYW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+TWVzc2FnZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj5FcnJvcjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgXHJcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVUYWIoZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JzXCI+YCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj4ke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPiR7ZXJyLm1lc3NhZ2V9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+PGEgY2xhc3M9XCJlcnJvci1saW5rXCIgaHJlZj1cIlwiPiR7ZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBcIlwifTwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYEVycm9yIGRldGFpbHMgZm9yICR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfS5gLCBlcnIuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBbZ2VuZXJhdGVUYWIocGx1Z2luRXJyb3JzKSwgZ2VuZXJhdGVUYWIodGhlbWVFcnJvcnMpXTtcclxuICAgIFxyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbS5zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSBET00ucmVtb3ZlQ2xhc3Moc2VsZWN0ZWQsIFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhlLnRhcmdldCwgXCJzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnNjcm9sbGVyXCIpO1xyXG4gICAgICAgICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQodGFic1tET00uaW5kZXgoZS50YXJnZXQpXSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgXHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcclxuICAgICAgICBpZiAocGx1Z2luRXJyb3JzLmxlbmd0aCkgbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW1cIikuY2xpY2soKTtcclxuICAgICAgICBlbHNlIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpWzFdLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBjb25zdCBDaGFuZ2Vsb2dDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJmaXhlZFwiLCBcImltcHJvdmVkXCIpO1xyXG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xyXG4gICAgICAgIGNvbnN0IEZsZXhDaGlsZCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiQ2hpbGRcIik7XHJcbiAgICAgICAgY29uc3QgVGl0bGVzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJUYWdzXCIsIFwiZGVmYXVsdFwiKTtcclxuICAgICAgICBjb25zdCBDaGFuZ2Vsb2cgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuc2VsZWN0YWJsZSA9PSBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgTWFya2Rvd25QYXJzZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImRlZmF1bHRSdWxlc1wiLCBcInBhcnNlXCIpO1xyXG4gICAgICAgIGlmICghQ2hhbmdlbG9nIHx8ICFNb2RhbFN0YWNrIHx8ICFDaGFuZ2Vsb2dDbGFzc2VzIHx8ICFUZXh0RWxlbWVudCB8fCAhRmxleENoaWxkIHx8ICFUaXRsZXMgfHwgIU1hcmtkb3duUGFyc2VyKSByZXR1cm47XHJcbiAgICBcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGltYWdlID0gXCJodHRwczovL3JlcG9zaXRvcnktaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMDU0NzM1MzcvOTU3YjU0ODAtN2MyNi0xMWU5LTg0MDEtNTBmYTgyMGNiYWU1XCIsIFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCIsIFxyXG4gICAgICAgICAgICBjaGFuZ2VzID0gW10sIFxyXG4gICAgICAgICAgICB0aXRsZSA9IFwiQmFuZGFnZWRCRFwiLCBcclxuICAgICAgICAgICAgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLCBcclxuICAgICAgICAgICAgZm9vdGVyXHJcbiAgICAgICAgfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgY2UgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nSXRlbXMgPSBbY2UoXCJpbWdcIiwge3NyYzogaW1hZ2V9KV07XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwicFwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShkZXNjcmlwdGlvbikpKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5nZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjaGFuZ2VzW2NdO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA/IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gOiBDaGFuZ2Vsb2dDbGFzc2VzLmFkZGVkO1xyXG4gICAgICAgICAgICBjb25zdCBtYXJnaW4gPSBjID09IDAgPyBDaGFuZ2Vsb2dDbGFzc2VzLm1hcmdpblRvcCA6IFwiXCI7XHJcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJoMVwiLCB7Y2xhc3NOYW1lOiBgJHt0eXBlfSAke21hcmdpbn1gLH0sIGVudHJ5LnRpdGxlKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBjZShcInVsXCIsIG51bGwsIGVudHJ5Lml0ZW1zLm1hcChpID0+IGNlKFwibGlcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoaSkpKSk7XHJcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2gobGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlbmRlckhlYWRlciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSxcclxuICAgICAgICAgICAgICAgIGNlKFRpdGxlcy5kZWZhdWx0LCB7dGFnOiBUaXRsZXMuVGFncy5INH0sIHRpdGxlKSxcclxuICAgICAgICAgICAgICAgIGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRCwgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmRhdGV9LCBzdWJ0aXRsZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgY29uc3QgcmVuZGVyRm9vdGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgICAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcclxuICAgICAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcclxuICAgICAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLmpvaW5CRDIoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBjZShBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogY2UoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm9vdGVyID0gY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LCBmb290ZXIgPyBmb290ZXIgOiBkZWZhdWx0Rm9vdGVyKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShDaGFuZ2Vsb2csIE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBvblNjcm9sbDogXyA9PiBfLFxyXG4gICAgICAgICAgICAgICAgb25DbG9zZTogXyA9PiBfLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVySGVhZGVyOiByZW5kZXJIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGFuZ2Vsb2dJdGVtc1xyXG4gICAgICAgICAgICB9LCBwcm9wcykpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IE1hcmtkb3duID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNYXJrZG93blwiKTtcclxuICAgICAgICBjb25zdCBDb25maXJtYXRpb25Nb2RhbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmtleSAmJiBtLmtleSgpID09IFwiY29uZmlybS1tb2RhbFwiKTtcclxuICAgICAgICBpZiAoIU1vZGFsU3RhY2sgfHwgIUNvbmZpcm1hdGlvbk1vZGFsIHx8ICFNYXJrZG93bikgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZW1wdHlGdW5jdGlvbiA9ICgpID0+IHt9O1xyXG4gICAgICAgIGNvbnN0IHtvbkNvbmZpcm0gPSBlbXB0eUZ1bmN0aW9uLCBvbkNhbmNlbCA9IGVtcHR5RnVuY3Rpb24sIGNvbmZpcm1UZXh0ID0gXCJPa2F5XCIsIGNhbmNlbFRleHQgPSBcIkNhbmNlbFwiLCBkYW5nZXIgPSBmYWxzZSwga2V5ID0gdW5kZWZpbmVkfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGVudCA9IFtjb250ZW50XTtcclxuICAgICAgICBjb250ZW50ID0gY29udGVudC5tYXAoYyA9PiB0eXBlb2YoYykgPT09IFwic3RyaW5nXCIgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2Rvd24sIG51bGwsIGMpIDogYyk7XHJcbiAgICAgICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChDb25maXJtYXRpb25Nb2RhbCwge1xyXG4gICAgICAgICAgICBoZWFkZXI6IHRpdGxlLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogY29udGVudCxcclxuICAgICAgICAgICAgcmVkOiBkYW5nZXIsXHJcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBjb25maXJtVGV4dCxcclxuICAgICAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcclxuICAgICAgICAgICAgb25Db25maXJtOiBvbkNvbmZpcm0sXHJcbiAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxyXG4gICAgICAgIH0sIGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZURhKGNsYXNzTmFtZSl7XHJcbiAgICAgICAgaWYoIWNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXHJcbiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuZmlsdGVyKGUgPT4gIWUuc3RhcnRzV2l0aChcImRhLVwiKSkuam9pbihcIiBcIilcclxuICAgIH1cclxufVxyXG5cclxuVXRpbHMuc2hvd1RvYXN0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoVXRpbHMuc2hvd1RvYXN0LCBcIkNvdWxkIG5vdCBzaG93IHRvYXN0LlwiKTtcclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5VdGlscyA9IFV0aWxzIiwiaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLldlYnBhY2tNb2R1bGVzID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxID0gd2VicGFja0pzb25wLnB1c2goW1tdLCB7X19leHRyYV9pZF9fOiAobW9kdWxlLCBleHBvcnRzLCByZXEpID0+IG1vZHVsZS5leHBvcnRzID0gcmVxfSwgW1tcIl9fZXh0cmFfaWRfX1wiXV1dKTtcclxuICAgICAgICAgICAgZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcclxuICAgICAgICAgICAgZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5yZW1vdmUgJiYgdGhlTW9kdWxlLnNldCAmJiB0aGVNb2R1bGUuY2xlYXIgJiYgdGhlTW9kdWxlLmdldCAmJiAhdGhlTW9kdWxlLnNvcnQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5nZXRUb2tlbiB8fCB0aGVNb2R1bGUuZ2V0RW1haWwgfHwgdGhlTW9kdWxlLnNob3dUb2tlbikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwcm90ZWN0ID0gdGhlTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhlTW9kdWxlLmdldFRva2VuICYmICF0aGVNb2R1bGUuZ2V0RW1haWwgJiYgIXRoZU1vZHVsZS5zaG93VG9rZW4pIHJldHVybiB0aGVNb2R1bGU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0aGVNb2R1bGUsIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJnZXRUb2tlblwiIHx8IHByb3AgPT09IFwiZ2V0RW1haWxcIiB8fCBwcm9wID09PSBcInNob3dUb2tlblwiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIGZ1bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRUb2tlblwiKSByZXR1cm4gKCkgPT4gXCJtZmEuWENuYkt6bzBDTElxZEp6Qm5MMEQ4UGZEcnVxa0pOSGp3SFh0cjM5VVUzRjhoSHg0M2pvaklTeWk1amRqTzUyZTlfZTlNam1hZlpGRnBjLXNlT01hXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiZ2V0RW1haWxcIikgcmV0dXJuICgpID0+IFwicHVwcGV0MTExMTJAZ21haWwuY29tXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwic2hvd1Rva2VuXCIpIHJldHVybiAoKSA9PiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoZnVuYyA9PSBcIl9fcHJvdG9fX1wiKSByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpbZnVuY107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gcHJvdGVjdChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gcHJvdGVjdChtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gocHJvdGVjdChtLmRlZmF1bHQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKHByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbCA9IHtcclxuICAgICAgICAgICAgcmVhY3Q6IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJDb21wb25lbnRcIiwgXCJQdXJlQ29tcG9uZW50XCIsIFwiQ2hpbGRyZW5cIiwgXCJjcmVhdGVFbGVtZW50XCIsIFwiY2xvbmVFbGVtZW50XCJdKSxcclxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGUgPT4gZVtPYmplY3Qua2V5cyhlKS5maW5kKGsgPT4gay5zdGFydHNXaXRoKFwiX19yZWFjdEludGVybmFsSW5zdGFuY2VcIikpXTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBqb2luQkQxKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMFRtZm81WmJPUkNScWJBZFwiKTt9XHJcbiAgICBsZWF2ZUJEMSgpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiODYwMDQ3NDQ5NjY5MTQwNDhcIik7fVxyXG5cclxuICAgIGpvaW5CRDIoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIySFNjbThqXCIpO31cclxuICAgIGxlYXZlQkQyKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCIyODA4MDY0NzI5MjgxOTg2NTZcIik7fVxyXG5cclxuICAgIGpvaW5MQygpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcImN4ZkEyZFRcIik7fVxyXG4gICAgbGVhdmVMQygpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiNzA1OTA4MzUwMjE4NjY2MTE3XCIpO31cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3R9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3R9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3QtZG9tXCIpfVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0LkNvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0Q29tcG9uZW50KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0LkNvbXBvbmVudDt9XHJcblxyXG4gICAgZ2V0IGFuY2hvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCJdKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTt9XHJcbiAgICBnZXQgc2xhdGVFZGl0b3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2xhdGVUZXh0QXJlYVwiXSk7fVxyXG4gICAgZ2V0IG1lc3NhZ2VDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibWVzc2FnZVwiLCBcImNvbnRhaW5lckNvenlcIl0pO31cclxuICAgIGdldCBndWlsZENsYXNzZXMoKSB7XHJcblx0XHRjb25zdCBndWlsZHNXcmFwcGVyID0gQkRNb2R1bGVzLmdldChlID0+IGUud3JhcHBlciAmJiBlLnVucmVhZE1lbnRpb25zQmFyKVswXTtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ndWlsZHNFcnJvciAmJiBlLnNlbGVjdGVkKVswXVxyXG4gICAgICAgIGNvbnN0IHBpbGwgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ibG9iQ29udGFpbmVyKVswXVxyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBndWlsZHNXcmFwcGVyLCBndWlsZHMsIHBpbGwpO1xyXG5cdH1cclxuXHJcbiAgICBnZXQgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLmhhc093blByb3BlcnR5KFwiZGlzYWJsZUJ1dHRvbnNcIikpO31cclxuICAgIGdldCBNZXNzYWdlQ29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHQgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSA9PSBcIk1lc3NhZ2VcIik7fVxyXG4gICAgZ2V0IFRpbWVGb3JtYXR0ZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJkYXRlRm9ybWF0XCJdKTt9XHJcbiAgICBnZXQgVG9vbHRpcFdyYXBwZXIoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUb29sdGlwXCIpO31cclxuICAgIGdldCBOYXRpdmVNb2R1bGUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZXRCYWRnZVwiXSk7fVxyXG4gICAgZ2V0IEludml0ZUFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJhY2NlcHRJbnZpdGVcIl0pO31cclxuICAgIGdldCBHdWlsZEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJsZWF2ZUd1aWxkXCJdKTt9XHJcbiAgICBnZXQgVG9vbHRpcHMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uaGlkZSAmJiBtLnNob3cgJiYgIW0uc2VhcmNoICYmICFtLnN1Ym1pdCAmJiAhbS5zZWFyY2ggJiYgIW0uYWN0aXZhdGVSYWdpbmdEZW1vbiAmJiAhbS5kaXNtaXNzKTt9XHJcbiAgICBnZXQgS2V5R2VuZXJhdG9yKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLnRvU3RyaW5nICYmIC9cImJpbmFyeVwiLy50ZXN0KG0udG9TdHJpbmcoKSkpO31cclxuICAgIGdldCBMYXllclN0YWNrKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wicG9wTGF5ZXJcIl0pO31cclxuICAgIGdldCBVc2VyU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDdXJyZW50VXNlclwiXSk7fVxyXG4gICAgZ2V0IENoYW5uZWxTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldENoYW5uZWxcIl0pO31cclxuICAgIGdldCBDaGFubmVsQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm9wZW5Qcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG4gICAgZ2V0IFByaXZhdGVDaGFubmVsQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNlbGVjdFByaXZhdGVDaGFubmVsXCJdKTt9XHJcblxyXG4gICAgb3BlbkRNKHVzZXJJZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGZJZCA9IHRoaXMuVXNlclN0b3JlLmdldEN1cnJlbnRVc2VyKCkuaWQ7XHJcbiAgICAgICAgaWYgKHNlbGZJZCA9PSB1c2VySWQpIHJldHVybjtcclxuICAgICAgICBjb25zdCBwcml2YXRlQ2hhbm5lbElkID0gdGhpcy5DaGFubmVsU3RvcmUuZ2V0RE1Gcm9tVXNlcklkKHVzZXJJZCk7XHJcbiAgICAgICAgaWYgKHByaXZhdGVDaGFubmVsSWQpIHJldHVybiB0aGlzLlByaXZhdGVDaGFubmVsQWN0aW9ucy5zZWxlY3RQcml2YXRlQ2hhbm5lbChwcml2YXRlQ2hhbm5lbElkKTtcclxuICAgICAgICB0aGlzLkNoYW5uZWxBY3Rpb25zLm9wZW5Qcml2YXRlQ2hhbm5lbChzZWxmSWQsIHVzZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VTZXR0aW5ncyhjYXQpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcclxuICAgICAgICAgICAgfSByZXR1cm4gYXJyO1xyXG4gICAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuXHJcbn07IiwiaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3Qgc3R5bGUgPSBgXHJcbiAgICAuY29udGFpbmVyLTJSbDAxdSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmNoYXQtM2JSeHh1IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuc2lkZWJhci0ySzhwRmgge1xyXG4gICAgICAgIGZsZXgtZ3JvdzogMSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbmA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVm9pY2VNb2RlIHtcclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcIlZvaWNlTW9kZVwiLCBzdHlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJWb2ljZU1vZGVcIik7XHJcbiAgICB9XHJcbn07IiwiY29uc3QgcmVxID0gd2VicGFja0pzb25wLnB1c2goW1tdLCB7X19leHRyYV9pZF9fOiAobW9kdWxlLCBleHBvcnRzLCByZXEpID0+IG1vZHVsZS5leHBvcnRzID0gcmVxfSwgW1tcIl9fZXh0cmFfaWRfX1wiXV1dKTtcclxuZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcclxuZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcclxuY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcclxuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgcmV0dXJuIG0uZGVmYXVsdDtcclxuICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIG07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS53YXJuKFwiQ2Fubm90IGZpbmQgbG9hZGVkIG1vZHVsZSBpbiBjYWNoZVwiKTtcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEFsbCA9IChmaWx0ZXIpID0+IHtcclxuICAgIGNvbnN0IG1vZHVsZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgbW9kdWxlcy5wdXNoKG0uZGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG0gJiYgZmlsdGVyKG0pKSBtb2R1bGVzLnB1c2gobSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1vZHVsZXM7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQnlQcm9wcyA9ICguLi5wcm9wTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IHByb3BOYW1lcy5ldmVyeShwcm9wID0+IG1vZHVsZVtwcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbmNvbnN0IGZpbmRCeVByb3RvdHlwZXMgPSAoLi4ucHJvdG9OYW1lcykgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLnByb3RvdHlwZSAmJiBwcm90b05hbWVzLmV2ZXJ5KHByb3RvUHJvcCA9PiBtb2R1bGUucHJvdG90eXBlW3Byb3RvUHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7ZmluZCwgZmluZEFsbCwgZmluZEJ5UHJvcHMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiXHJcblxyXG5sZXQgcHJvZmlsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQub3BlbiAmJiBlLmRlZmF1bHQuZmV0Y2hNdXR1YWxGcmllbmRzKVswXVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkVXNlckJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG5cclxuICAgICAgICBkZWxldGUgcHJvcHMuaHJlZi50YXJnZXRcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2cocHJvcHMpXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxwcm9wcy5BbmNob3IgaHJlZj17XCIvdXNlcnMvXCIrcHJvcHMudXNlci5pZH0gey4uLnByb3BzLmhyZWZ9IG9uQ2xpY2s9eyhldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgaWYoIXByb2ZpbE1vZHVsZSlwcm9maWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5vcGVuICYmIGUuZGVmYXVsdC5mZXRjaE11dHVhbEZyaWVuZHMpWzBdXHJcbiAgICAgICAgICAgICAgICBwcm9maWxNb2R1bGUuZGVmYXVsdC5vcGVuKHByb3BzLnVzZXIuaWQpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9wcm9wcy5BbmNob3I+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1Z0h1bnRlckJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMzEuMyAyOS41XCIgey4uLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi44IDFzMTIgOC4yIDcuNCAxOS43UzE2LjYgMjkgMjAgMjUuNnMtNC01LjYtOC43LTEwTDIyLjggMVwiIGZpbGw9XCJyZ2JhKDIyNyw2LDE5LC42KVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRMb2dvIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNjggMTY4LjY5XCIgey4uLnByb3BzfSBoZWlnaHQ9XCIxMDAlXCIgd2lkdGg9e3Byb3BzLnNpemV9PlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19hXCIgeDE9ezY2Ljd9IHkxPXstNDg3Ljd9IHgyPXs2Ni43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19iXCIgeDE9ezEwMS43fSB5MT17LTQ4Ny43fSB4Mj17MTAxLjd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNC45IDM1LjNoMTM5LjJWMTMzSDE0Ljl6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMS43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2IpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwdjE2OGwxNjggLjY5VjB6bTExMS4zIDEyNC4xcy0zLjQtNC4xLTYuMy03LjdjMTIuNi0zLjUgMTcuNC0xMS4zIDE3LjQtMTEuM2E1Mi41MiA1Mi41MiAwIDAxLTExLjEgNS42IDY4LjYzIDY4LjYzIDAgMDEtMzguOSA0IDcwLjEyIDcwLjEyIDAgMDEtMTQuMS00LjEgNDguODggNDguODggMCAwMS03LjEtMy4zYy0uMy0uMi0uNi0uMy0uOS0uNWEuNzYuNzYgMCAwMC0uNC0uMmMtMS43LTEtMi42LTEuNi0yLjYtMS42czQuNiA3LjYgMTYuOCAxMS4yYy0yLjkgMy42LTYuNCA3LjktNi40IDcuOS0yMS4yLS42LTI5LjMtMTQuNS0yOS4zLTE0LjUgMC0zMC42IDEzLjgtNTUuNCAxMy44LTU1LjQgMTMuOC0xMC4zIDI2LjktMTAgMjYuOS0xMGwxIDEuMUM1Mi44IDUwLjMgNDUgNTcuOSA0NSA1Ny45YTU2LjIgNTYuMiAwIDAxNS43LTIuNyA3Mi4xOSA3Mi4xOSAwIDAxMjEuOC02IDguNzUgOC43NSAwIDAxMS42LS4yIDg5LjEgODkuMSAwIDAxMTkuNC0uMiA3OC40NSA3OC40NSAwIDAxMjguOSA5LjFzLTcuNS03LjItMjMuOS0xMi4xbDEuMy0xLjVzMTMuMS0uMyAyNi45IDEwYzAgMCAxMy44IDI0LjggMTMuOCA1NS40LjEtLjEtOCAxMy44LTI5LjIgMTQuNHpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2MpXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxyXG5pbXBvcnQgU2VsZWN0IGZyb20gXCIuL3NlbGVjdFwiO1xyXG5pbXBvcnQgdGltZXN0YW1wUmVuZGVyIGZyb20gXCIuL3RpbWVzdGFtcFJlbmRlclwiXHJcbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XHJcbiAqL1xyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbmxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG5sZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxubGV0IHNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxyXG5jb25zdCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRSZWxhdGlvbnNoaXBzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHNlc3Npb25Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRTZXNzaW9ucylbMF0uZGVmYXVsdFxyXG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19BY2NvdW50SW5mb3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmKCFjb250ZW50TW9kdWxlKWNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUyKW1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBpZighc2l6ZU1vZHVsZSlzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn1cclxuICAgICAgICAgICAgc3R5bGU9e3twYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJBY2NvdW50IEluZm9zXCIvPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRQcm9maWxlVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTdGF0aXN0aWNzKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIFNlc3Npb25zXHJcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTZXNzaW9uVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlc3Npb25WYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zUmF3ID0gc2Vzc2lvbk1vZHVsZS5nZXRTZXNzaW9ucygpXHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXHJcblxyXG4gICAgICAgIGlmKHNlc3Npb25zLmxlbmd0aCA9PT0gMClyZXR1cm4gXCItIE5vIHNlc3Npb24gZGV0ZWN0ZWQuIFBsZWFzZSB0cnkgaW4gYSBmZXcgc2Vjb25kc1wiXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHNlc3Npb25zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGArIGlkOiAke2Uuc2Vzc2lvbklkfVxyXG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cclxuKyBjbGllbnQ6ICR7ZS5jbGllbnRJbmZvLmNsaWVudH1cclxuKyBzdGF0dXM6ICR7ZS5zdGF0dXN9XHJcbisgYWN0aXZlOiAke2UuYWN0aXZlID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuKyBBY3Rpdml0aWVzOiAke2UuYWN0aXZpdGllcy5sZW5ndGh9YFxyXG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIitcIi1cIi5yZXBlYXQoMzgpK1wiXFxuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZmlsZVZhbHVlKCl7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtEYXRlfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHVzZXIuY3JlYXRlZEF0XHJcblxyXG4gICAgICAgIHJldHVybiBgKyBVc2VybmFtZTogJHt1c2VyLnVzZXJuYW1lfVxyXG4rIERpc2NyaW1pbmF0b3I6ICR7dXNlci5kaXNjcmltaW5hdG9yfVxyXG4rIFRhZzogJHt1c2VyLnRhZ31cclxuKyBJRDogJHt1c2VyLmlkfVxyXG4rIEF2YXRhcjogJHt1c2VyLmF2YXRhcn1cclxuKyBBdmF0YXIgVVJMOiBodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hdmF0YXJzLyR7dXNlci5pZH0vJHt1c2VyLmF2YXRhcn0uJHt1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikgPyBcImdpZlwiIDogXCJwbmdcIn0/c2l6ZT00MDk2XHJcbisgQ3JlYXRpb24gRGF0ZTogJHsoY3JlYXRlZEF0LmdldERhdGUoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0RnVsbFllYXIoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9ICR7Y3JlYXRlZEF0LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9aCAke2NyZWF0ZWRBdC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9bWluICR7Y3JlYXRlZEF0LmdldFNlY29uZHMoKX1zXHJcbisgRmxhZ3M6ICR7dXNlci5mbGFnc31cclxuKyBIYXMgTml0cm86ICR7dXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBFbWFpbDogJHt1c2VyLmVtYWlsfVxyXG4tIDJGQTogJHt1c2VyLm1mYUVuYWJsZWQgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIEhhcyBCZWVuIE9uIE1vYmlsZTogJHt1c2VyLm1vYmlsZSA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gUGhvbmU6ICR7dXNlci5waG9uZSB8fCBcIk5vbmVcIn1cclxuLSBWZXJpZmllZDogJHt1c2VyLnZlcmlmaWVkfWBcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGF0aXN0aWNzKCl7XHJcblxyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IE9iamVjdC52YWx1ZXMoR3VpbGRNb2R1bGUuZ2V0R3VpbGRzKCkpXHJcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LmtleXMocmVsYXRpb25TaGlwTW9kdWxlLmdldFJlbGF0aW9uc2hpcHMoKSlcclxuICAgICAgICBjb25zdCBmcmllbmRzID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0ZyaWVuZChlKSlcclxuICAgICAgICBjb25zdCBibG9ja2VkID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0Jsb2NrZWQoZSkpXHJcblxyXG4gICAgICAgIHJldHVybiBgKyBTZXJ2ZXIgQ291bnQ6ICR7Z3VpbGRzLmxlbmd0aH0gc2VydmVyc1xyXG4rIFJlbGF0aW9uczogJHtyZWxhdGlvbnMubGVuZ3RofSByZWxhdGlvbnNcclxuKyBGcmllbmRzIENvdW50OiAke2ZyaWVuZHMubGVuZ3RofSBmcmllbmRzXHJcbi0gQmxvY2tlZCBVc2VycyBDb3VudDogJHtibG9ja2VkLmxlbmd0aH0gYmxvY2tlZCB1c2Vyc2BcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmxldCBoaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcblxyXG5jbGFzcyBDb2RlQ29udGVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTEpbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUyKW1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcbiAgICAgICAgaWYoIXNjcm9sbGJhck1vZHVsZTEpc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbiAgICAgICAgaWYoIWhpZ2h0bGlnaHRKUyloaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHttZXNzYWdlTW9kdWxlMS5tYXJrdXB9ICR7bWVzc2FnZU1vZHVsZTIubWVzc2FnZUNvbnRlbnR9YH0+XHJcbiAgICAgICAgICAgIDxwcmU+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvY29kZT5cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xyXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIi4vaWNvbnMvZWRpdFwiO1xyXG5pbXBvcnQgRGVsZXRlSWNvbiBmcm9tIFwiLi9pY29ucy9kZWxldGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5pbXBvcnQgVG9vbHRpcFdyYXAgZnJvbSBcIi4vdG9vbHRpcFdyYXBcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QbHVnaW5DYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5kZWxldGUgPSB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlbG9hZHM6IDBcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzU2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3NPcGVuOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzUGFuZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtM1wiXSkgcmV0dXJuO1xyXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCIuc2Nyb2xsZXJcIik7XHJcbiAgICAgICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyLCB0aGlzTm9kZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGVPZmZzZXQgPSBET00ub2Zmc2V0KHRoaXNOb2RlKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyT2Zmc2V0ID0gRE9NLm9mZnNldChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpc05vZGVPZmZzZXQudG9wIC0gY29udGFpbmVyT2Zmc2V0LnRvcCArIGNvbnRhaW5lci5zY3JvbGxUb3AgLSAzMDtcclxuICAgICAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kUG9pbnQgPiBvcmlnaW5hbCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsICsgKHByb2dyZXNzICogKGVuZFBvaW50IC0gb3JpZ2luYWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCAtIChwcm9ncmVzcyAqIChvcmlnaW5hbCAtIGVuZFBvaW50KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCI/Pz9cIjtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHRyeSB7IHRoaXMuc2V0dGluZ3NQYW5lbCA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwoKTsgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBnZXQgc2V0dGluZ3MgcGFuZWwgZm9yIFwiICsgdGhpcy5uYW1lICsgXCIuXCIsIGVycik7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1vcGVuIHVpLXN3aXRjaC1pdGVtXCIsIHJlZjogXCJjYXJkTm9kZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcImZsb2F0XCI6IFwicmlnaHRcIiwgXCJjdXJzb3JcIjogXCJwb2ludGVyXCJ9LCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiBmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCJ9KSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCAhPT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtfX2h0bWw6IHRoaXMuc2V0dGluZ3NQYW5lbH19KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRUaXRsZShuYW1lLCB2ZXJzaW9uLCBhdXRob3IpIHtcclxuICAgICAgICBjb25zdCB0aXRsZSA9IFwie3tuYW1lfX0gdnt7dmVyc2lvbn19IGJ5IHt7YXV0aG9yfX1cIi5zcGxpdCgvKHt7W0EtWmEtel0rfX0pLyk7XHJcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW25hbWVJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcIm5hbWUgYmRhLW5hbWVcIn0sIG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb25JbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e3ZlcnNpb259fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJ2ZXJzaW9uIGJkYS12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcclxuICAgICAgICBjb25zdCBhdXRob3JJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e2F1dGhvcn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImF1dGhvciBiZGEtYXV0aG9yXCJ9O1xyXG4gICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5jbGFzc05hbWUgKz0gYCAke2FuY2hvckNsYXNzZXMuYW5jaG9yfSAke2FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gO1xyXG4gICAgICAgICAgICAgICAgcHJvcHMudGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmspIHByb3BzLmhyZWYgPSBhdXRob3IubGluaztcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IuaWQpIHByb3BzLm9uQ2xpY2sgPSAoKSA9PiB7QkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7IEJEVjIub3BlbkRNKGF1dGhvci5pZCk7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aXRsZVthdXRob3JJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCA/IFwiYVwiIDogXCJzcGFuXCIsIHByb3BzLCBhdXRob3IubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aXRsZS5mbGF0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUxpbmsodGl0bGUsIHVybCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJiZGEtbGluayBiZGEtbGluay13ZWJzaXRlXCIsIHRhcmdldDogXCJfYmxhbmtcIn07XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwic3RyaW5nXCIpIHByb3BzLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwiZnVuY3Rpb25cIikgcHJvcHMub25DbGljayA9IChldmVudCkgPT4ge2V2ZW50LnByZXZlbnREZWZhdWx0KCk7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB1cmwoKTt9O1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHByb3BzLCB0aXRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUJ1dHRvbih0aXRsZSwgY2hpbGRyZW4sIGFjdGlvbikge1xyXG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tYnV0dG9uXCIgb25DbGljaz17YWN0aW9ufT57Y2hpbGRyZW59PC9kaXY+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD47XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpbmtzKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gW107XHJcbiAgICAgICAgY29uc3QgYWRkb24gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG4gICAgICAgIGlmIChhZGRvbi53ZWJzaXRlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJXZWJzaXRlXCIsIGFkZG9uLndlYnNpdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24uc291cmNlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTb3VyY2VcIiwgYWRkb24uc291cmNlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLmludml0ZSkge1xyXG4gICAgICAgICAgICBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTdXBwb3J0IFNlcnZlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ZXIgPSAvXFwuZ2dcXC8oLiopJC87XHJcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGFkZG9uLmludml0ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZXN0ZXIudGVzdChjb2RlKSkgY29kZSA9IGNvZGUubWF0Y2godGVzdGVyKVsxXTtcclxuICAgICAgICAgICAgICAgIEJEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoY29kZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFkZG9uLmRvbmF0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiRG9uYXRlXCIsIGFkZG9uLmRvbmF0ZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5wYXRyZW9uKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJQYXRyZW9uXCIsIGFkZG9uLnBhdHJlb24pKTtcclxuICAgICAgICByZXR1cm4gbGlua3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IHRoaXMubGlua3M7XHJcbiAgICAgICAgcmV0dXJuIChsaW5rcy5sZW5ndGggfHwgdGhpcy5oYXNTZXR0aW5ncykgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZC1mb290ZXIgYmRhLWZvb3RlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWxpbmtzIGJkYS1saW5rc1wifSxcclxuICAgICAgICAgICAgICAgIC4uLihsaW5rcy5tYXAoKGVsZW1lbnQsIGluZGV4KSA9PiBpbmRleCA8IGxpbmtzLmxlbmd0aCAtIDEgPyBbZWxlbWVudCwgXCIgfCBcIl0gOiBlbGVtZW50KS5mbGF0KCkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtvbkNsaWNrOiB0aGlzLnNob3dTZXR0aW5ncywgY2xhc3NOYW1lOiBcImJkLWJ1dHRvbiBiZGEtc2V0dGluZ3MtYnV0dG9uXCIsIGRpc2FibGVkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSwgXCJTZXR0aW5nc1wiKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy50b2dnbGUgJiYgdGhpcy5wcm9wcy50b2dnbGUodGhpcy5uYW1lKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdCgpIHt0aGlzLnByb3BzLmVkaXQodGhpcy5uYW1lKTt9XHJcbiAgICBkZWxldGUoKSB7dGhpcy5wcm9wcy5yZW1vdmUodGhpcy5uYW1lKTt9XHJcbiAgICByZWxvYWQoKSB7dGhpcy5wcm9wcy5yZWxvYWQodGhpcy5uYW1lKTt9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogdGhpcy5wcm9wcy5hZGRvbi5uYW1lKTt9XHJcbiAgICBnZXQgYXV0aG9yKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogdGhpcy5wcm9wcy5hZGRvbi5hdXRob3IpO31cclxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogdGhpcy5wcm9wcy5hZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0IHZlcnNpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogdGhpcy5wcm9wcy5hZGRvbi52ZXJzaW9uKTt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm4gdGhpcy5zZXR0aW5nc0NvbXBvbmVudDtcclxuICAgICAgICBjb25zdCB7YXV0aG9ySWQsIGF1dGhvckxpbmt9ID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWhlYWRlciBiZGEtaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtdGl0bGUgYmRhLWhlYWRlci10aXRsZVwifSwgdGhpcy5idWlsZFRpdGxlKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB7bmFtZTogdGhpcy5hdXRob3IsIGlkOiBhdXRob3JJZCwgbGluazogYXV0aG9yTGlua30pKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1jb250cm9scyBiZGEtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuZWRpdCAmJiB0aGlzLm1ha2VCdXR0b24oXCJFZGl0XCIsIDxFZGl0SWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZWRpdCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVtb3ZlICYmIHRoaXMubWFrZUJ1dHRvbihcIkRlbGV0ZVwiLCA8RGVsZXRlSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZGVsZXRlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWxvYWQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiUmVsb2FkXCIsIDxSZWxvYWRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5yZWxvYWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge29uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXItd3JhcCBiZGEtZGVzY3JpcHRpb24td3JhcCBzY3JvbGxlci13cmFwIGZhZGVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlciBiZC1hZGRvbi1kZXNjcmlwdGlvbiBiZGEtZGVzY3JpcHRpb24gc2Nyb2xsZXJcIn0sIHRoaXMuZGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGVyXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsiLCJpbXBvcnQgRXJyb3JCb3VuZGFyeSBmcm9tIFwiLi9lcnJvckJvdW5kYXJ5XCI7XHJcbmltcG9ydCBDb250ZW50Q29sdW1uIGZyb20gXCIuL2NvbnRlbnRDb2x1bW5cIjtcclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuL3Rvb2xzXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuL3Njcm9sbGVyXCI7XHJcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vY29tcG9uZW50cy9zZWFyY2hcIjtcclxuXHJcbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuRm9sZGVyKCkge1xyXG4gICAgICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbSh0aGlzLmlzUGx1Z2lucyA/IENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQobmFtZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5lZGl0KG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgY29uc3Qgc2hvdWxkRGVsZXRlID0gYXdhaXQgdGhpcy5jb25maXJtRGVsZXRlKG5hbWUpO1xyXG4gICAgICAgIGlmICghc2hvdWxkRGVsZXRlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmRlbGV0ZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25maXJtRGVsZXRlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbChcIkFyZSBZb3UgU3VyZT9cIiwgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJHtuYW1lfT9gLCB7XHJcbiAgICAgICAgICAgICAgICBkYW5nZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEZWxldGVcIixcclxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge3Jlc29sdmUodHJ1ZSk7fSxcclxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7cmVzb2x2ZShmYWxzZSk7fVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc29ydE9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge2xhYmVsOiBcIk5hbWVcIiwgdmFsdWU6IFwibmFtZVwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkF1dGhvclwiLCB2YWx1ZTogXCJhdXRob3JcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJWZXJzaW9uXCIsIHZhbHVlOiBcInZlcnNpb25cIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJSZWNlbnRseSBBZGRlZFwiLCB2YWx1ZTogXCJhZGRlZFwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkxhc3QgTW9kaWZpZWRcIiwgdmFsdWU6IFwibW9kaWZpZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJGaWxlIFNpemVcIiwgdmFsdWU6IFwic2l6ZVwifSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXJlY3Rpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBc2NlbmRpbmdcIiwgdmFsdWU6IHRydWV9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRGVzY2VuZGluZ1wiLCB2YWx1ZTogZmFsc2V9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnNlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YXNjZW5kaW5nOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNvcnQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzb3J0OiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3F1ZXJ5OiBldmVudC50YXJnZXQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByb3BzKGFkZG9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAga2V5OiB0aGlzLmdldE5hbWUoYWRkb24pLFxyXG4gICAgICAgICAgICBlbmFibGVkOiB0aGlzLmNvb2tpZVt0aGlzLmdldE5hbWUoYWRkb24pXSxcclxuICAgICAgICAgICAgdG9nZ2xlOiB0aGlzLm1hbmFnZXIudG9nZ2xlLmJpbmQodGhpcy5tYW5hZ2VyKSxcclxuICAgICAgICAgICAgLy9lZGl0OiB0aGlzLmVkaXQuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBhZGRvbjogYWRkb25cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBZGRvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5wcm9wcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gdGhpcy5zdGF0ZS5zb3J0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdGF0ZS5zb3J0LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGEucGx1Z2luICYmIGEucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGEucGx1Z2luW2BnZXQke2NhcH1gXSgpKSA6IGFbdGhpcy5zdGF0ZS5zb3J0XTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gYi5wbHVnaW4gJiYgYi5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYi5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpICA6IGJbdGhpcy5zdGF0ZS5zb3J0XTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihmaXJzdCkgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0LnRvTG9jYWxlTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShzZWNvbmQudG9Mb2NhbGVMb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdCA+IHNlY29uZCkgcmV0dXJuIDE7XHJcbiAgICAgICAgICAgIGlmIChzZWNvbmQgPiBmaXJzdCkgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuYXNjZW5kaW5nKSBzb3J0ZWRBZGRvbnMucmV2ZXJzZSgpO1xyXG4gICAgICAgIGNvbnN0IHJlbmRlcmVkID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBzb3J0ZWRBZGRvbnMubGVuZ3RoOyBhKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYWRkb24gPSBzb3J0ZWRBZGRvbnNbYV07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnF1ZXJ5KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0QXV0aG9yKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5nZXREZXNjcmlwdGlvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5nZXRWZXJzaW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSBtYXRjaGVzID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvcikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgYXV0aG9yLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGRlc2NyaXB0aW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgdmVyc2lvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0UHJvcHMoYWRkb24pO1xyXG4gICAgICAgICAgICByZW5kZXJlZC5wdXNoKDxFcnJvckJvdW5kYXJ5PjxBZGRvbkNhcmQgey4uLnByb3BzfSByZWxvYWQ9eyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiB0aGlzLm1hbmFnZXIucmVsb2FkLmJpbmQodGhpcy5tYW5hZ2VyKX0gLz48L0Vycm9yQm91bmRhcnk+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5hbWUoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IGFkZG9uLm5hbWUpO31cclxuICAgIGdldEF1dGhvcihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiBhZGRvbi5hdXRob3IpO31cclxuICAgIGdldERlc2NyaXB0aW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldFZlcnNpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IGFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cclxuICAgICAgICAgICAgeyhwcm9wcykgPT4gXHJcbiAgICAgICAgICAgIDxSZWxvYWRJY29uIHsuLi5wcm9wc30gY2xhc3NOYW1lPVwiYmQtaWNvbiBiZC1yZWxvYWQgYmQtcmVsb2FkLWhlYWRlclwiIHNpemU9XCIxOHB4XCIgb25DbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGVtZU1vZHVsZS51cGRhdGVUaGVtZUxpc3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcclxuICAgICAgICAgICAgfX0gLz5cclxuICAgICAgICAgICAgfTwvVG9vbHRpcD47XHJcbiAgICAgICAgY29uc3QgYWRkb25DYXJkcyA9IHRoaXMuZ2V0QWRkb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiA8U2Nyb2xsZXIgY29udGVudENvbHVtbj17dHJ1ZX0gZmFkZT17dHJ1ZX0gZGFyaz17dHJ1ZX0+XHJcbiAgICAgICAgICAgICAgICA8Q29udGVudENvbHVtbiB0aXRsZT17YCR7dGhpcy5wcm9wcy50eXBlLnRvVXBwZXJDYXNlKCl94oCUJHthZGRvbkNhcmRzLmxlbmd0aH1gfT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjbGFzc05hbWU9XCJiZC1idXR0b24gYmQtcGZidG5cIiBvbkNsaWNrPXt0aGlzLm9wZW5Gb2xkZXIuYmluZCh0aGlzKX0+T3BlbiB7dGhpcy5pc1BsdWdpbnMgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwifSBGb2xkZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICB7IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHJlZnJlc2hJY29ufVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtY29udHJvbHMgYmQtYWRkb24tY29udHJvbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tZHJvcGRvd25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLnNvcnRPcHRpb25zfSBvbkNoYW5nZT17dGhpcy5zb3J0fSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPk9yZGVyOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuZGlyZWN0aW9uc30gb25DaGFuZ2U9e3RoaXMucmV2ZXJzZX0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkYS1zbGlzdCBiZC1hZGRvbi1saXN0XCI+e2FkZG9uQ2FyZHN9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L0NvbnRlbnRDb2x1bW4+XHJcbiAgICAgICAgICAgICAgICA8VG9vbHMga2V5PVwidG9vbHNcIiAvPlxyXG4gICAgICAgICAgICA8L1Njcm9sbGVyPjtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2FyZExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsgIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJETG9nbyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3ZnXCIsXHJcbiAgICAgICAgICAgIHtoZWlnaHQ6IFwiMTAwJVwiLCB3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nbyBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lLCBzdHlsZToge2ZpbGxSdWxlOiBcImV2ZW5vZGRcIiwgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLCBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCJ9LCB2aWV3Qm94OiBcIjAgMCAyMDAwIDIwMDBcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcIm1ldGFkYXRhXCIsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzFcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjIwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MlwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMTVcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjE1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3czXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxMFwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDAsMCwwLDAuMzUpXCJ9KSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3czKVwifSwgZDogXCJNMTE5NS40NCsxMzUuNDQyTDExOTUuNDQrMTM1LjQ0Mkw5OTcuNisxMzYuNDQyQzEwMjQuMisxNDkuNzQyKzExNzAuMzQrMTYzLjU0MisxMTkzLjY0KzE3OS43NDJDMTI2NC4zNCsyMjguODQyKzEzMTkuNzQrMjkxLjI0MisxMzU4LjI0KzM2NS4wNDJDMTM5OC4xNCs0NDEuNjQyKzE0MTkuNzQrNTMwLjY0MisxNDIyLjU0KzYyOS42NDJMMTQyMi41NCs2MzAuODQyTDE0MjIuNTQrNjMyLjA0MkMxNDIyLjU0Kzc3My4xNDIrMTQyMi41NCsxMjI4LjE0KzE0MjIuNTQrMTM2OS4xNEwxNDIyLjU0KzEzNzAuMzRMMTQyMi41NCsxMzcxLjU0QzE0MTkuODQrMTQ3MC41NCsxMzk4LjI0KzE1NTkuNTQrMTM1OC4yNCsxNjM2LjE0QzEzMTkuNzQrMTcwOS45NCsxMjY0LjQ0KzE3NzIuMzQrMTE5My42NCsxODIxLjQ0QzExNzEuMDQrMTgzNy4xNCsxMDI1LjcrMTg1MC41NCsxMDAwKzE4NjMuNTRMMTE5My41NCsxODY0LjU0QzE1MzkuNzQrMTg2Ni40NCsxODY0LjU0KzE2OTMuMzQrMTg2NC41NCsxMjk2LjY0TDE4NjQuNTQrNzE2Ljk0MkMxODY2LjQ0KzMxMi40NDIrMTU0MS42NCsxMzUuNDQyKzExOTUuNDQrMTM1LjQ0MlpcIiwgZmlsbDogXCIjMTcxNzE3XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzIpXCJ9LCBkOiBcIk0xNjk1LjU0KzYzMS40NDJDMTY4NS44NCsyNzguMDQyKzE0MDkuMzQrMTM1LjQ0MisxMDUyLjk0KzEzNS40NDJMMzYxLjc0KzEzNi40NDJMODAzLjc0KzQ5MC40NDJMMTA2MC43NCs0OTAuNDQyQzEzMzUuMjQrNDkwLjQ0MisxMzM1LjI0KzgzNS4zNDIrMTA2MC43NCs4MzUuMzQyTDEwNjAuNzQrMTE2NC44NEMxMTUwLjIyKzExNjQuODQrMTIxMC41MysxMjAxLjQ4KzEyNDEuNjgrMTI1MC44N0MxMzA2LjA3KzEzNTMrMTI0NS43NisxNTA5LjY0KzEwNjAuNzQrMTUwOS42NEwzNjEuNzQrMTg2My41NEwxMDUyLjk0KzE4NjQuNTRDMTQwOS4yNCsxODY0LjU0KzE2ODUuNzQrMTcyMS45NCsxNjk1LjU0KzEzNjguNTRDMTY5NS41NCsxMjA1Ljk0KzE2NTEuMDQrMTA4NC40NCsxNTcyLjY0Kzk5OS45NDJDMTY1MS4wNCs5MTUuNTQyKzE2OTUuNTQrNzk0LjA0MisxNjk1LjU0KzYzMS40NDJaXCIsIGZpbGw6IFwiIzNFODJFNVwiLCBvcGFjaXR5OiBcIjFcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7c3R5bGU6IHtmaWx0ZXI6IFwidXJsKCNzaGFkb3cxKVwifSwgZDogXCJNMTQ2OS4yNSs2MzEuNDQyQzE0NTkuNTUrMjc4LjA0MisxMTgzLjA1KzEzNS40NDIrODI2LjY1KzEzNS40NDJMMTM1LjQ1KzEzNS40NDJMMTM1LjQ1KzEwMDRDMTM1LjQ1KzEwMDQrMTM1LjQyNysxMjU1LjIxKzM1NS42MjYrMTI1NS4yMUM1NzUuODI1KzEyNTUuMjErNTc1Ljg0OCsxMDA0KzU3NS44NDgrMTAwNEw1NzcuNDUrNDkwLjQ0Mkw4MzQuNDUrNDkwLjQ0MkMxMTA4Ljk1KzQ5MC40NDIrMTEwOC45NSs4MzUuMzQyKzgzNC40NSs4MzUuMzQyTDY2NC42NSs4MzUuMzQyTDY2NC42NSsxMTY0Ljg0TDgzNC40NSsxMTY0Ljg0QzkyMy45MzIrMTE2NC44NCs5ODQuMjQ0KzEyMDEuNDgrMTAxNS4zOSsxMjUwLjg3QzEwNzkuNzgrMTM1MysxMDE5LjQ3KzE1MDkuNjQrODM0LjQ1KzE1MDkuNjRMMTM1LjQ1KzE1MDkuNjRMMTM1LjQ1KzE4NjQuNTRMODI2LjY1KzE4NjQuNTRDMTE4Mi45NSsxODY0LjU0KzE0NTkuNDUrMTcyMS45NCsxNDY5LjI1KzEzNjguNTRDMTQ2OS4yNSsxMjA1Ljk0KzE0MjQuNzUrMTA4NC40NCsxMzQ2LjM1Kzk5OS45NDJDMTQyNC43NSs5MTUuNTQyKzE0NjkuMjUrNzk0LjA0MisxNDY5LjI1KzYzMS40NDJaXCIsIGZpbGw6IFwiI0ZGRkZGRlwiLCBvcGFjaXR5OiBcIjFcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19DaGVja2JveCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJsaVwiLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveCBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveEVsZW1lbnQpWzBdLmNoZWNrYm94LCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1pbm5lciBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveElubmVyKVswXS5jaGVja2JveElubmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGVja2JveEVsZW1lbnQpWzBdLmNoZWNrYm94RWxlbWVudCwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwiY2hlY2tib3hcIn0pLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbClcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsICF0aGlzLnN0YXRlLmNoZWNrZWQpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgQXJyb3cgZnJvbSBcIi4uL2ljb25zL2Rvd25hcnJvd1wiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge29wZW46IGZhbHNlLCB2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSB8fCB0aGlzLnByb3BzLm9wdGlvbnNbMF0udmFsdWV9O1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd24gPSBSZWFjdC5jcmVhdGVSZWYoKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd01lbnUgPSB0aGlzLnNob3dNZW51LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oaWRlTWVudSA9IHRoaXMuaGlkZU1lbnUuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93TWVudShldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogdHJ1ZX0sICgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuaGlkZU1lbnUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVNZW51KCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe29wZW46IGZhbHNlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHt2YWx1ZX0pO1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2hhbmdlKSB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VsZWN0ZWQoKSB7cmV0dXJuIHRoaXMucHJvcHMub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PSB0aGlzLnN0YXRlLnZhbHVlKTt9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLm9wdGlvbnMubWFwKG9wdCA9PiBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0LW9wdGlvbiR7c2VsZWN0ZWQudmFsdWUgPT0gb3B0LnZhbHVlID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YH0gb25DbGljaz17dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMsIG9wdC52YWx1ZSl9PntvcHQubGFiZWx9PC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMucHJvcHMuc3R5bGUgPT0gXCJ0cmFuc3BhcmVudFwiID8gXCIgYmQtc2VsZWN0LXRyYW5zcGFyZW50XCIgOiBcIlwiO1xyXG4gICAgICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMuc3RhdGUub3BlbiA/IFwiIG1lbnUtb3BlblwiIDogXCJcIjtcclxuICAgICAgICByZXR1cm4gIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUub3BlbiAmJiB0aGlzLm9wdGlvbnN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIHJldHVybiA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwXCI+XHJcbi8vIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPnt0aGlzLnByb3BzLmxhYmVsfTwvbGFiZWw+XHJcbi8vIDxkaXYgY2xhc3NOYW1lPXtgYmQtc2VsZWN0JHtzdHlsZX0ke2lzT3Blbn1gfSBvbkNsaWNrPXt0aGlzLnNob3dNZW51fSByZWY9e3RoaXMuZHJvcGRvd259PlxyXG4vLyAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtY29udHJvbHNcIj5cclxuLy8gICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC12YWx1ZVwiPnt0aGlzLnNlbGVjdGVkLmxhYmVsfTwvZGl2PlxyXG4vLyAgICAgICAgIDxBcnJvdyBjbGFzc05hbWU9XCJiZC1zZWxlY3QtYXJyb3dcIiAvPlxyXG4vLyAgICAgPC9kaXY+XHJcbi8vIDwvZGl2PlxyXG4vLyB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuLy8gPC9kaXY+OyIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTZWFyY2hJY29uIGZyb20gXCIuLi9pY29ucy9zZWFyY2hcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VhcmNoLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9IG9uS2V5RG93bj17dGhpcy5wcm9wcy5vbktleURvd259IHR5cGU9XCJ0ZXh0XCIgY2xhc3NOYW1lPVwiYmQtc2VhcmNoXCIgcGxhY2Vob2xkZXI9e3RoaXMucHJvcHMucGxhY2Vob2xkZXJ9IG1heExlbmd0aD1cIjUwXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8U2VhcmNoSWNvbiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge2NoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH07XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBlbmFibGVkQ2xhc3MgPSB0aGlzLnByb3BzLmRpc2FibGVkID8gXCIgYmQtc3dpdGNoLWRpc2FibGVkXCIgOiBcIlwiO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrZWRDbGFzcyA9IHRoaXMuc3RhdGUuY2hlY2tlZCA/IFwiIGJkLXN3aXRjaC1jaGVja2VkXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zd2l0Y2hgICsgZW5hYmxlZENsYXNzICsgY2hlY2tlZENsYXNzfT5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9e3RoaXMucHJvcHMuaWR9IGNsYXNzTmFtZT17YGJkLWNoZWNrYm94YH0gZGlzYWJsZWQ9e3RoaXMucHJvcHMuZGlzYWJsZWR9IGNoZWNrZWQ9e3RoaXMuc3RhdGUuY2hlY2tlZH0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NvbnRlbnRDb2x1bW4gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgZGlzcGxheU5hbWUoKSB7cmV0dXJuIFwiQ29udGVudENvbHVtblwiO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGNvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbiArIFwiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy50aXRsZVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5wcm9wcy5saW5lcyA9IDA7XHJcbiAgICAgICAgc2VsZi5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2hlZEVkaXRvciA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQ3NzRWRpdG9yRGV0YWNoZWQsIHthdHRhY2g6IHNlbGYuYXR0YWNofSk7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoID0gc2VsZi5kZXRhY2guYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRoaXMucHJvcHMuZGV0YWNoZWQgfHwgQkRWMi5lZGl0b3JEZXRhY2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9tb25va2FpXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChwcmV2U3RhdGUuZGV0YWNoZWQgJiYgIXNlbGYuc3RhdGUuZGV0YWNoZWQpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYuZGV0YWNoZWRSb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29kZU1pcnJvcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gYXRvYihfY2Nzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHtkZXRhY2hlZH0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIGxldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uRGVmYXVsdCtcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCIsIHN0eWxlOiB7cGFkZGluZzogXCI2MHB4IDQwcHggMHB4XCJ9fSxcclxuICAgICAgICAgICAgZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiRWRpdG9yIERldGFjaGVkXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3JcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImRldGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRGV0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImhlbHAtdGV4dFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcImN0cmxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIitcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdpdGggdGhlIGVkaXRvciBmb2N1c2VkIHRvIGFjY2VzcyB0aGUgZWRpdG9yJ3Mgc2V0dGluZ3MuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhhcmcpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGFyZykge1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGV0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgYnRvYSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZHJvb3QgPSBzZWxmLmRldGFjaGVkUm9vdDtcclxuICAgICAgICBpZiAoIWRyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcC5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvbW9ub2thaVwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IGF0b2IoX2Njc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2NzcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcC5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJiZC1kZXRhY2hlZC1jc3MtZWRpdG9yXCIsIGlkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtZWRpdG9yXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1pbm5lcnBhbmVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogc2VsZi5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImF0dGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soaWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhdHRhY2hcIjpcclxuICAgICAgICAgICAgICAgIGlmIChET00ucXVlcnkoXCIjZWRpdG9yLWRldGFjaGVkXCIpKSBzZWxmLnByb3BzLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYucm9vdCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJvb3QucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBidG9hKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSkpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJERXJyb3JCb3VuZGFyeSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICB0aGlzLnN0YXRlID0ge2hhc0Vycm9yOiBmYWxzZX07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goKSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2hhc0Vycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInJlYWN0LWVycm9yXCJ9LCBcIkNvbXBvbmVudCBFcnJvclwiKTsgIFxyXG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjsgXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCREVycm9yQm91bmRhcnkucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsgIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25BcnJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xMiA5LjI5TDEyIDEzLjE3bDMuODgtMy44OGMuMzktLjM5IDEuMDItLjM5IDEuNDEgMCAuMzkuMzkuMzkgMS4wMiAwIDEuNDFsLTQuNTkgNC41OWMtLjM5LjM5LTEuMDIuMzktMS40MSAwTDYuNyAxMC43Yy0uMzktLjM5LS4zOS0xLjAyIDAtMS40MS4zOS0uMzggMS4wMy0uMzkgMS40MiAwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjRkZGRkZGXCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIgLz5cclxuICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59Iiwiey8qIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIiB3aWR0aD1cIjE4cHhcIiBoZWlnaHQ9XCIxOHB4XCI+XHJcbiAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxyXG48L3N2Zz4gKi99XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGlzdG9yeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE4cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIiNGRkZGRkZcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cIiNGRkZGRkZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiXHJcbmltcG9ydCBTZWxlY3QgZnJvbSBcIi4vc2VsZWN0XCI7XHJcbmltcG9ydCB0aW1lc3RhbXBSZW5kZXIgZnJvbSBcIi4vdGltZXN0YW1wUmVuZGVyXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcblxyXG4vKipcclxuICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdFwiKX1cclxuICovXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QcmVzZW5jZVNldHRpbmdzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpIHx8IGRlZmF1bHRSUEMsXHJcbiAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJldmlldyA9IG51bGxcclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtJbnB1dFRleHR9IHNldHRpbmcgXHJcbiAgICAgKi9cclxuICAgIG9uQ2hhbmdlKHNldHRpbmcsIHZhbHVlKXtcclxuICAgICAgICBsZXQgZGVmYXVsdFNldHRpbmcgPSBSUENQcm9wcy5maW5kKGUgPT4gZS5pZCA9PT0gc2V0dGluZy5wcm9wcy5pZClcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIHRoaXMuc3RhdGUuZGF0YSwge1xyXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRTZXR0aW5nLmlkXTogISF2YWx1ZSA/IHZhbHVlIDogbnVsbFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLnN0YXRlLmFzc2V0c1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYoc2V0dGluZy5wcm9wcy5pZCA9PT0gXCJhcHBsaWNhdGlvbl9pZFwiKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgICAgICB0aGlzLnByZXZpZXcuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIEN1c3RvbVJpY2hQcmVzZW5jZS5zZXQoc2V0dGluZ3NSUEMpXHJcbiAgICB9XHJcblxyXG4gICAgZmV0Y2hBc3NldHMoKXtcclxuICAgICAgICBpZih0aGlzLmlzZmV0Y2hpbmcgPT09IHRydWUpe1xyXG4gICAgICAgICAgICBsZXQgYXBwID0gdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkICE9PSBhcHApe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgICAgIH0sIDUwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN0YXRlLmRhdGEsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmZldGNoQXNzZXRzKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZClcclxuICAgICAgICAudGhlbihhc3NldHMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogT2JqZWN0LmtleXMoYXNzZXRzKS5tYXAoayA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFzc2V0ID0gYXNzZXRzW2tdXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhc3NldC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhc3NldC50eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcmV2aWV3KGRhdGEpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn1cclxuICAgICAgICAgICAgc3R5bGU9e3twYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc0dyb3VwIHRpdGxlPVwiUmljaFByZXNlbmNlIFNldHRpbmdzXCIgc2V0dGluZ3M9e3RoaXMucHJvcHMuc2V0dGluZ3N9IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfS8+XHJcbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlJpY2hQcmVzZW5jZVwiLz5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgey8qKiBvcHRpb25zICovfVxyXG4gICAgICAgICAgICAgICAgICAgIHtSUENQcm9wcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUudHlwZSA9PT0gXCJ0ZXh0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dFRleHQgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IFs8SW5wdXROdW1iZXIgc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9Lz5dLypcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheS51bnNoaWZ0KDxEaXNjb3JkQnV0dG9uIHRpdGxlPVwiQ29weSBDdXJyZW50IFRpbWVzdGFtcFwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0gLz4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ki9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwiY2hvaWNlXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoW1wiYXNzZXRzLnNtYWxsXCIsIFwiYXNzZXRzLmxhcmdlXCJdLmluY2x1ZGVzKGUuaWQpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0Q2hvaWNlIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfSBjaG9pY2VzPXtbe3ZhbHVlOiBcIm5vbmVcIiwgbGFiZWw6IFwiTm8gYXNzZXRzXCJ9XS5jb25jYXQodGhpcy5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKX0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiVW5rbm93biBjaG9pY2UuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUHJldmlld1wiLz5cclxuICAgICAgICAgICAgICAgICAgICB7LyoqIHByZXZpZXcgKi99XHJcbiAgICAgICAgICAgICAgICAgICAgPFJwY1ByZXZpZXcgc2V0dGluZ3M9e3RoaXN9Lz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9e3dpbmRvdy5vaGdvZG9oZnVja30+XHJcbiAgICAgICAgICAgICAgICAgICAgT2ggZ29kIE9oIGZ1Y2tcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbmNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGtZYTdycHNfZzRcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgICAgICBTZWUgPyBJIHB1bGxlZCBhIGxpdGxlIHNuZWFreSBvbiB5YVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcbmNvbnN0IFJQQ1Byb3BzID0gW1xyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkFwcGxpY2F0aW9uIElEXCIsXHJcbiAgICAgICAgaWQ6IFwiYXBwbGljYXRpb25faWRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIk5hbWVcIixcclxuICAgICAgICBpZDogXCJuYW1lXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiRGV0YWlsc1wiLFxyXG4gICAgICAgIGlkOiBcImRldGFpbHNcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTdGF0ZVwiLFxyXG4gICAgICAgIGlkOiBcInN0YXRlXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiVGltZXN0YW1wIFN0YXJ0XCIsXHJcbiAgICAgICAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiTGFyZ2VBc3NldFwiLFxyXG4gICAgICAgIGlkOiBcImFzc2V0cy5sYXJnZVwiLFxyXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU21hbGxBc3NldFwiLFxyXG4gICAgICAgIGlkOiBcImFzc2V0cy5zbWFsbFwiLFxyXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcclxuICAgIH0sXHJcbl1cclxuXHJcbmNsYXNzIElucHV0VGV4dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgbGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBsZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxuICAgICAgICBsZXQgZmxleE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBpbnB1dE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmlucHV0TWluaSlbMF1cclxuICAgICAgICBsZXQgc2l6ZU1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17aW5wdXRNb2R1bGUuaW5wdXRXcmFwcGVyfT5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9e2Ake2lucHV0TW9kdWxlLmlucHV0RGVmYXVsdH0gJHtzaXplTW9kdWxlMi5zaXplMTZ9YH0gbmFtZT1cInN0YXRlXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlwiIG1heGxlbmd0aD1cIjk5OVwiIHZhbHVlPXt0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXX0gb25DaGFuZ2U9eyhldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgZXYudGFyZ2V0LnZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIH19IC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake0JETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXS5kaXZpZGVyfSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXS5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIElucHV0TnVtYmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCByb3dNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxuICAgICAgICBsZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG4gICAgICAgIGxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcbiAgICAgICAgbGV0IGlucHV0TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXVxyXG4gICAgICAgIGxldCBzaXplTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUxNiAmJiBlLnNpemUyMClbMF1cclxuICAgICAgICBsZXQgZXVoTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdXHJcblxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2lucHV0TW9kdWxlLmlucHV0V3JhcHBlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPXtgJHtpbnB1dE1vZHVsZS5pbnB1dERlZmF1bHR9ICR7c2l6ZU1vZHVsZTIuc2l6ZTE2fWB9IG5hbWU9XCJzdGF0ZVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJcIiBtYXhsZW5ndGg9XCI5OTlcIiB2YWx1ZT17dGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF19IG9uQ2hhbmdlPXsoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1ZhbHVlID0gZXYudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1teXFxkXSsvZywgXCJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV3VmFsdWUgIT09IGV2LnRhcmdldC52YWx1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi50YXJnZXQudmFsdWUgPSBuZXdWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCBuZXdWYWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB9fSAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7c2V0dGluZy5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIgPyBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5idXR0b25XcmFwcGVyKVswXS5idXR0b25XcmFwcGVyfT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz17YCR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9ICR7ZXVoTW9kdWxlMS5idXR0b259ICR7ZXVoTW9kdWxlMS5sb29rRmlsbGVkfSAke2V1aE1vZHVsZTEuY29sb3JCcmFuZH0gJHtldWhNb2R1bGUxLnNpemVTbWFsbH0gJHtldWhNb2R1bGUxLmdyb3d9YH0gc3R5bGU9e3tmbGV4OiBcIjAgMSBhdXRvXCJ9fSBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH19PlxyXG5cdCAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17ZXVoTW9kdWxlMS5jb250ZW50c30+Q29weSBjdXJyZW50IHRpbWVzdGFtcDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake0JETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXS5kaXZpZGVyfSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXS5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIG9uQ2hhbmdlKGRhdGEpe1xyXG4gICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCBkYXRhLnZhbHVlID09PSBcIm5vbmVcIiA/IG51bGwgOiBkYXRhLnZhbHVlLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIGxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG4gICAgICAgIGxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbiAgICAgICAgbGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuICAgICAgICBcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMucHJvcHMuY2hvaWNlc1xyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPFNlbGVjdCB2YWx1ZT17XCJhc3NldC1cIit0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSB8fCBcIm5vbmVcIn0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gb3B0aW9ucz17b3B0aW9uc30vPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7QkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlciAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLmRpdmlkZXJ9ICR7QkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlckRlZmF1bHQpWzBdLmRpdmlkZXJEZWZhdWx0fWB9PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuICAgICAgICBsZXQgZXVoTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yVHJhbnNwYXJlbnQpWzBdXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLmJ1dHRvbldyYXBwZXIpWzBdLmJ1dHRvbldyYXBwZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPXtgJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH0gJHtldWhNb2R1bGUxLmJ1dHRvbn0gJHtldWhNb2R1bGUxLmxvb2tGaWxsZWR9ICR7ZXVoTW9kdWxlMS5jb2xvckJyYW5kfSAke2V1aE1vZHVsZTEuc2l6ZVNtYWxsfSAke2V1aE1vZHVsZTEuZ3Jvd31gfSBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19IG9uQ2xpY2s9e3RoaXMub25DbGlja30+XHJcblx0ICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtldWhNb2R1bGUxLmNvbnRlbnRzfT57dGhpcy5wcm9wcy50aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMgPSB7fSl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBcInByb2ZpbGVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRhYnMgPSBbXVxyXG5cclxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGFiKHRhYil7XHJcbiAgICAgICAgbGV0IGFuY2llbnRUYWIgPSB0aGlzLnN0YXRlLmFjdGl2ZVxyXG4gICAgICAgIGlmKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZClyZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc2V0QWN0aXZlKGZhbHNlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGFiLnNldEFjdGl2ZSh0cnVlKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHByZXZpZXcgPSBuZXcgdGhpcy5wcmV2aWV3KHtcclxuICAgICAgICAgICAgcHJldmlldzogdGhpc1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnN0YXRlLnJwYylcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYm5hdlwiIHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiRnVsbCBQcm9maWxlXCIgaWQ9XCJwcm9maWxlXCIvPlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7cHJldmlldy5yZW5kZXIoKX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9ICAgXHJcblxyXG4gICAgaXNBY3RpdmUodGFiKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYlxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcmV2aWV3KCl7XHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUgPT09IFwicHJvZmlsZVwiKXJldHVybiBQcm9maWxlXHJcbiAgICAgICAgcmV0dXJuIFBvcG91dFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IHByb3BzLnByZXZpZXcuaXNBY3RpdmUocHJvcHMuaWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BzLnByZXZpZXcudGFicy5wdXNoKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0QWN0aXZlKGlzQWN0aXZlKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiAhIWlzQWN0aXZlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gYGxjLW5hdkl0ZW1gXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUpe1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtQWN0aXZlYFxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wcmV2aWV3LmNoYW5nZVRhYih0aGlzKVxyXG4gICAgICAgIH19PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFBvcG91dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBwcm90aXBNb2R1bGUxLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudXNlclBvcG91dClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmJvdClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFjdGl2aXR5VXNlclBvcG91dClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm11dGVkICYmIGUud3JhcHBlciAmJiBlLmJhc2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50aGVtZUdob3N0SGFpcmxpbmVDaGFubmVscylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucHJvICYmIGUuaW5saW5lKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzKVswXS5kZWZhdWx0Lk1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIHRpbWVzdGFtcENsYXNzID0gdGltZXN0YW1wQ2xhc3MgfHwgYWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcFxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJQb3BvdXR9IHJvbGU9XCJkaWFsb2dcIiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJQbGF5aW5nfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlDZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRvcH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJXcmFwcGVyTm9ybWFsfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthdmF0YXJNb2R1bGUxfSByb2xlPVwiaW1nXCIgc3R5bGU9e3t3aWR0aDogXCI4MHB4XCIsIGhlaWdodDogXCI4MHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOTJcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgOTIgODBcIiBjbGFzcz17YCR7YXZhdGFyTW9kdWxlMS5tYXNrfSAke2F2YXRhck1vZHVsZTEuc3ZnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgbWFzaz1cInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPXthdmF0YXJVUkx9IGFsdD1cIiBcIiBjbGFzcz17YXZhdGFyTW9kdWxlMS5hdmF0YXJ9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXR1cyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJIaW50fSB2aWV3Qm94PVwiMCAwIDgwIDgwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhckhpbnRJbm5lcn0+e01lc3NhZ2VzLlZJRVdfUFJPRklMRX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlclRleHR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5oZWFkZXJUYWdOb05pY2tuYW1lfSAke25hbWVUYWdNb2R1bGUxLm5hbWVUYWd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtgJHtuYW1lVGFnTW9kdWxlMS51c2VybmFtZX0gJHtyb290TW9kdWxlMS5oZWFkZXJUYWdVc2VybmFtZU5vTmlja25hbWV9YH0+e3VzZXIudXNlcm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4je3VzZXIuZGlzY3JpbWluYXRvcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5VXNlclBvcG91dH0gJHtyb290TW9kdWxlMS5hY3Rpdml0eX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfT57TWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlOR308L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYm9keU5vcm1hbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVtcImFzc2V0cy5sYXJnZVwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMubGFyZ2VcIl0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2B9IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXR9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IDogXCJcIn1gfSAvPilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5zbWFsbFwiXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYH0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlVXNlclBvcG91dH0gLz4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1VzZXJQb3BvdXR9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLm5hbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLm5hbWVOb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTR9YH0gdGl0bGU9e2RhdGEubmFtZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZX0+e2RhdGEubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuZGV0YWlscylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiB0aXRsZT17ZGF0YS50aXRsZX0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5kZXRhaWxzfT57ZGF0YS5kZXRhaWxzfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLnN0YXRlKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuc3RhdGV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9e2RhdGEuc3RhdGV9PntkYXRhLnN0YXRlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQodGltZUNvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7cm9vdE1vZHVsZTEuYm9keX0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3RIYWlybGluZX0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcn0gJHtyb290TW9kdWxlMS5ib2R5SW5uZXJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmJvZHlUaXRsZX0+e01lc3NhZ2VzLk5PVEV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake25vdGVNb2R1bGUxLm5vdGV9ICR7cm9vdE1vZHVsZTEubm90ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj17TWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUn0gbWF4bGVuZ3RoPVwiMjU2XCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBjbGFzcz17QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF0uc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gc3R5bGU9e3toZWlnaHQ6IFwiMzZweFwifX0gZGlzYWJsZWQ+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmZvb3Rlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEucHJvdGlwfSAke3Byb3RpcE1vZHVsZTEuaW5saW5lfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9e2Ake3Byb3RpcE1vZHVsZTEucHJvfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWB9IHN0eWxlPXt7Y29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIn19PntNZXNzYWdlcy5QSU5ORURfTUVTU0FHRVNfUFJPX1RJUH08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtjb2xvck1vZHVsZTEuY29sb3JTdGFuZGFyZH0gJHtzaXplTW9kdWxlMS5zaXplMTR9ICR7cHJvdGlwTW9kdWxlMS50aXB9YH0+e01lc3NhZ2VzLkNPTlRFWFRfTUVOVV9ISU5UfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgU3RhdHVzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzdGF0dXMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRQcmVzZW5jZSlbMF0uZGVmYXVsdC5nZXRQcmVzZW5jZSgpLnN0YXR1c1xyXG4gICAgICAgIGlmKHN0YXR1cyA9PT0gXCJpbnZpc2libGVcIilzdGF0dXMgPSBcIm9mZmxpbmVcIlxyXG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXS5wb2ludGVyRXZlbnRzXHJcbiAgICAgICAgcmV0dXJuIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHg9XCI2MFwiIHk9XCI2MFwiIGZpbGw9XCIjZmZmZmZmXCIgbWFzaz17YHVybCgjc3ZnLW1hc2stc3RhdHVzLSR7c3RhdHVzfSlgfSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+PC9yZWN0PlxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgdGltZXN0YW1wQ2xhc3MgPSBcIlwiXHJcblxyXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmdldEF2YXRhclVSTCh1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikgPyBcImdpZlwiIDogXCJwbmdcIilcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBmbGV4TW9kdWxlMSxcclxuICAgICAgICAgICAgc3R5bGluZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIHJvb3RNb2R1bGUxLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxLFxyXG4gICAgICAgICAgICBuYW1lVGFnTW9kdWxlMSxcclxuICAgICAgICAgICAgYWN0aXZpdHlNb2R1bGUxLFxyXG4gICAgICAgICAgICB0ZXh0TW9kdWxlMSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNjcm9sbGVyTW9kdWxlMSxcclxuICAgICAgICAgICAgbm90ZU1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb2ludGVyRXZlbnRzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlQcm9maWxlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyRmFkZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm5vdGUgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXNcclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXBcclxuXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7c3R5bGluZ01vZHVsZTEudmVydGljYWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduU3RyZXRjaH0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEucm9vdH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnRvcFNlY3Rpb25QbGF5aW5nfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmF2YXRhcn0gJHthdmF0YXJNb2R1bGUxLndyYXBwZXJ9YH0gcm9sZT1cImltZ1wiIHN0eWxlPXt7d2lkdGg6IFwiODBweFwiLCBoZWlnaHQ6IFwiODBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjkyXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDkyIDgwXCIgY2xhc3M9e2Ake2F2YXRhck1vZHVsZTEubWFza30gJHthdmF0YXJNb2R1bGUxLnN2Z31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17YXZhdGFyVVJMfSBhbHQ9XCIgXCIgY2xhc3M9e2F2YXRhck1vZHVsZTEuYXZhdGFyfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdGF0dXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEuaGVhZGVySW5mb31gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5uYW1lVGFnfSAke25hbWVUYWdNb2R1bGUxLm5hbWVUYWd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtgJHtyb290TW9kdWxlMS51c2VybmFtZX0gJHtyb290TW9kdWxlMS51c2VybmFtZX1gfT57dXNlci51c2VybmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtyb290TW9kdWxlMS5kaXNjcmltaW5hdG9yfT4je3VzZXIuZGlzY3JpbWluYXRvcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtmbGV4TW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnblN0cmV0Y2h9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZXN9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJhZGdlcyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJGaWxsfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eVByb2ZpbGV9ICR7cm9vdE1vZHVsZTEuYWN0aXZpdHl9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYm9keU5vcm1hbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFbXCJhc3NldHMubGFyZ2VcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5sYXJnZVwiXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLmxhcmdlXCJdfS5wbmdgfSBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlSW1hZ2VQcm9maWxlfSAke2RhdGFbXCJhc3NldHMuc21hbGxcIl0gPyBhY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VNYXNrUHJvZmlsZSA6IFwiXCJ9YH0gLz4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLnNtYWxsXCJdKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMuc21hbGxcIl19LnBuZ2B9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYXNzZXRzU21hbGxJbWFnZVByb2ZpbGV9IC8+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHN9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpbWFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNQcm9maWxlfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEubmFtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8aDMgY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5uYW1lTm9ybWFsfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTE0fWB9IHRpdGxlPXtkYXRhLm5hbWV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZX0+e2RhdGEubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5kZXRhaWxzKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgdGl0bGU9e2RhdGEudGl0bGV9IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuZGV0YWlsc30+e2RhdGEuZGV0YWlsc308L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YS5zdGF0ZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuc3RhdGV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT17ZGF0YS5zdGF0ZX0+e2RhdGEuc3RhdGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnRpbWVzdGFtcH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KHRpbWVDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5ib2R5fT5cclxuXHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGV9YH0+XHJcblx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJ9PlxyXG5cdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb259PlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJJbmZvU2VjdGlvbkhlYWRlcn0+e01lc3NhZ2VzLk5PVEV9PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEubm90ZX0gJHtub3RlTW9kdWxlMS5ub3RlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPXtNZXNzYWdlcy5OT1RFX1BMQUNFSE9MREVSfSBtYXhsZW5ndGg9XCIyNTZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9e0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdLnNjcm9sbGJhckdob3N0SGFpcmxpbmV9IHN0eWxlPXt7aGVpZ2h0OiBcIjQwcHhcIn19IGRpc2FibGVkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XHJcblx0XHRcdFx0XHRcdFx0XHQgICAgPC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0ICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25uZWN0ZWRBY2NvdW50cyAvPlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYy0gXCI+PC9kaXY+XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb25uZWN0ZWRBY2NvdW50cyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgYWNjb3VudHMgPSBbXVxyXG4gICAgICAgIGxldCByb290TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdXHJcbiAgICAgICAgbGV0IEFjY291bnRNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0QWNjb3VudHMpWzBdLmRlZmF1bHRcclxuXHJcbiAgICAgICAgbGV0IGFjY3MgPSBBY2NvdW50TW9kdWxlMS5nZXRBY2NvdW50cygpLmZpbHRlcihlID0+IGUudmlzaWJpbGl0eSA9PT0gMSlcclxuICAgICAgICBmb3IobGV0IGFjYyBvZiBhY2NzKXtcclxuICAgICAgICAgICAgYWNjb3VudHMucHVzaCg8Q29ubmVjdGVkQWNjb3VudCBhY2M9e2FjY30gLz4pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihhY2NvdW50cy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb259PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudHN9PlxyXG4gICAgICAgICAgICAgICAgICAgIHthY2NvdW50c31cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIENvbm5lY3RlZEFjY291bnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgZmxvd2VyTW9kdWxlMSxcclxuICAgICAgICAgICAgYW5jaG9yTW9kdWxlMSxcclxuICAgICAgICAgICAgU29jaWFsQ29uc3RhbnRzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxleCAmJiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUudmVydGljYWwgJiYgZS5hbGlnblN0cmV0Y2ggJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZEJ0bilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvcFNlY3Rpb25TdHJlYW1pbmcpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYW5jaG9yKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0ICYmIGUuZGVmYXVsdC5tYXApWzBdLmRlZmF1bHRcclxuICAgICAgICBdXHJcbiAgICAgICAgbGV0IGFjYyA9IHRoaXMucHJvcHMuYWNjXHJcbiAgICAgICAgbGV0IGNvbnN0YW50c1NvY2lhbCA9IFNvY2lhbENvbnN0YW50cy5nZXQoYWNjLnR5cGUpXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke2ZsZXhNb2R1bGUxLmhvcml6b250YWx9ICR7c3R5bGluZ01vZHVsZTEuanVzdGlmeVN0YXJ0fSAke3N0eWxpbmdNb2R1bGUxLmFsaWduQ2VudGVyfSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50fWB9IHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgIDxpbWcgYWx0PXtgTG9nbyAke2NvbnN0YW50c1NvY2lhbC5uYW1lfWB9IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50SWNvbn0gc3JjPXtjb25zdGFudHNTb2NpYWwuaWNvbi5jb2xvciB8fCBjb25zdGFudHNTb2NpYWwuaWNvbi53aGl0ZSB8fCBjb25zdGFudHNTb2NpYWwuaWNvbi5ncmV5fSAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50TmFtZUlubmVyfT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnROYW1lfT57YWNjLm5hbWV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7YWNjLnZlcmlmaWVkID8gKDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2Zsb3dlck1vZHVsZTEuZmxvd2VyU3RhckNvbnRhaW5lcn0gJHtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50VmVyaWZpZWRJY29ufWB9IHN0eWxlPXt7d2lkdGg6IFwiMTZweFwiLCBoZWlnaHQ6IFwiMTZweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9e2Zsb3dlck1vZHVsZTEuZmxvd2VyU3Rhcn0gd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNS4yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiIzRmNTQ1Y1wiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Zsb3dlck1vZHVsZTEuY2hpbGRDb250YWluZXJ9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE1LjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIiBmaWxsPVwiI2ZmZmZmZlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj4pIDogbnVsbH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPXtgJHthbmNob3JNb2R1bGUxLmFuY2hvcn0gJHthbmNob3JNb2R1bGUxLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YH0gcmVsPVwibm9yZWZlcnJlciBub29wZW5lclwiIHRhcmdldD1cIl9ibGFua1wiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRPcGVuSWNvbn0gd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTEwIDVWM0g1LjM3NUM0LjA2NTE5IDMgMyA0LjA2NTE5IDMgNS4zNzVWMTguNjI1QzMgMTkuOTM2IDQuMDY1MTkgMjEgNS4zNzUgMjFIMTguNjI1QzE5LjkzNiAyMSAyMSAxOS45MzYgMjEgMTguNjI1VjE0SDE5VjE5SDVWNUgxMFpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMjEgMi45OTkwMkgxNFY0Ljk5OTAySDE3LjU4Nkw5LjI5Mjk3IDEzLjI5MkwxMC43MDcgMTQuNzA2TDE5IDYuNDEzMDJWOS45OTkwMkgyMVYyLjk5OTAyWlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBCYWRnZXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHVzZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG4gICAgICAgIGxldCBVc2VyRmxhZ3MgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5Vc2VyRmxhZ3MpWzBdLlVzZXJGbGFnc1xyXG4gICAgICAgIGxldCBiYWRnZXMgPSBbXVxyXG4gICAgICAgIGxldCBzZXJpYWxpemVkID0gW11cclxuXHJcbiAgICAgICAgZm9yKGxldCBmbGFnTmFtZSBpbiBVc2VyRmxhZ3Mpe1xyXG4gICAgICAgICAgICBpZih1c2VyLmhhc0ZsYWcoVXNlckZsYWdzW2ZsYWdOYW1lXSkpc2VyaWFsaXplZC5wdXNoKGZsYWdOYW1lKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yKGxldCBmbGFnTmFtZSBvZiBzZXJpYWxpemVkKXtcclxuICAgICAgICAgICAgbGV0IHNlYXJjaGFibGUgPSBgcHJvZmlsZUJhZGdlJHtmbGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCIgXCIpLnNwbGl0KFwiIFwiKS5tYXAoZSA9PiBlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSkuam9pbihcIlwiKX1gXHJcbiAgICAgICAgICAgIHNlYXJjaGFibGUgPSBzZWFyY2hhYmxlLnJlcGxhY2UoXCJIeXBlc3F1YWRPbmxpbmVcIiwgXCJIeXBlU3F1YWRPbmxpbmVcIilcclxuICAgICAgICAgICAgaWYoIXJvb3RNb2R1bGVbc2VhcmNoYWJsZV0pY29udGludWVcclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goPEJhZGdlIG5hbWU9e3NlYXJjaGFibGV9Lz4pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih1c2VyLmhhc1ByZW1pdW1TdWJzY3JpcHRpb24pe1xyXG4gICAgICAgICAgICBiYWRnZXMucHVzaCg8QmFkZ2UgbmFtZT1cInByb2ZpbGVCYWRnZVByZW1pdW1cIiAvPilcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm9vdE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnByb2ZpbGVCYWRnZVdyYXBwZXJ9PlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2V9ICR7cm9vdE1vZHVsZTFbdGhpcy5wcm9wcy5uYW1lXX1gfT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBUaW1lc3RhbXAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aW1lc3RhbXBDbGFzc30+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLm1lc3NhZ2V9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi8uLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfTGF5ZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLmtleXVwTGlzdGVuZXIgPSB0aGlzLmtleXVwTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBrZXl1cExpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMjcpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMucmVmcy5yb290LnBhcmVudE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMua2V5dXBMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoaXNOb2RlID0gRE9NLnF1ZXJ5KGAjJHt0aGlzLnByb3BzLmlkfWApO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MS4xIC0gMC4xICogcHJvZ3Jlc3N9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy5rZXl1cExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhpc05vZGUgPSBET00ucXVlcnkoYCMke3RoaXMucHJvcHMuaWR9YCk7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxLjEgLSAwLjEgKiAoMSAtIHByb2dyZXNzKX0pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gMSAtIHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTm9kZS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBsYXllciA9IERPTS5xdWVyeShcIi5wdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBsYXllci5jbGFzc0xpc3QucmVtb3ZlKFwicHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHswLjA3ICogcHJvZ3Jlc3MgKyAwLjkzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBET00ucXVlcnkoXCJbY2xhc3MqPVxcXCJsYXllci1cXFwiXVwiKTtcclxuICAgICAgICBsYXllci5jbGFzc0xpc3QuYWRkKFwicHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHswLjA3ICogKDEgLSBwcm9ncmVzcykgKyAwLjkzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSAxIC0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJsYXllciBiZC1sYXllciBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIsIGlkOiB0aGlzLnByb3BzLmlkLCByZWY6IFwicm9vdFwiLCBzdHlsZToge29wYWNpdHk6IDAsIHRyYW5zZm9ybTogXCJzY2FsZSgxLjEpIHRyYW5zbGF0ZVooMHB4KVwifX0sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi4vdG9vbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4uL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFRhYkJhclNlcGFyYXRvciBmcm9tIFwiLi4vdGFiQmFyU2VwYXJhdG9yXCI7XHJcbmltcG9ydCBUYWJCYXJIZWFkZXIgZnJvbSBcIi4uL3RhYkJhckhlYWRlclwiO1xyXG5pbXBvcnQgVGFiQmFySXRlbSBmcm9tIFwiLi4vdGFiQmFySXRlbVwiO1xyXG5cclxuaW1wb3J0IFNlcnZlckNhcmQgZnJvbSBcIi4vc2VydmVyQ2FyZFwiO1xyXG5pbXBvcnQgU2lkZWJhclZpZXcgZnJvbSBcIi4vc2lkZWJhclZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QdWJsaWNTZXJ2ZXJzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmNsb3NlID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlQ2F0ZWdvcnkgPSB0aGlzLmNoYW5nZUNhdGVnb3J5LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2ggPSB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoS2V5RG93biA9IHRoaXMuc2VhcmNoS2V5RG93bi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uID0gdGhpcy5jaGVja0Nvbm5lY3Rpb24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmpvaW4gPSB0aGlzLmpvaW4uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5HdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEd1aWxkc1wiXSk7XHJcbiAgICAgICAgdGhpcy5BdmF0YXJEZWZhdWx0cyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRVc2VyQXZhdGFyVVJMXCIsIFwiREVGQVVMVF9BVkFUQVJTXCJdKTtcclxuICAgICAgICB0aGlzLkludml0ZUFjdGlvbnMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTtcclxuICAgICAgICB0aGlzLlNvcnRlZEd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0U29ydGVkR3VpbGRzXCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgc2VydmVyczogW10sXHJcbiAgICAgICAgICAgIG5leHQ6IG51bGwsXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgIHN0YXRlOiAwLFxyXG4gICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wcm9wcy5yb290SWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2gocXVlcnksIGNsZWFyKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZmV0Y2goYCR7c2VsZi5lbmRQb2ludH0ke3F1ZXJ5fSR7cXVlcnkgPyBcIiZzY2hlbWE9bmV3XCIgOiBcIj9zY2hlbWE9bmV3XCJ9YCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiZ2V0XCJcclxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBhd2FpdCByZXMudGV4dCgpXHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHNlcnZlcnMgPSBkYXRhLnJlc3VsdHMucmVkdWNlKChhcnIsIHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VydmVyLmpvaW5lZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2VydmVyKTtcclxuICAgICAgICAgICAgICAgIC8vIGFyci5wdXNoKDxTZXJ2ZXJDYXJkIHNlcnZlcj17c2VydmVyfSBqb2luPXtzZWxmLmpvaW59Lz4pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICAgICAgfSwgW10pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgc2VydmVycyA9IHNlbGYuc3RhdGUuc2VydmVycy5jb25jYXQoc2VydmVycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3NlcnZlcnMudW5zaGlmdChzZWxmLmJkU2VydmVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGVuZCA9IGRhdGEuc2l6ZSArIGRhdGEuZnJvbTtcclxuICAgICAgICAgICAgZGF0YS5uZXh0ID0gYD9mcm9tPSR7ZW5kfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIGRhdGEubmV4dCArPSBgJnRlcm09JHtzZWxmLnN0YXRlLnRlcm19YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSkgZGF0YS5uZXh0ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZGF0YS50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS50b3RhbDtcclxuICAgICAgICAgICAgICAgIGRhdGEubmV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGBTaG93aW5nIDEtJHtlbmR9IG9mICR7ZGF0YS50b3RhbH0gcmVzdWx0cyBpbiAke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgdGl0bGUgKz0gYCBmb3IgJHtzZWxmLnN0YXRlLnRlcm19YDtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzOiBzZXJ2ZXJzLFxyXG4gICAgICAgICAgICAgICAgbmV4dDogZGF0YS5uZXh0XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNsZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yZWZzLnNidi5yZWZzLmNvbnRlbnRTY3JvbGxlci5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJGYWlsZWQgdG8gbG9hZCBzZXJ2ZXJzLiBDaGVjayBjb25zb2xlIGZvciBkZXRhaWxzXCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBqb2luKHNlcnZlckNhcmQpIHtcclxuICAgICAgICBpZiAoc2VydmVyQ2FyZC5wcm9wcy5waW5uZWQpIHJldHVybiB0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlKHNlcnZlckNhcmQucHJvcHMuaW52aXRlX2NvZGUpO1xyXG5cclxuICAgICAgICBhd2FpdCBmZXRjaChgJHt0aGlzLmpvaW5FbmRQb2ludH0vJHtzZXJ2ZXJDYXJkLnByb3BzLnNlcnZlci5pZGVudGlmaWVyfWAse1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcclxuICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXJ2ZXJDYXJkLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25uZWN0KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxmLndpbmRvd09wdGlvbnM7XHJcbiAgICAgICAgb3B0aW9ucy54ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWCArIHdpbmRvdy5pbm5lcldpZHRoIC8gMiAtIG9wdGlvbnMud2lkdGggLyAyKTtcclxuICAgICAgICBvcHRpb25zLnkgPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5ZICsgd2luZG93LmlubmVySGVpZ2h0IC8gMiAtIG9wdGlvbnMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdyA9IG5ldyAod2luZG93LnJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuQnJvd3NlcldpbmRvdykob3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgdXJsID0gXCJodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2Nvbm5lY3Q/c2NvcGVzPWd1aWxkcy5qb2luJnByZXZpb3VzVXJsPWh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy53ZWJDb250ZW50cy5vbihcImRpZC1uYXZpZ2F0ZVwiLCAoZXZlbnQsIHVybCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXJsICE9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCIpIHJldHVybjtcclxuICAgICAgICAgICAgc2VsZi5qb2luV2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHNlbGYuY2hlY2tDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93LmxvYWRVUkwodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgd2luZG93T3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3aWR0aDogNTAwLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDU1MCxcclxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMyODJiMzBcIixcclxuICAgICAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtaW5pbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsd2F5c09uVG9wOiB0cnVlLFxyXG4gICAgICAgICAgICBmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNlbnRlcjogZmFsc2UsXHJcbiAgICAgICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XHJcbiAgICAgICAgICAgICAgICBub2RlSW50ZWdyYXRpb246IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBiZFNlcnZlcigpIHtcclxuICAgICAgICBjb25zdCBzZXJ2ZXIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQmV0dGVyRGlzY29yZFwiLFxyXG4gICAgICAgICAgICBvbmxpbmU6IFwiNzUwMCtcIixcclxuICAgICAgICAgICAgbWVtYmVyczogXCIyMDAwMCtcIixcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBCZXR0ZXJEaXNjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzg2MDA0NzQ0OTY2OTE0MDQ4LzI5MmU3ZjZiZmZmMmI3MWRmZDEzZTUwOGE4NTlhZWRkLndlYnBcIixcclxuICAgICAgICAgICAgbmF0aXZlam9pbjogdHJ1ZSxcclxuICAgICAgICAgICAgaW52aXRlX2NvZGU6IFwiMFRtZm81WmJPUkNScWJBZFwiLFxyXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHNlcnZlcjIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCIzMCtcIixcclxuICAgICAgICAgICAgbWVtYmVyczogXCI1MCtcIixcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBMaWdodGNvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vaWNvbnMvNzA1OTA4MzUwMjE4NjY2MTE3LzA1YTU2NTJmN2QxZDBhZTMyOGNhN2Q2ZTIzNTRhODJhLndlYnBcIixcclxuICAgICAgICAgICAgbmF0aXZlam9pbjogdHJ1ZSxcclxuICAgICAgICAgICAgaW52aXRlX2NvZGU6IFwiN2VGZmYyQVwiLFxyXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGd1aWxkTGlzdCA9IHRoaXMuU29ydGVkR3VpbGRTdG9yZS5nZXRGbGF0dGVuZWRHdWlsZElkcygpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlcjIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9zZWFyY2guZGlzY29yZHNlcnZlcnMuY29tXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGpvaW5FbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL2ouZGlzY29yZHNlcnZlcnMuY29tXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbm5lY3RFbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL2pvaW4uZGlzY29yZHNlcnZlcnMuY29tL2Nvbm5lY3RcIjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja0Nvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvYCx7XHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAwLFxyXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IGRhdGFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTaWRlYmFyVmlldywge3JlZjogXCJzYnZcIn0sIHRoaXMuY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNpZGViYXI6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5zaWRlYmFyXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5jb250ZW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRvb2xzOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29scywge2tleTogXCJwdFwiLCByZWY6IFwidG9vbHNcIiwgb25DbGljazogdGhpcy5jbG9zZX0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaWRlYmFyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2lkZWJhclwiLCBrZXk6IFwicHNcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXIgU0lERVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIiwgc3R5bGU6IHtmb250U2l6ZTogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIlB1YmxpYyBTZXJ2ZXJzXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJIZWFkZXIsIHt0ZXh0OiBcIkNhdGVnb3JpZXNcIn0pLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeUJ1dHRvbnMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckl0ZW0sIHtpZDogaW5kZXgsIG9uQ2xpY2s6IHRoaXMuY2hhbmdlQ2F0ZWdvcnksIGtleTogaW5kZXgsIHRleHQ6IHZhbHVlLCBzZWxlY3RlZDogdGhpcy5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5ID09PSBpbmRleH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWFyY2hJbnB1dCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0taXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGV4dC1pbnB1dCBmbGV4LXZlcnRpY2FsXCIsIHN0eWxlOiB7d2lkdGg6IFwiMTcycHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtyZWY6IFwic2VhcmNoaW5wdXRcIiwgb25LZXlEb3duOiB0aGlzLnNlYXJjaEtleURvd24sIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJ0ZXh0XCIsIGNsYXNzTmFtZTogXCJpbnB1dCBkZWZhdWx0XCIsIHBsYWNlaG9sZGVyOiBcIlNlYXJjaC4uLlwiLCBtYXhMZW5ndGg6IFwiNTBcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaEtleURvd24oZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcgfHwgZS53aGljaCAhPT0gMTMpIHJldHVybjtcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBlLnRhcmdldC52YWx1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBxdWVyeSA9IGA/dGVybT0ke2UudGFyZ2V0LnZhbHVlfWA7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSAhPT0gMCkge1xyXG4gICAgICAgICAgICBxdWVyeSArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlYXJjaChxdWVyeSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhdGVnb3J5QnV0dG9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1wiQWxsXCIsIFwiRlBTIEdhbWVzXCIsIFwiTU1PIEdhbWVzXCIsIFwiU3RyYXRlZ3kgR2FtZXNcIiwgXCJNT0JBIEdhbWVzXCIsIFwiUlBHIEdhbWVzXCIsIFwiVGFibGV0b3AgR2FtZXNcIiwgXCJTYW5kYm94IEdhbWVzXCIsIFwiU2ltdWxhdGlvbiBHYW1lc1wiLCBcIk11c2ljXCIsIFwiQ29tbXVuaXR5XCIsIFwiTGFuZ3VhZ2VcIiwgXCJQcm9ncmFtbWluZ1wiLCBcIk90aGVyXCJdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUNhdGVnb3J5KGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIHNlbGYucmVmcy5zZWFyY2hpbnB1dC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIHRlcm06IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaWQgPT09IDApIHtcclxuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2goYD9jYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW2lkXX1gLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGVudCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmNvbm5lY3Rpb24uc3RhdGUgPT09IDEpIHJldHVybiBzZWxmLm5vdENvbm5lY3RlZDtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtyZWY6IFwiY29udGVudFwiLCBrZXk6IFwicGNcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHNlbGYuc3RhdGUudGl0bGV9KSxcclxuICAgICAgICAgICAgc2VsZi5iZFNlcnZlcixcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLm1hcCgoc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtrZXk6IHNlcnZlci5pZGVudGlmaWVyLCBzZXJ2ZXI6IHNlcnZlciwgam9pbjogc2VsZi5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5uZXh0ICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nKSByZXR1cm47c2VsZi5zZXRTdGF0ZSh7bG9hZGluZzogdHJ1ZX0pOyBzZWxmLnNlYXJjaChzZWxmLnN0YXRlLm5leHQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCIsIHN0eWxlOiB7d2lkdGg6IFwiMTAwJVwiLCBtYXJnaW5Ub3A6IFwiMTBweFwiLCBtYXJnaW5Cb3R0b206IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLmxvYWRpbmcgPyBcIkxvYWRpbmdcIiA6IFwiTG9hZCBNb3JlXCJcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSlcclxuICAgICAgICApXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90Q29ubmVjdGVkKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7IHRleHQ6IHNlbGYuc3RhdGUudGl0bGUgfSk7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7a2V5OiBcIm5jY1wiLCByZWY6IFwiY29udGVudFwiLCBjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgICAgIFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHNlbGYuY29ubmVjdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogXCIxOHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMTRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLCBzZWxmLmJkU2VydmVyXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImFcIixcclxuICAgICAgICAgICAgICAgIHtocmVmOiBcImh0dHBzOi8vZGlzY29yZHNlcnZlcnMuY29tXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICBcIkRpc2NvcmRzZXJ2ZXJzLmNvbVwiXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IHtjb25uZWN0aW9ufSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IDIpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAge3N0eWxlOiB7Y29sb3I6IFwiI2I5YmJiZVwiLCBmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBcIkNvbm5lY3RlZCBhczogXCIsXHJcbiAgICAgICAgICAgICAgICBgJHtjb25uZWN0aW9uLnVzZXIudXNlcm5hbWV9IyR7Y29ubmVjdGlvbi51c2VyLmRpc2NyaW1pbmF0b3J9YFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge3N0eWxlOiB7cGFkZGluZzogXCI1cHggMTBweCAwIDEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7d2lkdGg6IFwiMTAwJVwiLCBtaW5IZWlnaHQ6IFwiMjBweFwifSwgdHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCIsIG9uQ2xpY2s6IHNlbGYuY29ubmVjdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVjb25uZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG59XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlcnZlckNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCkgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgaW1hZ2VFcnJvcjogZmFsc2UsXHJcbiAgICAgICAgICAgIGpvaW5lZDogdGhpcy5wcm9wcy5ndWlsZExpc3QuaW5jbHVkZXModGhpcy5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcilcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7c2VydmVyfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgbGV0IGNhcmRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jYXJkICYmIGUuY2FyZFByaW1hcnkpWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbGV4Q2hpbGQgJiYgZS5faG9yaXpvbnRhbFJldmVyc2UpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub1dyYXAgJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLCAvLyBjYXJkUHJpbWFyeS0xSHYtdG9cclxuICAgICAgICAgICAge2NsYXNzTmFtZTogYCR7Y2FyZE1vZHVsZS5jYXJkfSAke2NhcmRNb2R1bGUuY2FyZFByaW1hcnl9ICR7QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0gYmQtc2VydmVyLWNhcmQke3NlcnZlci5waW5uZWQgPyBcIiBiZC1zZXJ2ZXItY2FyZC1waW5uZWRcIiA6IFwiXCJ9YH0sXHJcbiAgICAgICAgICAgIC8vIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIC8vIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAvLyB7IGNsYXNzTmFtZTogXCJmbGV4LTF4TVFnNSBmbGV4LTFPMUdLWSBob3Jpem9udGFsLTFhZTljaSBob3Jpem9udGFsLTJFRUVuWSBmbGV4LTFPMUdLWSBkaXJlY3Rpb25Sb3ctM3YzdGZHIGp1c3RpZnlTdGFydC0yeUlabzAgYWxpZ25TdHJldGNoLTFod3hNYSBub1dyYXAtM2p5bnY2XCIgfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7cmVmOiBcImltZ1wiLCBjbGFzc05hbWU6IFwiYmQtc2VydmVyLWltYWdlXCIsIHNyYzogc2VydmVyLmljb25VcmwsIG9uRXJyb3I6IHRoaXMuaGFuZGxlRXJyb3IuYmluZCh0aGlzKX0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5mbGV4Q2hpbGQrXCIgYmQtc2VydmVyLWNvbnRlbnRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXArXCIgYmQtc2VydmVyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW5hbWVcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImg1LTE4XzFuZCBkZWZhdWx0Q29sb3ItMV9halgwIG1hcmdpbi1yZXNldCBiZC1zZXJ2ZXItbWVtYmVyLWNvdW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm1lbWJlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBNZW1iZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXkgYmQtc2VydmVyLWRlc2NyaXB0aW9uLWNvbnRhaW5lclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXItMkZLRlBHIHNjcm9sbGVyIGJkLXNlcnZlci1kZXNjcmlwdGlvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJmbGV4LTF4TVFnNSBmbGV4LTFPMUdLWSBob3Jpem9udGFsLTFhZTljaSBob3Jpem9udGFsLTJFRUVuWSBkaXJlY3Rpb25Sb3ctM3YzdGZHIG5vV3JhcC0zanludjYgYmQtc2VydmVyLWZvb3RlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleENoaWxkLWZhb1ZXMyBiZC1zZXJ2ZXItdGFnc1wiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmNhdGVnb3JpZXMuam9pbihcIiwgXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gY29sb3JHcmVlbi0yOWlBS1lcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjM2FjMTVjXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSm9pbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmVycm9yICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gZGlzYWJsZWQtOWFGMnVnXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiI2MxM2EzYVwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlcnZlci5lcnJvciAmJiAhdGhpcy5zdGF0ZS5qb2luZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTlwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIn0sIG9uQ2xpY2s6ICgpID0+IHt0aGlzLmpvaW4oKTt9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSm9pblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC8vIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ltYWdlRXJyb3I6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBqb2luKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuam9pbih0aGlzKTtcclxuICAgICAgICAvL3RoaXMuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTY3JvbGxlciBmcm9tIFwiLi4vc2Nyb2xsZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TaWRlYmFyVmlldyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7c2lkZWJhciwgY29udGVudCwgdG9vbHN9ID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInN0YW5kYXJkU2lkZWJhclZpZXctM0YxSTdpIHVpLXN0YW5kYXJkLXNpZGViYXItdmlld1wifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2lkZWJhclJlZ2lvbi1WRlRVa04gc2lkZWJhci1yZWdpb25cIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtrZXk6IFwic2lkZWJhclNjcm9sbGVyXCIsIHJlZjogXCJzaWRlYmFyU2Nyb2xsZXJcIiwgc2lkZWJhcjogdHJ1ZSwgZmFkZTogc2lkZWJhci5mYWRlIHx8IHRydWUsIGRhcms6IHNpZGViYXIuZGFyayB8fCB0cnVlfSwgc2lkZWJhci5jb21wb25lbnQpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRSZWdpb24tM25EdVl5IGNvbnRlbnQtcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFRyYW5zaXRpb25XcmFwLTNocU9FVyBjb250ZW50LXRyYW5zaXRpb24td3JhcFwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJzY3JvbGxlcldyYXAtMmxKRWtkIGZpcmVmb3hGaXhTY3JvbGxGbGV4LWNuSTJpeCBjb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwLTNZWlhkbSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlci13cmFwIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0LTI4TVNuMCBzY3JvbGxlclRyYWNrLTFaSXBzdlwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXItMkZLRlBHIGZpcmVmb3hGaXhTY3JvbGxGbGV4LWNuSTJpeCBjb250ZW50UmVnaW9uU2Nyb2xsZXItMjZuYzFlIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyIHNjcm9sbGVyXCIsIHJlZjogXCJjb250ZW50U2Nyb2xsZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50Q29sdW1uLTJocklZSCBjb250ZW50Q29sdW1uRGVmYXVsdC0xVlFrR00gY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSwgY29udGVudC5jb21wb25lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHMuY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19SZWxvYWRJY29uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XHJcbiAgICAgICAgICAgICAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxyXG4gICAgICAgICAgICAgICAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcclxuICAgICAgICAgICAgICAgIGZpbGw6IFwiI2RjZGRkZVwiLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLXJlbG9hZCBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogdGhpcy5wcm9wcy5vbkNsaWNrLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHt3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiLCBoZWlnaHQ6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIn1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6XCJ9KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDogXCJub25lXCIsIGQ6IFwiTTAgMGgyNHYyNEgwelwifSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TY3JvbGxlciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICAvL3Njcm9sbGVyV3JhcC0ybEpFa2Qgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3RIYWlybGluZS1EQkQtMmQgc2Nyb2xsZXJGYWRlLTFJanc1eVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlckhvcml6b250YWwpWzBdXHJcbiAgICAgICAgbGV0IHNjcm9sbGVyTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpZGViYXJSZWdpb25TY3JvbGxlcilbMF1cclxuICAgICAgICBsZXQgd3JhcHBlckNsYXNzID0gYCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3RIYWlybGluZX0ke3RoaXMucHJvcHMuZmFkZSA/IFwiIFwiK3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGUgOiBcIlwifWA7XHJcbiAgICAgICAgbGV0IHNjcm9sbGVyQ2xhc3MgPSBzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXIrXCIgc2Nyb2xsZXJcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2lkZWJhcikgc2Nyb2xsZXJDbGFzcyArPSBgICR7c2Nyb2xsZXJNb2R1bGUyLnNpZGViYXJSZWdpb25TY3JvbGxlcn0gc2lkZWJhci1yZWdpb24tc2Nyb2xsZXJgXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuY29udGVudENvbHVtbikge1xyXG4gICAgICAgICAgICBzY3JvbGxlckNsYXNzICs9IFwiIFwiK3Njcm9sbGVyTW9kdWxlMi5jb250ZW50UmVnaW9uU2Nyb2xsZXIrXCIgY29udGVudC1yZWdpb24tc2Nyb2xsZXJcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1Y2sgKi9cclxuICAgICAgICAgICAgd3JhcHBlckNsYXNzID0gYCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcH0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCAgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3R9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVHJhY2t9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qge2NoaWxkcmVufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJzY3JvbGxlcndyYXBcIiwgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3N9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2tleTogXCJzY3JvbGxlclwiLCByZWY6IFwic2Nyb2xsZXJcIiwgY2xhc3NOYW1lOiBzY3JvbGxlckNsYXNzfSxcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLCB7Y2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5zZWN0aW9ucy5tYXAoc2VjdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzR3JvdXAsIE9iamVjdC5hc3NpZ24oe30sIHNlY3Rpb24sIHtvbkNoYW5nZTogdGhpcy5wcm9wcy5vbkNoYW5nZX0pKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XHJcbiAqL1xyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3RcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBoYW5kbGVDaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm9uQ2hhbmdlID09IFwiZnVuY3Rpb25cIikgdGhpcy5wcm9wcy5vbkNoYW5nZSh2YWx1ZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICB9XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgbGV0IGZsZXggPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5XcmFwICYmIGUuZGVmYXVsdC5EaXJlY3Rpb24gJiYgZS5kZWZhdWx0LkNoaWxkKVswXS5kZWZhdWx0XHJcbiAgICAgICAgbGV0IG5hdGl2ZVNlbGVjdCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIlNlbGVjdFRlbXBXcmFwcGVyXCIpWzBdLmRlZmF1bHRcclxuICAgICAgICByZXR1cm4gKDxmbGV4IGRpcmVjdGlvbj17ZmxleC5EaXJlY3Rpb24uSE9SSVpPTlRBTH0gYWxpZ249e2ZsZXguQWxpZ24uQ0VOVEVSfT5cclxuICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KG5hdGl2ZVNlbGVjdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICB9KSl9XHJcbiAgICAgICAgICAgIDwvZmxleD4pLypcclxuICAgICAgICByZXR1cm4gQkRGREIuUmVhY3RVdGlscy5jcmVhdGVFbGVtZW50KEludGVybmFsQ29tcG9uZW50cy5MaWJyYXJ5Q29tcG9uZW50cy5GbGV4LCB7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogQkRGREIuZGlzQ04uc2VsZWN0d3JhcHBlcixcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiBJbnRlcm5hbENvbXBvbmVudHMuTGlicmFyeUNvbXBvbmVudHMuRmxleC5EaXJlY3Rpb24uSE9SSVpPTlRBTCxcclxuICAgICAgICAgICAgYWxpZ246IEludGVybmFsQ29tcG9uZW50cy5MaWJyYXJ5Q29tcG9uZW50cy5GbGV4LkFsaWduLkNFTlRFUixcclxuICAgICAgICAgICAgY2hpbGRyZW46IEJERkRCLlJlYWN0VXRpbHMuY3JlYXRlRWxlbWVudChJbnRlcm5hbENvbXBvbmVudHMuTmF0aXZlU3ViQ29tcG9uZW50cy5TZWxlY3QsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH0pOyovXHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vc3dpdGNoXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NHcm91cCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7dGl0bGUsIHNldHRpbmdzLCBidXR0b259ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBjb25zdCBidXR0b25Db21wb25lbnQgPSBidXR0b24gPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge2tleTogXCJ0aXRsZS1idXR0b25cIiwgY2xhc3NOYW1lOiBcImJkLXBmYnRuXCIsIG9uQ2xpY2s6IGJ1dHRvbi5vbkNsaWNrfSwgYnV0dG9uLnRpdGxlKSA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHRpdGxlfSksXHJcbiAgICAgICAgICAgICAgICBidXR0b25Db21wb25lbnQsXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXSwgb25DaGFuZ2U6IChpZCwgY2hlY2tlZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcclxuICAgICAgICAgICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgICAgICAgICB9KV07XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc1BhbmVsIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtzZXR0aW5nc30gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiB0aGlzLnByb3BzLnRpdGxlfSksXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuYnV0dG9uICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7a2V5OiBcInRpdGxlLWJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYmQtcGZidG5cIiwgb25DbGljazogdGhpcy5wcm9wcy5idXR0b24ub25DbGlja30sIHRoaXMucHJvcHMuYnV0dG9uLnRpdGxlKSxcclxuICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXSwgb25DaGFuZ2U6IChpZCwgY2hlY2tlZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcclxuICAgICAgICAgICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcbi8vaDItMmdXRS1vIHRpdGxlLTNzWldZUSBzaXplMTYtMTRjR3o1IGhlaWdodDIwLW1PMmVJTiB3ZWlnaHRTZW1pQm9sZC1OSmV4emkgZGEtaDIgZGEtdGl0bGUgZGEtc2l6ZTE2IGRhLWhlaWdodDIwIGRhLXdlaWdodFNlbWlCb2xkIGRlZmF1bHRDb2xvci0xX2FqWDAgZGEtZGVmYXVsdENvbG9yIG1hcmdpblRvcDYwLTNQR2J0SyBkYS1tYXJnaW5Ub3A2MCBtYXJnaW5Cb3R0b20yMC0zMnFJRDcgZGEtbWFyZ2luQm90dG9tMjBcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMCBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF0ubWFyZ2luVG9wNjB9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4vdGFiQmFyU2VwYXJhdG9yXCI7XHJcbmltcG9ydCBUYWJCYXJIZWFkZXIgZnJvbSBcIi4vdGFiQmFySGVhZGVyXCI7XHJcbmltcG9ydCBUYWJCYXJJdGVtIGZyb20gXCIuL3RhYkJhckl0ZW1cIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TaWRlQmFyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2kgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2NsYXNzKj1zaWRlLV0gPiBbY2xhc3MqPXNlbGVjdGVkXVwiKTtcclxuICAgICAgICBpZiAoc2kpIHRoaXMuc2NuID0gc2kuY2xhc3NOYW1lO1xyXG4gICAgICAgIGNvbnN0IG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltjbGFzcyo9c2lkZS1dID4gW2NsYXNzKj0naXRlbS0nXTpub3QoW2NsYXNzKj1zZWxlY3RlZF0pXCIpO1xyXG4gICAgICAgIGlmIChucykgdGhpcy5uc2NuID0gbnMuY2xhc3NOYW1lO1xyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzKj0nc2lkZS0nXSA+IFtjbGFzcyo9J2l0ZW0tJ11cIik7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRhYnMpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IG51bGxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkID0gdGhpcy5zZXRTZWxlY3RlZC5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBzaWRlYmFycy5wdXNoKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiBudWxsLFxyXG4gICAgICAgICAgICBpdGVtczogc2VsZi5wcm9wcy5pdGVtc1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb24gPSBzZWxmLnByb3BzLml0ZW1zLmZpbmQoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnNlbGVjdGVkO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbml0aWFsU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VsZWN0ZWQgPSBpbml0aWFsU2VsZWN0aW9uLmlkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3Qge2hlYWRlclRleHR9ID0gc2VsZi5wcm9wcztcclxuICAgICAgICBjb25zdCB7aXRlbXMsIHNlbGVjdGVkfSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJIZWFkZXIsIHt0ZXh0OiBoZWFkZXJUZXh0LCBidXR0b246IHRoaXMucHJvcHMuaGVhZGVyQnV0dG9ufSksXHJcbiAgICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHtpZCwgdGV4dH0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7a2V5OiBpZCwgc2VsZWN0ZWQ6IHNlbGVjdGVkID09PSBpZCwgdGV4dDogdGV4dCwgaWQ6IGlkLCBvbkNsaWNrOiBzZWxmLm9uQ2xpY2t9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGVkKGUpIHtcclxuICAgICAgICBlLnRhcmdldC5jbGFzc05hbWUgPSB0aGlzLnNjbjtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2kgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW2NsYXNzKj1zaWRlXSA+IFtjbGFzcyo9c2VsZWN0ZWRdXCIpO1xyXG4gICAgICAgIGlmIChzaSkge1xyXG4gICAgICAgICAgICBzaS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5zZXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIHNpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnNldFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgc2kuY2xhc3NOYW1lID0gdGhpcy5uc2NuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VW5zZWxlY3RlZCgpXHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWQ6IGlkfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHRoaXMucHJvcHMub25DbGljayhpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICBsZXQgc2lkZWJhckluZGV4ID0gc2lkZWJhcnMuZmluZEluZGV4KGUgPT4gZSA9PT0gdGhpcylcclxuICAgICAgICBpZihzaWRlYmFySW5kZXgpc2lkZWJhcnMuc3BsaWNlKHNpZGViYXJJbmRleCwgMSlcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgc2lkZWJhcnMgPSBbXVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFVuc2VsZWN0ZWQoKXtcclxuICAgIHNpZGViYXJzLmZvckVhY2goKHNpZGViYXIpID0+IHtcclxuICAgICAgICBpZighc2lkZWJhci5zdGF0ZS5zZWxlY3RlZClyZXR1cm5cclxuICAgICAgICBzaWRlYmFyLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IG51bGxcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgzIG1hcmdpbi1yZXNldCBtYXJnaW4tcmVzZXQgdWktZmxleC1jaGlsZFwifSwgdGV4dCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJIZWFkZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSwgdGhpcy5wcm9wcy50ZXh0LCB0aGlzLnByb3BzLmJ1dHRvbik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5wcm9wcy5zZWxlY3RlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGB1aS10YWItYmFyLWl0ZW0ke3RoaXMucHJvcHMuc2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2sodGhpcy5wcm9wcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJTZXBhcmF0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1zZXBhcmF0b3IgbWFyZ2luLXRvcC04IG1hcmdpbi1ib3R0b20tOFwifSk7XHJcbiAgICB9XHJcbn0iLCJcInVzZSBzdHJpY3RcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3RcclxuXHJcbmNvbnN0IGludGVydmFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkludGVydmFsKVswXVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBvbmVudCwgTWVzc2FnZXMpIHtcclxuICAgIGNsYXNzIFRpbWVSZW5kZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IG5ldyBpbnRlcnZhbE1vZHVsZTEuSW50ZXJ2YWwoKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudERpZE1vdW50KCl7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RhcnQoMWUzLCAoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZShzZWxmLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RvcCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnREaWRVcGRhdGUoYWN0aXZpdHkpe1xyXG4gICAgICAgICAgICBpZihhY3Rpdml0eS50aW1lc3RhbXBzLmVuZCA9PT0gdGhpcy5wcm9wcy50aW1lc3RhbXBzLmVuZCAmJiBhY3Rpdml0eS50aW1lc3RhbXBzLnN0YXJ0ID09PSB0aGlzLnByb3BzLnRpbWVzdGFtcHMuc3RhcnQpcmV0dXJuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0VXBkYXRlZFRpbWUoKXtcclxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB0aGlzLnByb3BzLnRpbWVzdGFtcHNcclxuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCkgLyAxZTM7XHJcbiAgICAgICAgICAgIGlmKG51bGwgIT0gdGltZXN0YW1wcy5lbmQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlmZihub3csIGNoZWNrVW5peCh0aW1lc3RhbXBzLmVuZCkgLyAxZTMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYobnVsbCAhPSB0aW1lc3RhbXBzLnN0YXJ0KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERpZmYoY2hlY2tVbml4KHRpbWVzdGFtcHMuc3RhcnQpIC8gMWUzLCBub3cpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiAwLFxyXG4gICAgICAgICAgICAgICAgbWludXRlczogMCxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyVGltZShudW1iZXIsIHJlbW92ZVplcm8pe1xyXG4gICAgICAgICAgICBpZihyZW1vdmVaZXJvID09PSB1bmRlZmluZWQpcmVtb3ZlWmVybyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGlmKHJlbW92ZVplcm8gJiYgbnVtYmVyIDw9IDApcmV0dXJuIC0xXHJcbiAgICAgICAgICAgIGlmKG51bWJlciA8IDEwKXJldHVybiBcIjBcIitudW1iZXJcclxuICAgICAgICAgICAgcmV0dXJuIG51bWJlclxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0RGlmZih0aW1lc3RhbXAsIG5vdyl7XHJcbiAgICAgICAgICAgIGxldCBob3VycyA9IE1hdGgubWF4KG5vdyAtIHRpbWVzdGFtcCwgMClcclxuICAgICAgICAgICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKGhvdXJzKSAlIDYwXHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAvIDYwKSAlIDYwXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogTWF0aC5mbG9vcihob3VycyAvIDM2MDApICUgMjQsXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgbGV0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHByb3BzLnRpbWVzdGFtcHNcclxuXHJcbiAgICAgICAgICAgIGxldCB1c2VkUHJvcHMgPSBmdW5jdGlvbihwcm9wcywgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChudWxsID09IHByb3BzKSByZXR1cm4ge307XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB7fVxyXG4gICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtcy5pbmRleE9mKGtleSkgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNba2V5XSA9IHByb3BzW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHNcclxuICAgICAgICAgICAgfShwcm9wcywgW1widGltZXN0YW1wc1wiXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gc3RhdGUuaG91cnNcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBzdGF0ZS5taW51dGVzXHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzID0gc3RhdGUuc2Vjb25kc1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiB0aGlzLnJlbmRlclRpbWUoaG91cnMsICEwKSxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXM6IHRoaXMucmVuZGVyVGltZShtaW51dGVzKSxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IHRoaXMucmVuZGVyVGltZShzZWNvbmRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZih0aW1lc3RhbXBzLmVuZCAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHVzZWRQcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX0VORC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRpbWVzdGFtcHMuc3RhcnQgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB1c2VkUHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9TVEFSVC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFRpbWVSZW5kZXJcclxufTtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrVW5peChlKSB7XHJcbiAgICByZXR1cm4gKFwiXCIgKyBlKS5sZW5ndGggPCAxMyA/IDFlMyAqIGUgOiBlXHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Rvb2xzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB0b29sc01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvb2xzQ29udGFpbmVyKVswXVxyXG4gICAgICAgIGxldCBjb250YWluZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250YWluZXIgJiYgZS5jbG9zZUJ1dHRvbiAmJiBlLmNsb3NlQnV0dG9uQm9sZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMtY29udGFpbmVyIFwiK3Rvb2xzTW9kdWxlLnRvb2xzQ29udGFpbmVyfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMgXCIrdG9vbHNNb2R1bGUudG9vbHN9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNvbnRhaW5lck1vZHVsZS5jb250YWluZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0bi1jbG9zZSBcIitjb250YWluZXJNb2R1bGUuY2xvc2VCdXR0b24sIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImVzYy10ZXh0IFwiK2NvbnRhaW5lck1vZHVsZS5rZXliaW5kfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFU0NcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2xvc2VCdXR0b24gJiYgZS5rZXliaW5kQm9sZClbMF0uY2xvc2VCdXR0b24uc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoY2xvc2VCdXR0b24pIGNsb3NlQnV0dG9uLmNsaWNrKCk7XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogVG9vbHRpcCB0aGF0IGF1dG9tYXRpY2FsbHkgc2hvdyBhbmQgaGlkZSB0aGVtc2VsdmVzIG9uIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG4gKiBXaWxsIGFsc28gcmVtb3ZlIHRoZW1zZWx2ZXMgaWYgdGhlIG5vZGUgdG8gd2F0Y2ggaXMgcmVtb3ZlZCBmcm9tIERPTSB0aHJvdWdoXHJcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cclxuICpcclxuICogTm90ZSB0aGlzIGlzIG5vdCB1c2luZyBEaXNjb3JkJ3MgaW50ZXJuYWxzIGJ1dCBub3JtYWwgRE9NIG1hbmlwdWxhdGlvbiBhbmQgZW11bGF0ZXNcclxuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIEVtdWxhdGVkVG9vbHRpcFxyXG4gKiBAdmVyc2lvbiAwLjAuMVxyXG4gKi9cclxuXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuXHJcbi8vPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZYyBkaXNhYmxlZFBvaW50ZXJFdmVudHMtMXB0Z1RCXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDIzN3B4OyBib3R0b206IDUxcHg7XCI+XHJcbi8vXHQ8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgdG9vbHRpcFRvcC1YRERTeHggdG9vbHRpcEJsYWNrLVBQRzQ3eiB0b29sdGlwRGlzYWJsZVBvaW50ZXJFdmVudHMtM2VhQkdOXCIgc3R5bGU9XCJvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7XCI+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcktcIj48L2Rpdj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBDb250ZW50LWJxVkxXS1wiPlVzZXIgU2V0dGluZ3M8L2Rpdj5cclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5cclxuLy88ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljXCIgc3R5bGU9XCJ0b3A6IDg2MHB4OyBsZWZ0OiA2MzIuNXB4O1wiPlxyXG4vL1x0PGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIHRvb2x0aXBCbGFjay1QUEc0N3ogdG9vbHRpcFRvcC1YRERTeHhcIj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlyS1wiPjwvZGl2PlxyXG4vL1x0XHRDaGFuZ2Vsb2dcclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5sZXQgVG9vbHRpcENsYXNzZXNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcENsYXNzZXMoKXtcclxuXHRpZihUb29sdGlwQ2xhc3NlcylyZXR1cm4gVG9vbHRpcENsYXNzZXNcclxuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XHJcbn1cclxubGV0IFRvb2x0aXBMYXllcnNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xyXG5cdGlmKFRvb2x0aXBMYXllcnMpcmV0dXJuIFRvb2x0aXBMYXllcnNcclxuXHRyZXR1cm4gVG9vbHRpcExheWVycyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwibGF5ZXJcIiwgXCJsYXllckNvbnRhaW5lclwiKTtcclxufVxyXG5cclxuY29uc3QgZ2V0Q2xhc3MgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xyXG4gICAgY29uc3QgdG9vbHRpcENsYXNzID0gZ2V0VG9vbHRpcENsYXNzZXMoKVtgdG9vbHRpcCR7dXBwZXJDYXNlfWBdO1xyXG4gICAgaWYgKHRvb2x0aXBDbGFzcykgcmV0dXJuIHRvb2x0aXBDbGFzcztcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgcmV0dXJuIGdldENsYXNzKHNpZGVPckNvbG9yKSA/IHRydWUgOiBmYWxzZTtcclxufTtcclxuXHJcbmNvbnN0IHRvUHggPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxufTtcclxuXHJcbi8qIDxkaXYgY2xhc3M9XCJsYXllci12OUh5WWMgZGEtbGF5ZXJcIiBzdHlsZT1cImxlZnQ6IDIzNC41cHg7IGJvdHRvbTogNTFweDtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyBkYS10b29sdGlwIHRvb2x0aXBUb3AtWEREU3h4IHRvb2x0aXBCbGFjay1QUEc0N3pcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLIGRhLXRvb2x0aXBQb2ludGVyXCI+PC9kaXY+XHJcbiAgICAgICAgVXNlciBTZXR0aW5nc1xyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcclxuXHQvKipcclxuXHQgKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fGpRdWVyeSl9IG5vZGUgLSBET00gbm9kZSB0byBtb25pdG9yIGFuZCBzaG93IHRoZSB0b29sdGlwIG9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpcCAtIHN0cmluZyB0byBzaG93IGluIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0eWxlPWJsYWNrXSAtIGNvcnJlbGF0ZXMgdG8gdGhlIGRpc2NvcmQgc3R5bGluZy9jb2xvcnMgKGJsYWNrLCBicmFuZCwgZ3JlZW4sIGdyZXksIHJlZCwgeWVsbG93KVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zaWRlPXRvcF0gLSBjYW4gYmUgYW55IG9mIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSBzaG93aW5nIG9uIGhvdmVyXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XHJcblx0XHRjb25zdCB7c3R5bGUgPSBcImJsYWNrXCIsIHNpZGUgPSBcInRvcFwiLCBwcmV2ZW50RmxpcCA9IGZhbHNlLCBkaXNhYmxlZCA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcblx0XHR0aGlzLm5vZGUgPSBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7XHJcblx0XHR0aGlzLnNpZGUgPSBzaWRlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdGlmICghY2xhc3NFeGlzdHModGhpcy5zdHlsZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFN0eWxlICR7dGhpcy5zdHlsZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRcclxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcExheWVycygpLmxheWVyICsgXCIgXCIgKyBnZXRUb29sdGlwTGF5ZXJzKCkuZGlzYWJsZWRQb2ludGVyRXZlbnRzO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBDb250ZW50XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0cG9pbnRlckVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwUG9pbnRlcjtcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZCh0aGlzLmxhYmVsRWxlbWVudCk7XHJcblx0XHR0aGlzLmVsZW1lbnQuYXBwZW5kKHRoaXMudG9vbHRpcEVsZW1lbnQpO1xyXG5cclxuXHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdFx0bXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZih0aGlzLm5vZGUpID4gLTE7XHJcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyh0aGlzLm5vZGUpKTtcclxuXHRcdFx0XHRcdGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuXHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHR9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXHJcbiAgICBnZXQgY29udGFpbmVyKCkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb3BvdXRzKVswXS5wb3BvdXRzLnNwbGl0KFwiIFwiKVswXStcIiB+IC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllckNvbnRhaW5lcilbMF0ubGF5ZXJDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdKTsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dBYm92ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYmVsb3cgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSBsZWZ0IG9mIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0xlZnQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xyXG5cdGdldCBjYW5TaG93UmlnaHQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA8PSBVdGlscy5zY3JlZW5XaWR0aDsgfVxyXG5cclxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cclxuXHRoaWRlKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcclxuXHR9XHJcblxyXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXHJcblx0c2hvdygpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kKHRoaXMuZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dBYm92ZSB8fCAoIXRoaXMuY2FuU2hvd0Fib3ZlICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImJvdHRvbVwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImxlZnRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93TGVmdCB8fCAoIXRoaXMuY2FuU2hvd0xlZnQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dSaWdodCB8fCAoIXRoaXMuY2FuU2hvd1JpZ2h0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXHJcblx0c2hvd0Fib3ZlKCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwidG9wXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGJlbG93IHRoZSBub2RlLiAqL1xyXG5cdHNob3dCZWxvdygpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgbGVmdCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93TGVmdCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImxlZnRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd1JpZ2h0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwicmlnaHRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVySG9yaXpvbnRhbGx5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICh0aGlzLm5vZGUub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVyVmVydGljYWxseSgpIHtcclxuXHRcdGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgLyAyKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAvIDIpKSk7XHJcblx0fVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gQkRWMi5yZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLm5vZGUsIHRleHQsIHtzdHlsZSwgc2lkZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudG9vbHRpcDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJnXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtjbGFzc05hbWU6IFwiZmlsbFwiLCBmaWxsOiBcIiNkY2RkZGVcIiwgZDogXCJNOS41IDMuMjA1TDguNzk1IDIuNSA2IDUuMjk1IDMuMjA1IDIuNWwtLjcwNS43MDVMNS4yOTUgNiAyLjUgOC43OTVsLjcwNS43MDVMNiA2LjcwNSA4Ljc5NSA5LjVsLjcwNS0uNzA1TDYuNzA1IDZcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJta2RpcnBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibW9kdWxlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGUtZmV0Y2hcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJpbXJhZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ5YXV6bFwiKTsiXSwic291cmNlUm9vdCI6IiJ9