diff --git a/README.md b/README.md
index 8840aad..42042d3 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,30 @@ You can add title to the code block like this.
You must put the title in quotes. You can use both single and double quotes.
+### Collapse
+
+You must use the title feature to use the collapse feature. You can collapse the code block like this.
+
+ ```python title:"Title of the code block" collapse
+ print("Hello world")
+ ```
+
+Or like this.
+
+ ```python title:"Title of the code block" collapse:true
+ print("Hello world")
+ ```
+
+
+
+
+
+If you want to explicitly expand the code block, you can do it like this.
+
+ ```python title:"Title of the code block" collapse:false
+ print("Hello world")
+ ```
+
### Line Numbers
You can add line numbers to the code block like this.
@@ -238,6 +262,15 @@ You can change the default settings of each feature of HK Code Block in the sett
- default off, but on when specified : the title will only be shown if the title statement is specified
- always off : the title will never be shown
+### Collapse
+
+- Use Collapse
+ - always on : the code block will always be collapsible
+ - default on, but off when specified : the code block will always be collapsible, but will not be collapsed if collapse statement is specified as false
+ - default off, but on when specified : the code block will only be collapsible if the collapse statement is specified as true
+ - always off : the code block will never be collapsible
+- Default Collapse State : the default collapse state of the code block
+
### Line numbers
- Use Line Numbers
@@ -315,4 +348,9 @@ MIT License
### 0.1.0
-- Initial release
\ No newline at end of file
+- Initial release
+
+### 0.2.0
+
+- Add features
+ - Add collapse feature
\ No newline at end of file
diff --git a/README_ko.md b/README_ko.md
index 0002bf0..c658c0b 100644
--- a/README_ko.md
+++ b/README_ko.md
@@ -22,6 +22,30 @@ HK CodeBlock을 이용하면 Code Block에 다양한 기능들을 추가할 수
반드시 따옴표 안에 제목을 넣어야 합니다. 큰따옴표와 작은 따옴표 모두 사용 가능합니다.
+### 접기
+
+접기 기능을 사용하려면 반드시 제목을 설정해야 합니다. 다음과 같이 하고 제목을 클릭하면 Code Block을 접거나 펼 수 있습니다.
+
+ ```python title:"Title of the code block" collapsible
+ print("Hello world")
+ ```
+
+또는 다음과 같이 할 수도 있습니다.
+
+ ```python title:"Title of the code block" collapsible:true
+ print("Hello world")
+ ```
+
+
+
+
+
+다음과 같이 하면 명시적으로 접기 기능을 끌 수 있습니다.
+
+ ```python title:"Title of the code block" collapsible:false
+ print("Hello world")
+ ```
+
### 줄 번호
다음과 같이 하면 Code Block에 줄 번호를 추가할 수 있습니다.
@@ -238,6 +262,15 @@ Result Code Block의 프롬프트는 설정에서 설정한 값(기본값: "Resu
- default off, but on when specified : 기본적으로 제목 기능을 사용하지 않습니다. 하지만 title 옵션을 명시하면 제목 기능을 사용합니다.
- always off : 제목 기능을 항상 사용하지 않습니다.
+### Collapse
+
+- Use Collapse
+ - always on : 접기 기능을 항상 사용합니다.
+ - default on, but off when specified : 기본적으로 접기 기능을 사용합니다. 하지만 접기 기능을 사용하지 않는다고 명시하면 접기 기능을 사용하지 않습니다.
+ - default off, but on when specified : 기본적으로 접기 기능을 사용하지 않습니다. 하지만 접기 기능을 사용한다고 명시하면 접기 기능을 사용합니다.
+ - always off : 접기 기능을 항상 사용하지 않습니다.
+- Default Collapse State : 접기 기능을 사용할 때, 기본적으로 접힌 상태로 보여줄지 펼쳐진 상태로 보여줄지를 설정합니다.
+
### Line numbers
- Use Line Numbers
@@ -315,4 +348,9 @@ MIT License
### 0.1.0
-- 최초 배포
\ No newline at end of file
+- 최초 배포
+
+### 0.2.0
+
+- 기능 추가
+ - 접기 기능 추가
\ No newline at end of file
diff --git a/dist/main.js b/dist/main.js
index 073a20b..9754d35 100644
--- a/dist/main.js
+++ b/dist/main.js
@@ -32,6 +32,9 @@ var import_obsidian3 = require("obsidian");
// src/HKCodeBlockSettings.ts
var DEFAULT_SETTINGS = {
useTitleGlobal: "default off, but on when specified",
+ useCollapsibleGlobal: "default on, but off when specified",
+ defaultCollapse: "expand",
+ showCollapseBtn: true,
useLinenosGlobal: "default off, but on when specified",
defaultLinenosStart: 1,
showLinenosSplitter: true,
@@ -74,6 +77,30 @@ var HKCodeBlockSettingTab = class extends import_obsidian.PluginSettingTab {
await this.plugin.saveSettings();
})
);
+ containerEl.createEl("h2", { text: "Collapse" });
+ new import_obsidian.Setting(containerEl).setName("Use Collapse").setDesc(fragWithHTML(`- always on : the code block will always be collapsible
+ - default on, but off when specified : the code block will always be collapsible, but will not be collapsed if collapse statement is specified as false
+ - default off, but on when specified : the code block will only be collapsible if the collapse statement is specified as true
+ - always off : the code block will never be collapsible`)).addDropdown(
+ (tc) => tc.addOptions({
+ "always on": "always on",
+ "default on, but off when specified": "default on, but off when specified",
+ "default off, but on when specified": "default off, but on when specified",
+ "always off": "always off"
+ }).setValue(this.plugin.settings.useCollapsibleGlobal).onChange(async (value) => {
+ this.plugin.settings.useCollapsibleGlobal = value;
+ await this.plugin.saveSettings();
+ })
+ );
+ new import_obsidian.Setting(containerEl).setName("Default Collapse State").setDesc("The default collapse state of the code block.").addDropdown(
+ (tc) => tc.addOptions({
+ "collapse": "collapse",
+ "expand": "expand"
+ }).setValue(this.plugin.settings.defaultCollapse).onChange(async (value) => {
+ this.plugin.settings.defaultCollapse = value;
+ await this.plugin.saveSettings();
+ })
+ );
containerEl.createEl("h2", { text: "Line Numbers" });
new import_obsidian.Setting(containerEl).setName("Use Line Numbers").setDesc(fragWithHTML(`- always on : line numbers will always be shown
- default on, but off when specified : line numbers will always be shown, but will not be shown if linenos statement is specified as false
@@ -161,8 +188,7 @@ var HKCodeBlockSettingTab = class extends import_obsidian.PluginSettingTab {
new import_obsidian.Setting(containerEl).setName("Use Prompt").setDesc(fragWithHTML(`- always on : prompt will always be shown
- default on, but off when specified : prompt will always be shown, but will not be shown if the prompt statement is specified as false
- default off, but on when specified : prompt will only be shown if the prompt statement is specified as true
- - always off : prompt will never be shown
- You can also specify the prompt by the statement like \`prompt:"My Prompt"\`. (default: "$")`)).addDropdown(
+ - always off : prompt will never be shown`)).addDropdown(
(tc) => tc.addOptions({
"always on": "always on",
"default on, but off when specified": "default on, but off when specified",
@@ -217,6 +243,8 @@ var HKCodeBlockSettingTab = class extends import_obsidian.PluginSettingTab {
var import_obsidian2 = require("obsidian");
var REGEX = {
TITLE: /\stitle:(?:'(.*?)'|"(.*?)")\s/,
+ COLLAPSIBLE_SIMPLE: /\scollapsible\s/,
+ COLLAPSIBLE_COMPLICATE: /\scollapsible:(true|false)\s/,
LINENOS_SIMPLE: /\slinenos\s/,
LINENOS_COMPLICATE: /\slinenos:(true|false|(-{0,1}\d+))\s/,
HIGHLIGHT: /\shighlight:(?:'(.*?)'|"(.*?)")\s/,
@@ -238,6 +266,18 @@ function getMeta(view, elem_code, section_code, settings) {
showTitle = true;
title = regexResult_title[1] || regexResult_title[2];
}
+ let isCollapsible = void 0;
+ const regexResult_collapsibleSimple = REGEX.COLLAPSIBLE_SIMPLE.exec(firstline);
+ const regexResult_collapsibleComplicate = REGEX.COLLAPSIBLE_COMPLICATE.exec(firstline);
+ if (regexResult_collapsibleSimple) {
+ isCollapsible = true;
+ } else if (regexResult_collapsibleComplicate) {
+ if (regexResult_collapsibleComplicate[1] === "true") {
+ isCollapsible = true;
+ } else if (regexResult_collapsibleComplicate[1] === "false") {
+ isCollapsible = false;
+ }
+ }
let showLinenos = void 0;
let linenosStart = settings.defaultLinenosStart;
const linenosNum = section_code.lineEnd - section_code.lineStart - 1;
@@ -338,6 +378,7 @@ function getMeta(view, elem_code, section_code, settings) {
return {
showTitle,
title,
+ isCollapsible,
showLinenos,
linenosStart,
linenosNum,
@@ -375,6 +416,7 @@ async function HKCodeBlockProcessor(el, context, plugin) {
const {
showTitle,
title,
+ isCollapsible,
showLinenos,
linenosStart,
linenosNum,
@@ -409,13 +451,46 @@ async function HKCodeBlockProcessor(el, context, plugin) {
elem_div.classList.add("hk-codeblock");
elem_code.classList.add("hk-codeblock-code");
elem_copyBtn.remove();
+ let elem_title = void 0;
if (settings.useTitleGlobal === "default off, but on when specified" && showTitle === true) {
elem_div.classList.add("hk-codeblock-show-title");
- const elem_title = document.createElement("div");
+ elem_title = document.createElement("div");
elem_title.classList.add("hk-codeblock-title");
elem_title.innerHTML = title;
elem_div.insertBefore(elem_title, elem_pre);
}
+ if (settings.useCollapsibleGlobal === "always on" || settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === void 0 || isCollapsible === true) || settings.useCollapsibleGlobal === "default off, but on when specified" && isCollapsible === true) {
+ elem_div.classList.add("hk-codeblock-collapsible");
+ if (settings.defaultCollapse === "collapse") {
+ elem_div.classList.add("hk-codeblock-collapsed");
+ }
+ if (elem_title) {
+ elem_title.addEventListener("click", (ev) => {
+ ev.stopPropagation();
+ ev.preventDefault();
+ if (elem_div.classList.contains("hk-codeblock-collapsed")) {
+ elem_div.classList.remove("hk-codeblock-collapsed");
+ } else {
+ elem_div.classList.add("hk-codeblock-collapsed");
+ }
+ });
+ const elem_collapseBtns = document.createElement("div");
+ elem_collapseBtns.classList.add("hk-codeblock-collapse-btns");
+ const elem_collapseBtn = document.createElement("div");
+ elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn");
+ elem_collapseBtn.innerHTML = ``;
+ elem_collapseBtns.appendChild(elem_collapseBtn);
+ const elem_expandBtn = document.createElement("div");
+ elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn");
+ elem_expandBtn.innerHTML = ``;
+ elem_collapseBtns.appendChild(elem_expandBtn);
+ elem_title.prepend(elem_collapseBtns);
+ }
+ }
if (settings.useLinenosGlobal === "always on" || settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === void 0 || showLinenos === true) || settings.useLinenosGlobal === "default off, but on when specified" && showLinenos === true) {
elem_div.classList.add("hk-codeblock-show-linenos");
const elem_linenos = document.createElement("code");
@@ -671,4 +746,4 @@ var HKCodeBlockPlugin = class extends import_obsidian3.Plugin {
await this.saveData(this.settings);
}
};
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiLCAiLi4vc3JjL3ByaXNtLXBsdWdpbnMvcHJpc20tY29tbWFuZC1saW5lLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4sIGxvYWRQcmlzbSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSAnLi9IS0NvZGVCbG9ja1NldHRpbmdzJztcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgSEtDb2RlQmxvY2tTZXR0aW5nVGFiIH0gZnJvbSAnLi9IS0NvZGVCbG9ja1NldHRpbmdUYWInO1xuaW1wb3J0IHsgSEtDb2RlQmxvY2tQcm9jZXNzb3IgfSBmcm9tICcuL0hLQ29kZUJsb2NrUHJvY2Vzc29yJztcblxuaW1wb3J0IHsgUHJpc21QbHVnaW5fQ29tbWFuZExpbmUgfSBmcm9tICcuL3ByaXNtLXBsdWdpbnMvcHJpc20tY29tbWFuZC1saW5lJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSEtDb2RlQmxvY2tQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncztcblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Z01vZGUpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgUHJpc20gPSBhd2FpdCBsb2FkUHJpc20oKTtcblxuXHRcdC8vIGFjdGl2YXRlIFByaXNtLmpzIHBsdWdpbnNcblx0XHRQcmlzbVBsdWdpbl9Db21tYW5kTGluZShQcmlzbSk7XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMaW5lbm9zU3RhcnQ6IG51bWJlcjtcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogYm9vbGVhbjtcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0aGlnaGxpZ2h0Q29sb3I6IHN0cmluZztcblxuXHR1c2VMYW5ndWFnZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZztcblx0XG5cdHVzZUNvcHlCdG5HbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XG5cdHVzZVByb21wdEdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0UHJvbXB0OiBzdHJpbmc7XG5cdFxuXHR1c2VSZXN1bHRHbG9iYWw6IChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRwcm9tcHRpbmdMYW5ndWFnZXM6IHN0cmluZ1tdO1xuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBzdHJpbmc7XG5cblx0ZGVidWdNb2RlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogSEtDb2RlQmxvY2tTZXR0aW5ncyA9IHtcblx0dXNlVGl0bGVHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZUxpbmVub3NHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGluZW5vc1N0YXJ0OiAxLFxuXHRzaG93TGluZW5vc1NwbGl0dGVyOiB0cnVlLFxuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGhpZ2hsaWdodENvbG9yOiBcIiNmZjAwMDBcIixcblxuXHR1c2VMYW5ndWFnZUdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdGRlZmF1bHRMYW5ndWFnZTogXCJwbGFpbiB0ZXh0XCIsXG5cblx0dXNlQ29weUJ0bkdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlUHJvbXB0R2xvYmFsOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0cHJvbXB0aW5nTGFuZ3VhZ2VzOiBbXCJiYXNoXCJdLFxuXHRkZWZhdWx0UHJvbXB0OiBcIiRcIixcblxuXHR1c2VSZXN1bHRHbG9iYWw6IFwiZW5hYmxlXCIsXG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IFwiUmVzdWx0XCIsXG5cblx0ZGVidWdNb2RlOiBmYWxzZSxcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSAnLi9tYWluJztcblxuZXhwb3J0IGNvbnN0IGZyYWdXaXRoSFRNTCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcblx0cmV0dXJuIGNyZWF0ZUZyYWdtZW50KChmcmFnKSA9PiB7XG5cdFx0ZnJhZy5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmpvaW4oXCI8YnI+XCIpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEhLQ29kZUJsb2NrU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuXHRwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEhLQ29kZUJsb2NrUGx1Z2luKSB7XG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHQvLyB0aXRsZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1RpdGxlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBUaXRsZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgdGl0bGUgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSB0aXRsZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiB0aGUgdGl0bGUgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGl0bGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIGxpbmUgbnVtYmVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xpbmUgTnVtYmVycycgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBOdW1iZXJzJylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5hbHdheXMgb248L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgZmFsc2Vcblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxpbmVub3Mgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID0gdmFsdWUgYXMgKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdEZWZhdWx0IExpbmUgTnVtYmVyIFN0YXJ0Jylcblx0XHRcdC5zZXREZXNjKCdUaGUgZGVmYXVsdCBsaW5lIG51bWJlciBzdGFydCBvZiB0aGUgY29kZSBibG9jay4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExpbmVub3NTdGFydC50b1N0cmluZygpKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgbnVtID0gcGFyc2VJbnQodmFsdWUpO1xuXHRcdFx0XHRcdFx0aWYgKGlzTmFOKG51bSkpIHJldHVybjtcblxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExpbmVub3NTdGFydCA9IG51bTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnU2hvdyBMaW5lIE51bWJlciBTcGxpdHRlcicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd0xpbmVub3NTcGxpdHRlciA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIGhpZ2hsaWdodFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xpbmUgSGlnaGxpZ2h0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBMaW5lIEhpZ2hsaWdodCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxpbmUgaGlnaGxpZ2h0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWRcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGxpbmUgaGlnaGxpZ2h0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VIaWdobGlnaHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VIaWdobGlnaHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0xpbmUgSGlnaGxpZ2h0IENvbG9yJylcblx0XHRcdC5zZXREZXNjKCdUaGUgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgaGlnaGxpZ2h0ZWQgbGluZS4gTm90ZSB0aGF0IHRoZSBnaXZlbiBjb2xvciB3aWxsIGJlIGFwcGxpZWQgd2l0aCAwLjIgb3BhY2l0eS4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5oaWdobGlnaHRDb2xvciA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsYW5ndWFnZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0xhbmd1YWdlIEluZGljYXRvcicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGFuZ3VhZ2UgSW5kaWNhdG9yJylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5hbHdheXMgb248L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgbGFuZ3VhZ2UgaW5kaWNhdG9yIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgZmFsc2Vcblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJhbHdheXMgb25cIjogXCJhbHdheXMgb25cIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMYW5ndWFnZUdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMYW5ndWFnZScpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbmFtZSBvZiB0aGUgY29kZSBibG9jayBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHNwZWNpZmllZC4nKVxuXHRcdFx0LmFkZFRleHQodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcblx0XHQvLyBjb3B5IGJ1dHRvblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvcHkgQnV0dG9uJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb3B5IEJ1dHRvbicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgYWx3YXlzIGJlIHNob3duXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIG9ubHkgYmUgc2hvd24gaWYgdGhlIGNvcHkgYnV0dG9uIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogY29weSBidXR0b24gd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID0gdmFsdWUgYXMgKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBwcm9tcHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdQcm9tcHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFByb21wdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIHByb21wdCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBwcm9tcHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBwcm9tcHQgd2lsbCBuZXZlciBiZSBzaG93blxuXHRcdFx0XHRZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgcHJvbXB0IGJ5IHRoZSBzdGF0ZW1lbnQgbGlrZSBcXGBwcm9tcHQ6XCJNeSBQcm9tcHRcIlxcYC4gKGRlZmF1bHQ6IFwiJFwiKWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVByb21wdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnUHJvbXB0aW5nIExhbmd1YWdlcycpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGxhbmd1YWdlcyB0aGF0IHdpbGwgYmUgcHJvbXB0ZWQgYnkgZGVmYXVsdC4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxhbmd1YWdlcyBieSBzZXBhcmF0aW5nIHRoZW0gd2l0aCBlbnRlcnMuJylcblx0XHRcdC5hZGRUZXh0QXJlYSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9tcHRpbmdMYW5ndWFnZXMuam9pbihcIlxcblwiKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGxpbmVzID0gdmFsdWUuc3BsaXQoXCJcXG5cIikuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09IFwiXCIpO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzID0gbGluZXM7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJEZWZhdWx0IFByb21wdFwiKVxuXHRcdFx0LnNldERlc2MoXCJUaGUgZGVmYXVsdCBwcm9tcHQgb2YgdGhlIGJhc2ggY29kZSBibG9jay5cIilcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRQcm9tcHQpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIHJlc3VsdFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ1Jlc3VsdCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgUmVzdWx0Jylcblx0XHRcdC5zZXREZXNjKGZyYWdXaXRoSFRNTChgLSA8Yj5lbmFibGU8L2I+IDogdHJlYXQgdGhlIGNvZGUgYmxvY2sgc3RhcnRzIGxpa2UgXFxgXFxgXFxgXFxgcmVzdWx0XFxgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGFkamFjZW50IHByZXZpb3VzIGNvZGUgYmxvY2tcblx0XHRcdFx0LSA8Yj5kaXNhYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHdpdGggXFxgcmVzdWx0XFxgIGFzIGl0cyBsYW5ndWFnZSBuYW1lIGFzIGEgbm9ybWFsIGNvZGUgYmxvY2tgKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImVuYWJsZVwiOiBcImVuYWJsZVwiLFxuXHRcdFx0XHRcdFwiZGlzYWJsZVwiOiBcImRpc2FibGVcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlUmVzdWx0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlUmVzdWx0R2xvYmFsID0gdmFsdWUgYXMgKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoXCJEZWZhdWx0IFJlc3VsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSByZXN1bHQgY29kZSBibG9jay5cIilcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdC8vIGZvciBkZXZlbG9wZXJzXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnRGV2ZWxvcGVycycgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdEZWJ1ZyBNb2RlJylcblx0XHRcdC5zZXREZXNjKCdTaG93IGxvZ3MgaW4gdGhlIGNvbnNvbGUuJylcblx0XHRcdC5hZGRUb2dnbGUodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWdNb2RlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdH1cbn0iLCAiaW1wb3J0IHsgTWFya2Rvd25WaWV3IH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG5cbmltcG9ydCBIS0NvZGVCbG9ja1BsdWdpbiBmcm9tIFwiLi9tYWluXCI7XG5pbXBvcnQgdHlwZSB7IEhLQ29kZUJsb2NrU2V0dGluZ3MgfSBmcm9tIFwiLi9IS0NvZGVCbG9ja1NldHRpbmdzXCI7XG5cbmNvbnN0IFJFR0VYID0ge1xuICBUSVRMRTogL1xcc3RpdGxlOig/OicoLio/KSd8XCIoLio/KVwiKVxccy8sXG4gIExJTkVOT1NfU0lNUExFOiAvXFxzbGluZW5vc1xccy8sXG4gIExJTkVOT1NfQ09NUExJQ0FURTogL1xcc2xpbmVub3M6KHRydWV8ZmFsc2V8KC17MCwxfVxcZCspKVxccy8sXG4gIEhJR0hMSUdIVDogL1xcc2hpZ2hsaWdodDooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBMQU5HVUFHRV9GUk9NX0NMQVNTOiAvXmxhbmd1YWdlLShcXHcrKSQvLFxuICBMQU5HVUFHRV9TSU1QTEU6IC9cXHNsYW5ndWFnZVxccy8sXG4gIExBTkdVQUdFX0NPTVBMSUNBVEU6IC9cXHNsYW5ndWFnZToodHJ1ZXxmYWxzZXwnKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT1BZQlROX1NJTVBMRTogL1xcc2NvcHlidG5cXHMvLFxuICBDT1BZQlROX0NPTVBMSUNBVEU6IC9cXHNjb3B5YnRuOih0cnVlfGZhbHNlKVxccy8sXG4gIFJFU1VMVDogL15gYGByZXN1bHRcXHMvLFxuICBQUk9NUFRfU0lNUExFOiAvXFxzcHJvbXB0XFxzLyxcbiAgUFJPTVBUX0NPTVBMSUNBVEU6IC9cXHNwcm9tcHQ6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbn1cblxuZnVuY3Rpb24gZ2V0TWV0YSh2aWV3OiBNYXJrZG93blZpZXcsIGVsZW1fY29kZTogSFRNTEVsZW1lbnQsIHNlY3Rpb25fY29kZTogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24sIHNldHRpbmdzOiBIS0NvZGVCbG9ja1NldHRpbmdzKToge1xuICBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgdGl0bGU6IHN0cmluZyxcbiAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gIGxpbmVub3NOdW06IG51bWJlcixcbiAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgcHJvbXB0OiBzdHJpbmdcbn0ge1xuICBjb25zdCBmaXJzdGxpbmUgPSB2aWV3LmVkaXRvci5nZXRMaW5lKHNlY3Rpb25fY29kZS5saW5lU3RhcnQpICsgXCIgXCI7IC8vIGFkZCBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgdG8gbWFrZSBzdXJlIHRoZSByZWdleCB3b3Jrc1xuXG4gIC8vIHRpdGxlXG4gIGxldCBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IHRpdGxlID0gXCJcIjtcbiAgY29uc3QgcmVnZXhSZXN1bHRfdGl0bGUgPSBSRUdFWC5USVRMRS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF90aXRsZSkge1xuICAgIHNob3dUaXRsZSA9IHRydWU7XG4gICAgdGl0bGUgPSByZWdleFJlc3VsdF90aXRsZVsxXSB8fCByZWdleFJlc3VsdF90aXRsZVsyXTtcbiAgfVxuXG4gIC8vIGxpbmVub3NcbiAgbGV0IHNob3dMaW5lbm9zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsaW5lbm9zU3RhcnQgPSBzZXR0aW5ncy5kZWZhdWx0TGluZW5vc1N0YXJ0O1xuICBjb25zdCBsaW5lbm9zTnVtID0gc2VjdGlvbl9jb2RlLmxpbmVFbmQgLSBzZWN0aW9uX2NvZGUubGluZVN0YXJ0IC0gMTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGluZW5vc1NpbXBsZSA9IFJFR0VYLkxJTkVOT1NfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGUgPSBSRUdFWC5MSU5FTk9TX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfbGluZW5vc1NpbXBsZSkge1xuICAgIHNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dMaW5lbm9zID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dMaW5lbm9zID0gdHJ1ZTtcbiAgICAgIGxpbmVub3NTdGFydCA9IHBhcnNlSW50KHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzJdKSB8fCAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhpZ2hsaWdodFxuICBsZXQgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpID0gdW5kZWZpbmVkO1xuICBsZXQgaGlnaGxpZ2h0TGluZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodCA9IFJFR0VYLkhJR0hMSUdIVC5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9oaWdobGlnaHQpIHtcbiAgICBzaG93SGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICBjb25zdCBoaWdobGlnaHRMaW5lc19zdHIgPSByZWdleFJlc3VsdF9oaWdobGlnaHRbMV0gfHwgcmVnZXhSZXN1bHRfaGlnaGxpZ2h0WzJdO1xuICAgIGhpZ2hsaWdodExpbmVzID0gaGlnaGxpZ2h0TGluZXNfc3RyLnNwbGl0KFwiLFwiKS5tYXAoKGxpbmUpID0+IHBhcnNlSW50KGxpbmUpKTtcblxuICAgIGlmIChoaWdobGlnaHRMaW5lcy5zb21lKChsaW5lKSA9PiBpc05hTihsaW5lKSkpIHtcbiAgICAgIC8vIGlmIGFueSBlbGVtZW50IGlzIG5hbiwgdGhlbiBzZXQgc2hvd0hpZ2hsaWdodCB0byBmYWxzZVxuICAgICAgc2hvd0hpZ2hsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgIGhpZ2hsaWdodExpbmVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBvbmx5IHZhbGlkIGxpbmUgbnVtYmVyc1xuICAgICAgaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lcy5maWx0ZXIoKGxpbmUpID0+IGxpbmUgPj0gbGluZW5vc1N0YXJ0ICYmIGxpbmUgPCBsaW5lbm9zU3RhcnQgKyBsaW5lbm9zTnVtKTtcbiAgICB9XG4gIH1cblxuICAvLyBsYW5ndWFnZVxuICBsZXQgc2hvd0xhbmd1YWdlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBsYW5ndWFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IGxhbmd1YWdlID0gc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlO1xuICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcyA9IFJFR0VYLkxBTkdVQUdFX0ZST01fQ0xBU1MuZXhlYyhjbGFzc05hbWUudHJpbSgpKTtcbiAgICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzcykgbGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUZyb21DbGFzc1sxXTtcbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ndWFnZTtcbiAgfSkoKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUgPSBSRUdFWC5MQU5HVUFHRV9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUgPSBSRUdFWC5MQU5HVUFHRV9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlU2ltcGxlKSB7XG4gICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xhbmd1YWdlID0gdHJ1ZTtcbiAgICAgIGxhbmd1YWdlID0gcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZVszXTtcbiAgICB9XG4gIH1cblxuICAvLyBjb3B5IGJ1dHRvblxuICBsZXQgc2hvd0NvcHlCdG46IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSA9IFJFR0VYLkNPUFlCVE5fU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGUgPSBSRUdFWC5DT1BZQlROX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfY29weUJ0blNpbXBsZSkge1xuICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJvbXB0XG4gIGxldCBzaG93UHJvbXB0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBwcm9tcHQgPSBzZXR0aW5ncy5kZWZhdWx0UHJvbXB0O1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRTaW1wbGUgPSBSRUdFWC5QUk9NUFRfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSkge1xuICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGUpIHtcbiAgICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBzaG93UHJvbXB0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dQcm9tcHQgPSB0cnVlO1xuICAgICAgcHJvbXB0ID0gcmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZVsyXSB8fCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc3VsdFxuICBsZXQgaXNSZXN1bHQgPSBmYWxzZTtcbiAgbGV0IHJlc3VsdFByb21wdCA9IHNldHRpbmdzLmRlZmF1bHRSZXN1bHRQcm9tcHQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Jlc3VsdCA9IFJFR0VYLlJFU1VMVC5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCA9IFJFR0VYLlBST01QVF9DT01QTElDQVRFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X3Jlc3VsdCkge1xuICAgIGlzUmVzdWx0ID0gdHJ1ZTtcbiAgICBcbiAgICAvLyBvdmVycmlkZSBvdGhlciBtZXRhIGRhdGEgOiBvbmx5IGxpbmVub3MsIGhpZ2hsaWdodCBhcmUgYXZhaWxhYmxlXG4gICAgc2hvd1RpdGxlID0gZmFsc2U7XG4gICAgc2hvd0xhbmd1YWdlID0gZmFsc2U7XG4gICAgc2hvd0NvcHlCdG4gPSBmYWxzZTtcbiAgICBzaG93UHJvbXB0ID0gZmFsc2U7XG5cbiAgICBpZiAocmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0KSB7XG4gICAgICByZXN1bHRQcm9tcHQgPSByZWdleFJlc3VsdFByb21wdF9yZXN1bHRbMl0gfHwgcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0WzNdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIHNob3dMaW5lbm9zOiBzaG93TGluZW5vcyxcbiAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICBsaW5lbm9zTnVtOiBsaW5lbm9zTnVtLFxuICAgIHNob3dIaWdobGlnaHQ6IHNob3dIaWdobGlnaHQsXG4gICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgIHNob3dMYW5ndWFnZTogc2hvd0xhbmd1YWdlLFxuICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgaXNSZXN1bHQ6IGlzUmVzdWx0LFxuICAgIHJlc3VsdFByb21wdDogcmVzdWx0UHJvbXB0LFxuICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgcHJvbXB0OiBwcm9tcHRcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEhLQ29kZUJsb2NrUHJvY2Vzc29yKFxuICBlbDogSFRNTEVsZW1lbnQsXG4gIGNvbnRleHQ6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIHBsdWdpbjogSEtDb2RlQmxvY2tQbHVnaW5cbikge1xuICBjb25zdCBzZXR0aW5ncyA9IHBsdWdpbi5zZXR0aW5ncztcblxuICBjb25zdCB2aWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGlmICghdmlldykgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fY29kZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbC5xdWVyeVNlbGVjdG9yKFwicHJlOm5vdCguZnJvbnRtYXR0ZXIpID4gY29kZVwiKTtcbiAgaWYgKCFlbGVtX2NvZGUpIHJldHVybjtcblxuICBjb25zdCBlbGVtX3ByZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX2NvZGUucGFyZW50RWxlbWVudDtcbiAgaWYgKCFlbGVtX3ByZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fZGl2OiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fcHJlLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghZWxlbV9kaXYpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2NvcHlCdG46IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9kaXYucXVlcnlTZWxlY3RvcihcIi5jb3B5LWNvZGUtYnV0dG9uXCIpO1xuICBpZiAoIWVsZW1fY29weUJ0bikgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25fY29kZTogKE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHwgbnVsbCkgPSBjb250ZXh0LmdldFNlY3Rpb25JbmZvKGVsZW1fY29kZSk7XG4gIGlmICghc2VjdGlvbl9jb2RlKSByZXR1cm47XG5cbiAgLy8gZ2V0IG1ldGFkYXRhXG4gIGNvbnN0IHsgXG4gICAgc2hvd1RpdGxlLFxuICAgIHRpdGxlLFxuICAgIHNob3dMaW5lbm9zLFxuICAgIGxpbmVub3NTdGFydCxcbiAgICBsaW5lbm9zTnVtLFxuICAgIHNob3dIaWdobGlnaHQsXG4gICAgaGlnaGxpZ2h0TGluZXMsXG4gICAgc2hvd0xhbmd1YWdlLFxuICAgIGxhbmd1YWdlLFxuICAgIHNob3dDb3B5QnRuLFxuICAgIGlzUmVzdWx0LFxuICAgIHJlc3VsdFByb21wdCxcbiAgICBzaG93UHJvbXB0LFxuICAgIHByb21wdFxuICB9ID0gZ2V0TWV0YSh2aWV3LCBlbGVtX2NvZGUsIHNlY3Rpb25fY29kZSwgc2V0dGluZ3MpO1xuXG4gIGlmIChzZXR0aW5ncy5kZWJ1Z01vZGUpIHtcbiAgICBjb25zb2xlLmxvZyh7IFxuICAgICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICB9KVxuICB9XG5cbiAgLy8gY3JlYXRlIEhUTUwgZWxlbWVudHNcbiAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9ja1wiKTtcbiAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29kZVwiKTtcbiAgZWxlbV9jb3B5QnRuLnJlbW92ZSgpOyAvLyByZW1vdmUgdGhlIG9yaWdpbmFsIGNvcHkgYnV0dG9uIGFzIGRlZmF1bHRcblxuICBpZiAoc2V0dGluZ3MudXNlVGl0bGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93VGl0bGUgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXRpdGxlXCIpO1xuXG4gICAgY29uc3QgZWxlbV90aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWxlbV90aXRsZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXRpdGxlXCIpO1xuICAgIGVsZW1fdGl0bGUuaW5uZXJIVE1MID0gdGl0bGU7XG4gICAgZWxlbV9kaXYuaW5zZXJ0QmVmb3JlKGVsZW1fdGl0bGUsIGVsZW1fcHJlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMaW5lbm9zID09PSB1bmRlZmluZWQgfHwgc2hvd0xpbmVub3MgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xpbmVub3MgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGluZW5vc1wiKTtcblxuICAgIGNvbnN0IGVsZW1fbGluZW5vcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWxpbmVub3NcIik7XG4gICAgZWxlbV9saW5lbm9zLmlubmVyVGV4dCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IGlkeCArIGxpbmVub3NTdGFydCkuam9pbihcIlxcblwiKTtcbiAgICBlbGVtX3ByZS5pbnNlcnRCZWZvcmUoZWxlbV9saW5lbm9zLCBlbGVtX2NvZGUpO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIpIHtcbiAgICAgIGVsZW1fbGluZW5vcy5jbGFzc0xpc3QuYWRkKFwic2hvdy1zcGxpdHRlclwiKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0hpZ2hsaWdodCA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0XCIpO1xuXG4gICAgZWxlbV9kaXYuc3R5bGUuc2V0UHJvcGVydHkoXCItLWhrLWNvZGVibG9jay1oaWdobGlnaHQtYmFja2dyb3VuZC1jb2xvclwiLCBzZXR0aW5ncy5oaWdobGlnaHRDb2xvcik7XG5cbiAgICBjb25zdCBlbGVtX2hpZ2hsaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2staGlnaGxpZ2h0XCIpO1xuICAgIGVsZW1faGlnaGxpZ2h0LmlubmVySFRNTCA9IEFycmF5KGxpbmVub3NOdW0pLmZpbGwoMCkubWFwKChfLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoaGlnaGxpZ2h0TGluZXMuaW5jbHVkZXMoaWR4ICsgbGluZW5vc1N0YXJ0KSkgY2xhc3NOYW1lcy5wdXNoKFwiaGlnaGxpZ2h0XCIpO1xuICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cImxpbmUgbGluZS0ke2lkeCArIGxpbmVub3NTdGFydH0gJHtjbGFzc05hbWVzLmpvaW4oXCIgXCIpfVwiPiA8L3NwYW4+YDtcbiAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIGVsZW1fcHJlLmluc2VydEJlZm9yZShlbGVtX2hpZ2hsaWdodCwgZWxlbV9jb2RlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB1bmRlZmluZWQgfHwgc2hvd0xhbmd1YWdlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGFuZ3VhZ2UgPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctbGFuZ3VhZ2VcIik7XG5cbiAgICBjb25zdCBlbGVtX2xhbmd1YWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBlbGVtX2xhbmd1YWdlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stbGFuZ3VhZ2VcIik7XG4gICAgZWxlbV9sYW5ndWFnZS5pbm5lclRleHQgPSBsYW5ndWFnZTtcbiAgICBlbGVtX3ByZS5wcmVwZW5kKGVsZW1fbGFuZ3VhZ2UpO1xuICB9XG5cbiAgaWYgKFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHVuZGVmaW5lZCB8fCBzaG93Q29weUJ0biA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUNvcHlCdG5HbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93Q29weUJ0biA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuXCIpO1xuXG4gICAgZWxlbV9wcmUuYXBwZW5kQ2hpbGQoZWxlbV9jb3B5QnRuKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImFsd2F5cyBvblwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlKSAmJiAoc2hvd1Byb21wdCA9PT0gdW5kZWZpbmVkIHx8IHNob3dQcm9tcHQgPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93UHJvbXB0ID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LXByb21wdFwiKTtcblxuICAgIC8vIHVzaW5nIFByaXNtLmpzIGNvbW1hbmQtbGluZSBwbHVnaW5cbiAgICBsZXQgY29kZV9saW5lcyA9IGVsZW1fY29kZS5pbm5lclRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgaWYgKGNvZGVfbGluZXNbY29kZV9saW5lcy5sZW5ndGggLSAxXS50cmltKCkubGVuZ3RoID09IDApIGNvZGVfbGluZXMucG9wKCk7IC8vIHJlbW92ZSBsYXN0IGxpbmUgaWYgZW1wdHlcblxuICAgIGNvbnN0IG5vX3Byb21wdF9saW5lX2lkeHMgPSBjb2RlX2xpbmVzLm1hcCgobGluZSwgaWR4KSA9PiB7XG4gICAgICBpZiAobGluZS50cmltKCkubGVuZ3RoID09IDApIHJldHVybiAoaWR4ICsgMSk7IC8vIGVtcHR5IGxpbmVcbiAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCIjXCIpKSByZXR1cm4gKGlkeCArIDEpOyAvLyBjb21tZW50IGxpbmVcbiAgICAgIHJldHVybiAtMTtcbiAgICB9KS5maWx0ZXIoKGlkeCkgPT4gaWR4ICE9IC0xKTtcblxuICAgIGVsZW1fcHJlLmNsYXNzTGlzdC5hZGQoXCJjb21tYW5kLWxpbmVcIik7XG4gICAgZWxlbV9wcmUuc2V0QXR0cmlidXRlKFwiZGF0YS1wcm9tcHRcIiwgcHJvbXB0KTtcbiAgICBlbGVtX3ByZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRpbnVhdGlvbi1zdHJcIiwgXCJcXFxcXCIpO1xuICAgIGVsZW1fcHJlLnNldEF0dHJpYnV0ZShcImRhdGEtY29udGludWF0aW9uLXByb21wdFwiLCBcIiBcIi5yZXBlYXQocHJvbXB0Lmxlbmd0aCkpOyAgLy8gdXNlIHNwYWNlcyB0byBhbGlnbiBjb250aW51YXRpb24gcHJvbXB0XG4gICAgZWxlbV9wcmUuc2V0QXR0cmlidXRlKFwiZGF0YS1vdXRwdXRcIiwgbm9fcHJvbXB0X2xpbmVfaWR4cy5qb2luKFwiLCBcIikpO1xuICB9XG5cbiAgaWYoc2V0dGluZ3MudXNlUmVzdWx0R2xvYmFsID09PSBcImVuYWJsZVwiICYmIChpc1Jlc3VsdCA9PT0gdHJ1ZSkpIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXJlc3VsdFwiKTtcbiAgICBlbGVtX2NvZGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1yZXN1bHQtY29kZVwiKTtcblxuICAgIGVsZW1fZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtcmVzdWx0LXByb21wdFwiLCByZXN1bHRQcm9tcHQpO1xuICB9XG59IiwgImV4cG9ydCBmdW5jdGlvbiBQcmlzbVBsdWdpbl9Db21tYW5kTGluZShQcmlzbSkge1xuXG5cdGlmICh0eXBlb2YgUHJpc20gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgQ0xBU1NfUEFUVEVSTiA9IC8oPzpefFxccyljb21tYW5kLWxpbmUoPzpcXHN8JCkvO1xuXHR2YXIgUFJPTVBUX0NMQVNTID0gJ2NvbW1hbmQtbGluZS1wcm9tcHQnO1xuXG5cdC8qKiBAdHlwZSB7KHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykgPT4gYm9vbGVhbn0gKi9cblx0dmFyIHN0YXJ0c1dpdGggPSAnJy5zdGFydHNXaXRoXG5cdFx0PyBmdW5jdGlvbiAocywgcCkgeyByZXR1cm4gcy5zdGFydHNXaXRoKHApOyB9XG5cdFx0OiBmdW5jdGlvbiAocywgcCkgeyByZXR1cm4gcy5pbmRleE9mKHApID09PSAwOyB9O1xuXG5cdC8vIFN1cHBvcnQgZm9yIElFMTEgdGhhdCBoYXMgbm8gZW5kc1dpdGgoKVxuXHQvKiogQHR5cGUgeyhzdHI6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+IGJvb2xlYW59ICovXG5cdHZhciBlbmRzV2l0aCA9ICcnLmVuZHNXaXRoXG5cdFx0PyBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcblx0XHRcdHJldHVybiBzdHIuZW5kc1dpdGgoc3VmZml4KTtcblx0XHR9XG5cdFx0OiBmdW5jdGlvbiAoc3RyLCBzdWZmaXgpIHtcblx0XHRcdHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuXHRcdFx0cmV0dXJuIHN0ci5zdWJzdHJpbmcobGVuIC0gc3VmZml4Lmxlbmd0aCwgbGVuKSA9PT0gc3VmZml4O1xuXHRcdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gaG9vayBlbnZpcm9ubWVudCBoYXMgYSBjb21tYW5kIGxpbmUgaW5mbyBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7YW55fSBlbnZcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRmdW5jdGlvbiBoYXNDb21tYW5kTGluZUluZm8oZW52KSB7XG5cdFx0dmFyIHZhcnMgPSBlbnYudmFycyA9IGVudi52YXJzIHx8IHt9O1xuXHRcdHJldHVybiAnY29tbWFuZC1saW5lJyBpbiB2YXJzO1xuXHR9XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBjb21tYW5kIGxpbmUgaW5mbyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaG9vayBlbnZpcm9ubWVudC5cblx0ICpcblx0ICogQHBhcmFtIHthbnl9IGVudlxuXHQgKiBAcmV0dXJucyB7Q29tbWFuZExpbmVJbmZvfVxuXHQgKlxuXHQgKiBAdHlwZWRlZiBDb21tYW5kTGluZUluZm9cblx0ICogQHByb3BlcnR5IHtib29sZWFufSBbY29tcGxldGVdXG5cdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbnVtYmVyT2ZMaW5lc11cblx0ICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW291dHB1dExpbmVzXVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0Q29tbWFuZExpbmVJbmZvKGVudikge1xuXHRcdHZhciB2YXJzID0gZW52LnZhcnMgPSBlbnYudmFycyB8fCB7fTtcblx0XHRyZXR1cm4gdmFyc1snY29tbWFuZC1saW5lJ10gPSB2YXJzWydjb21tYW5kLWxpbmUnXSB8fCB7fTtcblx0fVxuXG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtaGlnaGxpZ2h0JywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBjb21tYW5kTGluZSA9IGdldENvbW1hbmRMaW5lSW5mbyhlbnYpO1xuXG5cdFx0aWYgKGNvbW1hbmRMaW5lLmNvbXBsZXRlIHx8ICFlbnYuY29kZSkge1xuXHRcdFx0Y29tbWFuZExpbmUuY29tcGxldGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFdvcmtzIG9ubHkgZm9yIDxjb2RlPiB3cmFwcGVkIGluc2lkZSA8cHJlPiAobm90IGlubGluZSkuXG5cdFx0dmFyIHByZSA9IGVudi5lbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0aWYgKCFwcmUgfHwgIS9wcmUvaS50ZXN0KHByZS5ub2RlTmFtZSkgfHwgLy8gQWJvcnQgb25seSBpZiBuZWl0aGVyIHRoZSA8cHJlPiBub3IgdGhlIDxjb2RlPiBoYXZlIHRoZSBjbGFzc1xuXHRcdFx0KCFDTEFTU19QQVRURVJOLnRlc3QocHJlLmNsYXNzTmFtZSkgJiYgIUNMQVNTX1BBVFRFUk4udGVzdChlbnYuZWxlbWVudC5jbGFzc05hbWUpKSkge1xuXHRcdFx0Y29tbWFuZExpbmUuY29tcGxldGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBlbGVtZW50IG1pZ2h0IGJlIGhpZ2hsaWdodGVkIG11bHRpcGxlIHRpbWVzLCBzbyB3ZSBqdXN0IHJlbW92ZSB0aGUgcHJldmlvdXMgcHJvbXB0XG5cdFx0dmFyIGV4aXN0aW5nUHJvbXB0ID0gZW52LmVsZW1lbnQucXVlcnlTZWxlY3RvcignLicgKyBQUk9NUFRfQ0xBU1MpO1xuXHRcdGlmIChleGlzdGluZ1Byb21wdCkge1xuXHRcdFx0ZXhpc3RpbmdQcm9tcHQucmVtb3ZlKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvZGVMaW5lcyA9IGVudi5jb2RlLnNwbGl0KCdcXG4nKTtcblxuXHRcdGlmKGNvZGVMaW5lc1tjb2RlTGluZXMubGVuZ3RoIC0gMV0udHJpbSgpLmxlbmd0aCA9PT0gMCkgeyAvLyBkbyBub3QgY291bnQgdGhlIGxhc3QgbGluZSBpZiBpdCBpcyBlbXB0eVxuXHRcdFx0Y29tbWFuZExpbmUubnVtYmVyT2ZMaW5lcyA9IGNvZGVMaW5lcy5sZW5ndGggLSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb21tYW5kTGluZS5udW1iZXJPZkxpbmVzID0gY29kZUxpbmVzLmxlbmd0aDtcblx0XHR9XG5cdFx0LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cblx0XHR2YXIgb3V0cHV0TGluZXMgPSBjb21tYW5kTGluZS5vdXRwdXRMaW5lcyA9IFtdO1xuXG5cdFx0dmFyIG91dHB1dFNlY3Rpb25zID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1vdXRwdXQnKTtcblx0XHR2YXIgb3V0cHV0RmlsdGVyID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1maWx0ZXItb3V0cHV0Jyk7XG5cdFx0aWYgKG91dHB1dFNlY3Rpb25zICE9PSBudWxsKSB7IC8vIFRoZSB1c2VyIHNwZWNpZmllZCB0aGUgb3V0cHV0IGxpbmVzLiAtLSBjd2VsbHNcblx0XHRcdG91dHB1dFNlY3Rpb25zLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAoc2VjdGlvbikge1xuXHRcdFx0XHR2YXIgcmFuZ2UgPSBzZWN0aW9uLnNwbGl0KCctJyk7XG5cdFx0XHRcdHZhciBvdXRwdXRTdGFydCA9IHBhcnNlSW50KHJhbmdlWzBdLCAxMCk7XG5cdFx0XHRcdHZhciBvdXRwdXRFbmQgPSByYW5nZS5sZW5ndGggPT09IDIgPyBwYXJzZUludChyYW5nZVsxXSwgMTApIDogb3V0cHV0U3RhcnQ7XG5cblx0XHRcdFx0aWYgKCFpc05hTihvdXRwdXRTdGFydCkgJiYgIWlzTmFOKG91dHB1dEVuZCkpIHtcblx0XHRcdFx0XHRpZiAob3V0cHV0U3RhcnQgPCAxKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXRTdGFydCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvdXRwdXRFbmQgPiBjb2RlTGluZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXRFbmQgPSBjb2RlTGluZXMubGVuZ3RoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDb252ZXJ0IHN0YXJ0IGFuZCBlbmQgdG8gMC1iYXNlZCB0byBzaW1wbGlmeSB0aGUgYXJyYXlzLiAtLSBjd2VsbHNcblx0XHRcdFx0XHRvdXRwdXRTdGFydC0tO1xuXHRcdFx0XHRcdG91dHB1dEVuZC0tO1xuXHRcdFx0XHRcdC8vIFNhdmUgdGhlIG91dHB1dCBsaW5lIGluIGFuIGFycmF5IGFuZCBjbGVhciBpdCBpbiB0aGUgY29kZSBzbyBpdCdzIG5vdCBoaWdobGlnaHRlZC4gLS0gY3dlbGxzXG5cdFx0XHRcdFx0Zm9yICh2YXIgaiA9IG91dHB1dFN0YXJ0OyBqIDw9IG91dHB1dEVuZDsgaisrKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXRMaW5lc1tqXSA9IGNvZGVMaW5lc1tqXTtcblx0XHRcdFx0XHRcdGNvZGVMaW5lc1tqXSA9ICcnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChvdXRwdXRGaWx0ZXIpIHsgLy8gVHJlYXQgbGluZXMgYmVnaW5uaW5nIHdpdGggdGhpcyBzdHJpbmcgYXMgb3V0cHV0LiAtLSBjd2VsbHNcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY29kZUxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChzdGFydHNXaXRoKGNvZGVMaW5lc1tpXSwgb3V0cHV0RmlsdGVyKSkgeyAvLyBUaGlzIGxpbmUgaXMgb3V0cHV0LiAtLSBjd2VsbHNcblx0XHRcdFx0XHRvdXRwdXRMaW5lc1tpXSA9IGNvZGVMaW5lc1tpXS5zbGljZShvdXRwdXRGaWx0ZXIubGVuZ3RoKTtcblx0XHRcdFx0XHRjb2RlTGluZXNbaV0gPSAnJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZhciBjb250aW51YXRpb25MaW5lSW5kaWNpZXMgPSBjb21tYW5kTGluZS5jb250aW51YXRpb25MaW5lSW5kaWNpZXMgPSBuZXcgU2V0KCk7XG5cdFx0dmFyIGxpbmVDb250aW51YXRpb25TdHIgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbnRpbnVhdGlvbi1zdHInKTtcblx0XHR2YXIgY29udGludWF0aW9uRmlsdGVyID0gcHJlLmdldEF0dHJpYnV0ZSgnZGF0YS1maWx0ZXItY29udGludWF0aW9uJyk7XG5cblx0XHQvLyBJZGVudGlmeSBjb2RlIGxpbmVzIHdoZXJlIHRoZSBjb21tYW5kIGhhcyBjb250aW51ZWQgb250byBzdWJzZXF1ZW50XG5cdFx0Ly8gbGluZXMgYW5kIHRodXMgbmVlZCBhIGRpZmZlcmVudCBwcm9tcHQuIE5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgb3V0cHV0XG5cdFx0Ly8gbGluZXMgaGF2ZSBiZWVuIHJlbW92ZWQgdG8gZW5zdXJlIHdlIGRvbid0IHBpY2sgdXAgYSBjb250aW51YXRpb24gc3RyaW5nXG5cdFx0Ly8gaW4gYW4gb3V0cHV0IGxpbmUuXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBjb2RlTGluZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdHZhciBsaW5lID0gY29kZUxpbmVzW2pdO1xuXHRcdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZWNvcmQgdGhlIG5leHQgbGluZSBhcyBhIGNvbnRpbnVhdGlvbiBpZiB0aGlzIG9uZSBlbmRzIGluIGEgY29udGludWF0aW9uIHN0ci5cblx0XHRcdGlmIChsaW5lQ29udGludWF0aW9uU3RyICYmIGVuZHNXaXRoKGxpbmUsIGxpbmVDb250aW51YXRpb25TdHIpKSB7XG5cdFx0XHRcdGNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcy5hZGQoaiArIDEpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gUmVjb3JkIHRoaXMgbGluZSBhcyBhIGNvbnRpbnVhdGlvbiBpZiBtYXJrZWQgd2l0aCBhIGNvbnRpbnVhdGlvbiBwcmVmaXhcblx0XHRcdC8vICh0aGF0IHdlIHdpbGwgcmVtb3ZlKS5cblx0XHRcdGlmIChqID4gMCAmJiBjb250aW51YXRpb25GaWx0ZXIgJiYgc3RhcnRzV2l0aChsaW5lLCBjb250aW51YXRpb25GaWx0ZXIpKSB7XG5cdFx0XHRcdGNvZGVMaW5lc1tqXSA9IGxpbmUuc2xpY2UoY29udGludWF0aW9uRmlsdGVyLmxlbmd0aCk7XG5cdFx0XHRcdGNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcy5hZGQoaik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZW52LmNvZGUgPSBjb2RlTGluZXMuam9pbignXFxuJyk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLWluc2VydCcsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgY29tbWFuZExpbmUgPSBnZXRDb21tYW5kTGluZUluZm8oZW52KTtcblxuXHRcdGlmIChjb21tYW5kTGluZS5jb21wbGV0ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlaW5zZXJ0IHRoZSBvdXRwdXQgbGluZXMgaW50byB0aGUgaGlnaGxpZ2h0ZWQgY29kZS4gLS0gY3dlbGxzXG5cdFx0dmFyIGNvZGVMaW5lcyA9IGVudi5oaWdobGlnaHRlZENvZGUuc3BsaXQoJ1xcbicpO1xuXHRcdHZhciBvdXRwdXRMaW5lcyA9IGNvbW1hbmRMaW5lLm91dHB1dExpbmVzIHx8IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwLCBsID0gY29kZUxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0Ly8gQWRkIHNwYW5zIHRvIGFsbG93IGRpc3RpbmN0aW9uIG9mIGlucHV0L291dHB1dCB0ZXh0IGZvciBzdHlsaW5nXG5cdFx0XHRpZiAob3V0cHV0TGluZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdFx0Ly8gb3V0cHV0TGluZXMgd2VyZSByZW1vdmVkIGZyb20gY29kZUxpbmVzIHNvIG1pc3NlZCBvdXQgb24gZXNjYXBpbmdcblx0XHRcdFx0Ly8gb2YgbWFya3VwIHNvIGRvIGl0IGhlcmUuXG5cdFx0XHRcdGNvZGVMaW5lc1tpXSA9ICc8c3BhbiBjbGFzcz1cInRva2VuIG91dHB1dFwiPidcblx0XHRcdFx0XHQrIFByaXNtLnV0aWwuZW5jb2RlKG91dHB1dExpbmVzW2ldKSArICc8L3NwYW4+Jztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvZGVMaW5lc1tpXSA9ICc8c3BhbiBjbGFzcz1cInRva2VuIGNvbW1hbmRcIj4nXG5cdFx0XHRcdFx0KyBjb2RlTGluZXNbaV0gKyAnPC9zcGFuPic7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVudi5oaWdobGlnaHRlZENvZGUgPSBjb2RlTGluZXMuam9pbignXFxuJyk7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnY29tcGxldGUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKCFoYXNDb21tYW5kTGluZUluZm8oZW52KSkge1xuXHRcdFx0Ly8gdGhlIHByZXZpb3VzIGhvb2tzIG5ldmVyIHJhblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjb21tYW5kTGluZSA9IGdldENvbW1hbmRMaW5lSW5mbyhlbnYpO1xuXG5cdFx0aWYgKGNvbW1hbmRMaW5lLmNvbXBsZXRlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIHByZSA9IGVudi5lbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0aWYgKENMQVNTX1BBVFRFUk4udGVzdChlbnYuZWxlbWVudC5jbGFzc05hbWUpKSB7IC8vIFJlbW92ZSB0aGUgY2xhc3MgXCJjb21tYW5kLWxpbmVcIiBmcm9tIHRoZSA8Y29kZT5cblx0XHRcdGVudi5lbGVtZW50LmNsYXNzTmFtZSA9IGVudi5lbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKENMQVNTX1BBVFRFUk4sICcgJyk7XG5cdFx0fVxuXHRcdGlmICghQ0xBU1NfUEFUVEVSTi50ZXN0KHByZS5jbGFzc05hbWUpKSB7IC8vIEFkZCB0aGUgY2xhc3MgXCJjb21tYW5kLWxpbmVcIiB0byB0aGUgPHByZT5cblx0XHRcdHByZS5jbGFzc05hbWUgKz0gJyBjb21tYW5kLWxpbmUnO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldEF0dHJpYnV0ZShrZXksIGRlZmF1bHRWYWx1ZSkge1xuXHRcdFx0cmV0dXJuIChwcmUuZ2V0QXR0cmlidXRlKGtleSkgfHwgZGVmYXVsdFZhbHVlKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3QnKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIFwicm93c1wiIHRoYXQgd2lsbCBiZWNvbWUgdGhlIGNvbW1hbmQtbGluZSBwcm9tcHRzLiAtLSBjd2VsbHNcblx0XHR2YXIgcHJvbXB0TGluZXMgPSAnJztcblx0XHR2YXIgcm93Q291bnQgPSBjb21tYW5kTGluZS5udW1iZXJPZkxpbmVzIHx8IDA7XG5cdFx0dmFyIHByb21wdFRleHQgPSBnZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvbXB0JywgJycpO1xuXHRcdHZhciBwcm9tcHRMaW5lO1xuXHRcdGlmIChwcm9tcHRUZXh0ICE9PSAnJykge1xuXHRcdFx0cHJvbXB0TGluZSA9ICc8c3BhbiBkYXRhLXByb21wdD1cIicgKyBwcm9tcHRUZXh0ICsgJ1wiPjwvc3Bhbj4nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgdXNlciA9IGdldEF0dHJpYnV0ZSgnZGF0YS11c2VyJywgJ3VzZXInKTtcblx0XHRcdHZhciBob3N0ID0gZ2V0QXR0cmlidXRlKCdkYXRhLWhvc3QnLCAnbG9jYWxob3N0Jyk7XG5cdFx0XHRwcm9tcHRMaW5lID0gJzxzcGFuIGRhdGEtdXNlcj1cIicgKyB1c2VyICsgJ1wiIGRhdGEtaG9zdD1cIicgKyBob3N0ICsgJ1wiPjwvc3Bhbj4nO1xuXHRcdH1cblxuXHRcdHZhciBjb250aW51YXRpb25MaW5lSW5kaWNpZXMgPSBjb21tYW5kTGluZS5jb250aW51YXRpb25MaW5lSW5kaWNpZXMgfHwgbmV3IFNldCgpO1xuXHRcdHZhciBjb250aW51YXRpb25Qcm9tcHRUZXh0ID0gZ2V0QXR0cmlidXRlKCdkYXRhLWNvbnRpbnVhdGlvbi1wcm9tcHQnLCAnPicpO1xuXHRcdHZhciBjb250aW51YXRpb25Qcm9tcHRMaW5lID0gJzxzcGFuIGRhdGEtY29udGludWF0aW9uLXByb21wdD1cIicgKyBjb250aW51YXRpb25Qcm9tcHRUZXh0ICsgJ1wiPjwvc3Bhbj4nO1xuXG5cdFx0Ly8gQXNzZW1ibGUgYWxsIHRoZSBhcHByb3ByaWF0ZSBwcm9tcHQvY29udGludWF0aW9uIGxpbmVzXG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCByb3dDb3VudDsgaisrKSB7XG5cdFx0XHRpZiAoY29udGludWF0aW9uTGluZUluZGljaWVzLmhhcyhqKSkge1xuXHRcdFx0XHRwcm9tcHRMaW5lcyArPSBjb250aW51YXRpb25Qcm9tcHRMaW5lO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHJvbXB0TGluZXMgKz0gcHJvbXB0TGluZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIHdyYXBwZXIgZWxlbWVudC4gLS0gY3dlbGxzXG5cdFx0dmFyIHByb21wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRwcm9tcHQuY2xhc3NOYW1lID0gUFJPTVBUX0NMQVNTO1xuXHRcdHByb21wdC5pbm5lckhUTUwgPSBwcm9tcHRMaW5lcztcblxuXHRcdC8vIFJlbW92ZSB0aGUgcHJvbXB0IGZyb20gdGhlIG91dHB1dCBsaW5lcy4gLS0gY3dlbGxzXG5cdFx0dmFyIG91dHB1dExpbmVzID0gY29tbWFuZExpbmUub3V0cHV0TGluZXMgfHwgW107XG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBvdXRwdXRMaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdGlmIChvdXRwdXRMaW5lcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHByb21wdC5jaGlsZHJlbltpXTtcblx0XHRcdFx0bm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdXNlcicpO1xuXHRcdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1ob3N0Jyk7XG5cdFx0XHRcdG5vZGUucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXByb21wdCcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGVudi5lbGVtZW50Lmluc2VydEJlZm9yZShwcm9tcHQsIGVudi5lbGVtZW50LmZpcnN0Q2hpbGQpO1xuXHRcdGNvbW1hbmRMaW5lLmNvbXBsZXRlID0gdHJ1ZTtcblx0fSk7XG5cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxtQkFBa0M7OztBQ3lCM0IsSUFBTSxtQkFBd0M7QUFBQSxFQUNwRCxnQkFBZ0I7QUFBQSxFQUVoQixrQkFBa0I7QUFBQSxFQUNsQixxQkFBcUI7QUFBQSxFQUNyQixxQkFBcUI7QUFBQSxFQUVyQixvQkFBb0I7QUFBQSxFQUNwQixnQkFBZ0I7QUFBQSxFQUVoQixtQkFBbUI7QUFBQSxFQUNuQixpQkFBaUI7QUFBQSxFQUVqQixrQkFBa0I7QUFBQSxFQUVsQixpQkFBaUI7QUFBQSxFQUNqQixvQkFBb0IsQ0FBQyxNQUFNO0FBQUEsRUFDM0IsZUFBZTtBQUFBLEVBRWYsaUJBQWlCO0FBQUEsRUFDakIscUJBQXFCO0FBQUEsRUFFckIsV0FBVztBQUNaOzs7QUNoREEsc0JBQStDO0FBSXhDLElBQU0sZUFBZSxDQUFDLFNBQWlCO0FBQzdDLFNBQU8sZUFBZSxDQUFDLFNBQVM7QUFDL0IsU0FBSyxVQUFVLEVBQUUsWUFBWSxLQUFLLE1BQU0sSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsS0FBSyxNQUFNO0FBQUEsRUFDckYsQ0FBQztBQUNGO0FBRU8sSUFBTSx3QkFBTixjQUFvQyxpQ0FBaUI7QUFBQSxFQUczRCxZQUFZQyxNQUFVLFFBQTJCO0FBQ2hELFVBQU1BLE1BQUssTUFBTTtBQUNqQixTQUFLLFNBQVM7QUFBQSxFQUNmO0FBQUEsRUFFQSxVQUFnQjtBQUNmLFVBQU0sRUFBRSxZQUFZLElBQUk7QUFDeEIsZ0JBQVksTUFBTTtBQUdsQixnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU1QyxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxXQUFXLEVBQ25CLFFBQVEsYUFBYTtBQUFBLHdEQUMrQixDQUFDLEVBQ3JEO0FBQUEsTUFBWSxRQUNaLEdBQUcsV0FBVztBQUFBLFFBQ2Isc0NBQXNDO0FBQUEsUUFDdEMsY0FBYztBQUFBLE1BQ2YsQ0FBQyxFQUNDLFNBQVMsS0FBSyxPQUFPLFNBQVMsY0FBYyxFQUM1QyxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsaUJBQWlCO0FBQ3RDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUdELGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLGtCQUFrQixFQUMxQixRQUFRLGFBQWE7QUFBQTtBQUFBO0FBQUEsMkRBR2tDLENBQUMsRUFDeEQ7QUFBQSxNQUFZLFFBQ1osR0FBRyxXQUFXO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixzQ0FBc0M7QUFBQSxRQUN0QyxzQ0FBc0M7QUFBQSxRQUN0QyxjQUFjO0FBQUEsTUFDZixDQUFDLEVBQ0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxnQkFBZ0IsRUFDOUMsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLG1CQUFtQjtBQUN4QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFFRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSwyQkFBMkIsRUFDbkMsUUFBUSxrREFBa0QsRUFDMUQ7QUFBQSxNQUFRLFFBQ1IsR0FBRyxTQUFTLEtBQUssT0FBTyxTQUFTLG9CQUFvQixTQUFTLENBQUMsRUFDN0QsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGNBQU0sTUFBTSxTQUFTLEtBQUs7QUFDMUIsWUFBSSxNQUFNLEdBQUc7QUFBRztBQUVoQixhQUFLLE9BQU8sU0FBUyxzQkFBc0I7QUFDM0MsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBRUQsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsMkJBQTJCLEVBQ25DO0FBQUEsTUFBVSxRQUNWLEdBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxtQkFBbUIsRUFDbEQsU0FBUyxPQUFPLFVBQW1CO0FBQ25DLGFBQUssT0FBTyxTQUFTLHNCQUFzQjtBQUMzQyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLG9CQUFvQixFQUM1QixRQUFRLGFBQWE7QUFBQSw2REFDb0MsQ0FBQyxFQUMxRDtBQUFBLE1BQVksUUFDWixHQUFHLFdBQVc7QUFBQSxRQUNiLHNDQUFzQztBQUFBLFFBQ3RDLGNBQWM7QUFBQSxNQUNmLENBQUMsRUFDQyxTQUFTLEtBQUssT0FBTyxTQUFTLGtCQUFrQixFQUNoRCxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMscUJBQXFCO0FBQzFDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUVELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLHNCQUFzQixFQUM5QixRQUFRLDJHQUEyRyxFQUNuSDtBQUFBLE1BQVEsUUFDUixHQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsY0FBYyxFQUM3QyxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsaUJBQWlCO0FBQ3RDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUdELGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsd0JBQXdCLEVBQ2hDLFFBQVEsYUFBYTtBQUFBO0FBQUE7QUFBQSxpRUFHd0MsQ0FBQyxFQUM5RDtBQUFBLE1BQVksUUFDWixHQUFHLFdBQVc7QUFBQSxRQUNiLGFBQWE7QUFBQSxRQUNiLHNDQUFzQztBQUFBLFFBQ3RDLHNDQUFzQztBQUFBLFFBQ3RDLGNBQWM7QUFBQSxNQUNmLENBQUMsRUFDQyxTQUFTLEtBQUssT0FBTyxTQUFTLGlCQUFpQixFQUMvQyxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsb0JBQW9CO0FBQ3pDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUVELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLGtCQUFrQixFQUMxQixRQUFRLCtFQUErRSxFQUN2RjtBQUFBLE1BQVEsUUFDUixHQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsZUFBZSxFQUM5QyxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsa0JBQWtCO0FBQ3ZDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUdELGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWxELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLGlCQUFpQixFQUN6QixRQUFRLGFBQWE7QUFBQTtBQUFBO0FBQUEsMERBR2lDLENBQUMsRUFDdkQ7QUFBQSxNQUFZLFFBQ1osR0FBRyxXQUFXO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixzQ0FBc0M7QUFBQSxRQUN0QyxzQ0FBc0M7QUFBQSxRQUN0QyxjQUFjO0FBQUEsTUFDZixDQUFDLEVBQ0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxnQkFBZ0IsRUFDOUMsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLG1CQUFtQjtBQUN4QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFHRCxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3QyxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxZQUFZLEVBQ3BCLFFBQVEsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLGlHQUl3RSxDQUFDLEVBQzlGO0FBQUEsTUFBWSxRQUNaLEdBQUcsV0FBVztBQUFBLFFBQ2IsYUFBYTtBQUFBLFFBQ2Isc0NBQXNDO0FBQUEsUUFDdEMsc0NBQXNDO0FBQUEsUUFDdEMsY0FBYztBQUFBLE1BQ2YsQ0FBQyxFQUNDLFNBQVMsS0FBSyxPQUFPLFNBQVMsZUFBZSxFQUM3QyxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsa0JBQWtCO0FBQ3ZDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUVELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLHFCQUFxQixFQUM3QixRQUFRLG9IQUFvSCxFQUM1SDtBQUFBLE1BQVksUUFDWixHQUFHLFNBQVMsS0FBSyxPQUFPLFNBQVMsbUJBQW1CLEtBQUssSUFBSSxDQUFDLEVBQzVELFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxjQUFNLFFBQVEsTUFBTSxNQUFNLElBQUksRUFBRSxPQUFPLFVBQVEsS0FBSyxLQUFLLE1BQU0sRUFBRTtBQUNqRSxhQUFLLE9BQU8sU0FBUyxxQkFBcUI7QUFDMUMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBRUQsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsZ0JBQWdCLEVBQ3hCLFFBQVEsNENBQTRDLEVBQ3BEO0FBQUEsTUFBUSxRQUNSLEdBQUcsU0FBUyxLQUFLLE9BQU8sU0FBUyxhQUFhLEVBQzVDLFNBQVMsT0FBTyxVQUFrQjtBQUNsQyxhQUFLLE9BQU8sU0FBUyxnQkFBZ0I7QUFDckMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBR0QsZ0JBQVksU0FBUyxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFN0MsUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsWUFBWSxFQUNwQixRQUFRLGFBQWE7QUFBQSx3R0FDK0UsQ0FBQyxFQUNyRztBQUFBLE1BQVksUUFDWixHQUFHLFdBQVc7QUFBQSxRQUNiLFVBQVU7QUFBQSxRQUNWLFdBQVc7QUFBQSxNQUNaLENBQUMsRUFDQyxTQUFTLEtBQUssT0FBTyxTQUFTLGVBQWUsRUFDN0MsU0FBUyxPQUFPLFVBQWtCO0FBQ2xDLGFBQUssT0FBTyxTQUFTLGtCQUFrQjtBQUN2QyxjQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsTUFDaEMsQ0FBQztBQUFBLElBQ0g7QUFFRCxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSx1QkFBdUIsRUFDL0IsUUFBUSw4Q0FBOEMsRUFDdEQ7QUFBQSxNQUFRLFFBQ1IsR0FBRyxTQUFTLEtBQUssT0FBTyxTQUFTLG1CQUFtQixFQUNsRCxTQUFTLE9BQU8sVUFBa0I7QUFDbEMsYUFBSyxPQUFPLFNBQVMsc0JBQXNCO0FBQzNDLGNBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxNQUNoQyxDQUFDO0FBQUEsSUFDSDtBQUdELGdCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLFlBQVksRUFDcEIsUUFBUSwyQkFBMkIsRUFDbkM7QUFBQSxNQUFVLFFBQ1YsR0FBRyxTQUFTLEtBQUssT0FBTyxTQUFTLFNBQVMsRUFDeEMsU0FBUyxPQUFPLFVBQW1CO0FBQ25DLGFBQUssT0FBTyxTQUFTLFlBQVk7QUFDakMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNEOzs7QUMxUUEsSUFBQUMsbUJBQTZCO0FBTTdCLElBQU0sUUFBUTtBQUFBLEVBQ1osT0FBTztBQUFBLEVBQ1AsZ0JBQWdCO0FBQUEsRUFDaEIsb0JBQW9CO0FBQUEsRUFDcEIsV0FBVztBQUFBLEVBQ1gscUJBQXFCO0FBQUEsRUFDckIsaUJBQWlCO0FBQUEsRUFDakIscUJBQXFCO0FBQUEsRUFDckIsZ0JBQWdCO0FBQUEsRUFDaEIsb0JBQW9CO0FBQUEsRUFDcEIsUUFBUTtBQUFBLEVBQ1IsZUFBZTtBQUFBLEVBQ2YsbUJBQW1CO0FBQ3JCO0FBRUEsU0FBUyxRQUFRLE1BQW9CLFdBQXdCLGNBQTBDLFVBZXJHO0FBQ0EsUUFBTSxZQUFZLEtBQUssT0FBTyxRQUFRLGFBQWEsU0FBUyxJQUFJO0FBR2hFLE1BQUksWUFBbUM7QUFDdkMsTUFBSSxRQUFRO0FBQ1osUUFBTSxvQkFBb0IsTUFBTSxNQUFNLEtBQUssU0FBUztBQUNwRCxNQUFJLG1CQUFtQjtBQUNyQixnQkFBWTtBQUNaLFlBQVEsa0JBQWtCLENBQUMsS0FBSyxrQkFBa0IsQ0FBQztBQUFBLEVBQ3JEO0FBR0EsTUFBSSxjQUFxQztBQUN6QyxNQUFJLGVBQWUsU0FBUztBQUM1QixRQUFNLGFBQWEsYUFBYSxVQUFVLGFBQWEsWUFBWTtBQUNuRSxRQUFNLDRCQUE0QixNQUFNLGVBQWUsS0FBSyxTQUFTO0FBQ3JFLFFBQU0sZ0NBQWdDLE1BQU0sbUJBQW1CLEtBQUssU0FBUztBQUM3RSxNQUFJLDJCQUEyQjtBQUM3QixrQkFBYztBQUFBLEVBQ2hCLFdBQVcsK0JBQStCO0FBQ3hDLFFBQUksOEJBQThCLENBQUMsTUFBTSxRQUFRO0FBQy9DLG9CQUFjO0FBQUEsSUFDaEIsV0FBVyw4QkFBOEIsQ0FBQyxNQUFNLFNBQVM7QUFDdkQsb0JBQWM7QUFBQSxJQUNoQixPQUFPO0FBQ0wsb0JBQWM7QUFDZCxxQkFBZSxTQUFTLDhCQUE4QixDQUFDLENBQUMsS0FBSztBQUFBLElBQy9EO0FBQUEsRUFDRjtBQUdBLE1BQUksZ0JBQXVDO0FBQzNDLE1BQUksaUJBQTJCLENBQUM7QUFDaEMsUUFBTSx3QkFBd0IsTUFBTSxVQUFVLEtBQUssU0FBUztBQUM1RCxNQUFJLHVCQUF1QjtBQUN6QixvQkFBZ0I7QUFDaEIsVUFBTSxxQkFBcUIsc0JBQXNCLENBQUMsS0FBSyxzQkFBc0IsQ0FBQztBQUM5RSxxQkFBaUIsbUJBQW1CLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLFNBQVMsSUFBSSxDQUFDO0FBRTNFLFFBQUksZUFBZSxLQUFLLENBQUMsU0FBUyxNQUFNLElBQUksQ0FBQyxHQUFHO0FBRTlDLHNCQUFnQjtBQUNoQix1QkFBaUIsQ0FBQztBQUFBLElBQ3BCLE9BQU87QUFFTCx1QkFBaUIsZUFBZSxPQUFPLENBQUMsU0FBUyxRQUFRLGdCQUFnQixPQUFPLGVBQWUsVUFBVTtBQUFBLElBQzNHO0FBQUEsRUFDRjtBQUdBLE1BQUksZUFBc0M7QUFDMUMsTUFBSSxZQUFZLE1BQU07QUFDcEIsUUFBSUMsWUFBVyxTQUFTO0FBQ3hCLGNBQVUsVUFBVSxRQUFRLENBQUMsY0FBYztBQUN6QyxZQUFNLGdDQUFnQyxNQUFNLG9CQUFvQixLQUFLLFVBQVUsS0FBSyxDQUFDO0FBQ3JGLFVBQUk7QUFBK0IsUUFBQUEsWUFBVyw4QkFBOEIsQ0FBQztBQUFBLElBQy9FLENBQUM7QUFFRCxXQUFPQTtBQUFBLEVBQ1QsR0FBRztBQUNILFFBQU0sNkJBQTZCLE1BQU0sZ0JBQWdCLEtBQUssU0FBUztBQUN2RSxRQUFNLGlDQUFpQyxNQUFNLG9CQUFvQixLQUFLLFNBQVM7QUFDL0UsTUFBSSw0QkFBNEI7QUFDOUIsbUJBQWU7QUFBQSxFQUNqQixXQUFXLGdDQUFnQztBQUN6QyxRQUFJLCtCQUErQixDQUFDLE1BQU0sUUFBUTtBQUNoRCxxQkFBZTtBQUFBLElBQ2pCLFdBQVcsK0JBQStCLENBQUMsTUFBTSxTQUFTO0FBQ3hELHFCQUFlO0FBQUEsSUFDakIsT0FBTztBQUNMLHFCQUFlO0FBQ2YsaUJBQVcsK0JBQStCLENBQUMsS0FBSywrQkFBK0IsQ0FBQztBQUFBLElBQ2xGO0FBQUEsRUFDRjtBQUdBLE1BQUksY0FBcUM7QUFDekMsUUFBTSw0QkFBNEIsTUFBTSxlQUFlLEtBQUssU0FBUztBQUNyRSxRQUFNLGdDQUFnQyxNQUFNLG1CQUFtQixLQUFLLFNBQVM7QUFDN0UsTUFBSSwyQkFBMkI7QUFDN0Isa0JBQWM7QUFBQSxFQUNoQixXQUFXLCtCQUErQjtBQUN4QyxRQUFJLDhCQUE4QixDQUFDLE1BQU0sUUFBUTtBQUMvQyxvQkFBYztBQUFBLElBQ2hCLFdBQVcsOEJBQThCLENBQUMsTUFBTSxTQUFTO0FBQ3ZELG9CQUFjO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBR0EsTUFBSSxhQUFvQztBQUN4QyxNQUFJLFNBQVMsU0FBUztBQUN0QixRQUFNLDJCQUEyQixNQUFNLGNBQWMsS0FBSyxTQUFTO0FBQ25FLFFBQU0sK0JBQStCLE1BQU0sa0JBQWtCLEtBQUssU0FBUztBQUMzRSxNQUFJLDBCQUEwQjtBQUM1QixpQkFBYTtBQUFBLEVBQ2YsV0FBVyw4QkFBOEI7QUFDdkMsUUFBSSw2QkFBNkIsQ0FBQyxNQUFNLFFBQVE7QUFDOUMsbUJBQWE7QUFBQSxJQUNmLFdBQVcsNkJBQTZCLENBQUMsTUFBTSxTQUFTO0FBQ3RELG1CQUFhO0FBQUEsSUFDZixPQUFPO0FBQ0wsbUJBQWE7QUFDYixlQUFTLDZCQUE2QixDQUFDLEtBQUssNkJBQTZCLENBQUM7QUFBQSxJQUM1RTtBQUFBLEVBQ0Y7QUFHQSxNQUFJLFdBQVc7QUFDZixNQUFJLGVBQWUsU0FBUztBQUM1QixRQUFNLHFCQUFxQixNQUFNLE9BQU8sS0FBSyxTQUFTO0FBQ3RELFFBQU0sMkJBQTJCLE1BQU0sa0JBQWtCLEtBQUssU0FBUztBQUN2RSxNQUFJLG9CQUFvQjtBQUN0QixlQUFXO0FBR1gsZ0JBQVk7QUFDWixtQkFBZTtBQUNmLGtCQUFjO0FBQ2QsaUJBQWE7QUFFYixRQUFJLDBCQUEwQjtBQUM1QixxQkFBZSx5QkFBeUIsQ0FBQyxLQUFLLHlCQUF5QixDQUFDO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBRUEsZUFBc0IscUJBQ3BCLElBQ0EsU0FDQSxRQUNBO0FBQ0EsUUFBTSxXQUFXLE9BQU87QUFFeEIsUUFBTSxPQUFPLElBQUksVUFBVSxvQkFBb0IsNkJBQVk7QUFDM0QsTUFBSSxDQUFDO0FBQU07QUFFWCxRQUFNLFlBQWtDLEdBQUcsY0FBYyw4QkFBOEI7QUFDdkYsTUFBSSxDQUFDO0FBQVc7QUFFaEIsUUFBTSxXQUFpQyxVQUFVO0FBQ2pELE1BQUksQ0FBQztBQUFVO0FBRWYsUUFBTSxXQUFpQyxTQUFTO0FBQ2hELE1BQUksQ0FBQztBQUFVO0FBRWYsUUFBTSxlQUFxQyxTQUFTLGNBQWMsbUJBQW1CO0FBQ3JGLE1BQUksQ0FBQztBQUFjO0FBRW5CLFFBQU0sZUFBb0QsUUFBUSxlQUFlLFNBQVM7QUFDMUYsTUFBSSxDQUFDO0FBQWM7QUFHbkIsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJLFFBQVEsTUFBTSxXQUFXLGNBQWMsUUFBUTtBQUVuRCxNQUFJLFNBQVMsV0FBVztBQUN0QixZQUFRLElBQUk7QUFBQSxNQUNWO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFHQSxXQUFTLFVBQVUsSUFBSSxjQUFjO0FBQ3JDLFlBQVUsVUFBVSxJQUFJLG1CQUFtQjtBQUMzQyxlQUFhLE9BQU87QUFFcEIsTUFBSSxTQUFTLG1CQUFtQix3Q0FBeUMsY0FBYyxNQUFPO0FBQzVGLGFBQVMsVUFBVSxJQUFJLHlCQUF5QjtBQUVoRCxVQUFNLGFBQWEsU0FBUyxjQUFjLEtBQUs7QUFDL0MsZUFBVyxVQUFVLElBQUksb0JBQW9CO0FBQzdDLGVBQVcsWUFBWTtBQUN2QixhQUFTLGFBQWEsWUFBWSxRQUFRO0FBQUEsRUFDNUM7QUFFQSxNQUNHLFNBQVMscUJBQXFCLGVBQzlCLFNBQVMscUJBQXFCLHlDQUF5QyxnQkFBZ0IsVUFBYSxnQkFBZ0IsU0FDcEgsU0FBUyxxQkFBcUIsd0NBQXlDLGdCQUFnQixNQUN4RjtBQUNBLGFBQVMsVUFBVSxJQUFJLDJCQUEyQjtBQUVsRCxVQUFNLGVBQWUsU0FBUyxjQUFjLE1BQU07QUFDbEQsaUJBQWEsVUFBVSxJQUFJLHNCQUFzQjtBQUNqRCxpQkFBYSxZQUFZLE1BQU0sVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLFFBQVEsTUFBTSxZQUFZLEVBQUUsS0FBSyxJQUFJO0FBQ2hHLGFBQVMsYUFBYSxjQUFjLFNBQVM7QUFFN0MsUUFBSSxTQUFTLHFCQUFxQjtBQUNoQyxtQkFBYSxVQUFVLElBQUksZUFBZTtBQUFBLElBQzVDO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUyx1QkFBdUIsd0NBQXlDLGtCQUFrQixNQUFPO0FBQ3BHLGFBQVMsVUFBVSxJQUFJLDZCQUE2QjtBQUVwRCxhQUFTLE1BQU0sWUFBWSw2Q0FBNkMsU0FBUyxjQUFjO0FBRS9GLFVBQU0saUJBQWlCLFNBQVMsY0FBYyxNQUFNO0FBQ3BELG1CQUFlLFVBQVUsSUFBSSx3QkFBd0I7QUFDckQsbUJBQWUsWUFBWSxNQUFNLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxRQUFRO0FBQ25FLFlBQU0sYUFBdUIsQ0FBQztBQUM5QixVQUFJLGVBQWUsU0FBUyxNQUFNLFlBQVk7QUFBRyxtQkFBVyxLQUFLLFdBQVc7QUFDNUUsYUFBTywwQkFBMEIsTUFBTSxnQkFBZ0IsV0FBVyxLQUFLLEdBQUc7QUFBQSxJQUM1RSxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBQ1osYUFBUyxhQUFhLGdCQUFnQixTQUFTO0FBQUEsRUFDakQ7QUFFQSxNQUNHLFNBQVMsc0JBQXNCLGVBQy9CLFNBQVMsc0JBQXNCLHlDQUF5QyxpQkFBaUIsVUFBYSxpQkFBaUIsU0FDdkgsU0FBUyxzQkFBc0Isd0NBQXlDLGlCQUFpQixNQUMxRjtBQUNBLGFBQVMsVUFBVSxJQUFJLDRCQUE0QjtBQUVuRCxVQUFNLGdCQUFnQixTQUFTLGNBQWMsS0FBSztBQUNsRCxrQkFBYyxVQUFVLElBQUksdUJBQXVCO0FBQ25ELGtCQUFjLFlBQVk7QUFDMUIsYUFBUyxRQUFRLGFBQWE7QUFBQSxFQUNoQztBQUVBLE1BQ0csU0FBUyxxQkFBcUIsZUFDOUIsU0FBUyxxQkFBcUIseUNBQXlDLGdCQUFnQixVQUFhLGdCQUFnQixTQUNwSCxTQUFTLHFCQUFxQix3Q0FBeUMsZ0JBQWdCLE1BQ3hGO0FBQ0EsYUFBUyxVQUFVLElBQUksMkJBQTJCO0FBRWxELGFBQVMsWUFBWSxZQUFZO0FBQUEsRUFDbkM7QUFFQSxNQUNHLFNBQVMsb0JBQW9CLGVBQWUsU0FBUyxtQkFBbUIsU0FBUyxRQUFRLEtBQ3pGLFNBQVMsb0JBQW9CLHdDQUF3QyxTQUFTLG1CQUFtQixTQUFTLFFBQVEsTUFBTSxlQUFlLFVBQWEsZUFBZSxTQUNuSyxTQUFTLG9CQUFvQix3Q0FBeUMsZUFBZSxNQUN0RjtBQUNBLGFBQVMsVUFBVSxJQUFJLDBCQUEwQjtBQUdqRCxRQUFJLGFBQWEsVUFBVSxVQUFVLE1BQU0sSUFBSTtBQUMvQyxRQUFJLFdBQVcsV0FBVyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVTtBQUFHLGlCQUFXLElBQUk7QUFFekUsVUFBTSxzQkFBc0IsV0FBVyxJQUFJLENBQUMsTUFBTSxRQUFRO0FBQ3hELFVBQUksS0FBSyxLQUFLLEVBQUUsVUFBVTtBQUFHLGVBQVEsTUFBTTtBQUMzQyxVQUFJLEtBQUssV0FBVyxHQUFHO0FBQUcsZUFBUSxNQUFNO0FBQ3hDLGFBQU87QUFBQSxJQUNULENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxPQUFPLEVBQUU7QUFFNUIsYUFBUyxVQUFVLElBQUksY0FBYztBQUNyQyxhQUFTLGFBQWEsZUFBZSxNQUFNO0FBQzNDLGFBQVMsYUFBYSx5QkFBeUIsSUFBSTtBQUNuRCxhQUFTLGFBQWEsNEJBQTRCLElBQUksT0FBTyxPQUFPLE1BQU0sQ0FBQztBQUMzRSxhQUFTLGFBQWEsZUFBZSxvQkFBb0IsS0FBSyxJQUFJLENBQUM7QUFBQSxFQUNyRTtBQUVBLE1BQUcsU0FBUyxvQkFBb0IsWUFBYSxhQUFhLE1BQU87QUFDL0QsYUFBUyxVQUFVLElBQUkscUJBQXFCO0FBQzVDLGNBQVUsVUFBVSxJQUFJLDBCQUEwQjtBQUVsRCxhQUFTLGFBQWEsc0JBQXNCLFlBQVk7QUFBQSxFQUMxRDtBQUNGOzs7QUN0Vk8sU0FBUyx3QkFBd0IsT0FBTztBQUU5QyxNQUFJLE9BQU8sVUFBVSxlQUFlLE9BQU8sYUFBYSxhQUFhO0FBQ3BFO0FBQUEsRUFDRDtBQUVBLE1BQUksZ0JBQWdCO0FBQ3BCLE1BQUksZUFBZTtBQUduQixNQUFJLGFBQWEsR0FBRyxhQUNqQixTQUFVLEdBQUcsR0FBRztBQUFFLFdBQU8sRUFBRSxXQUFXLENBQUM7QUFBQSxFQUFHLElBQzFDLFNBQVUsR0FBRyxHQUFHO0FBQUUsV0FBTyxFQUFFLFFBQVEsQ0FBQyxNQUFNO0FBQUEsRUFBRztBQUloRCxNQUFJLFdBQVcsR0FBRyxXQUNmLFNBQVUsS0FBSyxRQUFRO0FBQ3hCLFdBQU8sSUFBSSxTQUFTLE1BQU07QUFBQSxFQUMzQixJQUNFLFNBQVUsS0FBSyxRQUFRO0FBQ3hCLFFBQUksTUFBTSxJQUFJO0FBQ2QsV0FBTyxJQUFJLFVBQVUsTUFBTSxPQUFPLFFBQVEsR0FBRyxNQUFNO0FBQUEsRUFDcEQ7QUFRRCxXQUFTLG1CQUFtQixLQUFLO0FBQ2hDLFFBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxRQUFRLENBQUM7QUFDbkMsV0FBTyxrQkFBa0I7QUFBQSxFQUMxQjtBQVlBLFdBQVMsbUJBQW1CLEtBQUs7QUFDaEMsUUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLFFBQVEsQ0FBQztBQUNuQyxXQUFPLEtBQUssY0FBYyxJQUFJLEtBQUssY0FBYyxLQUFLLENBQUM7QUFBQSxFQUN4RDtBQUdBLFFBQU0sTUFBTSxJQUFJLG9CQUFvQixTQUFVLEtBQUs7QUFDbEQsUUFBSSxjQUFjLG1CQUFtQixHQUFHO0FBRXhDLFFBQUksWUFBWSxZQUFZLENBQUMsSUFBSSxNQUFNO0FBQ3RDLGtCQUFZLFdBQVc7QUFDdkI7QUFBQSxJQUNEO0FBR0EsUUFBSSxNQUFNLElBQUksUUFBUTtBQUN0QixRQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLFFBQVE7QUFBQSxJQUNuQyxDQUFDLGNBQWMsS0FBSyxJQUFJLFNBQVMsS0FBSyxDQUFDLGNBQWMsS0FBSyxJQUFJLFFBQVEsU0FBUyxHQUFJO0FBQ3BGLGtCQUFZLFdBQVc7QUFDdkI7QUFBQSxJQUNEO0FBR0EsUUFBSSxpQkFBaUIsSUFBSSxRQUFRLGNBQWMsTUFBTSxZQUFZO0FBQ2pFLFFBQUksZ0JBQWdCO0FBQ25CLHFCQUFlLE9BQU87QUFBQSxJQUN2QjtBQUVBLFFBQUksWUFBWSxJQUFJLEtBQUssTUFBTSxJQUFJO0FBRW5DLFFBQUcsVUFBVSxVQUFVLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEdBQUc7QUFDdkQsa0JBQVksZ0JBQWdCLFVBQVUsU0FBUztBQUFBLElBQ2hELE9BQU87QUFDTixrQkFBWSxnQkFBZ0IsVUFBVTtBQUFBLElBQ3ZDO0FBRUEsUUFBSSxjQUFjLFlBQVksY0FBYyxDQUFDO0FBRTdDLFFBQUksaUJBQWlCLElBQUksYUFBYSxhQUFhO0FBQ25ELFFBQUksZUFBZSxJQUFJLGFBQWEsb0JBQW9CO0FBQ3hELFFBQUksbUJBQW1CLE1BQU07QUFDNUIscUJBQWUsTUFBTSxHQUFHLEVBQUUsUUFBUSxTQUFVLFNBQVM7QUFDcEQsWUFBSSxRQUFRLFFBQVEsTUFBTSxHQUFHO0FBQzdCLFlBQUksY0FBYyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFDdkMsWUFBSSxZQUFZLE1BQU0sV0FBVyxJQUFJLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJO0FBRTlELFlBQUksQ0FBQyxNQUFNLFdBQVcsS0FBSyxDQUFDLE1BQU0sU0FBUyxHQUFHO0FBQzdDLGNBQUksY0FBYyxHQUFHO0FBQ3BCLDBCQUFjO0FBQUEsVUFDZjtBQUNBLGNBQUksWUFBWSxVQUFVLFFBQVE7QUFDakMsd0JBQVksVUFBVTtBQUFBLFVBQ3ZCO0FBRUE7QUFDQTtBQUVBLG1CQUFTQyxLQUFJLGFBQWFBLE1BQUssV0FBV0EsTUFBSztBQUM5Qyx3QkFBWUEsRUFBQyxJQUFJLFVBQVVBLEVBQUM7QUFDNUIsc0JBQVVBLEVBQUMsSUFBSTtBQUFBLFVBQ2hCO0FBQUEsUUFDRDtBQUFBLE1BQ0QsQ0FBQztBQUFBLElBQ0YsV0FBVyxjQUFjO0FBQ3hCLGVBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDMUMsWUFBSSxXQUFXLFVBQVUsQ0FBQyxHQUFHLFlBQVksR0FBRztBQUMzQyxzQkFBWSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsTUFBTSxhQUFhLE1BQU07QUFDdkQsb0JBQVUsQ0FBQyxJQUFJO0FBQUEsUUFDaEI7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUVBLFFBQUksMkJBQTJCLFlBQVksMkJBQTJCLG9CQUFJLElBQUk7QUFDOUUsUUFBSSxzQkFBc0IsSUFBSSxhQUFhLHVCQUF1QjtBQUNsRSxRQUFJLHFCQUFxQixJQUFJLGFBQWEsMEJBQTBCO0FBTXBFLGFBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDMUMsVUFBSSxPQUFPLFVBQVUsQ0FBQztBQUN0QixVQUFJLENBQUMsTUFBTTtBQUNWO0FBQUEsTUFDRDtBQUdBLFVBQUksdUJBQXVCLFNBQVMsTUFBTSxtQkFBbUIsR0FBRztBQUMvRCxpQ0FBeUIsSUFBSSxJQUFJLENBQUM7QUFBQSxNQUNuQztBQUdBLFVBQUksSUFBSSxLQUFLLHNCQUFzQixXQUFXLE1BQU0sa0JBQWtCLEdBQUc7QUFDeEUsa0JBQVUsQ0FBQyxJQUFJLEtBQUssTUFBTSxtQkFBbUIsTUFBTTtBQUNuRCxpQ0FBeUIsSUFBSSxDQUFDO0FBQUEsTUFDL0I7QUFBQSxJQUNEO0FBRUEsUUFBSSxPQUFPLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDL0IsQ0FBQztBQUVELFFBQU0sTUFBTSxJQUFJLGlCQUFpQixTQUFVLEtBQUs7QUFDL0MsUUFBSSxjQUFjLG1CQUFtQixHQUFHO0FBRXhDLFFBQUksWUFBWSxVQUFVO0FBQ3pCO0FBQUEsSUFDRDtBQUdBLFFBQUksWUFBWSxJQUFJLGdCQUFnQixNQUFNLElBQUk7QUFDOUMsUUFBSSxjQUFjLFlBQVksZUFBZSxDQUFDO0FBQzlDLGFBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLElBQUksR0FBRyxLQUFLO0FBRWpELFVBQUksWUFBWSxlQUFlLENBQUMsR0FBRztBQUdsQyxrQkFBVSxDQUFDLElBQUksZ0NBQ1osTUFBTSxLQUFLLE9BQU8sWUFBWSxDQUFDLENBQUMsSUFBSTtBQUFBLE1BQ3hDLE9BQU87QUFDTixrQkFBVSxDQUFDLElBQUksaUNBQ1osVUFBVSxDQUFDLElBQUk7QUFBQSxNQUNuQjtBQUFBLElBQ0Q7QUFDQSxRQUFJLGtCQUFrQixVQUFVLEtBQUssSUFBSTtBQUFBLEVBQzFDLENBQUM7QUFFRCxRQUFNLE1BQU0sSUFBSSxZQUFZLFNBQVUsS0FBSztBQUMxQyxRQUFJLENBQUMsbUJBQW1CLEdBQUcsR0FBRztBQUU3QjtBQUFBLElBQ0Q7QUFFQSxRQUFJLGNBQWMsbUJBQW1CLEdBQUc7QUFFeEMsUUFBSSxZQUFZLFVBQVU7QUFDekI7QUFBQSxJQUNEO0FBRUEsUUFBSSxNQUFNLElBQUksUUFBUTtBQUN0QixRQUFJLGNBQWMsS0FBSyxJQUFJLFFBQVEsU0FBUyxHQUFHO0FBQzlDLFVBQUksUUFBUSxZQUFZLElBQUksUUFBUSxVQUFVLFFBQVEsZUFBZSxHQUFHO0FBQUEsSUFDekU7QUFDQSxRQUFJLENBQUMsY0FBYyxLQUFLLElBQUksU0FBUyxHQUFHO0FBQ3ZDLFVBQUksYUFBYTtBQUFBLElBQ2xCO0FBRUEsYUFBUyxhQUFhLEtBQUssY0FBYztBQUN4QyxjQUFRLElBQUksYUFBYSxHQUFHLEtBQUssY0FBYyxRQUFRLE1BQU0sT0FBTztBQUFBLElBQ3JFO0FBR0EsUUFBSSxjQUFjO0FBQ2xCLFFBQUksV0FBVyxZQUFZLGlCQUFpQjtBQUM1QyxRQUFJLGFBQWEsYUFBYSxlQUFlLEVBQUU7QUFDL0MsUUFBSTtBQUNKLFFBQUksZUFBZSxJQUFJO0FBQ3RCLG1CQUFhLHdCQUF3QixhQUFhO0FBQUEsSUFDbkQsT0FBTztBQUNOLFVBQUksT0FBTyxhQUFhLGFBQWEsTUFBTTtBQUMzQyxVQUFJLE9BQU8sYUFBYSxhQUFhLFdBQVc7QUFDaEQsbUJBQWEsc0JBQXNCLE9BQU8sa0JBQWtCLE9BQU87QUFBQSxJQUNwRTtBQUVBLFFBQUksMkJBQTJCLFlBQVksNEJBQTRCLG9CQUFJLElBQUk7QUFDL0UsUUFBSSx5QkFBeUIsYUFBYSw0QkFBNEIsR0FBRztBQUN6RSxRQUFJLHlCQUF5QixxQ0FBcUMseUJBQXlCO0FBRzNGLGFBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxLQUFLO0FBQ2xDLFVBQUkseUJBQXlCLElBQUksQ0FBQyxHQUFHO0FBQ3BDLHVCQUFlO0FBQUEsTUFDaEIsT0FBTztBQUNOLHVCQUFlO0FBQUEsTUFDaEI7QUFBQSxJQUNEO0FBR0EsUUFBSSxTQUFTLFNBQVMsY0FBYyxNQUFNO0FBQzFDLFdBQU8sWUFBWTtBQUNuQixXQUFPLFlBQVk7QUFHbkIsUUFBSSxjQUFjLFlBQVksZUFBZSxDQUFDO0FBQzlDLGFBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxRQUFRLElBQUksR0FBRyxLQUFLO0FBQ25ELFVBQUksWUFBWSxlQUFlLENBQUMsR0FBRztBQUNsQyxZQUFJLE9BQU8sT0FBTyxTQUFTLENBQUM7QUFDNUIsYUFBSyxnQkFBZ0IsV0FBVztBQUNoQyxhQUFLLGdCQUFnQixXQUFXO0FBQ2hDLGFBQUssZ0JBQWdCLGFBQWE7QUFBQSxNQUNuQztBQUFBLElBQ0Q7QUFFQSxRQUFJLFFBQVEsYUFBYSxRQUFRLElBQUksUUFBUSxVQUFVO0FBQ3ZELGdCQUFZLFdBQVc7QUFBQSxFQUN4QixDQUFDO0FBRUY7OztBSnpPQSxJQUFxQixvQkFBckIsY0FBK0Msd0JBQU87QUFBQSxFQUdyRCxNQUFNLFNBQVM7QUFDZCxVQUFNLEtBQUssYUFBYTtBQUN4QixRQUFJLEtBQUssU0FBUyxXQUFXO0FBQzVCLGNBQVEsSUFBSSw0QkFBNEI7QUFBQSxJQUN6QztBQUVBLFVBQU0sUUFBUSxVQUFNLDRCQUFVO0FBRzlCLDRCQUF3QixLQUFLO0FBRzdCLFNBQUssY0FBYyxJQUFJLHNCQUFzQixLQUFLLEtBQUssSUFBSSxDQUFDO0FBRzVELFVBQU0sWUFBWSxLQUFLLDhCQUE4QixDQUFDLElBQUksUUFBUTtBQUNqRSwyQkFBcUIsSUFBSSxLQUFLLElBQUk7QUFBQSxJQUNuQyxDQUFDO0FBRUQsY0FBVSxZQUFZO0FBQUEsRUFDdkI7QUFBQSxFQUVBLFdBQVc7QUFDVixRQUFJLEtBQUssU0FBUyxXQUFXO0FBQzVCLGNBQVEsSUFBSSw4QkFBOEI7QUFBQSxJQUMzQztBQUFBLEVBQ0Q7QUFBQSxFQUVBLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxrQkFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQzFFO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsVUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsRUFDbEM7QUFDRDsiLAogICJuYW1lcyI6IFsiaW1wb3J0X29ic2lkaWFuIiwgImFwcCIsICJpbXBvcnRfb2JzaWRpYW4iLCAibGFuZ3VhZ2UiLCAiaiJdCn0K
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ3MudHMiLCAiLi4vc3JjL0hLQ29kZUJsb2NrU2V0dGluZ1RhYi50cyIsICIuLi9zcmMvSEtDb2RlQmxvY2tQcm9jZXNzb3IudHMiLCAiLi4vc3JjL3ByaXNtLXBsdWdpbnMvcHJpc20tY29tbWFuZC1saW5lLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBQbHVnaW4sIGxvYWRQcmlzbSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSAnLi9IS0NvZGVCbG9ja1NldHRpbmdzJztcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MgfSBmcm9tICcuL0hLQ29kZUJsb2NrU2V0dGluZ3MnO1xuaW1wb3J0IHsgSEtDb2RlQmxvY2tTZXR0aW5nVGFiIH0gZnJvbSAnLi9IS0NvZGVCbG9ja1NldHRpbmdUYWInO1xuaW1wb3J0IHsgSEtDb2RlQmxvY2tQcm9jZXNzb3IgfSBmcm9tICcuL0hLQ29kZUJsb2NrUHJvY2Vzc29yJztcblxuaW1wb3J0IHsgUHJpc21QbHVnaW5fQ29tbWFuZExpbmUgfSBmcm9tICcuL3ByaXNtLXBsdWdpbnMvcHJpc20tY29tbWFuZC1saW5lJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSEtDb2RlQmxvY2tQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncztcblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Z01vZGUpIHtcblx0XHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgUHJpc20gPSBhd2FpdCBsb2FkUHJpc20oKTtcblxuXHRcdC8vIGFjdGl2YXRlIFByaXNtLmpzIHBsdWdpbnNcblx0XHRQcmlzbVBsdWdpbl9Db21tYW5kTGluZShQcmlzbSk7XG5cblx0XHQvLyByZWdpc3RlciBzZXR0aW5ncyB0YWJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEhLQ29kZUJsb2NrU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgbWFya2Rvd24gcG9zdCBwcm9jZXNzb3Jcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Qb3N0UHJvY2Vzc29yKChlbCwgY3R4KSA9PiB7XG5cdFx0XHRIS0NvZGVCbG9ja1Byb2Nlc3NvcihlbCwgY3R4LCB0aGlzKTtcblx0XHR9KTtcblxuXHRcdHByb2Nlc3Nvci5zb3J0T3JkZXIgPSAxMDA7IC8vIHJ1biBhZnRlciB0aGUgZGVmYXVsdCBjb2RlIGJsb2NrIHByb2Nlc3NvclxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWdNb2RlKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcInVubG9hZGluZyBIS0NvZGVCbG9jayBwbHVnaW5cIik7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn0iLCAiZXhwb3J0IGludGVyZmFjZSBIS0NvZGVCbG9ja1NldHRpbmdzIHtcblx0dXNlVGl0bGVHbG9iYWw6IChcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblxuXHR1c2VDb2xsYXBzaWJsZUdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRkZWZhdWx0Q29sbGFwc2U6IChcImNvbGxhcHNlXCIgfCBcImV4cGFuZFwiKTtcblx0c2hvd0NvbGxhcHNlQnRuOiBib29sZWFuO1xuXG5cdHVzZUxpbmVub3NHbG9iYWw6IChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0ZGVmYXVsdExpbmVub3NTdGFydDogbnVtYmVyO1xuXHRzaG93TGluZW5vc1NwbGl0dGVyOiBib29sZWFuO1xuXG5cdHVzZUhpZ2hsaWdodEdsb2JhbDogKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRoaWdobGlnaHRDb2xvcjogc3RyaW5nO1xuXG5cdHVzZUxhbmd1YWdlR2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRMYW5ndWFnZTogc3RyaW5nO1xuXHRcblx0dXNlQ29weUJ0bkdsb2JhbDogKFwiYWx3YXlzIG9uXCIgfCBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIiB8IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcblx0dXNlUHJvbXB0R2xvYmFsOiAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdGRlZmF1bHRQcm9tcHQ6IHN0cmluZztcblx0XG5cdHVzZVJlc3VsdEdsb2JhbDogKFwiZW5hYmxlXCIgfCBcImRpc2FibGVcIik7XG5cdHByb21wdGluZ0xhbmd1YWdlczogc3RyaW5nW107XG5cdGRlZmF1bHRSZXN1bHRQcm9tcHQ6IHN0cmluZztcblxuXHRkZWJ1Z01vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBIS0NvZGVCbG9ja1NldHRpbmdzID0ge1xuXHR1c2VUaXRsZUdsb2JhbDogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cblx0dXNlQ29sbGFwc2libGVHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0Q29sbGFwc2U6IFwiZXhwYW5kXCIsXG5cdHNob3dDb2xsYXBzZUJ0bjogdHJ1ZSxcblxuXHR1c2VMaW5lbm9zR2xvYmFsOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0ZGVmYXVsdExpbmVub3NTdGFydDogMSxcblx0c2hvd0xpbmVub3NTcGxpdHRlcjogdHJ1ZSxcblxuXHR1c2VIaWdobGlnaHRHbG9iYWw6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRoaWdobGlnaHRDb2xvcjogXCIjZmYwMDAwXCIsXG5cblx0dXNlTGFuZ3VhZ2VHbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRkZWZhdWx0TGFuZ3VhZ2U6IFwicGxhaW4gdGV4dFwiLFxuXG5cdHVzZUNvcHlCdG5HbG9iYWw6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXG5cdHVzZVByb21wdEdsb2JhbDogXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIsXG5cdHByb21wdGluZ0xhbmd1YWdlczogW1wiYmFzaFwiXSxcblx0ZGVmYXVsdFByb21wdDogXCIkXCIsXG5cblx0dXNlUmVzdWx0R2xvYmFsOiBcImVuYWJsZVwiLFxuXHRkZWZhdWx0UmVzdWx0UHJvbXB0OiBcIlJlc3VsdFwiLFxuXG5cdGRlYnVnTW9kZTogZmFsc2UsXG59IiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEhLQ29kZUJsb2NrUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbmV4cG9ydCBjb25zdCBmcmFnV2l0aEhUTUwgPSAodGV4dDogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBjcmVhdGVGcmFnbWVudCgoZnJhZykgPT4ge1xuXHRcdGZyYWcuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdGV4dC5zcGxpdChcIlxcblwiKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5qb2luKFwiPGJyPlwiKTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBIS0NvZGVCbG9ja1NldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBIS0NvZGVCbG9ja1BsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Ly8gdGl0bGVcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaXRsZScgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgVGl0bGUnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogdGhlIHRpdGxlIHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgdGl0bGUgc3RhdGVtZW50IGlzIHNwZWNpZmllZFxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIHRpdGxlIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VUaXRsZUdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBjb2xsYXBzZVxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0NvbGxhcHNlJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBDb2xsYXBzZScpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IHRoZSBjb2RlIGJsb2NrIHdpbGwgYWx3YXlzIGJlIGNvbGxhcHNpYmxlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIGFsd2F5cyBiZSBjb2xsYXBzaWJsZSwgYnV0IHdpbGwgbm90IGJlIGNvbGxhcHNlZCBpZiBjb2xsYXBzZSBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiB0aGUgY29kZSBibG9jayB3aWxsIG9ubHkgYmUgY29sbGFwc2libGUgaWYgdGhlIGNvbGxhcHNlIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogdGhlIGNvZGUgYmxvY2sgd2lsbCBuZXZlciBiZSBjb2xsYXBzaWJsZWApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgQ29sbGFwc2UgU3RhdGUnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGNvbGxhcHNlIHN0YXRlIG9mIHRoZSBjb2RlIGJsb2NrLicpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJjb2xsYXBzZVwiOiBcImNvbGxhcHNlXCIsXG5cdFx0XHRcdFx0XCJleHBhbmRcIjogXCJleHBhbmRcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdENvbGxhcHNlID0gdmFsdWUgYXMgKFwiY29sbGFwc2VcIiB8IFwiZXhwYW5kXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBsaW5lIG51bWJlcnNcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIE51bWJlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExpbmUgTnVtYmVycycpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxpbmUgbnVtYmVycyB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgbGluZW5vcyBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsaW5lIG51bWJlcnMgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lbm9zIHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogbGluZSBudW1iZXJzIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VMaW5lbm9zR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCBMaW5lIE51bWJlciBTdGFydCcpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGRlZmF1bHQgbGluZSBudW1iZXIgc3RhcnQgb2YgdGhlIGNvZGUgYmxvY2suJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQudG9TdHJpbmcoKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG51bSA9IHBhcnNlSW50KHZhbHVlKTtcblx0XHRcdFx0XHRcdGlmIChpc05hTihudW0pKSByZXR1cm47XG5cblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQgPSBudW07XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Nob3cgTGluZSBOdW1iZXIgU3BsaXR0ZXInKVxuXHRcdFx0LmFkZFRvZ2dsZSh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dMaW5lbm9zU3BsaXR0ZXIgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGluZSBoaWdobGlnaHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMaW5lIEhpZ2hsaWdodCcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgTGluZSBIaWdobGlnaHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGluZSBoaWdobGlnaHQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsaW5lIGhpZ2hsaWdodCBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsaW5lIGhpZ2hsaWdodCB3aWxsIG5ldmVyIGJlIHNob3duYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiYWx3YXlzIG9mZlwiOiBcImFsd2F5cyBvZmZcIixcblx0XHRcdFx0fSlcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlSGlnaGxpZ2h0R2xvYmFsID0gdmFsdWUgYXMgKFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiIHwgXCJhbHdheXMgb2ZmXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdMaW5lIEhpZ2hsaWdodCBDb2xvcicpXG5cdFx0XHQuc2V0RGVzYygnVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGhpZ2hsaWdodGVkIGxpbmUuIE5vdGUgdGhhdCB0aGUgZ2l2ZW4gY29sb3Igd2lsbCBiZSBhcHBsaWVkIHdpdGggMC4yIG9wYWNpdHkuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmhpZ2hsaWdodENvbG9yKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gbGFuZ3VhZ2Vcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdMYW5ndWFnZSBJbmRpY2F0b3InIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIExhbmd1YWdlIEluZGljYXRvcicpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+YWx3YXlzIG9uPC9iPiA6IGxhbmd1YWdlIGluZGljYXRvciB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogbGFuZ3VhZ2UgaW5kaWNhdG9yIHdpbGwgYWx3YXlzIGJlIHNob3duLCBidXQgd2lsbCBub3QgYmUgc2hvd24gaWYgdGhlIGxhbmd1YWdlIGluZGljYXRvciBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIGZhbHNlXG5cdFx0XHRcdC0gPGI+ZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZDwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBsYW5ndWFnZSBpbmRpY2F0b3Igc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyB0cnVlXG5cdFx0XHRcdC0gPGI+YWx3YXlzIG9mZjwvYj4gOiBsYW5ndWFnZSBpbmRpY2F0b3Igd2lsbCBuZXZlciBiZSBzaG93bmApKVxuXHRcdFx0LmFkZERyb3Bkb3duKHRjID0+XG5cdFx0XHRcdHRjLmFkZE9wdGlvbnMoe1xuXHRcdFx0XHRcdFwiYWx3YXlzIG9uXCI6IFwiYWx3YXlzIG9uXCIsXG5cdFx0XHRcdFx0XCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCI6IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImFsd2F5cyBvZmZcIjogXCJhbHdheXMgb2ZmXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlTGFuZ3VhZ2VHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0RlZmF1bHQgTGFuZ3VhZ2UnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBkZWZhdWx0IGxhbmd1YWdlIG5hbWUgb2YgdGhlIGNvZGUgYmxvY2sgaWYgdGhlIGxhbmd1YWdlIGlzIG5vdCBzcGVjaWZpZWQuJylcblx0XHRcdC5hZGRUZXh0KHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRMYW5ndWFnZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XG5cdFx0Ly8gY29weSBidXR0b25cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdDb3B5IEJ1dHRvbicgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdVc2UgQ29weSBCdXR0b24nKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBjb3B5IGJ1dHRvbiB3aWxsIGFsd2F5cyBiZSBzaG93blxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBhbHdheXMgYmUgc2hvd24sIGJ1dCB3aWxsIG5vdCBiZSBzaG93biBpZiB0aGUgY29weSBidXR0b24gc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogY29weSBidXR0b24gd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSBjb3B5IGJ1dHRvbiBzdGF0ZW1lbnQgaXMgc3BlY2lmaWVkIGFzIHRydWVcblx0XHRcdFx0LSA8Yj5hbHdheXMgb2ZmPC9iPiA6IGNvcHkgYnV0dG9uIHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9IHZhbHVlIGFzIChcImFsd2F5cyBvblwiIHwgXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgfCBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiB8IFwiYWx3YXlzIG9mZlwiKTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0Ly8gcHJvbXB0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiAnUHJvbXB0JyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1VzZSBQcm9tcHQnKVxuXHRcdFx0LnNldERlc2MoZnJhZ1dpdGhIVE1MKGAtIDxiPmFsd2F5cyBvbjwvYj4gOiBwcm9tcHQgd2lsbCBhbHdheXMgYmUgc2hvd25cblx0XHRcdFx0LSA8Yj5kZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkPC9iPiA6IHByb21wdCB3aWxsIGFsd2F5cyBiZSBzaG93biwgYnV0IHdpbGwgbm90IGJlIHNob3duIGlmIHRoZSBwcm9tcHQgc3RhdGVtZW50IGlzIHNwZWNpZmllZCBhcyBmYWxzZVxuXHRcdFx0XHQtIDxiPmRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWQ8L2I+IDogcHJvbXB0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgcHJvbXB0IHN0YXRlbWVudCBpcyBzcGVjaWZpZWQgYXMgdHJ1ZVxuXHRcdFx0XHQtIDxiPmFsd2F5cyBvZmY8L2I+IDogcHJvbXB0IHdpbGwgbmV2ZXIgYmUgc2hvd25gKSlcblx0XHRcdC5hZGREcm9wZG93bih0YyA9PlxuXHRcdFx0XHR0Yy5hZGRPcHRpb25zKHtcblx0XHRcdFx0XHRcImFsd2F5cyBvblwiOiBcImFsd2F5cyBvblwiLFxuXHRcdFx0XHRcdFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiOiBcImRlZmF1bHQgb24sIGJ1dCBvZmYgd2hlbiBzcGVjaWZpZWRcIixcblx0XHRcdFx0XHRcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIjogXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIsXG5cdFx0XHRcdFx0XCJhbHdheXMgb2ZmXCI6IFwiYWx3YXlzIG9mZlwiLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPSB2YWx1ZSBhcyAoXCJhbHdheXMgb25cIiB8IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiIHwgXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgfCBcImFsd2F5cyBvZmZcIik7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1Byb21wdGluZyBMYW5ndWFnZXMnKVxuXHRcdFx0LnNldERlc2MoJ1RoZSBsYW5ndWFnZXMgdGhhdCB3aWxsIGJlIHByb21wdGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBsYW5ndWFnZXMgYnkgc2VwYXJhdGluZyB0aGVtIHdpdGggZW50ZXJzLicpXG5cdFx0XHQuYWRkVGV4dEFyZWEodGMgPT5cblx0XHRcdFx0dGMuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0aW5nTGFuZ3VhZ2VzLmpvaW4oXCJcXG5cIikpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcihsaW5lID0+IGxpbmUudHJpbSgpICE9PSBcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcyA9IGxpbmVzO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBQcm9tcHRcIilcblx0XHRcdC5zZXREZXNjKFwiVGhlIGRlZmF1bHQgcHJvbXB0IG9mIHRoZSBiYXNoIGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyByZXN1bHRcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdSZXN1bHQnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnVXNlIFJlc3VsdCcpXG5cdFx0XHQuc2V0RGVzYyhmcmFnV2l0aEhUTUwoYC0gPGI+ZW5hYmxlPC9iPiA6IHRyZWF0IHRoZSBjb2RlIGJsb2NrIHN0YXJ0cyBsaWtlIFxcYFxcYFxcYFxcYHJlc3VsdFxcYCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBhZGphY2VudCBwcmV2aW91cyBjb2RlIGJsb2NrXG5cdFx0XHRcdC0gPGI+ZGlzYWJsZTwvYj4gOiB0cmVhdCB0aGUgY29kZSBibG9jayB3aXRoIFxcYHJlc3VsdFxcYCBhcyBpdHMgbGFuZ3VhZ2UgbmFtZSBhcyBhIG5vcm1hbCBjb2RlIGJsb2NrYCkpXG5cdFx0XHQuYWRkRHJvcGRvd24odGMgPT5cblx0XHRcdFx0dGMuYWRkT3B0aW9ucyh7XG5cdFx0XHRcdFx0XCJlbmFibGVcIjogXCJlbmFibGVcIixcblx0XHRcdFx0XHRcImRpc2FibGVcIjogXCJkaXNhYmxlXCIsXG5cdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVJlc3VsdEdsb2JhbCA9IHZhbHVlIGFzIChcImVuYWJsZVwiIHwgXCJkaXNhYmxlXCIpO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGVmYXVsdCBSZXN1bHQgUHJvbXB0XCIpXG5cdFx0XHQuc2V0RGVzYyhcIlRoZSBkZWZhdWx0IHByb21wdCBvZiB0aGUgcmVzdWx0IGNvZGUgYmxvY2suXCIpXG5cdFx0XHQuYWRkVGV4dCh0YyA9PlxuXHRcdFx0XHR0Yy5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0UmVzdWx0UHJvbXB0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHQvLyBmb3IgZGV2ZWxvcGVyc1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogJ0RldmVsb3BlcnMnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVidWcgTW9kZScpXG5cdFx0XHQuc2V0RGVzYygnU2hvdyBsb2dzIGluIHRoZSBjb25zb2xlLicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRjID0+XG5cdFx0XHRcdHRjLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnTW9kZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z01vZGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHR9XG59IiwgImltcG9ydCB7IE1hcmtkb3duVmlldyB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blNlY3Rpb25JbmZvcm1hdGlvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgSEtDb2RlQmxvY2tQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHR5cGUgeyBIS0NvZGVCbG9ja1NldHRpbmdzIH0gZnJvbSBcIi4vSEtDb2RlQmxvY2tTZXR0aW5nc1wiO1xuXG5jb25zdCBSRUdFWCA9IHtcbiAgVElUTEU6IC9cXHN0aXRsZTooPzonKC4qPyknfFwiKC4qPylcIilcXHMvLFxuICBDT0xMQVBTSUJMRV9TSU1QTEU6IC9cXHNjb2xsYXBzaWJsZVxccy8sXG4gIENPTExBUFNJQkxFX0NPTVBMSUNBVEU6IC9cXHNjb2xsYXBzaWJsZToodHJ1ZXxmYWxzZSlcXHMvLFxuICBMSU5FTk9TX1NJTVBMRTogL1xcc2xpbmVub3NcXHMvLFxuICBMSU5FTk9TX0NPTVBMSUNBVEU6IC9cXHNsaW5lbm9zOih0cnVlfGZhbHNlfCgtezAsMX1cXGQrKSlcXHMvLFxuICBISUdITElHSFQ6IC9cXHNoaWdobGlnaHQ6KD86JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgTEFOR1VBR0VfRlJPTV9DTEFTUzogL15sYW5ndWFnZS0oXFx3KykkLyxcbiAgTEFOR1VBR0VfU0lNUExFOiAvXFxzbGFuZ3VhZ2VcXHMvLFxuICBMQU5HVUFHRV9DT01QTElDQVRFOiAvXFxzbGFuZ3VhZ2U6KHRydWV8ZmFsc2V8JyguKj8pJ3xcIiguKj8pXCIpXFxzLyxcbiAgQ09QWUJUTl9TSU1QTEU6IC9cXHNjb3B5YnRuXFxzLyxcbiAgQ09QWUJUTl9DT01QTElDQVRFOiAvXFxzY29weWJ0bjoodHJ1ZXxmYWxzZSlcXHMvLFxuICBSRVNVTFQ6IC9eYGBgcmVzdWx0XFxzLyxcbiAgUFJPTVBUX1NJTVBMRTogL1xcc3Byb21wdFxccy8sXG4gIFBST01QVF9DT01QTElDQVRFOiAvXFxzcHJvbXB0Oih0cnVlfGZhbHNlfCcoLio/KSd8XCIoLio/KVwiKVxccy8sXG59XG5cbmZ1bmN0aW9uIGdldE1ldGEodmlldzogTWFya2Rvd25WaWV3LCBlbGVtX2NvZGU6IEhUTUxFbGVtZW50LCBzZWN0aW9uX2NvZGU6IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLCBzZXR0aW5nczogSEtDb2RlQmxvY2tTZXR0aW5ncyk6IHtcbiAgc2hvd1RpdGxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCksXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGlzQ29sbGFwc2libGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgbGluZW5vc1N0YXJ0OiBudW1iZXIsXG4gIGxpbmVub3NOdW06IG51bWJlcixcbiAgc2hvd0hpZ2hsaWdodDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBoaWdobGlnaHRMaW5lczogbnVtYmVyW10sXG4gIHNob3dMYW5ndWFnZTogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpLFxuICBpc1Jlc3VsdDogYm9vbGVhbixcbiAgcmVzdWx0UHJvbXB0OiBzdHJpbmcsXG4gIHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSxcbiAgcHJvbXB0OiBzdHJpbmdcbn0ge1xuICBjb25zdCBmaXJzdGxpbmUgPSB2aWV3LmVkaXRvci5nZXRMaW5lKHNlY3Rpb25fY29kZS5saW5lU3RhcnQpICsgXCIgXCI7IC8vIGFkZCBhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgdG8gbWFrZSBzdXJlIHRoZSByZWdleCB3b3Jrc1xuXG4gIC8vIHRpdGxlXG4gIGxldCBzaG93VGl0bGU6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IHRpdGxlID0gXCJcIjtcbiAgY29uc3QgcmVnZXhSZXN1bHRfdGl0bGUgPSBSRUdFWC5USVRMRS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF90aXRsZSkge1xuICAgIHNob3dUaXRsZSA9IHRydWU7XG4gICAgdGl0bGUgPSByZWdleFJlc3VsdF90aXRsZVsxXSB8fCByZWdleFJlc3VsdF90aXRsZVsyXTtcbiAgfVxuXG4gIC8vIGNvbGxhcHNpYmxlXG4gIGxldCBpc0NvbGxhcHNpYmxlOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlU2ltcGxlID0gUkVHRVguQ09MTEFQU0lCTEVfU0lNUExFLmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfY29sbGFwc2libGVDb21wbGljYXRlID0gUkVHRVguQ09MTEFQU0lCTEVfQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZVNpbXBsZSkge1xuICAgIGlzQ29sbGFwc2libGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9jb2xsYXBzaWJsZUNvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICBpc0NvbGxhcHNpYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvbGxhcHNpYmxlQ29tcGxpY2F0ZVsxXSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICBpc0NvbGxhcHNpYmxlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbGluZW5vc1xuICBsZXQgc2hvd0xpbmVub3M6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IGxpbmVub3NTdGFydCA9IHNldHRpbmdzLmRlZmF1bHRMaW5lbm9zU3RhcnQ7XG4gIGNvbnN0IGxpbmVub3NOdW0gPSBzZWN0aW9uX2NvZGUubGluZUVuZCAtIHNlY3Rpb25fY29kZS5saW5lU3RhcnQgLSAxO1xuICBjb25zdCByZWdleFJlc3VsdF9saW5lbm9zU2ltcGxlID0gUkVHRVguTElORU5PU19TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9saW5lbm9zQ29tcGxpY2F0ZSA9IFJFR0VYLkxJTkVOT1NfQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9saW5lbm9zU2ltcGxlKSB7XG4gICAgc2hvd0xpbmVub3MgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2xpbmVub3NDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0xpbmVub3MgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgc2hvd0xpbmVub3MgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd0xpbmVub3MgPSB0cnVlO1xuICAgICAgbGluZW5vc1N0YXJ0ID0gcGFyc2VJbnQocmVnZXhSZXN1bHRfbGluZW5vc0NvbXBsaWNhdGVbMl0pIHx8IDE7XG4gICAgfVxuICB9XG5cbiAgLy8gaGlnaGxpZ2h0XG4gIGxldCBzaG93SGlnaGxpZ2h0OiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkgPSB1bmRlZmluZWQ7XG4gIGxldCBoaWdobGlnaHRMaW5lczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcmVnZXhSZXN1bHRfaGlnaGxpZ2h0ID0gUkVHRVguSElHSExJR0hULmV4ZWMoZmlyc3RsaW5lKTtcbiAgaWYgKHJlZ2V4UmVzdWx0X2hpZ2hsaWdodCkge1xuICAgIHNob3dIaWdobGlnaHQgPSB0cnVlO1xuICAgIGNvbnN0IGhpZ2hsaWdodExpbmVzX3N0ciA9IHJlZ2V4UmVzdWx0X2hpZ2hsaWdodFsxXSB8fCByZWdleFJlc3VsdF9oaWdobGlnaHRbMl07XG4gICAgaGlnaGxpZ2h0TGluZXMgPSBoaWdobGlnaHRMaW5lc19zdHIuc3BsaXQoXCIsXCIpLm1hcCgobGluZSkgPT4gcGFyc2VJbnQobGluZSkpO1xuXG4gICAgaWYgKGhpZ2hsaWdodExpbmVzLnNvbWUoKGxpbmUpID0+IGlzTmFOKGxpbmUpKSkge1xuICAgICAgLy8gaWYgYW55IGVsZW1lbnQgaXMgbmFuLCB0aGVuIHNldCBzaG93SGlnaGxpZ2h0IHRvIGZhbHNlXG4gICAgICBzaG93SGlnaGxpZ2h0ID0gdW5kZWZpbmVkO1xuICAgICAgaGlnaGxpZ2h0TGluZXMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXNlIG9ubHkgdmFsaWQgbGluZSBudW1iZXJzXG4gICAgICBoaWdobGlnaHRMaW5lcyA9IGhpZ2hsaWdodExpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSA+PSBsaW5lbm9zU3RhcnQgJiYgbGluZSA8IGxpbmVub3NTdGFydCArIGxpbmVub3NOdW0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxhbmd1YWdlXG4gIGxldCBzaG93TGFuZ3VhZ2U6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IGxhbmd1YWdlID0gKCgpID0+IHtcbiAgICBsZXQgbGFuZ3VhZ2UgPSBzZXR0aW5ncy5kZWZhdWx0TGFuZ3VhZ2U7XG4gICAgZWxlbV9jb2RlLmNsYXNzTGlzdC5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzID0gUkVHRVguTEFOR1VBR0VfRlJPTV9DTEFTUy5leGVjKGNsYXNzTmFtZS50cmltKCkpO1xuICAgICAgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzKSBsYW5ndWFnZSA9IHJlZ2V4UmVzdWx0X2xhbmd1YWdlRnJvbUNsYXNzWzFdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmd1YWdlO1xuICB9KSgpO1xuICBjb25zdCByZWdleFJlc3VsdF9sYW5ndWFnZVNpbXBsZSA9IFJFR0VYLkxBTkdVQUdFX1NJTVBMRS5leGVjKGZpcnN0bGluZSk7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZSA9IFJFR0VYLkxBTkdVQUdFX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VTaW1wbGUpIHtcbiAgICBzaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2xhbmd1YWdlQ29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbMV0gPT09IFwidHJ1ZVwiKSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dMYW5ndWFnZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93TGFuZ3VhZ2UgPSB0cnVlO1xuICAgICAgbGFuZ3VhZ2UgPSByZWdleFJlc3VsdF9sYW5ndWFnZUNvbXBsaWNhdGVbMl0gfHwgcmVnZXhSZXN1bHRfbGFuZ3VhZ2VDb21wbGljYXRlWzNdO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvcHkgYnV0dG9uXG4gIGxldCBzaG93Q29weUJ0bjogKGJvb2xlYW4gfCB1bmRlZmluZWQpID0gdW5kZWZpbmVkO1xuICBjb25zdCByZWdleFJlc3VsdF9jb3B5QnRuU2ltcGxlID0gUkVHRVguQ09QWUJUTl9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9jb3B5QnRuQ29tcGxpY2F0ZSA9IFJFR0VYLkNPUFlCVE5fQ09NUExJQ0FURS5leGVjKGZpcnN0bGluZSk7XG4gIGlmIChyZWdleFJlc3VsdF9jb3B5QnRuU2ltcGxlKSB7XG4gICAgc2hvd0NvcHlCdG4gPSB0cnVlO1xuICB9IGVsc2UgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlKSB7XG4gICAgaWYgKHJlZ2V4UmVzdWx0X2NvcHlCdG5Db21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd0NvcHlCdG4gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfY29weUJ0bkNvbXBsaWNhdGVbMV0gPT09IFwiZmFsc2VcIikge1xuICAgICAgc2hvd0NvcHlCdG4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm9tcHRcbiAgbGV0IHNob3dQcm9tcHQ6IChib29sZWFuIHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgbGV0IHByb21wdCA9IHNldHRpbmdzLmRlZmF1bHRQcm9tcHQ7XG4gIGNvbnN0IHJlZ2V4UmVzdWx0X3Byb21wdFNpbXBsZSA9IFJFR0VYLlBST01QVF9TSU1QTEUuZXhlYyhmaXJzdGxpbmUpO1xuICBjb25zdCByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlID0gUkVHRVguUFJPTVBUX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfcHJvbXB0U2ltcGxlKSB7XG4gICAgc2hvd1Byb21wdCA9IHRydWU7XG4gIH0gZWxzZSBpZiAocmVnZXhSZXN1bHRfcHJvbXB0Q29tcGxpY2F0ZSkge1xuICAgIGlmIChyZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzFdID09PSBcInRydWVcIikge1xuICAgICAgc2hvd1Byb21wdCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzFdID09PSBcImZhbHNlXCIpIHtcbiAgICAgIHNob3dQcm9tcHQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1Byb21wdCA9IHRydWU7XG4gICAgICBwcm9tcHQgPSByZWdleFJlc3VsdF9wcm9tcHRDb21wbGljYXRlWzJdIHx8IHJlZ2V4UmVzdWx0X3Byb21wdENvbXBsaWNhdGVbM107XG4gICAgfVxuICB9XG5cbiAgLy8gcmVzdWx0XG4gIGxldCBpc1Jlc3VsdCA9IGZhbHNlO1xuICBsZXQgcmVzdWx0UHJvbXB0ID0gc2V0dGluZ3MuZGVmYXVsdFJlc3VsdFByb21wdDtcbiAgY29uc3QgcmVnZXhSZXN1bHRfcmVzdWx0ID0gUkVHRVguUkVTVUxULmV4ZWMoZmlyc3RsaW5lKTtcbiAgY29uc3QgcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0ID0gUkVHRVguUFJPTVBUX0NPTVBMSUNBVEUuZXhlYyhmaXJzdGxpbmUpO1xuICBpZiAocmVnZXhSZXN1bHRfcmVzdWx0KSB7XG4gICAgaXNSZXN1bHQgPSB0cnVlO1xuXG4gICAgLy8gb3ZlcnJpZGUgb3RoZXIgbWV0YSBkYXRhIDogb25seSBsaW5lbm9zLCBoaWdobGlnaHQgYXJlIGF2YWlsYWJsZVxuICAgIHNob3dUaXRsZSA9IGZhbHNlO1xuICAgIHNob3dMYW5ndWFnZSA9IGZhbHNlO1xuICAgIHNob3dDb3B5QnRuID0gZmFsc2U7XG4gICAgc2hvd1Byb21wdCA9IGZhbHNlO1xuXG4gICAgaWYgKHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdCkge1xuICAgICAgcmVzdWx0UHJvbXB0ID0gcmVnZXhSZXN1bHRQcm9tcHRfcmVzdWx0WzJdIHx8IHJlZ2V4UmVzdWx0UHJvbXB0X3Jlc3VsdFszXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNob3dUaXRsZTogc2hvd1RpdGxlLFxuICAgIHRpdGxlOiB0aXRsZSxcbiAgICBpc0NvbGxhcHNpYmxlOiBpc0NvbGxhcHNpYmxlLFxuICAgIHNob3dMaW5lbm9zOiBzaG93TGluZW5vcyxcbiAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICBsaW5lbm9zTnVtOiBsaW5lbm9zTnVtLFxuICAgIHNob3dIaWdobGlnaHQ6IHNob3dIaWdobGlnaHQsXG4gICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgIHNob3dMYW5ndWFnZTogc2hvd0xhbmd1YWdlLFxuICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgaXNSZXN1bHQ6IGlzUmVzdWx0LFxuICAgIHJlc3VsdFByb21wdDogcmVzdWx0UHJvbXB0LFxuICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgcHJvbXB0OiBwcm9tcHRcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEhLQ29kZUJsb2NrUHJvY2Vzc29yKFxuICBlbDogSFRNTEVsZW1lbnQsXG4gIGNvbnRleHQ6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsXG4gIHBsdWdpbjogSEtDb2RlQmxvY2tQbHVnaW5cbikge1xuICBjb25zdCBzZXR0aW5ncyA9IHBsdWdpbi5zZXR0aW5ncztcblxuICBjb25zdCB2aWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gIGlmICghdmlldykgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fY29kZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbC5xdWVyeVNlbGVjdG9yKFwicHJlOm5vdCguZnJvbnRtYXR0ZXIpID4gY29kZVwiKTtcbiAgaWYgKCFlbGVtX2NvZGUpIHJldHVybjtcblxuICBjb25zdCBlbGVtX3ByZTogKEhUTUxFbGVtZW50IHwgbnVsbCkgPSBlbGVtX2NvZGUucGFyZW50RWxlbWVudDtcbiAgaWYgKCFlbGVtX3ByZSkgcmV0dXJuO1xuXG4gIGNvbnN0IGVsZW1fZGl2OiAoSFRNTEVsZW1lbnQgfCBudWxsKSA9IGVsZW1fcHJlLnBhcmVudEVsZW1lbnQ7XG4gIGlmICghZWxlbV9kaXYpIHJldHVybjtcblxuICBjb25zdCBlbGVtX2NvcHlCdG46IChIVE1MRWxlbWVudCB8IG51bGwpID0gZWxlbV9kaXYucXVlcnlTZWxlY3RvcihcIi5jb3B5LWNvZGUtYnV0dG9uXCIpO1xuICBpZiAoIWVsZW1fY29weUJ0bikgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25fY29kZTogKE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uIHwgbnVsbCkgPSBjb250ZXh0LmdldFNlY3Rpb25JbmZvKGVsZW1fY29kZSk7XG4gIGlmICghc2VjdGlvbl9jb2RlKSByZXR1cm47XG5cbiAgLy8gZ2V0IG1ldGFkYXRhXG4gIGNvbnN0IHtcbiAgICBzaG93VGl0bGUsXG4gICAgdGl0bGUsXG4gICAgaXNDb2xsYXBzaWJsZSxcbiAgICBzaG93TGluZW5vcyxcbiAgICBsaW5lbm9zU3RhcnQsXG4gICAgbGluZW5vc051bSxcbiAgICBzaG93SGlnaGxpZ2h0LFxuICAgIGhpZ2hsaWdodExpbmVzLFxuICAgIHNob3dMYW5ndWFnZSxcbiAgICBsYW5ndWFnZSxcbiAgICBzaG93Q29weUJ0bixcbiAgICBpc1Jlc3VsdCxcbiAgICByZXN1bHRQcm9tcHQsXG4gICAgc2hvd1Byb21wdCxcbiAgICBwcm9tcHRcbiAgfSA9IGdldE1ldGEodmlldywgZWxlbV9jb2RlLCBzZWN0aW9uX2NvZGUsIHNldHRpbmdzKTtcblxuICBpZiAoc2V0dGluZ3MuZGVidWdNb2RlKSB7XG4gICAgY29uc29sZS5sb2coe1xuICAgICAgc2hvd1RpdGxlOiBzaG93VGl0bGUsXG4gICAgICB0aXRsZTogdGl0bGUsXG4gICAgICBzaG93TGluZW5vczogc2hvd0xpbmVub3MsXG4gICAgICBsaW5lbm9zU3RhcnQ6IGxpbmVub3NTdGFydCxcbiAgICAgIGxpbmVub3NOdW06IGxpbmVub3NOdW0sXG4gICAgICBzaG93SGlnaGxpZ2h0OiBzaG93SGlnaGxpZ2h0LFxuICAgICAgaGlnaGxpZ2h0TGluZXM6IGhpZ2hsaWdodExpbmVzLFxuICAgICAgc2hvd0xhbmd1YWdlOiBzaG93TGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICBzaG93Q29weUJ0bjogc2hvd0NvcHlCdG4sXG4gICAgICBpc1Jlc3VsdDogaXNSZXN1bHQsXG4gICAgICByZXN1bHRQcm9tcHQ6IHJlc3VsdFByb21wdCxcbiAgICAgIHNob3dQcm9tcHQ6IHNob3dQcm9tcHQsXG4gICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICB9KVxuICB9XG5cbiAgLy8gY3JlYXRlIEhUTUwgZWxlbWVudHNcbiAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9ja1wiKTtcbiAgZWxlbV9jb2RlLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29kZVwiKTtcbiAgZWxlbV9jb3B5QnRuLnJlbW92ZSgpOyAvLyByZW1vdmUgdGhlIG9yaWdpbmFsIGNvcHkgYnV0dG9uIGFzIGRlZmF1bHRcblxuICBsZXQgZWxlbV90aXRsZTogKEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkKSA9IHVuZGVmaW5lZDtcbiAgaWYgKHNldHRpbmdzLnVzZVRpdGxlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd1RpdGxlID09PSB0cnVlKSkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy10aXRsZVwiKTtcblxuICAgIGVsZW1fdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVsZW1fdGl0bGUuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay10aXRsZVwiKTtcbiAgICBlbGVtX3RpdGxlLmlubmVySFRNTCA9IHRpdGxlO1xuICAgIGVsZW1fZGl2Lmluc2VydEJlZm9yZShlbGVtX3RpdGxlLCBlbGVtX3ByZSk7XG4gIH1cblxuICBpZiAoXG4gICAgKHNldHRpbmdzLnVzZUNvbGxhcHNpYmxlR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb2xsYXBzaWJsZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKGlzQ29sbGFwc2libGUgPT09IHVuZGVmaW5lZCB8fCBpc0NvbGxhcHNpYmxlID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlQ29sbGFwc2libGVHbG9iYWwgPT09IFwiZGVmYXVsdCBvZmYsIGJ1dCBvbiB3aGVuIHNwZWNpZmllZFwiICYmIChpc0NvbGxhcHNpYmxlID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzaWJsZVwiKTtcblxuICAgIGlmIChzZXR0aW5ncy5kZWZhdWx0Q29sbGFwc2UgPT09IFwiY29sbGFwc2VcIikge1xuICAgICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1fdGl0bGUpIHtcbiAgICAgIGVsZW1fdGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldikgPT4ge1xuICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGVsZW1fZGl2LmNsYXNzTGlzdC5jb250YWlucyhcImhrLWNvZGVibG9jay1jb2xsYXBzZWRcIikpIHtcbiAgICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1fY29sbGFwc2VCdG5zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1fY29sbGFwc2VCdG5zLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2UtYnRuc1wiKTtcblxuICAgICAgY29uc3QgZWxlbV9jb2xsYXBzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRuLmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stY29sbGFwc2UtYnRuXCIsIFwiaGstY29kZWJsb2NrLWNvbGxhcHNlZC1idG5cIik7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRuLmlubmVySFRNTCA9IGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNMTAgMTlhMSAxIDAgMCAxLS42NC0uMjMgMSAxIDAgMCAxLS4xMy0xLjQxTDEzLjcxIDEyIDkuMzkgNi42M2ExIDEgMCAwIDEgLjE1LTEuNDEgMSAxIDAgMCAxIDEuNDYuMTVsNC44MyA2YTEgMSAwIDAgMSAwIDEuMjdsLTUgNkExIDEgMCAwIDEgMTAgMTl6XCIvPlxuICAgICAgPC9zdmc+YDtcbiAgICAgIGVsZW1fY29sbGFwc2VCdG5zLmFwcGVuZENoaWxkKGVsZW1fY29sbGFwc2VCdG4pO1xuXG4gICAgICBjb25zdCBlbGVtX2V4cGFuZEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtX2V4cGFuZEJ0bi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0blwiLCBcImhrLWNvZGVibG9jay1leHBhbmRlZC1idG5cIik7XG4gICAgICBlbGVtX2V4cGFuZEJ0bi5pbm5lckhUTUwgPSBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICA8cGF0aCBkPVwiTTEyIDE2YTEgMSAwIDAgMS0uNjQtLjIzbC02LTVhMSAxIDAgMSAxIDEuMjgtMS41NEwxMiAxMy43MWw1LjM2LTQuMzJhMSAxIDAgMCAxIDEuNDEuMTUgMSAxIDAgMCAxLS4xNCAxLjQ2bC02IDQuODNBMSAxIDAgMCAxIDEyIDE2elwiLz5cbiAgICAgIDwvc3ZnPmA7XG4gICAgICBlbGVtX2NvbGxhcHNlQnRucy5hcHBlbmRDaGlsZChlbGVtX2V4cGFuZEJ0bik7XG5cbiAgICAgIGVsZW1fdGl0bGUucHJlcGVuZChlbGVtX2NvbGxhcHNlQnRucyk7XG4gICAgfVxuICB9XG5cblxuICBpZiAoXG4gICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiYWx3YXlzIG9uXCIpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxpbmVub3NHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIChzaG93TGluZW5vcyA9PT0gdW5kZWZpbmVkIHx8IHNob3dMaW5lbm9zID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlTGluZW5vc0dsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMaW5lbm9zID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWxpbmVub3NcIik7XG5cbiAgICBjb25zdCBlbGVtX2xpbmVub3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29kZVwiKTtcbiAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1saW5lbm9zXCIpO1xuICAgIGVsZW1fbGluZW5vcy5pbm5lclRleHQgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiBpZHggKyBsaW5lbm9zU3RhcnQpLmpvaW4oXCJcXG5cIik7XG4gICAgZWxlbV9wcmUuaW5zZXJ0QmVmb3JlKGVsZW1fbGluZW5vcywgZWxlbV9jb2RlKTtcblxuICAgIGlmIChzZXR0aW5ncy5zaG93TGluZW5vc1NwbGl0dGVyKSB7XG4gICAgICBlbGVtX2xpbmVub3MuY2xhc3NMaXN0LmFkZChcInNob3ctc3BsaXR0ZXJcIik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNldHRpbmdzLnVzZUhpZ2hsaWdodEdsb2JhbCA9PT0gXCJkZWZhdWx0IG9mZiwgYnV0IG9uIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dIaWdobGlnaHQgPT09IHRydWUpKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWhpZ2hsaWdodFwiKTtcblxuICAgIGVsZW1fZGl2LnN0eWxlLnNldFByb3BlcnR5KFwiLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3JcIiwgc2V0dGluZ3MuaGlnaGxpZ2h0Q29sb3IpO1xuXG4gICAgY29uc3QgZWxlbV9oaWdobGlnaHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29kZVwiKTtcbiAgICBlbGVtX2hpZ2hsaWdodC5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWhpZ2hsaWdodFwiKTtcbiAgICBlbGVtX2hpZ2hsaWdodC5pbm5lckhUTUwgPSBBcnJheShsaW5lbm9zTnVtKS5maWxsKDApLm1hcCgoXywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKGhpZ2hsaWdodExpbmVzLmluY2x1ZGVzKGlkeCArIGxpbmVub3NTdGFydCkpIGNsYXNzTmFtZXMucHVzaChcImhpZ2hsaWdodFwiKTtcbiAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJsaW5lIGxpbmUtJHtpZHggKyBsaW5lbm9zU3RhcnR9ICR7Y2xhc3NOYW1lcy5qb2luKFwiIFwiKX1cIj4gPC9zcGFuPmA7XG4gICAgfSkuam9pbihcIlxcblwiKTtcbiAgICBlbGVtX3ByZS5pbnNlcnRCZWZvcmUoZWxlbV9oaWdobGlnaHQsIGVsZW1fY29kZSk7XG4gIH1cblxuICBpZiAoXG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImFsd2F5cyBvblwiKSB8fFxuICAgIChzZXR0aW5ncy51c2VMYW5ndWFnZUdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dMYW5ndWFnZSA9PT0gdW5kZWZpbmVkIHx8IHNob3dMYW5ndWFnZSA9PT0gdHJ1ZSkpIHx8XG4gICAgKHNldHRpbmdzLnVzZUxhbmd1YWdlR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0xhbmd1YWdlID09PSB0cnVlKSlcbiAgKSB7XG4gICAgZWxlbV9kaXYuY2xhc3NMaXN0LmFkZChcImhrLWNvZGVibG9jay1zaG93LWxhbmd1YWdlXCIpO1xuXG4gICAgY29uc3QgZWxlbV9sYW5ndWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWxlbV9sYW5ndWFnZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLWxhbmd1YWdlXCIpO1xuICAgIGVsZW1fbGFuZ3VhZ2UuaW5uZXJUZXh0ID0gbGFuZ3VhZ2U7XG4gICAgZWxlbV9wcmUucHJlcGVuZChlbGVtX2xhbmd1YWdlKTtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9PT0gXCJhbHdheXMgb25cIikgfHxcbiAgICAoc2V0dGluZ3MudXNlQ29weUJ0bkdsb2JhbCA9PT0gXCJkZWZhdWx0IG9uLCBidXQgb2ZmIHdoZW4gc3BlY2lmaWVkXCIgJiYgKHNob3dDb3B5QnRuID09PSB1bmRlZmluZWQgfHwgc2hvd0NvcHlCdG4gPT09IHRydWUpKSB8fFxuICAgIChzZXR0aW5ncy51c2VDb3B5QnRuR2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd0NvcHlCdG4gPT09IHRydWUpKVxuICApIHtcbiAgICBlbGVtX2Rpdi5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXNob3ctY29weWJ0blwiKTtcblxuICAgIGVsZW1fcHJlLmFwcGVuZENoaWxkKGVsZW1fY29weUJ0bik7XG4gIH1cblxuICBpZiAoXG4gICAgKHNldHRpbmdzLnVzZVByb21wdEdsb2JhbCA9PT0gXCJhbHdheXMgb25cIiAmJiBzZXR0aW5ncy5wcm9tcHRpbmdMYW5ndWFnZXMuaW5jbHVkZXMobGFuZ3VhZ2UpKSB8fFxuICAgIChzZXR0aW5ncy51c2VQcm9tcHRHbG9iYWwgPT09IFwiZGVmYXVsdCBvbiwgYnV0IG9mZiB3aGVuIHNwZWNpZmllZFwiICYmIHNldHRpbmdzLnByb21wdGluZ0xhbmd1YWdlcy5pbmNsdWRlcyhsYW5ndWFnZSkgJiYgKHNob3dQcm9tcHQgPT09IHVuZGVmaW5lZCB8fCBzaG93UHJvbXB0ID09PSB0cnVlKSkgfHxcbiAgICAoc2V0dGluZ3MudXNlUHJvbXB0R2xvYmFsID09PSBcImRlZmF1bHQgb2ZmLCBidXQgb24gd2hlbiBzcGVjaWZpZWRcIiAmJiAoc2hvd1Byb21wdCA9PT0gdHJ1ZSkpXG4gICkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stc2hvdy1wcm9tcHRcIik7XG5cbiAgICAvLyB1c2luZyBQcmlzbS5qcyBjb21tYW5kLWxpbmUgcGx1Z2luXG4gICAgbGV0IGNvZGVfbGluZXMgPSBlbGVtX2NvZGUuaW5uZXJUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgIGlmIChjb2RlX2xpbmVzW2NvZGVfbGluZXMubGVuZ3RoIC0gMV0udHJpbSgpLmxlbmd0aCA9PSAwKSBjb2RlX2xpbmVzLnBvcCgpOyAvLyByZW1vdmUgbGFzdCBsaW5lIGlmIGVtcHR5XG5cbiAgICBjb25zdCBub19wcm9tcHRfbGluZV9pZHhzID0gY29kZV9saW5lcy5tYXAoKGxpbmUsIGlkeCkgPT4ge1xuICAgICAgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCA9PSAwKSByZXR1cm4gKGlkeCArIDEpOyAvLyBlbXB0eSBsaW5lXG4gICAgICBpZiAobGluZS5zdGFydHNXaXRoKFwiI1wiKSkgcmV0dXJuIChpZHggKyAxKTsgLy8gY29tbWVudCBsaW5lXG4gICAgICByZXR1cm4gLTE7XG4gICAgfSkuZmlsdGVyKChpZHgpID0+IGlkeCAhPSAtMSk7XG5cbiAgICBlbGVtX3ByZS5jbGFzc0xpc3QuYWRkKFwiY29tbWFuZC1saW5lXCIpO1xuICAgIGVsZW1fcHJlLnNldEF0dHJpYnV0ZShcImRhdGEtcHJvbXB0XCIsIHByb21wdCk7XG4gICAgZWxlbV9wcmUuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250aW51YXRpb24tc3RyXCIsIFwiXFxcXFwiKTtcbiAgICBlbGVtX3ByZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRpbnVhdGlvbi1wcm9tcHRcIiwgXCIgXCIucmVwZWF0KHByb21wdC5sZW5ndGgpKTsgIC8vIHVzZSBzcGFjZXMgdG8gYWxpZ24gY29udGludWF0aW9uIHByb21wdFxuICAgIGVsZW1fcHJlLnNldEF0dHJpYnV0ZShcImRhdGEtb3V0cHV0XCIsIG5vX3Byb21wdF9saW5lX2lkeHMuam9pbihcIiwgXCIpKTtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy51c2VSZXN1bHRHbG9iYWwgPT09IFwiZW5hYmxlXCIgJiYgKGlzUmVzdWx0ID09PSB0cnVlKSkge1xuICAgIGVsZW1fZGl2LmNsYXNzTGlzdC5hZGQoXCJoay1jb2RlYmxvY2stcmVzdWx0XCIpO1xuICAgIGVsZW1fY29kZS5jbGFzc0xpc3QuYWRkKFwiaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlXCIpO1xuXG4gICAgZWxlbV9kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1yZXN1bHQtcHJvbXB0XCIsIHJlc3VsdFByb21wdCk7XG4gIH1cbn0iLCAiZXhwb3J0IGZ1bmN0aW9uIFByaXNtUGx1Z2luX0NvbW1hbmRMaW5lKFByaXNtKSB7XG5cblx0aWYgKHR5cGVvZiBQcmlzbSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBDTEFTU19QQVRURVJOID0gLyg/Ol58XFxzKWNvbW1hbmQtbGluZSg/Olxcc3wkKS87XG5cdHZhciBQUk9NUFRfQ0xBU1MgPSAnY29tbWFuZC1saW5lLXByb21wdCc7XG5cblx0LyoqIEB0eXBlIHsoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSA9PiBib29sZWFufSAqL1xuXHR2YXIgc3RhcnRzV2l0aCA9ICcnLnN0YXJ0c1dpdGhcblx0XHQ/IGZ1bmN0aW9uIChzLCBwKSB7IHJldHVybiBzLnN0YXJ0c1dpdGgocCk7IH1cblx0XHQ6IGZ1bmN0aW9uIChzLCBwKSB7IHJldHVybiBzLmluZGV4T2YocCkgPT09IDA7IH07XG5cblx0Ly8gU3VwcG9ydCBmb3IgSUUxMSB0aGF0IGhhcyBubyBlbmRzV2l0aCgpXG5cdC8qKiBAdHlwZSB7KHN0cjogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgPT4gYm9vbGVhbn0gKi9cblx0dmFyIGVuZHNXaXRoID0gJycuZW5kc1dpdGhcblx0XHQ/IGZ1bmN0aW9uIChzdHIsIHN1ZmZpeCkge1xuXHRcdFx0cmV0dXJuIHN0ci5lbmRzV2l0aChzdWZmaXgpO1xuXHRcdH1cblx0XHQ6IGZ1bmN0aW9uIChzdHIsIHN1ZmZpeCkge1xuXHRcdFx0dmFyIGxlbiA9IHN0ci5sZW5ndGg7XG5cdFx0XHRyZXR1cm4gc3RyLnN1YnN0cmluZyhsZW4gLSBzdWZmaXgubGVuZ3RoLCBsZW4pID09PSBzdWZmaXg7XG5cdFx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBob29rIGVudmlyb25tZW50IGhhcyBhIGNvbW1hbmQgbGluZSBpbmZvIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHthbnl9IGVudlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdGZ1bmN0aW9uIGhhc0NvbW1hbmRMaW5lSW5mbyhlbnYpIHtcblx0XHR2YXIgdmFycyA9IGVudi52YXJzID0gZW52LnZhcnMgfHwge307XG5cdFx0cmV0dXJuICdjb21tYW5kLWxpbmUnIGluIHZhcnM7XG5cdH1cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNvbW1hbmQgbGluZSBpbmZvIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBob29rIGVudmlyb25tZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge2FueX0gZW52XG5cdCAqIEByZXR1cm5zIHtDb21tYW5kTGluZUluZm99XG5cdCAqXG5cdCAqIEB0eXBlZGVmIENvbW1hbmRMaW5lSW5mb1xuXHQgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb21wbGV0ZV1cblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IFtudW1iZXJPZkxpbmVzXVxuXHQgKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbb3V0cHV0TGluZXNdXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRDb21tYW5kTGluZUluZm8oZW52KSB7XG5cdFx0dmFyIHZhcnMgPSBlbnYudmFycyA9IGVudi52YXJzIHx8IHt9O1xuXHRcdHJldHVybiB2YXJzWydjb21tYW5kLWxpbmUnXSA9IHZhcnNbJ2NvbW1hbmQtbGluZSddIHx8IHt9O1xuXHR9XG5cblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS1oaWdobGlnaHQnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIGNvbW1hbmRMaW5lID0gZ2V0Q29tbWFuZExpbmVJbmZvKGVudik7XG5cblx0XHRpZiAoY29tbWFuZExpbmUuY29tcGxldGUgfHwgIWVudi5jb2RlKSB7XG5cdFx0XHRjb21tYW5kTGluZS5jb21wbGV0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV29ya3Mgb25seSBmb3IgPGNvZGU+IHdyYXBwZWQgaW5zaWRlIDxwcmU+IChub3QgaW5saW5lKS5cblx0XHR2YXIgcHJlID0gZW52LmVsZW1lbnQucGFyZW50RWxlbWVudDtcblx0XHRpZiAoIXByZSB8fCAhL3ByZS9pLnRlc3QocHJlLm5vZGVOYW1lKSB8fCAvLyBBYm9ydCBvbmx5IGlmIG5laXRoZXIgdGhlIDxwcmU+IG5vciB0aGUgPGNvZGU+IGhhdmUgdGhlIGNsYXNzXG5cdFx0XHQoIUNMQVNTX1BBVFRFUk4udGVzdChwcmUuY2xhc3NOYW1lKSAmJiAhQ0xBU1NfUEFUVEVSTi50ZXN0KGVudi5lbGVtZW50LmNsYXNzTmFtZSkpKSB7XG5cdFx0XHRjb21tYW5kTGluZS5jb21wbGV0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIGVsZW1lbnQgbWlnaHQgYmUgaGlnaGxpZ2h0ZWQgbXVsdGlwbGUgdGltZXMsIHNvIHdlIGp1c3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBwcm9tcHRcblx0XHR2YXIgZXhpc3RpbmdQcm9tcHQgPSBlbnYuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuJyArIFBST01QVF9DTEFTUyk7XG5cdFx0aWYgKGV4aXN0aW5nUHJvbXB0KSB7XG5cdFx0XHRleGlzdGluZ1Byb21wdC5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHR2YXIgY29kZUxpbmVzID0gZW52LmNvZGUuc3BsaXQoJ1xcbicpO1xuXG5cdFx0aWYoY29kZUxpbmVzW2NvZGVMaW5lcy5sZW5ndGggLSAxXS50cmltKCkubGVuZ3RoID09PSAwKSB7IC8vIGRvIG5vdCBjb3VudCB0aGUgbGFzdCBsaW5lIGlmIGl0IGlzIGVtcHR5XG5cdFx0XHRjb21tYW5kTGluZS5udW1iZXJPZkxpbmVzID0gY29kZUxpbmVzLmxlbmd0aCAtIDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbW1hbmRMaW5lLm51bWJlck9mTGluZXMgPSBjb2RlTGluZXMubGVuZ3RoO1xuXHRcdH1cblx0XHQvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuXHRcdHZhciBvdXRwdXRMaW5lcyA9IGNvbW1hbmRMaW5lLm91dHB1dExpbmVzID0gW107XG5cblx0XHR2YXIgb3V0cHV0U2VjdGlvbnMgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLW91dHB1dCcpO1xuXHRcdHZhciBvdXRwdXRGaWx0ZXIgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZpbHRlci1vdXRwdXQnKTtcblx0XHRpZiAob3V0cHV0U2VjdGlvbnMgIT09IG51bGwpIHsgLy8gVGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBvdXRwdXQgbGluZXMuIC0tIGN3ZWxsc1xuXHRcdFx0b3V0cHV0U2VjdGlvbnMuc3BsaXQoJywnKS5mb3JFYWNoKGZ1bmN0aW9uIChzZWN0aW9uKSB7XG5cdFx0XHRcdHZhciByYW5nZSA9IHNlY3Rpb24uc3BsaXQoJy0nKTtcblx0XHRcdFx0dmFyIG91dHB1dFN0YXJ0ID0gcGFyc2VJbnQocmFuZ2VbMF0sIDEwKTtcblx0XHRcdFx0dmFyIG91dHB1dEVuZCA9IHJhbmdlLmxlbmd0aCA9PT0gMiA/IHBhcnNlSW50KHJhbmdlWzFdLCAxMCkgOiBvdXRwdXRTdGFydDtcblxuXHRcdFx0XHRpZiAoIWlzTmFOKG91dHB1dFN0YXJ0KSAmJiAhaXNOYU4ob3V0cHV0RW5kKSkge1xuXHRcdFx0XHRcdGlmIChvdXRwdXRTdGFydCA8IDEpIHtcblx0XHRcdFx0XHRcdG91dHB1dFN0YXJ0ID0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG91dHB1dEVuZCA+IGNvZGVMaW5lcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG91dHB1dEVuZCA9IGNvZGVMaW5lcy5sZW5ndGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIENvbnZlcnQgc3RhcnQgYW5kIGVuZCB0byAwLWJhc2VkIHRvIHNpbXBsaWZ5IHRoZSBhcnJheXMuIC0tIGN3ZWxsc1xuXHRcdFx0XHRcdG91dHB1dFN0YXJ0LS07XG5cdFx0XHRcdFx0b3V0cHV0RW5kLS07XG5cdFx0XHRcdFx0Ly8gU2F2ZSB0aGUgb3V0cHV0IGxpbmUgaW4gYW4gYXJyYXkgYW5kIGNsZWFyIGl0IGluIHRoZSBjb2RlIHNvIGl0J3Mgbm90IGhpZ2hsaWdodGVkLiAtLSBjd2VsbHNcblx0XHRcdFx0XHRmb3IgKHZhciBqID0gb3V0cHV0U3RhcnQ7IGogPD0gb3V0cHV0RW5kOyBqKyspIHtcblx0XHRcdFx0XHRcdG91dHB1dExpbmVzW2pdID0gY29kZUxpbmVzW2pdO1xuXHRcdFx0XHRcdFx0Y29kZUxpbmVzW2pdID0gJyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKG91dHB1dEZpbHRlcikgeyAvLyBUcmVhdCBsaW5lcyBiZWdpbm5pbmcgd2l0aCB0aGlzIHN0cmluZyBhcyBvdXRwdXQuIC0tIGN3ZWxsc1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlTGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHN0YXJ0c1dpdGgoY29kZUxpbmVzW2ldLCBvdXRwdXRGaWx0ZXIpKSB7IC8vIFRoaXMgbGluZSBpcyBvdXRwdXQuIC0tIGN3ZWxsc1xuXHRcdFx0XHRcdG91dHB1dExpbmVzW2ldID0gY29kZUxpbmVzW2ldLnNsaWNlKG91dHB1dEZpbHRlci5sZW5ndGgpO1xuXHRcdFx0XHRcdGNvZGVMaW5lc1tpXSA9ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcyA9IGNvbW1hbmRMaW5lLmNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcyA9IG5ldyBTZXQoKTtcblx0XHR2YXIgbGluZUNvbnRpbnVhdGlvblN0ciA9IHByZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGludWF0aW9uLXN0cicpO1xuXHRcdHZhciBjb250aW51YXRpb25GaWx0ZXIgPSBwcmUuZ2V0QXR0cmlidXRlKCdkYXRhLWZpbHRlci1jb250aW51YXRpb24nKTtcblxuXHRcdC8vIElkZW50aWZ5IGNvZGUgbGluZXMgd2hlcmUgdGhlIGNvbW1hbmQgaGFzIGNvbnRpbnVlZCBvbnRvIHN1YnNlcXVlbnRcblx0XHQvLyBsaW5lcyBhbmQgdGh1cyBuZWVkIGEgZGlmZmVyZW50IHByb21wdC4gTmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBvdXRwdXRcblx0XHQvLyBsaW5lcyBoYXZlIGJlZW4gcmVtb3ZlZCB0byBlbnN1cmUgd2UgZG9uJ3QgcGljayB1cCBhIGNvbnRpbnVhdGlvbiBzdHJpbmdcblx0XHQvLyBpbiBhbiBvdXRwdXQgbGluZS5cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGNvZGVMaW5lcy5sZW5ndGg7IGorKykge1xuXHRcdFx0dmFyIGxpbmUgPSBjb2RlTGluZXNbal07XG5cdFx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlY29yZCB0aGUgbmV4dCBsaW5lIGFzIGEgY29udGludWF0aW9uIGlmIHRoaXMgb25lIGVuZHMgaW4gYSBjb250aW51YXRpb24gc3RyLlxuXHRcdFx0aWYgKGxpbmVDb250aW51YXRpb25TdHIgJiYgZW5kc1dpdGgobGluZSwgbGluZUNvbnRpbnVhdGlvblN0cikpIHtcblx0XHRcdFx0Y29udGludWF0aW9uTGluZUluZGljaWVzLmFkZChqICsgMSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBSZWNvcmQgdGhpcyBsaW5lIGFzIGEgY29udGludWF0aW9uIGlmIG1hcmtlZCB3aXRoIGEgY29udGludWF0aW9uIHByZWZpeFxuXHRcdFx0Ly8gKHRoYXQgd2Ugd2lsbCByZW1vdmUpLlxuXHRcdFx0aWYgKGogPiAwICYmIGNvbnRpbnVhdGlvbkZpbHRlciAmJiBzdGFydHNXaXRoKGxpbmUsIGNvbnRpbnVhdGlvbkZpbHRlcikpIHtcblx0XHRcdFx0Y29kZUxpbmVzW2pdID0gbGluZS5zbGljZShjb250aW51YXRpb25GaWx0ZXIubGVuZ3RoKTtcblx0XHRcdFx0Y29udGludWF0aW9uTGluZUluZGljaWVzLmFkZChqKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRlbnYuY29kZSA9IGNvZGVMaW5lcy5qb2luKCdcXG4nKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtaW5zZXJ0JywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBjb21tYW5kTGluZSA9IGdldENvbW1hbmRMaW5lSW5mbyhlbnYpO1xuXG5cdFx0aWYgKGNvbW1hbmRMaW5lLmNvbXBsZXRlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmVpbnNlcnQgdGhlIG91dHB1dCBsaW5lcyBpbnRvIHRoZSBoaWdobGlnaHRlZCBjb2RlLiAtLSBjd2VsbHNcblx0XHR2YXIgY29kZUxpbmVzID0gZW52LmhpZ2hsaWdodGVkQ29kZS5zcGxpdCgnXFxuJyk7XG5cdFx0dmFyIG91dHB1dExpbmVzID0gY29tbWFuZExpbmUub3V0cHV0TGluZXMgfHwgW107XG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBjb2RlTGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHQvLyBBZGQgc3BhbnMgdG8gYWxsb3cgZGlzdGluY3Rpb24gb2YgaW5wdXQvb3V0cHV0IHRleHQgZm9yIHN0eWxpbmdcblx0XHRcdGlmIChvdXRwdXRMaW5lcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHQvLyBvdXRwdXRMaW5lcyB3ZXJlIHJlbW92ZWQgZnJvbSBjb2RlTGluZXMgc28gbWlzc2VkIG91dCBvbiBlc2NhcGluZ1xuXHRcdFx0XHQvLyBvZiBtYXJrdXAgc28gZG8gaXQgaGVyZS5cblx0XHRcdFx0Y29kZUxpbmVzW2ldID0gJzxzcGFuIGNsYXNzPVwidG9rZW4gb3V0cHV0XCI+J1xuXHRcdFx0XHRcdCsgUHJpc20udXRpbC5lbmNvZGUob3V0cHV0TGluZXNbaV0pICsgJzwvc3Bhbj4nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29kZUxpbmVzW2ldID0gJzxzcGFuIGNsYXNzPVwidG9rZW4gY29tbWFuZFwiPidcblx0XHRcdFx0XHQrIGNvZGVMaW5lc1tpXSArICc8L3NwYW4+Jztcblx0XHRcdH1cblx0XHR9XG5cdFx0ZW52LmhpZ2hsaWdodGVkQ29kZSA9IGNvZGVMaW5lcy5qb2luKCdcXG4nKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdjb21wbGV0ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoIWhhc0NvbW1hbmRMaW5lSW5mbyhlbnYpKSB7XG5cdFx0XHQvLyB0aGUgcHJldmlvdXMgaG9va3MgbmV2ZXIgcmFuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNvbW1hbmRMaW5lID0gZ2V0Q29tbWFuZExpbmVJbmZvKGVudik7XG5cblx0XHRpZiAoY29tbWFuZExpbmUuY29tcGxldGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgcHJlID0gZW52LmVsZW1lbnQucGFyZW50RWxlbWVudDtcblx0XHRpZiAoQ0xBU1NfUEFUVEVSTi50ZXN0KGVudi5lbGVtZW50LmNsYXNzTmFtZSkpIHsgLy8gUmVtb3ZlIHRoZSBjbGFzcyBcImNvbW1hbmQtbGluZVwiIGZyb20gdGhlIDxjb2RlPlxuXHRcdFx0ZW52LmVsZW1lbnQuY2xhc3NOYW1lID0gZW52LmVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoQ0xBU1NfUEFUVEVSTiwgJyAnKTtcblx0XHR9XG5cdFx0aWYgKCFDTEFTU19QQVRURVJOLnRlc3QocHJlLmNsYXNzTmFtZSkpIHsgLy8gQWRkIHRoZSBjbGFzcyBcImNvbW1hbmQtbGluZVwiIHRvIHRoZSA8cHJlPlxuXHRcdFx0cHJlLmNsYXNzTmFtZSArPSAnIGNvbW1hbmQtbGluZSc7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0QXR0cmlidXRlKGtleSwgZGVmYXVsdFZhbHVlKSB7XG5cdFx0XHRyZXR1cm4gKHByZS5nZXRBdHRyaWJ1dGUoa2V5KSB8fCBkZWZhdWx0VmFsdWUpLnJlcGxhY2UoL1wiL2csICcmcXVvdCcpO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSB0aGUgXCJyb3dzXCIgdGhhdCB3aWxsIGJlY29tZSB0aGUgY29tbWFuZC1saW5lIHByb21wdHMuIC0tIGN3ZWxsc1xuXHRcdHZhciBwcm9tcHRMaW5lcyA9ICcnO1xuXHRcdHZhciByb3dDb3VudCA9IGNvbW1hbmRMaW5lLm51bWJlck9mTGluZXMgfHwgMDtcblx0XHR2YXIgcHJvbXB0VGV4dCA9IGdldEF0dHJpYnV0ZSgnZGF0YS1wcm9tcHQnLCAnJyk7XG5cdFx0dmFyIHByb21wdExpbmU7XG5cdFx0aWYgKHByb21wdFRleHQgIT09ICcnKSB7XG5cdFx0XHRwcm9tcHRMaW5lID0gJzxzcGFuIGRhdGEtcHJvbXB0PVwiJyArIHByb21wdFRleHQgKyAnXCI+PC9zcGFuPic7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciB1c2VyID0gZ2V0QXR0cmlidXRlKCdkYXRhLXVzZXInLCAndXNlcicpO1xuXHRcdFx0dmFyIGhvc3QgPSBnZXRBdHRyaWJ1dGUoJ2RhdGEtaG9zdCcsICdsb2NhbGhvc3QnKTtcblx0XHRcdHByb21wdExpbmUgPSAnPHNwYW4gZGF0YS11c2VyPVwiJyArIHVzZXIgKyAnXCIgZGF0YS1ob3N0PVwiJyArIGhvc3QgKyAnXCI+PC9zcGFuPic7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcyA9IGNvbW1hbmRMaW5lLmNvbnRpbnVhdGlvbkxpbmVJbmRpY2llcyB8fCBuZXcgU2V0KCk7XG5cdFx0dmFyIGNvbnRpbnVhdGlvblByb21wdFRleHQgPSBnZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGludWF0aW9uLXByb21wdCcsICc+Jyk7XG5cdFx0dmFyIGNvbnRpbnVhdGlvblByb21wdExpbmUgPSAnPHNwYW4gZGF0YS1jb250aW51YXRpb24tcHJvbXB0PVwiJyArIGNvbnRpbnVhdGlvblByb21wdFRleHQgKyAnXCI+PC9zcGFuPic7XG5cblx0XHQvLyBBc3NlbWJsZSBhbGwgdGhlIGFwcHJvcHJpYXRlIHByb21wdC9jb250aW51YXRpb24gbGluZXNcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHJvd0NvdW50OyBqKyspIHtcblx0XHRcdGlmIChjb250aW51YXRpb25MaW5lSW5kaWNpZXMuaGFzKGopKSB7XG5cdFx0XHRcdHByb21wdExpbmVzICs9IGNvbnRpbnVhdGlvblByb21wdExpbmU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwcm9tcHRMaW5lcyArPSBwcm9tcHRMaW5lO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSB0aGUgd3JhcHBlciBlbGVtZW50LiAtLSBjd2VsbHNcblx0XHR2YXIgcHJvbXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXHRcdHByb21wdC5jbGFzc05hbWUgPSBQUk9NUFRfQ0xBU1M7XG5cdFx0cHJvbXB0LmlubmVySFRNTCA9IHByb21wdExpbmVzO1xuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBwcm9tcHQgZnJvbSB0aGUgb3V0cHV0IGxpbmVzLiAtLSBjd2VsbHNcblx0XHR2YXIgb3V0cHV0TGluZXMgPSBjb21tYW5kTGluZS5vdXRwdXRMaW5lcyB8fCBbXTtcblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IG91dHB1dExpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0aWYgKG91dHB1dExpbmVzLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdHZhciBub2RlID0gcHJvbXB0LmNoaWxkcmVuW2ldO1xuXHRcdFx0XHRub2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS11c2VyJyk7XG5cdFx0XHRcdG5vZGUucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhvc3QnKTtcblx0XHRcdFx0bm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcHJvbXB0Jyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZW52LmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHByb21wdCwgZW52LmVsZW1lbnQuZmlyc3RDaGlsZCk7XG5cdFx0Y29tbWFuZExpbmUuY29tcGxldGUgPSB0cnVlO1xuXHR9KTtcblxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFBLG1CQUFrQzs7O0FDNkIzQixJQUFNLG1CQUF3QztBQUFBLEVBQ3BELGdCQUFnQjtBQUFBLEVBRWhCLHNCQUFzQjtBQUFBLEVB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QUc7QUFDekUsUUFBSSx5QkFBeUIscUNBQXFDLHlCQUF5QjtBQUczRixhQUFTLElBQUksR0FBRyxJQUFJLFVBQVUsS0FBSztBQUNsQyxVQUFJLHlCQUF5QixJQUFJLENBQUMsR0FBRztBQUNwQyx1QkFBZTtBQUFBLE1BQ2hCLE9BQU87QUFDTix1QkFBZTtBQUFBLE1BQ2hCO0FBQUEsSUFDRDtBQUdBLFFBQUksU0FBUyxTQUFTLGNBQWMsTUFBTTtBQUMxQyxXQUFPLFlBQVk7QUFDbkIsV0FBTyxZQUFZO0FBR25CLFFBQUksY0FBYyxZQUFZLGVBQWUsQ0FBQztBQUM5QyxhQUFTLElBQUksR0FBRyxJQUFJLFlBQVksUUFBUSxJQUFJLEdBQUcsS0FBSztBQUNuRCxVQUFJLFlBQVksZUFBZSxDQUFDLEdBQUc7QUFDbEMsWUFBSSxPQUFPLE9BQU8sU0FBUyxDQUFDO0FBQzVCLGFBQUssZ0JBQWdCLFdBQVc7QUFDaEMsYUFBSyxnQkFBZ0IsV0FBVztBQUNoQyxhQUFLLGdCQUFnQixhQUFhO0FBQUEsTUFDbkM7QUFBQSxJQUNEO0FBRUEsUUFBSSxRQUFRLGFBQWEsUUFBUSxJQUFJLFFBQVEsVUFBVTtBQUN2RCxnQkFBWSxXQUFXO0FBQUEsRUFDeEIsQ0FBQztBQUVGOzs7QUp6T0EsSUFBcUIsb0JBQXJCLGNBQStDLHdCQUFPO0FBQUEsRUFHckQsTUFBTSxTQUFTO0FBQ2QsVUFBTSxLQUFLLGFBQWE7QUFDeEIsUUFBSSxLQUFLLFNBQVMsV0FBVztBQUM1QixjQUFRLElBQUksNEJBQTRCO0FBQUEsSUFDekM7QUFFQSxVQUFNLFFBQVEsVUFBTSw0QkFBVTtBQUc5Qiw0QkFBd0IsS0FBSztBQUc3QixTQUFLLGNBQWMsSUFBSSxzQkFBc0IsS0FBSyxLQUFLLElBQUksQ0FBQztBQUc1RCxVQUFNLFlBQVksS0FBSyw4QkFBOEIsQ0FBQyxJQUFJLFFBQVE7QUFDakUsMkJBQXFCLElBQUksS0FBSyxJQUFJO0FBQUEsSUFDbkMsQ0FBQztBQUVELGNBQVUsWUFBWTtBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxXQUFXO0FBQ1YsUUFBSSxLQUFLLFNBQVMsV0FBVztBQUM1QixjQUFRLElBQUksOEJBQThCO0FBQUEsSUFDM0M7QUFBQSxFQUNEO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsU0FBSyxXQUFXLE9BQU8sT0FBTyxDQUFDLEdBQUcsa0JBQWtCLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFBQSxFQUMxRTtBQUFBLEVBRUEsTUFBTSxlQUFlO0FBQ3BCLFVBQU0sS0FBSyxTQUFTLEtBQUssUUFBUTtBQUFBLEVBQ2xDO0FBQ0Q7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJhcHAiLCAiaW1wb3J0X29ic2lkaWFuIiwgImxhbmd1YWdlIiwgImoiXQp9Cg==
diff --git a/dist/manifest.json b/dist/manifest.json
index 44c84b9..7d94b47 100644
--- a/dist/manifest.json
+++ b/dist/manifest.json
@@ -1,11 +1,11 @@
{
"id": "hk-code-block",
"name": "HK Code Block",
- "version": "0.1.0",
+ "version": "0.2.0",
"minAppVersion": "1.0.0",
"description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view",
"author": "Heekang Park",
"authorUrl": "https://github.com/HeekangPark",
"fundingUrl": "",
"isDesktopOnly": false
-}
+}
\ No newline at end of file
diff --git a/dist/styles.css b/dist/styles.css
index 89a2ed2..b94a9f0 100644
--- a/dist/styles.css
+++ b/dist/styles.css
@@ -42,10 +42,51 @@
background-color: var(--hk-codeblock-background-color);
border-bottom: 1px solid var(--hk-codeblock-border-color);
color: var(--hk-codeblock-title-text-color);
+ display: flex;
+ flex-direction: row;
+ align-items: center;
}
.hk-codeblock.hk-codeblock-show-title .hk-codeblock-title ~ pre {
margin-top: 0;
}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title {
+ cursor: pointer;
+ position: relative;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 4px;
+ position: relative;
+ top: -1px;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn {
+ width: 16px;
+ height: 16px;
+ fill: var(--hk-codeblock-title-text-color);
+ stroke: var(--hk-codeblock-title-text-color);
+ stroke-width: 2;
+ opacity: 0.2;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-collapsed-btn {
+ display: none;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-expanded-btn {
+ display: inline-block;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed .hk-codeblock-title {
+ border-bottom: none;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-collapsed-btn {
+ display: inline-block;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed .hk-codeblock-title .hk-codeblock-collapse-btns .hk-codeblock-collapse-btn.hk-codeblock-expanded-btn {
+ display: none;
+}
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible.hk-codeblock-collapsed pre {
+ display: none;
+}
.hk-codeblock.hk-codeblock-show-linenos pre code.hk-codeblock-linenos {
flex-shrink: 0;
flex-grow: 0;
@@ -137,4 +178,4 @@
.hk-codeblock + .hk-codeblock.hk-codeblock-result pre .hk-codeblock-result-code {
color: var(--hk-codeblock-result-text-color);
}
-/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtc2l6ZTogdmFyKC0tZm9udC11aS1zbWFsbGVyKTsgLy8gc2FtZSB3aXRoIGNvcHkgYnV0dG9uXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250OiB2YXIoLS1mb250LWludGVyZmFjZSk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3I6IHZhcigtLXRleHQtbm9ybWFsKTtcbiAgfVxuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stbWFyZ2luKTtcblxuICBwcmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcblxuICAgIGNvZGUuaGstY29kZWJsb2NrLWNvZGUge1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgfVxufVxuXG4vKiB0aXRsZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy10aXRsZSB7XG4gIC5oay1jb2RlYmxvY2stdGl0bGUge1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy10b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgfVxuXG4gIC5oay1jb2RlYmxvY2stdGl0bGV+cHJlIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8qIGxpbmVub3MgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctbGluZW5vcyB7XG4gIHByZSB7XG4gICAgY29kZS5oay1jb2RlYmxvY2stbGluZW5vcyB7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGZsZXgtZ3JvdzogMDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgcGFkZGluZy1yaWdodDogMWVtO1xuICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxpbmVub3MtdGV4dC1jb2xvcik7XG5cbiAgICAgICYuc2hvdy1zcGxpdHRlciB7XG4gICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWhrLWNvZGVibG9jay1ib3JkZXItY29sb3IpO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogaGlnaGxpZ2h0ICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LWhpZ2hsaWdodCB7XG4gIHByZSB7XG4gICAgY29kZS5oay1jb2RlYmxvY2staGlnaGxpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgICAgb3BhY2l0eTogMC4yO1xuXG4gICAgICAubGluZS5oaWdobGlnaHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2staGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBsYW5ndWFnZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1sYW5ndWFnZSB7XG4gIHByZSB7XG4gICAgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHotaW5kZXg6IDE7XG4gICAgICBtYXJnaW46IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCA4cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtY29sb3IpO1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1zaXplKTtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250KTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgIH1cblxuICAgICY6aG92ZXIgLmhrLWNvZGVibG9jay1sYW5ndWFnZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBjb3B5IGJ1dHRvbiAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1jb3B5YnRuIHtcbiAgcHJlIHtcbiAgICAuY29weS1jb2RlLWJ1dHRvbiB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG59XG5cbi8qIHByb21wdCAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1wcm9tcHQge1xuICBwcmUge1xuICAgIGNvZGUuaGstY29kZWJsb2NrLWNvZGUge1xuICAgICAgLmNvbW1hbmQtbGluZS1wcm9tcHQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMTAwJTtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuXG4gICAgICAgICY+c3Bhbjo6YmVmb3JlIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICAgICAgY29udGVudDogJyAnO1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIG1hcmdpbi1yaWdodDogMC42ZW07XG4gICAgICAgICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1wcm9tcHQtdGV4dC1jb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICAmPnNwYW5bZGF0YS1wcm9tcHRdOjpiZWZvcmUge1xuICAgICAgICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wcm9tcHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgJj5zcGFuW2RhdGEtY29udGludWF0aW9uLXByb21wdF06OmJlZm9yZSB7XG4gICAgICAgICAgY29udGVudDogYXR0cihkYXRhLWNvbnRpbnVhdGlvbi1wcm9tcHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIHJlc3VsdCAqL1xuLmhrLWNvZGVibG9jaysuaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1yZXN1bHQge1xuICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWhrLWNvZGVibG9jay1tYXJnaW4pICogKC0xKSk7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1oay1jb2RlYmxvY2stYm9yZGVyLWNvbG9yKTtcblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1yZXN1bHQtcHJvbXB0KTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXJlc3VsdC10ZXh0LWNvbG9yKTtcbiAgICBvcGFjaXR5OiAwLjY7XG4gICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICBwYWRkaW5nLXRvcDogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gIH1cblxuICBwcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICAuaGstY29kZWJsb2NrLXJlc3VsdC1jb2RlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgIH1cbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQWlCRTtBQUNBO0FBQ0E7O0FBbEJBO0FBRUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9GO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTtBQUNBOztBQU9KO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFPQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTs7QUFTSjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQVNKO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFRRjtBQUNFOztBQVNBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFHRjtBQUNFOztBQVFWO0FBQ0U7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFFQTtBQUNFOzsiLAogICJuYW1lcyI6IFtdCn0K */
+/*# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0eWxlcy5zY3NzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIuaGstY29kZWJsb2NrIHtcbiAgJiB7XG4gICAgLy8gdmFyaWFibGVzXG4gICAgLS1oay1jb2RlYmxvY2stbWFyZ2luOiAxZW07XG4gICAgLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nOiAxNnB4O1xuICAgIC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmc6IDhweDtcbiAgICAtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlLWJhY2tncm91bmQpO1xuICAgIC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcjogdmFyKC0tZGl2aWRlci1jb2xvcik7IC8vIGFwcGxpZWQgdG8gdGl0bGUsIGxpbmVub3MsIGFuZCByZXN1bHRcbiAgICAtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yOiB2YXIoLS10ZXh0LW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLWxhbmd1YWdlLXRleHQtc2l6ZTogdmFyKC0tZm9udC11aS1zbWFsbGVyKTsgLy8gc2FtZSB3aXRoIGNvcHkgYnV0dG9uXG4gICAgLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1mb250OiB2YXIoLS1mb250LWludGVyZmFjZSk7IC8vIHNhbWUgd2l0aCBjb3B5IGJ1dHRvblxuICAgIC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yOiB2YXIoLS1jb2RlLW5vcm1hbCk7XG4gICAgLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3I6IHZhcigtLXRleHQtbm9ybWFsKTtcbiAgfVxuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGstY29kZWJsb2NrLWJhY2tncm91bmQtY29sb3IpO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stbWFyZ2luKTtcblxuICBwcmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1ib3R0b206IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLWhrLWNvZGVibG9jay1ob3Jpem9udGFsLXBhZGRpbmcpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcblxuICAgIGNvZGUuaGstY29kZWJsb2NrLWNvZGUge1xuICAgICAgd2hpdGUtc3BhY2U6IHByZTtcbiAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgfVxufVxuXG4vKiB0aXRsZSAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy10aXRsZSB7XG4gIC5oay1jb2RlYmxvY2stdGl0bGUge1xuICAgIHBhZGRpbmctbGVmdDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1yaWdodDogdmFyKC0taGstY29kZWJsb2NrLWhvcml6b250YWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy10b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0taGstY29kZWJsb2NrLXZlcnRpY2FsLXBhZGRpbmcpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcblxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgLmhrLWNvZGVibG9jay10aXRsZX5wcmUge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cbn1cblxuLyogY29sbGFwc2UgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctdGl0bGUuaGstY29kZWJsb2NrLWNvbGxhcHNpYmxlIHtcbiAgLmhrLWNvZGVibG9jay10aXRsZSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdG9wOiAtMXB4O1xuXG4gICAgICAuaGstY29kZWJsb2NrLWNvbGxhcHNlLWJ0biB7XG4gICAgICAgIHdpZHRoOiAxNnB4O1xuICAgICAgICBoZWlnaHQ6IDE2cHg7XG5cbiAgICAgICAgZmlsbDogdmFyKC0taGstY29kZWJsb2NrLXRpdGxlLXRleHQtY29sb3IpO1xuICAgICAgICBzdHJva2U6IHZhcigtLWhrLWNvZGVibG9jay10aXRsZS10ZXh0LWNvbG9yKTtcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyO1xuICAgICAgICBvcGFjaXR5OiAwLjI7XG5cbiAgICAgICAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgICYuaGstY29kZWJsb2NrLWV4cGFuZGVkLWJ0biB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJi5oay1jb2RlYmxvY2stY29sbGFwc2VkIHtcbiAgICAuaGstY29kZWJsb2NrLXRpdGxlIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG5cbiAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRucyB7XG4gICAgICAgIC5oay1jb2RlYmxvY2stY29sbGFwc2UtYnRuIHtcbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1jb2xsYXBzZWQtYnRuIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmLmhrLWNvZGVibG9jay1leHBhbmRlZC1idG4ge1xuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLyogbGluZW5vcyAqL1xuLmhrLWNvZGVibG9jay5oay1jb2RlYmxvY2stc2hvdy1saW5lbm9zIHtcbiAgcHJlIHtcbiAgICBjb2RlLmhrLWNvZGVibG9jay1saW5lbm9zIHtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stbGluZW5vcy10ZXh0LWNvbG9yKTtcblxuICAgICAgJi5zaG93LXNwbGl0dGVyIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0taGstY29kZWJsb2NrLWJvcmRlci1jb2xvcik7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiBoaWdobGlnaHQgKi9cbi5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXNob3ctaGlnaGxpZ2h0IHtcbiAgcHJlIHtcbiAgICBjb2RlLmhrLWNvZGVibG9jay1oaWdobGlnaHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBib3R0b206IDA7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcGFkZGluZy10b3A6IHZhcigtLWhrLWNvZGVibG9jay12ZXJ0aWNhbC1wYWRkaW5nKTtcbiAgICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgICBvcGFjaXR5OiAwLjI7XG5cbiAgICAgIC5saW5lLmhpZ2hsaWdodCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1oaWdobGlnaHQtYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qIGxhbmd1YWdlICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LWxhbmd1YWdlIHtcbiAgcHJlIHtcbiAgICAuaGstY29kZWJsb2NrLWxhbmd1YWdlIHtcbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgei1pbmRleDogMTtcbiAgICAgIG1hcmdpbjogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDhweDtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stbGFuZ3VhZ2UtdGV4dC1jb2xvcik7XG4gICAgICBmb250LXNpemU6IHZhcigtLWhrLWNvZGVibG9jay1sYW5ndWFnZS10ZXh0LXNpemUpO1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWhrLWNvZGVibG9jay1sYW5ndWFnZS10ZXh0LWZvbnQpO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgfVxuXG4gICAgJjpob3ZlciAuaGstY29kZWJsb2NrLWxhbmd1YWdlIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi8qIGNvcHkgYnV0dG9uICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LWNvcHlidG4ge1xuICBwcmUge1xuICAgIC5jb3B5LWNvZGUtYnV0dG9uIHtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG4gIH1cbn1cblxuLyogcHJvbXB0ICovXG4uaGstY29kZWJsb2NrLmhrLWNvZGVibG9jay1zaG93LXByb21wdCB7XG4gIHByZSB7XG4gICAgY29kZS5oay1jb2RlYmxvY2stY29kZSB7XG4gICAgICAuY29tbWFuZC1saW5lLXByb21wdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbG9hdDogbGVmdDtcbiAgICAgICAgZm9udC1zaXplOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICAgICAgJj5zcGFuOjpiZWZvcmUge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNjtcbiAgICAgICAgICBjb250ZW50OiAnICc7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwLjZlbTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taGstY29kZWJsb2NrLXByb21wdC10ZXh0LWNvbG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgICY+c3BhbltkYXRhLXByb21wdF06OmJlZm9yZSB7XG4gICAgICAgICAgY29udGVudDogYXR0cihkYXRhLXByb21wdCk7XG4gICAgICAgIH1cblxuICAgICAgICAmPnNwYW5bZGF0YS1jb250aW51YXRpb24tcHJvbXB0XTo6YmVmb3JlIHtcbiAgICAgICAgICBjb250ZW50OiBhdHRyKGRhdGEtY29udGludWF0aW9uLXByb21wdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogcmVzdWx0ICovXG4uaGstY29kZWJsb2NrKy5oay1jb2RlYmxvY2suaGstY29kZWJsb2NrLXJlc3VsdCB7XG4gIG1hcmdpbi10b3A6IGNhbGModmFyKC0taGstY29kZWJsb2NrLW1hcmdpbikgKiAoLTEpKTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWhrLWNvZGVibG9jay1ib3JkZXItY29sb3IpO1xuXG4gICY6OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXJlc3VsdC1wcm9tcHQpO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGNvbG9yOiB2YXIoLS1oay1jb2RlYmxvY2stcmVzdWx0LXRleHQtY29sb3IpO1xuICAgIG9wYWNpdHk6IDAuNjtcbiAgICBmb250LXNpemU6IDAuOGVtO1xuICAgIHBhZGRpbmctdG9wOiB2YXIoLS1oay1jb2RlYmxvY2stdmVydGljYWwtcGFkZGluZyk7XG4gICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgICBwYWRkaW5nLXJpZ2h0OiB2YXIoLS1oay1jb2RlYmxvY2staG9yaXpvbnRhbC1wYWRkaW5nKTtcbiAgfVxuXG4gIHByZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcblxuICAgIC5oay1jb2RlYmxvY2stcmVzdWx0LWNvZGUge1xuICAgICAgY29sb3I6IHZhcigtLWhrLWNvZGVibG9jay1yZXN1bHQtdGV4dC1jb2xvcik7XG4gICAgfVxuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBaUJFO0FBQ0E7QUFDQTs7QUFsQkE7QUFFRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBT0Y7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDRTtBQUNBO0FBQ0E7O0FBT0o7QUFDRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFHRjtBQUNFOztBQU1GO0FBQ0U7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQUdGO0FBQ0U7O0FBT047QUFDRTs7QUFJSTtBQUNFOztBQUdGO0FBQ0U7O0FBTVI7QUFDRTs7QUFRRjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0U7QUFDQTs7QUFTSjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFOztBQVNKO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFRRjtBQUNFOztBQVNBO0FBQ0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFHRjtBQUNFOztBQVFWO0FBQ0U7QUFDQTs7QUFFQTtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0Y7QUFDRTs7QUFFQTtBQUNFOzsiLAogICJuYW1lcyI6IFtdCn0K */
diff --git a/dist/versions.json b/dist/versions.json
index 9be1f3d..79c5364 100644
--- a/dist/versions.json
+++ b/dist/versions.json
@@ -1,3 +1,4 @@
{
- "0.1.0": "0.15.0"
+ "0.1.0": "1.0.0",
+ "0.2.0": "1.0.0"
}
diff --git a/esbuild.config.mjs b/esbuild.config.mjs
index 8bc1049..2f9ba68 100644
--- a/esbuild.config.mjs
+++ b/esbuild.config.mjs
@@ -1,6 +1,7 @@
import esbuild from "esbuild";
import process from "process";
import builtins from "builtin-modules";
+import { copyFile } from "fs/promises";
import { sassPlugin } from "esbuild-sass-plugin";
const banner =
@@ -42,7 +43,18 @@ const context = await esbuild.context({
sourcemap: prod ? false : "inline",
treeShaking: true,
outdir: "./dist",
- plugins: [sassPlugin()]
+ plugins: [
+ sassPlugin(),
+ {
+ name: "copy-build-files-to-root",
+ setup(build) {
+ build.onEnd(() => {
+ copyFile("./dist/main.js", "./main.js");
+ copyFile("./dist/styles.css", "./styles.css");
+ });
+ }
+ }
+ ]
});
if (prod) {
diff --git a/imgs/collapsible1.png b/imgs/collapsible1.png
new file mode 100644
index 0000000..9ebe6a1
Binary files /dev/null and b/imgs/collapsible1.png differ
diff --git a/imgs/collapsible2.png b/imgs/collapsible2.png
new file mode 100644
index 0000000..51ae8fb
Binary files /dev/null and b/imgs/collapsible2.png differ
diff --git a/manifest.json b/manifest.json
index 44c84b9..54d4638 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"id": "hk-code-block",
"name": "HK Code Block",
- "version": "0.1.0",
+ "version": "0.2.0",
"minAppVersion": "1.0.0",
"description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view",
"author": "Heekang Park",
diff --git a/package.json b/package.json
index 53d08ed..fd238b1 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
"name": "obsidian-hk-code-block",
- "version": "0.1.0",
+ "version": "0.2.0",
"description": "Obsidian plugin developed by Heekang Park; Make code block looking good on reading view",
- "main": "main.js",
+ "main": "./dist/main.js",
"scripts": {
"dev": "node esbuild.config.mjs",
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
diff --git a/src/HKCodeBlockProcessor.ts b/src/HKCodeBlockProcessor.ts
index 773261d..0dc432c 100755
--- a/src/HKCodeBlockProcessor.ts
+++ b/src/HKCodeBlockProcessor.ts
@@ -6,6 +6,8 @@ import type { HKCodeBlockSettings } from "./HKCodeBlockSettings";
const REGEX = {
TITLE: /\stitle:(?:'(.*?)'|"(.*?)")\s/,
+ COLLAPSIBLE_SIMPLE: /\scollapsible\s/,
+ COLLAPSIBLE_COMPLICATE: /\scollapsible:(true|false)\s/,
LINENOS_SIMPLE: /\slinenos\s/,
LINENOS_COMPLICATE: /\slinenos:(true|false|(-{0,1}\d+))\s/,
HIGHLIGHT: /\shighlight:(?:'(.*?)'|"(.*?)")\s/,
@@ -22,6 +24,7 @@ const REGEX = {
function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: MarkdownSectionInformation, settings: HKCodeBlockSettings): {
showTitle: (boolean | undefined),
title: string,
+ isCollapsible: (boolean | undefined),
showLinenos: (boolean | undefined),
linenosStart: number,
linenosNum: number,
@@ -46,6 +49,20 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd
title = regexResult_title[1] || regexResult_title[2];
}
+ // collapsible
+ let isCollapsible: (boolean | undefined) = undefined;
+ const regexResult_collapsibleSimple = REGEX.COLLAPSIBLE_SIMPLE.exec(firstline);
+ const regexResult_collapsibleComplicate = REGEX.COLLAPSIBLE_COMPLICATE.exec(firstline);
+ if (regexResult_collapsibleSimple) {
+ isCollapsible = true;
+ } else if (regexResult_collapsibleComplicate) {
+ if (regexResult_collapsibleComplicate[1] === "true") {
+ isCollapsible = true;
+ } else if (regexResult_collapsibleComplicate[1] === "false") {
+ isCollapsible = false;
+ }
+ }
+
// linenos
let showLinenos: (boolean | undefined) = undefined;
let linenosStart = settings.defaultLinenosStart;
@@ -149,7 +166,7 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd
const regexResultPrompt_result = REGEX.PROMPT_COMPLICATE.exec(firstline);
if (regexResult_result) {
isResult = true;
-
+
// override other meta data : only linenos, highlight are available
showTitle = false;
showLanguage = false;
@@ -164,6 +181,7 @@ function getMeta(view: MarkdownView, elem_code: HTMLElement, section_code: Markd
return {
showTitle: showTitle,
title: title,
+ isCollapsible: isCollapsible,
showLinenos: showLinenos,
linenosStart: linenosStart,
linenosNum: linenosNum,
@@ -205,9 +223,10 @@ export async function HKCodeBlockProcessor(
if (!section_code) return;
// get metadata
- const {
+ const {
showTitle,
title,
+ isCollapsible,
showLinenos,
linenosStart,
linenosNum,
@@ -223,7 +242,7 @@ export async function HKCodeBlockProcessor(
} = getMeta(view, elem_code, section_code, settings);
if (settings.debugMode) {
- console.log({
+ console.log({
showTitle: showTitle,
title: title,
showLinenos: showLinenos,
@@ -246,15 +265,60 @@ export async function HKCodeBlockProcessor(
elem_code.classList.add("hk-codeblock-code");
elem_copyBtn.remove(); // remove the original copy button as default
+ let elem_title: (HTMLElement | undefined) = undefined;
if (settings.useTitleGlobal === "default off, but on when specified" && (showTitle === true)) {
elem_div.classList.add("hk-codeblock-show-title");
- const elem_title = document.createElement("div");
+ elem_title = document.createElement("div");
elem_title.classList.add("hk-codeblock-title");
elem_title.innerHTML = title;
elem_div.insertBefore(elem_title, elem_pre);
}
+ if (
+ (settings.useCollapsibleGlobal === "always on") ||
+ (settings.useCollapsibleGlobal === "default on, but off when specified" && (isCollapsible === undefined || isCollapsible === true)) ||
+ (settings.useCollapsibleGlobal === "default off, but on when specified" && (isCollapsible === true))
+ ) {
+ elem_div.classList.add("hk-codeblock-collapsible");
+
+ if (settings.defaultCollapse === "collapse") {
+ elem_div.classList.add("hk-codeblock-collapsed");
+ }
+
+ if (elem_title) {
+ elem_title.addEventListener("click", (ev) => {
+ ev.stopPropagation();
+ ev.preventDefault();
+ if (elem_div.classList.contains("hk-codeblock-collapsed")) {
+ elem_div.classList.remove("hk-codeblock-collapsed");
+ } else {
+ elem_div.classList.add("hk-codeblock-collapsed");
+ }
+ });
+
+ const elem_collapseBtns = document.createElement("div");
+ elem_collapseBtns.classList.add("hk-codeblock-collapse-btns");
+
+ const elem_collapseBtn = document.createElement("div");
+ elem_collapseBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-collapsed-btn");
+ elem_collapseBtn.innerHTML = ``;
+ elem_collapseBtns.appendChild(elem_collapseBtn);
+
+ const elem_expandBtn = document.createElement("div");
+ elem_expandBtn.classList.add("hk-codeblock-collapse-btn", "hk-codeblock-expanded-btn");
+ elem_expandBtn.innerHTML = ``;
+ elem_collapseBtns.appendChild(elem_expandBtn);
+
+ elem_title.prepend(elem_collapseBtns);
+ }
+ }
+
+
if (
(settings.useLinenosGlobal === "always on") ||
(settings.useLinenosGlobal === "default on, but off when specified" && (showLinenos === undefined || showLinenos === true)) ||
@@ -334,7 +398,7 @@ export async function HKCodeBlockProcessor(
elem_pre.setAttribute("data-output", no_prompt_line_idxs.join(", "));
}
- if(settings.useResultGlobal === "enable" && (isResult === true)) {
+ if (settings.useResultGlobal === "enable" && (isResult === true)) {
elem_div.classList.add("hk-codeblock-result");
elem_code.classList.add("hk-codeblock-result-code");
diff --git a/src/HKCodeBlockSettingTab.ts b/src/HKCodeBlockSettingTab.ts
index 5ac954e..02ef990 100755
--- a/src/HKCodeBlockSettingTab.ts
+++ b/src/HKCodeBlockSettingTab.ts
@@ -39,6 +39,44 @@ export class HKCodeBlockSettingTab extends PluginSettingTab {
})
);
+ // collapse
+ containerEl.createEl('h2', { text: 'Collapse' });
+
+ new Setting(containerEl)
+ .setName('Use Collapse')
+ .setDesc(fragWithHTML(`- always on : the code block will always be collapsible
+ - default on, but off when specified : the code block will always be collapsible, but will not be collapsed if collapse statement is specified as false
+ - default off, but on when specified : the code block will only be collapsible if the collapse statement is specified as true
+ - always off : the code block will never be collapsible`))
+ .addDropdown(tc =>
+ tc.addOptions({
+ "always on": "always on",
+ "default on, but off when specified": "default on, but off when specified",
+ "default off, but on when specified": "default off, but on when specified",
+ "always off": "always off",
+ })
+ .setValue(this.plugin.settings.useCollapsibleGlobal)
+ .onChange(async (value: string) => {
+ this.plugin.settings.useCollapsibleGlobal = value as ("always on" | "default on, but off when specified" | "default off, but on when specified" | "always off");
+ await this.plugin.saveSettings();
+ })
+ );
+
+ new Setting(containerEl)
+ .setName('Default Collapse State')
+ .setDesc('The default collapse state of the code block.')
+ .addDropdown(tc =>
+ tc.addOptions({
+ "collapse": "collapse",
+ "expand": "expand",
+ })
+ .setValue(this.plugin.settings.defaultCollapse)
+ .onChange(async (value: string) => {
+ this.plugin.settings.defaultCollapse = value as ("collapse" | "expand");
+ await this.plugin.saveSettings();
+ })
+ );
+
// line numbers
containerEl.createEl('h2', { text: 'Line Numbers' });
@@ -181,8 +219,7 @@ export class HKCodeBlockSettingTab extends PluginSettingTab {
.setDesc(fragWithHTML(`- always on : prompt will always be shown
- default on, but off when specified : prompt will always be shown, but will not be shown if the prompt statement is specified as false
- default off, but on when specified : prompt will only be shown if the prompt statement is specified as true
- - always off : prompt will never be shown
- You can also specify the prompt by the statement like \`prompt:"My Prompt"\`. (default: "$")`))
+ - always off : prompt will never be shown`))
.addDropdown(tc =>
tc.addOptions({
"always on": "always on",
diff --git a/src/HKCodeBlockSettings.ts b/src/HKCodeBlockSettings.ts
index 226a8d9..a1ed0aa 100755
--- a/src/HKCodeBlockSettings.ts
+++ b/src/HKCodeBlockSettings.ts
@@ -1,6 +1,10 @@
export interface HKCodeBlockSettings {
useTitleGlobal: ("default off, but on when specified" | "always off");
+ useCollapsibleGlobal: ("always on" | "default on, but off when specified" | "default off, but on when specified" | "always off");
+ defaultCollapse: ("collapse" | "expand");
+ showCollapseBtn: boolean;
+
useLinenosGlobal: ("always on" | "default on, but off when specified" | "default off, but on when specified" | "always off");
defaultLinenosStart: number;
showLinenosSplitter: boolean;
@@ -26,6 +30,10 @@ export interface HKCodeBlockSettings {
export const DEFAULT_SETTINGS: HKCodeBlockSettings = {
useTitleGlobal: "default off, but on when specified",
+ useCollapsibleGlobal: "default on, but off when specified",
+ defaultCollapse: "expand",
+ showCollapseBtn: true,
+
useLinenosGlobal: "default off, but on when specified",
defaultLinenosStart: 1,
showLinenosSplitter: true,
diff --git a/src/styles.scss b/src/styles.scss
index 456b263..9bd7b3e 100644
--- a/src/styles.scss
+++ b/src/styles.scss
@@ -48,6 +48,10 @@
background-color: var(--hk-codeblock-background-color);
border-bottom: 1px solid var(--hk-codeblock-border-color);
color: var(--hk-codeblock-title-text-color);
+
+ display: flex;
+ flex-direction: row;
+ align-items: center;
}
.hk-codeblock-title~pre {
@@ -55,6 +59,63 @@
}
}
+/* collapse */
+.hk-codeblock.hk-codeblock-show-title.hk-codeblock-collapsible {
+ .hk-codeblock-title {
+ cursor: pointer;
+ position: relative;
+
+ .hk-codeblock-collapse-btns {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 4px;
+ position: relative;
+ top: -1px;
+
+ .hk-codeblock-collapse-btn {
+ width: 16px;
+ height: 16px;
+
+ fill: var(--hk-codeblock-title-text-color);
+ stroke: var(--hk-codeblock-title-text-color);
+ stroke-width: 2;
+ opacity: 0.2;
+
+ &.hk-codeblock-collapsed-btn {
+ display: none;
+ }
+
+ &.hk-codeblock-expanded-btn {
+ display: inline-block;
+ }
+ }
+ }
+ }
+
+ &.hk-codeblock-collapsed {
+ .hk-codeblock-title {
+ border-bottom: none;
+
+ .hk-codeblock-collapse-btns {
+ .hk-codeblock-collapse-btn {
+ &.hk-codeblock-collapsed-btn {
+ display: inline-block;
+ }
+
+ &.hk-codeblock-expanded-btn {
+ display: none;
+ }
+ }
+ }
+ }
+
+ pre {
+ display: none;
+ }
+ }
+}
+
/* linenos */
.hk-codeblock.hk-codeblock-show-linenos {
pre {
diff --git a/versions.json b/versions.json
index 9be1f3d..79c5364 100644
--- a/versions.json
+++ b/versions.json
@@ -1,3 +1,4 @@
{
- "0.1.0": "0.15.0"
+ "0.1.0": "1.0.0",
+ "0.2.0": "1.0.0"
}