diff --git a/.obsidian/graph.json b/.obsidian/graph.json index e89929fe..ee9f56b1 100644 --- a/.obsidian/graph.json +++ b/.obsidian/graph.json @@ -95,6 +95,6 @@ "repelStrength": 10, "linkStrength": 1, "linkDistance": 250, - "scale": 0.17618934741400732, + "scale": 0.1807672187165208, "close": true } \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-activity-history/data.json b/.obsidian/plugins/obsidian-activity-history/data.json index cd6cfd6e..8d5f97fc 100644 --- a/.obsidian/plugins/obsidian-activity-history/data.json +++ b/.obsidian/plugins/obsidian-activity-history/data.json @@ -12,8 +12,8 @@ "checkpointList": [ { "path": "/", - "date": "2022-08-31", - "size": 6877984 + "date": "2022-09-02", + "size": 6888376 } ], "activityHistory": [ @@ -954,7 +954,15 @@ }, { "date": "2022-08-31", - "value": 9055 + "value": 9236 + }, + { + "date": "2022-09-01", + "value": 1824 + }, + { + "date": "2022-09-02", + "value": 8755 } ] } diff --git a/.obsidian/plugins/obsidian-commits/data.json b/.obsidian/plugins/obsidian-commits/data.json index 88cf17b2..573358a1 100644 --- a/.obsidian/plugins/obsidian-commits/data.json +++ b/.obsidian/plugins/obsidian-commits/data.json @@ -2775,7 +2775,7 @@ "links": 2 }, "06.02 Investments/VC Tasks.md": { - "size": 2013, + "size": 2297, "tags": 3, "links": 7 }, @@ -2860,7 +2860,7 @@ "links": 3 }, "06.02 Investments/Equity Tasks.md": { - "size": 1898, + "size": 2198, "tags": 3, "links": 4 }, @@ -5470,9 +5470,9 @@ "links": 8 }, "00.01 Admin/Calendars/2022-08-31.md": { - "size": 1429, + "size": 1615, "tags": 0, - "links": 7 + "links": 9 }, "00.01 Admin/Calendars/2022-11-19 Fiancailles Marguerite & Arnold - Paris.md": { "size": 230, @@ -5485,17 +5485,37 @@ "links": 4 }, "05.01 Computer setup/Jellyfin.md": { - "size": 2258, + "size": 3520, "tags": 4, + "links": 3 + }, + "00.01 Admin/Calendars/2022-09-01.md": { + "size": 1135, + "tags": 0, + "links": 7 + }, + "00.01 Admin/Calendars/2022-09-17 Diner Raph & Dalia à la maison.md": { + "size": 110, + "tags": 0, + "links": 0 + }, + "00.01 Admin/Calendars/2022-09-02.md": { + "size": 1135, + "tags": 0, + "links": 4 + }, + "00.03 News/Extroverts destroy the world.md": { + "size": 5947, + "tags": 3, "links": 2 } }, "commitTypes": { "/": { - "Refactor": 747, - "Create": 793, - "Link": 1661, - "Expand": 729 + "Refactor": 748, + "Create": 797, + "Link": 1670, + "Expand": 736 } }, "dailyCommits": { @@ -5507,22 +5527,22 @@ "4": 12, "5": 6, "6": 33, - "7": 257, - "8": 395, - "9": 373, + "7": 259, + "8": 398, + "9": 375, "10": 240, "11": 199, - "12": 150, - "13": 264, - "14": 208, + "12": 152, + "13": 265, + "14": 214, "15": 223, - "16": 185, + "16": 186, "17": 179, "18": 372, "19": 189, - "20": 140, - "21": 111, - "22": 244, + "20": 139, + "21": 114, + "22": 246, "23": 53 } }, @@ -5530,9 +5550,9 @@ "/": { "Mon": 611, "Tue": 491, - "Wed": 539, - "Thu": 367, - "Fri": 333, + "Wed": 541, + "Thu": 374, + "Fri": 345, "Sat": 0, "Sun": 1589 } @@ -5540,9 +5560,16 @@ "recentCommits": { "/": { "Expanded": [ + " VC Tasks ", + " Equity Tasks ", " Jellyfin ", " Jellyfin ", " Jellyfin ", + " Jellyfin ", + " 2022-09-17 Diner Raph & Dalia à la maison ", + " 2022-08-31 ", + " Jellyfin ", + " Jellyfin ", " Nextcloud ", " Configuring Docker ", " Nextcloud ", @@ -5583,16 +5610,13 @@ " @France ", " @Dubaï ", " 2023-02-11 Mariage Eloi ", - " 2022-09-13 Diner Lorena ", - " Pan-seared Seabream with vine leaf risotto ", - " Pan-seared Seabream with vine leaf risotto ", - " Pan-seared Seabream with vine leaf risotto ", - " 2022-08-21 ", - " Derborence ", - " Derborence ", - " Polo Park Zürich " + " 2022-09-13 Diner Lorena " ], "Created": [ + " Extroverts destroy the world ", + " 2022-09-02 ", + " 2022-09-17 Diner Raph & Dalia à la maison ", + " 2022-09-01 ", " Jellyfin ", " 2023-01-14 Mmariage Marguerite & Arnold ", " 2022-11-19 Fiancailles Marguerite & Arnold - Paris ", @@ -5639,13 +5663,10 @@ " “Game of Thrones” v “Lord of the Rings” a tale of old v new Hollywood ", " Donald Trump and the Sweepstakes Scammers ", " The century of climate migration why we need to plan for the great upheaval ", - " A Dad Took Photos of His Naked Toddler for the Doctor. Google Flagged Him as a Criminal. ", - " 2022-08-21 ", - " Untitled ", - " “Republicans Buy Sneakers Too” ", - " U.S. Ship Sunk by Germans in 1917 Is Found Off English Coast " + " A Dad Took Photos of His Naked Toddler for the Doctor. Google Flagged Him as a Criminal. " ], "Renamed": [ + " Extroverts destroy the world ", " Jellyfin ", " 2023-01-14 Mariage Marguerite & Arnold ", " Romain Gary 2 ", @@ -5695,10 +5716,10 @@ " How ‘The Bear’ Captures the Panic of Modern Work ", " After the Zodiac Killer's '340' Cipher Stumped the FBI, Three Amateurs Made a Breakthrough ", " YouTube Fraud Led to $23 Million in Royalties for 2 Men, IRS Says ", - " Donald Trump and American Intelligence’s Years of Conflict ", - " How Bolivia’s ruthless tin baron saved thousands of Jewish refugees " + " Donald Trump and American Intelligence’s Years of Conflict " ], "Tagged": [ + " Extroverts destroy the world ", " Jellyfin ", " Test sheet ", " Squid Game (2021–) ", @@ -5748,8 +5769,7 @@ " Breaking Bad (2008–2013) ", " The Wire (2002–2008) ", " My Name Is Earl (2005–2009) ", - " The Big Bang Theory (2007–2019) ", - " Weeds (2005–2012) " + " The Big Bang Theory (2007–2019) " ], "Refactored": [ " Server Cloud ", @@ -5858,6 +5878,14 @@ " This Italian artist became the first female superstar of the Renaissance " ], "Linked": [ + " Extroverts destroy the world ", + " Extroverts destroy the world ", + " 2022-09-02 ", + " 2022-09-01 ", + " 2022-09-01 ", + " 2022-09-01 ", + " 2022-08-31 ", + " Jellyfin ", " 2022-08-31 ", " Jellyfin ", " Server Cloud ", @@ -5900,15 +5928,7 @@ " 2022-08-25 ", " 2022-08-25 ", " 2022-08-25 ", - " 2022-08-24 ", - " 2022-08-24 ", - " 2022-08-13 ", - " 2022-03-05 ", - " 2022-08-06 ", - " 2022-02-28 ", - " Mountain hikes in Switzerland ", - " Skiing in Switzerland ", - " Geneva " + " 2022-08-24 " ], "Removed Tags from": [ " Le Miel de Paris ", diff --git a/.obsidian/plugins/obsidian-full-calendar/data.json b/.obsidian/plugins/obsidian-full-calendar/data.json index 39d72d90..c25b74b3 100644 --- a/.obsidian/plugins/obsidian-full-calendar/data.json +++ b/.obsidian/plugins/obsidian-full-calendar/data.json @@ -32,5 +32,6 @@ } ], "defaultCalendar": 0, - "recursiveLocal": true + "recursiveLocal": true, + "firstDay": 1 } \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-reminder-plugin/data.json b/.obsidian/plugins/obsidian-reminder-plugin/data.json index e8c02a81..7a94b90b 100644 --- a/.obsidian/plugins/obsidian-reminder-plugin/data.json +++ b/.obsidian/plugins/obsidian-reminder-plugin/data.json @@ -44,12 +44,12 @@ { "title": ":cloud: [[Server Cloud]]: Backup server %%done_del%%", "time": "2022-09-06", - "rowNumber": 292 + "rowNumber": 283 }, { "title": ":cloud: [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks %%done_del%%", "time": "2023-01-01", - "rowNumber": 293 + "rowNumber": 284 } ], "05.02 Networks/Server Alias.md": [ @@ -344,18 +344,18 @@ { "title": ":bed: [[Household]] Change bedsheets %%done_del%%", "time": "2022-09-03", - "rowNumber": 87 - }, - { - "title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%", - "time": "2022-09-05", - "rowNumber": 85 + "rowNumber": 88 }, { "title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%", "time": "2022-09-06", "rowNumber": 77 }, + { + "title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%", + "time": "2022-09-12", + "rowNumber": 85 + }, { "title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%", "time": "2022-09-13", @@ -478,49 +478,49 @@ "06.02 Investments/VC Tasks.md": [ { "title": "💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%%", - "time": "2022-09-02", + "time": "2022-09-09", "rowNumber": 74 } ], "06.02 Investments/Crypto Tasks.md": [ - { - "title": "💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%%", - "time": "2022-09-02", - "rowNumber": 74 - }, { "title": ":ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%%", "time": "2022-09-06", - "rowNumber": 78 + "rowNumber": 79 + }, + { + "title": "💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%%", + "time": "2022-09-09", + "rowNumber": 74 }, { "title": ":chart: Check [[Nimbus]] earnings %%done_del%%", "time": "2022-09-12", - "rowNumber": 80 + "rowNumber": 81 }, { "title": "Find staking for [[Aragon]]", "time": "2022-09-30", - "rowNumber": 82 + "rowNumber": 83 } ], "06.02 Investments/Equity Tasks.md": [ { "title": "💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%%", - "time": "2022-09-02", + "time": "2022-09-09", "rowNumber": 74 } ], "05.02 Networks/Configuring UFW.md": [ { "title": "🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%%", - "time": "2022-09-03", + "time": "2022-09-10", "rowNumber": 239 }, { "title": "🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list", - "time": "2022-09-03", - "rowNumber": 264 + "time": "2022-09-10", + "rowNumber": 265 } ], "00.01 Admin/Calendars/2022-01-22.md": [ @@ -589,16 +589,6 @@ "title": "15:13 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: write documentation Jellyfin", "time": "2022-09-04", "rowNumber": 81 - }, - { - "title": "15:14 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: find iOS & Mac clients that work well", - "time": "2022-09-14", - "rowNumber": 82 - }, - { - "title": "15:15 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: understand how live TV works", - "time": "2022-09-14", - "rowNumber": 83 } ] }, diff --git a/.obsidian/plugins/obsidian-style-settings/main.js b/.obsidian/plugins/obsidian-style-settings/main.js index c6a4bfef..2999162a 100644 --- a/.obsidian/plugins/obsidian-style-settings/main.js +++ b/.obsidian/plugins/obsidian-style-settings/main.js @@ -3376,10 +3376,23 @@ function generateColorVariables(key, format, colorStr, opacity, altFormats = []) } } } -function getCSSVariables(settings, config) { +function pushColors(arr, id, from, to, format, step, pad) { + const scale = chroma.scale([from.trim(), to.trim()]).domain([0, 100]); + for (let i = 0; i <= 100; i++) { + if (i % step === 0) { + const c = scale(i); + arr.push(...generateColorVariables(`${id}-${i.toString().padStart(pad, "0")}`, format, c.css(), c.alpha() !== 1)); + } + } +} +function getCSSVariables(settings, config, gradients, settingsManager) { const vars = []; const themedLight = []; const themedDark = []; + const gradientCandidates = {}; + const gradientCandidatesLight = {}; + const gradientCandidatesDark = {}; + const seenGradientSections = new Set(); for (const key in settings) { const [sectionId, settingId, modifier] = key.split("@@"); const section = config[sectionId]; @@ -3392,11 +3405,8 @@ function getCSSVariables(settings, config) { switch (setting.type) { case "variable-number": case "variable-number-slider": - const format = setting - .format; - const val = value !== undefined - ? value - : setting.default; + const format = setting.format; + const val = value !== undefined ? value : setting.default; vars.push({ key: setting.id, value: `${val}${format || ""}`, @@ -3405,9 +3415,7 @@ function getCSSVariables(settings, config) { case "variable-text": case "variable-select": const format_text = setting; - let text = value !== undefined - ? value.toString() - : format_text.default.toString(); + let text = value !== undefined ? value.toString() : format_text.default.toString(); if (format_text.quotes) { if (text !== `""`) { text = `'${text}'`; @@ -3418,29 +3426,76 @@ function getCSSVariables(settings, config) { } vars.push({ key: setting.id, - value: text + value: text, }); continue; case "variable-color": { + if (!seenGradientSections.has(sectionId)) + seenGradientSections.add(sectionId); const colorSetting = setting; const color = value !== undefined ? value.toString() : colorSetting.default; vars.push(...generateColorVariables(setting.id, colorSetting.format, color, colorSetting.opacity, colorSetting["alt-format"])); + generateColorVariables(setting.id, "rgb", color, colorSetting.opacity).forEach((kv) => { + gradientCandidates[kv.key] = kv.value; + }); continue; } case "variable-themed-color": { + if (!seenGradientSections.has(sectionId)) + seenGradientSections.add(sectionId); const colorSetting = setting; const color = value !== undefined ? value.toString() : colorSetting[modifier === "light" ? "default-light" : "default-dark"]; (modifier === "light" ? themedLight : themedDark).push(...generateColorVariables(setting.id, colorSetting.format, color, colorSetting.opacity, colorSetting["alt-format"])); + generateColorVariables(setting.id, "rgb", color, colorSetting.opacity).forEach((kv) => { + if (modifier === "light") { + gradientCandidatesLight[kv.key] = kv.value; + } + else { + gradientCandidatesDark[kv.key] = kv.value; + } + }); + continue; } } } + seenGradientSections.forEach((sectionId) => { + const g = gradients[sectionId]; + if (!g) + return; + g.forEach((def) => { + var _a, _b, _c; + const { from, to, format, step, id, pad = 0 } = def; + if (gradientCandidatesLight[from]) { + const fromColor = gradientCandidatesLight[from]; + const toColor = gradientCandidatesLight[to] || ((_a = settingsManager.plugin.getCSSVar(to).light) === null || _a === void 0 ? void 0 : _a.trim()); + if (toColor) { + pushColors(themedLight, id, fromColor, toColor, format, step, pad); + } + } + if (gradientCandidatesDark[from]) { + const fromColor = gradientCandidatesDark[from]; + const toColor = gradientCandidatesDark[to] || ((_b = settingsManager.plugin.getCSSVar(to).dark) === null || _b === void 0 ? void 0 : _b.trim()); + if (toColor) { + pushColors(themedDark, id, fromColor, toColor, format, step, pad); + } + } + if (gradientCandidates[from]) { + const fromColor = gradientCandidates[from]; + const toColor = gradientCandidates[to] || ((_c = settingsManager.plugin.getCSSVar(to).current) === null || _c === void 0 ? void 0 : _c.trim()); + if (toColor) { + pushColors(vars, id, fromColor, toColor, format, step, pad); + } + } + }); + }); return [vars, themedLight, themedDark]; } class CSSSettingsManager { constructor(plugin) { this.config = {}; + this.gradients = {}; this.plugin = plugin; this.settings = {}; this.styleTag = document.createElement("style"); @@ -3470,8 +3525,7 @@ class CSSSettingsManager { if (setting.type === "class-toggle") { const classToggle = setting; let value = this.getSetting(section, settingId); - if (value === true || - (value === undefined && classToggle.default === true)) { + if (value === true || (value === undefined && classToggle.default === true)) { document.body.classList.add(setting.id); } } @@ -3505,7 +3559,7 @@ class CSSSettingsManager { }); } setCSSVariables() { - const [vars, themedLight, themedDark] = getCSSVariables(this.settings, this.config); + const [vars, themedLight, themedDark] = getCSSVariables(this.settings, this.config, this.gradients, this); this.styleTag.innerText = ` body.css-settings-manager { ${vars.reduce((combined, current) => { @@ -3530,10 +3584,16 @@ class CSSSettingsManager { } setConfig(settings) { this.config = {}; + this.gradients = {}; settings.forEach((s) => { this.config[s.id] = {}; s.settings.forEach((setting) => { this.config[s.id][setting.id] = setting; + if (setting.type === "color-gradient") { + if (!this.gradients[s.id]) + this.gradients[s.id] = []; + this.gradients[s.id].push(setting); + } }); }); let pruned = false; @@ -3610,9 +3670,7 @@ class ExportModal extends obsidian.Modal { onOpen() { let { contentEl, modalEl } = this; modalEl.addClass("modal-style-settings"); - new obsidian.Setting(contentEl) - .setName(`Export settings for: ${this.section}`) - .then((setting) => { + new obsidian.Setting(contentEl).setName(`Export settings for: ${this.section}`).then((setting) => { const output = JSON.stringify(this.config, null, 2); // Build a copy to clipboard link setting.controlEl.createEl("a", { @@ -3620,9 +3678,7 @@ class ExportModal extends obsidian.Modal { text: "Copy to clipboard", href: "#", }, (copyButton) => { - new obsidian.TextAreaComponent(contentEl) - .setValue(output) - .then((textarea) => { + new obsidian.TextAreaComponent(contentEl).setValue(output).then((textarea) => { copyButton.addEventListener("click", (e) => { e.preventDefault(); // Select the textarea contents and copy them to the clipboard @@ -3719,12 +3775,8 @@ class ImportModal extends obsidian.Modal { for: "style-settings-import-input", }, }); - new obsidian.TextAreaComponent(contentEl) - .setPlaceholder("Paste config here...") - .then((ta) => { - new obsidian.ButtonComponent(contentEl) - .setButtonText("Save") - .onClick(() => __awaiter(this, void 0, void 0, function* () { + new obsidian.TextAreaComponent(contentEl).setPlaceholder("Paste config here...").then((ta) => { + new obsidian.ButtonComponent(contentEl).setButtonText("Save").onClick(() => __awaiter(this, void 0, void 0, function* () { yield importAndClose(ta.getValue().trim()); })); }); @@ -4222,7 +4274,12 @@ function isValidDefaultColor(color) { return /^(#|rgb|hsl)/.test(color); } function createVariableColor(opts) { + var _a; const { isView, sectionId, config, containerEl, settingsManager } = opts; + if (typeof config.default !== "string" || + !isValidDefaultColor(config.default)) { + config.default = (_a = settingsManager.plugin.getCSSVar(config.id).current) === null || _a === void 0 ? void 0 : _a.trim(); + } if (typeof config.default !== "string" || !isValidDefaultColor(config.default)) { return console.error(`${t("Error:")} ${getTitle(config)} ${t("missing default value, or value is not in a valid color format")}`); @@ -8592,10 +8649,19 @@ class CSSSettingsPlugin extends obsidian.Plugin { this.registerEvent(this.app.workspace.on("parse-style-settings", () => { this.parseCSS(); })); + this.lightEl = document.body.createDiv("theme-light style-settings-ref"); + this.darkEl = document.body.createDiv("theme-dark style-settings-ref"); document.body.classList.add("css-settings-manager"); this.parseCSS(); }); } + getCSSVar(id) { + const light = getComputedStyle(this.lightEl).getPropertyValue(`--${id}`); + const dark = getComputedStyle(this.darkEl).getPropertyValue(`--${id}`); + const current = getComputedStyle(document.body).getPropertyValue(`--${id}`); + console.log(id, light, dark, current); + return { light, dark, current }; + } parseCSS() { clearTimeout(this.debounceTimer); this.settingsList = []; @@ -8643,6 +8709,10 @@ class CSSSettingsPlugin extends obsidian.Plugin { }, 100); } onunload() { + this.lightEl.remove(); + this.darkEl.remove(); + this.lightEl = null; + this.darkEl = null; document.body.classList.remove("css-settings-manager"); this.settingsManager.cleanup(); this.settingsTab.settingsMarkup.cleanup(); diff --git a/.obsidian/plugins/obsidian-style-settings/manifest.json b/.obsidian/plugins/obsidian-style-settings/manifest.json index 8b468134..5225fc1c 100644 --- a/.obsidian/plugins/obsidian-style-settings/manifest.json +++ b/.obsidian/plugins/obsidian-style-settings/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-style-settings", "name": "Style Settings", - "version": "0.4.10", + "version": "0.4.11", "minAppVersion": "0.11.5", "description": "Offers controls for adjusting theme, plugin, and snippet CSS variables.", "author": "mgmeyers", diff --git a/.obsidian/plugins/obsidian-style-settings/styles.css b/.obsidian/plugins/obsidian-style-settings/styles.css index 40863fef..a4ddb64c 100644 --- a/.obsidian/plugins/obsidian-style-settings/styles.css +++ b/.obsidian/plugins/obsidian-style-settings/styles.css @@ -209,6 +209,13 @@ .view-content .style-settings-container .setting-item:not(.setting-item-heading) .themed-color-wrapper { display: flex; +} + +.style-settings-ref { + position: absolute; + width: 0 !important; + height: 0 !important; + pointer-events: none; }/*! Pickr 1.8.4 MIT | https://github.com/Simonwep/pickr */ .pickr{position:relative;overflow:visible;transform:translateY(0)}.pickr *{box-sizing:border-box;outline:none;border:none;-webkit-appearance:none}.pickr .pcr-button{position:relative;height:2em;width:2em;padding:0.5em;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Helvetica Neue",Arial,sans-serif;border-radius:.15em;background:url('data:image/svg+xml;utf8, ') no-repeat center;background-size:0;transition:all 0.3s}.pickr .pcr-button::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.pickr .pcr-button::before{z-index:initial}.pickr .pcr-button::after{position:absolute;content:'';top:0;left:0;height:100%;width:100%;transition:background 0.3s;background:var(--pcr-color);border-radius:.15em}.pickr .pcr-button.clear{background-size:70%}.pickr .pcr-button.clear::before{opacity:0}.pickr .pcr-button.clear:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px var(--pcr-color)}.pickr .pcr-button.disabled{cursor:not-allowed}.pickr *,.pcr-app *{box-sizing:border-box;outline:none;border:none;-webkit-appearance:none}.pickr input:focus,.pickr input.pcr-active,.pickr button:focus,.pickr button.pcr-active,.pcr-app input:focus,.pcr-app input.pcr-active,.pcr-app button:focus,.pcr-app button.pcr-active{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px var(--pcr-color)}.pickr .pcr-palette,.pickr .pcr-slider,.pcr-app .pcr-palette,.pcr-app .pcr-slider{transition:box-shadow 0.3s}.pickr .pcr-palette:focus,.pickr .pcr-slider:focus,.pcr-app .pcr-palette:focus,.pcr-app .pcr-slider:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px rgba(0,0,0,0.25)}.pcr-app{position:fixed;display:flex;flex-direction:column;z-index:10000;border-radius:0.1em;background:#fff;opacity:0;visibility:hidden;transition:opacity 0.3s, visibility 0s 0.3s;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Helvetica Neue",Arial,sans-serif;box-shadow:0 0.15em 1.5em 0 rgba(0,0,0,0.1),0 0 1em 0 rgba(0,0,0,0.03);left:0;top:0}.pcr-app.visible{transition:opacity 0.3s;visibility:visible;opacity:1}.pcr-app .pcr-swatches{display:flex;flex-wrap:wrap;margin-top:0.75em}.pcr-app .pcr-swatches.pcr-last{margin:0}@supports (display: grid){.pcr-app .pcr-swatches{display:grid;align-items:center;grid-template-columns:repeat(auto-fit, 1.75em)}}.pcr-app .pcr-swatches>button{font-size:1em;position:relative;width:calc(1.75em - 5px);height:calc(1.75em - 5px);border-radius:0.15em;cursor:pointer;margin:2.5px;flex-shrink:0;justify-self:center;transition:all 0.15s;overflow:hidden;background:transparent;z-index:1}.pcr-app .pcr-swatches>button::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:6px;border-radius:.15em;z-index:-1}.pcr-app .pcr-swatches>button::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background:var(--pcr-color);border:1px solid rgba(0,0,0,0.05);border-radius:0.15em;box-sizing:border-box}.pcr-app .pcr-swatches>button:hover{filter:brightness(1.05)}.pcr-app .pcr-swatches>button:not(.pcr-active){box-shadow:none}.pcr-app .pcr-interaction{display:flex;flex-wrap:wrap;align-items:center;margin:0 -0.2em 0 -0.2em}.pcr-app .pcr-interaction>*{margin:0 0.2em}.pcr-app .pcr-interaction input{letter-spacing:0.07em;font-size:0.75em;text-align:center;cursor:pointer;color:#75797e;background:#f1f3f4;border-radius:.15em;transition:all 0.15s;padding:0.45em 0.5em;margin-top:0.75em}.pcr-app .pcr-interaction input:hover{filter:brightness(0.975)}.pcr-app .pcr-interaction input:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px rgba(66,133,244,0.75)}.pcr-app .pcr-interaction .pcr-result{color:#75797e;text-align:left;flex:1 1 8em;min-width:8em;transition:all 0.2s;border-radius:.15em;background:#f1f3f4;cursor:text}.pcr-app .pcr-interaction .pcr-result::-moz-selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-result::selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-type.active{color:#fff;background:#4285f4}.pcr-app .pcr-interaction .pcr-save,.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{color:#fff;width:auto}.pcr-app .pcr-interaction .pcr-save,.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{color:#fff}.pcr-app .pcr-interaction .pcr-save:hover,.pcr-app .pcr-interaction .pcr-cancel:hover,.pcr-app .pcr-interaction .pcr-clear:hover{filter:brightness(0.925)}.pcr-app .pcr-interaction .pcr-save{background:#4285f4}.pcr-app .pcr-interaction .pcr-clear,.pcr-app .pcr-interaction .pcr-cancel{background:#f44250}.pcr-app .pcr-interaction .pcr-clear:focus,.pcr-app .pcr-interaction .pcr-cancel:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px rgba(244,66,80,0.75)}.pcr-app .pcr-selection .pcr-picker{position:absolute;height:18px;width:18px;border:2px solid #fff;border-radius:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pcr-app .pcr-selection .pcr-color-palette,.pcr-app .pcr-selection .pcr-color-chooser,.pcr-app .pcr-selection .pcr-color-opacity{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column;cursor:grab;cursor:-webkit-grab}.pcr-app .pcr-selection .pcr-color-palette:active,.pcr-app .pcr-selection .pcr-color-chooser:active,.pcr-app .pcr-selection .pcr-color-opacity:active{cursor:grabbing;cursor:-webkit-grabbing}.pcr-app[data-theme='nano']{width:14.25em;max-width:95vw}.pcr-app[data-theme='nano'] .pcr-swatches{margin-top:.6em;padding:0 .6em}.pcr-app[data-theme='nano'] .pcr-interaction{padding:0 .6em .6em .6em}.pcr-app[data-theme='nano'] .pcr-selection{display:grid;grid-gap:.6em;grid-template-columns:1fr 4fr;grid-template-rows:5fr auto auto;align-items:center;height:10.5em;width:100%;align-self:flex-start}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview{grid-area:2 / 1 / 4 / 1;height:100%;width:100%;display:flex;flex-direction:row;justify-content:center;margin-left:.6em}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview .pcr-last-color{display:none}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview .pcr-current-color{position:relative;background:var(--pcr-color);width:2em;height:2em;border-radius:50em;overflow:hidden}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview .pcr-current-color::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-palette{grid-area:1 / 1 / 2 / 3;width:100%;height:100%;z-index:1}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-palette .pcr-palette{border-radius:.15em;width:100%;height:100%}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-palette .pcr-palette::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, ');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser{grid-area:2 / 2 / 2 / 2}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity{grid-area:3 / 2 / 3 / 2}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser,.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity{height:0.5em;margin:0 .6em}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser .pcr-picker,.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity .pcr-picker{top:50%;transform:translateY(-50%)}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser .pcr-slider,.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity .pcr-slider{flex-grow:1;border-radius:50em}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser .pcr-slider{background:linear-gradient(to right, red, #ff0, lime, cyan, blue, #f0f, red)}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity .pcr-slider{background:linear-gradient(to right, transparent, black),url('data:image/svg+xml;utf8, ');background-size:100%, 0.25em} diff --git a/.obsidian/plugins/obsidian42-brat/main.js b/.obsidian/plugins/obsidian42-brat/main.js index b56f65ca..1c3bdc78 100644 --- a/.obsidian/plugins/obsidian42-brat/main.js +++ b/.obsidian/plugins/obsidian42-brat/main.js @@ -1,20 +1,23 @@ -var Ve=Object.create;var _=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Qe=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports),Ge=(s,t)=>{for(var e in t)_(s,e,{get:t[e],enumerable:!0})},ge=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qe(t))!We.call(s,i)&&i!==e&&_(s,i,{get:()=>t[i],enumerable:!(n=je(t,i))||n.enumerable});return s};var Ke=(s,t,e)=>(e=s!=null?Ve(Je(s)):{},ge(t||!s||!s.__esModule?_(e,"default",{value:s,enumerable:!0}):e,s)),Ze=s=>ge(_({},"__esModule",{value:!0}),s);var a=(s,t,e)=>new Promise((n,i)=>{var o=c=>{try{l(e.next(c))}catch(g){i(g)}},r=c=>{try{l(e.throw(c))}catch(g){i(g)}},l=c=>c.done?n(c.value):Promise.resolve(c.value).then(o,r);l((e=e.apply(s,t)).next())});var ze=Qe(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});var p=require("obsidian"),ie="YYYY-MM-DD",se="gggg-[W]ww",Ae="YYYY-MM",Ee="YYYY-[Q]Q",Ie="YYYY";function D(s){var e,n;let t=window.app.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e[s])==null?void 0:n.enabled)}function R(){var s,t,e,n;try{let{internalPlugins:i,plugins:o}=window.app;if(D("daily")){let{format:g,folder:h,template:d}=((t=(s=o.getPlugin("periodic-notes"))==null?void 0:s.settings)==null?void 0:t.daily)||{};return{format:g||ie,folder:(h==null?void 0:h.trim())||"",template:(d==null?void 0:d.trim())||""}}let{folder:r,format:l,template:c}=((n=(e=i.getPluginById("daily-notes"))==null?void 0:e.instance)==null?void 0:n.options)||{};return{format:l||ie,folder:(r==null?void 0:r.trim())||"",template:(c==null?void 0:c.trim())||""}}catch(i){console.info("No custom daily note settings found!",i)}}function k(){var s,t,e,n,i,o,r;try{let l=window.app.plugins,c=(s=l.getPlugin("calendar"))==null?void 0:s.options,g=(e=(t=l.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.weekly;if(D("weekly"))return{format:g.format||se,folder:((n=g.folder)==null?void 0:n.trim())||"",template:((i=g.template)==null?void 0:i.trim())||""};let h=c||{};return{format:h.weeklyNoteFormat||se,folder:((o=h.weeklyNoteFolder)==null?void 0:o.trim())||"",template:((r=h.weeklyNoteTemplate)==null?void 0:r.trim())||""}}catch(l){console.info("No custom weekly note settings found!",l)}}function M(){var t,e,n,i;let s=window.app.plugins;try{let o=D("monthly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.monthly)||{};return{format:o.format||Ae,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom monthly note settings found!",o)}}function x(){var t,e,n,i;let s=window.app.plugins;try{let o=D("quarterly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.quarterly)||{};return{format:o.format||Ee,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom quarterly note settings found!",o)}}function O(){var t,e,n,i;let s=window.app.plugins;try{let o=D("yearly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.yearly)||{};return{format:o.format||Ie,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom yearly note settings found!",o)}}function Le(...s){let t=[];for(let n=0,i=s.length;n{let X=n(),ee=s.clone().set({hour:X.get("hour"),minute:X.get("minute"),second:X.get("second")});return T&&ee.add(parseInt(f,10),P),w?ee.format(w.substring(1).trim()):ee.format(o)}).replace(/{{\s*yesterday\s*}}/gi,s.clone().subtract(1,"day").format(o)).replace(/{{\s*tomorrow\s*}}/gi,s.clone().add(1,"d").format(o)));return t.foldManager.save(d,c),d}catch(d){console.error(`Failed to create file: '${h}'`,d),new p.Notice("Unable to create new file.")}})}function at(s,t){var e;return(e=t[N(s,"day")])!=null?e:null}function rt(){let{vault:s}=window.app,{folder:t}=R(),e=s.getAbstractFileByPath(p.normalizePath(t));if(!e)throw new oe("Failed to find daily notes folder");let n={};return p.Vault.recurseChildren(e,i=>{if(i instanceof p.TFile){let o=E(i,"day");if(o){let r=N(o,"day");n[r]=i}}}),n}var ae=class extends Error{};function lt(){let{moment:s}=window,t=s.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;t;)e.push(e.shift()),t--;return e}function ut(s){return lt().indexOf(s.toLowerCase())}function ke(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=k(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*title\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(h,d,b)=>{let y=ut(d);return s.weekday(y).format(b.trim())}));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function gt(s,t){var e;return(e=t[N(s,"week")])!=null?e:null}function ct(){let s={};if(!xe())return s;let{vault:t}=window.app,{folder:e}=k(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new ae("Failed to find weekly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"week");if(o){let r=N(o,"week");s[r]=i}}}),s}var re=class extends Error{};function Me(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=M(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function dt(s,t){var e;return(e=t[N(s,"month")])!=null?e:null}function mt(){let s={};if(!Oe())return s;let{vault:t}=window.app,{folder:e}=M(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new re("Failed to find monthly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"month");if(o){let r=N(o,"month");s[r]=i}}}),s}var le=class extends Error{};function pt(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=x(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function ft(s,t){var e;return(e=t[N(s,"quarter")])!=null?e:null}function ht(){let s={};if(!$e())return s;let{vault:t}=window.app,{folder:e}=x(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new le("Failed to find quarterly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"quarter");if(o){let r=N(o,"quarter");s[r]=i}}}),s}var ue=class extends Error{};function bt(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=O(),[o,r]=yield A(e),l=s.format(n),c=yield $(i,l);try{let g=yield t.create(c,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,y,T,f)=>{let P=window.moment(),w=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&w.add(parseInt(y,10),T),f?w.format(f.substring(1).trim()):w.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(g,r),g}catch(g){console.error(`Failed to create file: '${c}'`,g),new p.Notice("Unable to create new file.")}})}function wt(s,t){var e;return(e=t[N(s,"year")])!=null?e:null}function yt(){let s={};if(!Ue())return s;let{vault:t}=window.app,{folder:e}=O(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new ue("Failed to find yearly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=E(i,"year");if(o){let r=N(o,"year");s[r]=i}}}),s}function Tt(){var n,i;let{app:s}=window,t=s.internalPlugins.plugins["daily-notes"];if(t&&t.enabled)return!0;let e=s.plugins.getPlugin("periodic-notes");return e&&((i=(n=e.settings)==null?void 0:n.daily)==null?void 0:i.enabled)}function xe(){var e,n;let{app:s}=window;if(s.plugins.getPlugin("calendar"))return!0;let t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.weekly)==null?void 0:n.enabled)}function Oe(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.monthly)==null?void 0:n.enabled)}function $e(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.quarterly)==null?void 0:n.enabled)}function Ue(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.yearly)==null?void 0:n.enabled)}function Pt(s){return{day:R,week:k,month:M,quarter:x,year:O}[s]()}function vt(s,t){return{day:Re,month:Me,week:ke}[s](t)}u.DEFAULT_DAILY_NOTE_FORMAT=ie;u.DEFAULT_MONTHLY_NOTE_FORMAT=Ae;u.DEFAULT_QUARTERLY_NOTE_FORMAT=Ee;u.DEFAULT_WEEKLY_NOTE_FORMAT=se;u.DEFAULT_YEARLY_NOTE_FORMAT=Ie;u.appHasDailyNotesPluginLoaded=Tt;u.appHasMonthlyNotesPluginLoaded=Oe;u.appHasQuarterlyNotesPluginLoaded=$e;u.appHasWeeklyNotesPluginLoaded=xe;u.appHasYearlyNotesPluginLoaded=Ue;u.createDailyNote=Re;u.createMonthlyNote=Me;u.createPeriodicNote=vt;u.createQuarterlyNote=pt;u.createWeeklyNote=ke;u.createYearlyNote=bt;u.getAllDailyNotes=rt;u.getAllMonthlyNotes=mt;u.getAllQuarterlyNotes=ht;u.getAllWeeklyNotes=ct;u.getAllYearlyNotes=yt;u.getDailyNote=at;u.getDailyNoteSettings=R;u.getDateFromFile=E;u.getDateFromPath=ot;u.getDateUID=N;u.getMonthlyNote=dt;u.getMonthlyNoteSettings=M;u.getPeriodicNoteSettings=Pt;u.getQuarterlyNote=ft;u.getQuarterlyNoteSettings=x;u.getTemplateInfo=A;u.getWeeklyNote=gt;u.getWeeklyNoteSettings=k;u.getYearlyNote=wt;u.getYearlyNoteSettings=O});var St={};Ge(St,{default:()=>Z});module.exports=Ze(St);var Ye=require("obsidian");var v=require("obsidian");var q=require("obsidian");var ce=require("obsidian"),S=class extends ce.FuzzySuggestModal{constructor(e){super(e.app);this.scope.register(["Shift"],"Enter",n=>this.enterTrigger(n)),this.scope.register(["Ctrl"],"Enter",n=>this.enterTrigger(n))}setSuggesterData(e){this.data=e}display(e){return a(this,null,function*(){this.callbackFunction=e,this.open()})}getItems(){return this.data}getItemText(e){return e.display}onChooseItem(){}renderSuggestion(e,n){n.createEl("div",{text:e.item.display})}enterTrigger(e){let n=document.querySelector(".suggestion-item.is-selected div").textContent,i=this.data.find(o=>o.display===n);i&&(this.invokeCallback(i,e),this.close())}onChooseSuggestion(e,n){this.invokeCallback(e.item,n)}invokeCallback(e,n){this.callbackFunction(e,n)}};var F=require("obsidian"),Xe="https://raw.githubusercontent.com/",H=(s,t,e)=>a(void 0,null,function*(){let n=`https://github.com/${s}/releases/download/${t}/${e}`;try{let i=yield(0,F.request)({url:n});return i==="Not Found"||i==='{"error":"Not Found"}'?null:i}catch(i){console.log("error in grabReleaseFileFromRepository",n,i)}}),de=(s,t=!0)=>a(void 0,null,function*(){let e=Xe+s+(t===!0?"/HEAD/manifest.json":"/HEAD/manifest-beta.json");try{let n=yield(0,F.request)({url:e});return n==="404: Not Found"?null:yield JSON.parse(n)}catch(n){console.log(`error in grabManifestJsonFromRepository for ${e}`,n)}}),me=()=>a(void 0,null,function*(){let s="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";try{let t=yield(0,F.request)({url:s});return t==="404: Not Found"?null:yield JSON.parse(t)}catch(t){console.log("error in grabCommmunityPluginList",t)}}),Y=()=>a(void 0,null,function*(){let s="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json";try{let t=yield(0,F.request)({url:s});return t==="404: Not Found"?null:yield JSON.parse(t)}catch(t){console.log("error in grabCommmunityThemesList",t)}}),te=s=>a(void 0,null,function*(){let t=`https://raw.githubusercontent.com/${s}/HEAD/obsidian.css`;try{let e=yield(0,F.request)({url:t});return e==="404: Not Found"?null:e}catch(e){console.log("error in grabCommmunityThemesList",e)}}),et=(s,t)=>a(void 0,null,function*(){let e=`https://api.github.com/repos/${s}/commits?path=${t}&page=1&per_page=1`;try{let n=yield(0,F.request)({url:e});return n==="404: Not Found"?null:JSON.parse(n)}catch(n){console.log("error in grabCommmunityThemesList",n)}}),V=(s,t)=>a(void 0,null,function*(){let e=yield et(s,t);return e[0].commit.committer.date?e[0].commit.committer.date:""});var pe={pluginList:[],pluginSubListFrozenVersion:[],themesList:[],updateAtStartup:!1,updateThemesAtStartup:!1,ribbonIconEnabled:!0,loggingEnabled:!1,loggingPath:"BRAT-log",loggingVerboseEnabled:!1,debuggingMode:!0,notificationsEnabled:!0};function fe(s,t,e=""){return a(this,null,function*(){let n=!1;s.settings.pluginList.contains(t)||(s.settings.pluginList.unshift(t),n=!0),e!==""&&s.settings.pluginSubListFrozenVersion.filter(i=>i.repo===t).length===0&&(s.settings.pluginSubListFrozenVersion.unshift({repo:t,version:e}),n=!0),n&&s.saveSettings()})}function he(s,t){return a(this,null,function*(){return s.settings.pluginList.contains(t)})}function be(s,t){return a(this,null,function*(){let e={repo:t,lastUpdate:yield V(t,"obsidian.css")};s.settings.themesList.unshift(e),s.saveSettings()})}function we(s,t){return a(this,null,function*(){return!!s.settings.themesList.find(n=>n.repo===t)})}function ye(s,t,e){s.settings.themesList.forEach(n=>{n.repo===t&&(n.lastUpdate=e,s.saveSettings())})}var Te=require("obsidian");function m(s,t,e=10,n=null){if(s.settings.notificationsEnabled===!1)return;let i=n?"(click=dismiss, right-click=Info)":"",o=new Te.Notice(`BRAT +var He=Object.create;var V=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Qe=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports),Ge=(s,t)=>{for(var e in t)V(s,e,{get:t[e],enumerable:!0})},ce=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qe(t))!We.call(s,i)&&i!==e&&V(s,i,{get:()=>t[i],enumerable:!(n=je(t,i))||n.enumerable});return s};var Ke=(s,t,e)=>(e=s!=null?He(Je(s)):{},ce(t||!s||!s.__esModule?V(e,"default",{value:s,enumerable:!0}):e,s)),Ze=s=>ce(V({},"__esModule",{value:!0}),s);var a=(s,t,e)=>new Promise((n,i)=>{var o=g=>{try{l(e.next(g))}catch(c){i(c)}},r=g=>{try{l(e.throw(g))}catch(c){i(c)}},l=g=>g.done?n(g.value):Promise.resolve(g.value).then(o,r);l((e=e.apply(s,t)).next())});var ze=Qe(u=>{"use strict";Object.defineProperty(u,"__esModule",{value:!0});var p=require("obsidian"),se="YYYY-MM-DD",oe="gggg-[W]ww",Ce="YYYY-MM",Ee="YYYY-[Q]Q",Ie="YYYY";function R(s){var e,n;let t=window.app.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e[s])==null?void 0:n.enabled)}function k(){var s,t,e,n;try{let{internalPlugins:i,plugins:o}=window.app;if(R("daily")){let{format:c,folder:h,template:d}=((t=(s=o.getPlugin("periodic-notes"))==null?void 0:s.settings)==null?void 0:t.daily)||{};return{format:c||se,folder:(h==null?void 0:h.trim())||"",template:(d==null?void 0:d.trim())||""}}let{folder:r,format:l,template:g}=((n=(e=i.getPluginById("daily-notes"))==null?void 0:e.instance)==null?void 0:n.options)||{};return{format:l||se,folder:(r==null?void 0:r.trim())||"",template:(g==null?void 0:g.trim())||""}}catch(i){console.info("No custom daily note settings found!",i)}}function M(){var s,t,e,n,i,o,r;try{let l=window.app.plugins,g=(s=l.getPlugin("calendar"))==null?void 0:s.options,c=(e=(t=l.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.weekly;if(R("weekly"))return{format:c.format||oe,folder:((n=c.folder)==null?void 0:n.trim())||"",template:((i=c.template)==null?void 0:i.trim())||""};let h=g||{};return{format:h.weeklyNoteFormat||oe,folder:((o=h.weeklyNoteFolder)==null?void 0:o.trim())||"",template:((r=h.weeklyNoteTemplate)==null?void 0:r.trim())||""}}catch(l){console.info("No custom weekly note settings found!",l)}}function O(){var t,e,n,i;let s=window.app.plugins;try{let o=R("monthly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.monthly)||{};return{format:o.format||Ce,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom monthly note settings found!",o)}}function $(){var t,e,n,i;let s=window.app.plugins;try{let o=R("quarterly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.quarterly)||{};return{format:o.format||Ee,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom quarterly note settings found!",o)}}function x(){var t,e,n,i;let s=window.app.plugins;try{let o=R("yearly")&&((e=(t=s.getPlugin("periodic-notes"))==null?void 0:t.settings)==null?void 0:e.yearly)||{};return{format:o.format||Ie,folder:((n=o.folder)==null?void 0:n.trim())||"",template:((i=o.template)==null?void 0:i.trim())||""}}catch(o){console.info("No custom yearly note settings found!",o)}}function Le(...s){let t=[];for(let n=0,i=s.length;n{let ee=n(),te=s.clone().set({hour:ee.get("hour"),minute:ee.get("minute"),second:ee.get("second")});return w&&te.add(parseInt(f,10),P),y?te.format(y.substring(1).trim()):te.format(o)}).replace(/{{\s*yesterday\s*}}/gi,s.clone().subtract(1,"day").format(o)).replace(/{{\s*tomorrow\s*}}/gi,s.clone().add(1,"d").format(o)));return t.foldManager.save(d,g),d}catch(d){console.error(`Failed to create file: '${h}'`,d),new p.Notice("Unable to create new file.")}})}function at(s,t){var e;return(e=t[N(s,"day")])!=null?e:null}function rt(){let{vault:s}=window.app,{folder:t}=k(),e=s.getAbstractFileByPath(p.normalizePath(t));if(!e)throw new ae("Failed to find daily notes folder");let n={};return p.Vault.recurseChildren(e,i=>{if(i instanceof p.TFile){let o=I(i,"day");if(o){let r=N(o,"day");n[r]=i}}}),n}var re=class extends Error{};function lt(){let{moment:s}=window,t=s.localeData()._week.dow,e=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;t;)e.push(e.shift()),t--;return e}function ut(s){return lt().indexOf(s.toLowerCase())}function ke(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=M(),[o,r]=yield E(e),l=s.format(n),g=yield U(i,l);try{let c=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,T,w,f)=>{let P=window.moment(),y=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&y.add(parseInt(T,10),w),f?y.format(f.substring(1).trim()):y.format(n)}).replace(/{{\s*title\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(h,d,b)=>{let T=ut(d);return s.weekday(T).format(b.trim())}));return window.app.foldManager.save(c,r),c}catch(c){console.error(`Failed to create file: '${g}'`,c),new p.Notice("Unable to create new file.")}})}function gt(s,t){var e;return(e=t[N(s,"week")])!=null?e:null}function ct(){let s={};if(!Oe())return s;let{vault:t}=window.app,{folder:e}=M(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new re("Failed to find weekly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=I(i,"week");if(o){let r=N(o,"week");s[r]=i}}}),s}var le=class extends Error{};function Me(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=O(),[o,r]=yield E(e),l=s.format(n),g=yield U(i,l);try{let c=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,T,w,f)=>{let P=window.moment(),y=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&y.add(parseInt(T,10),w),f?y.format(f.substring(1).trim()):y.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(c,r),c}catch(c){console.error(`Failed to create file: '${g}'`,c),new p.Notice("Unable to create new file.")}})}function dt(s,t){var e;return(e=t[N(s,"month")])!=null?e:null}function mt(){let s={};if(!$e())return s;let{vault:t}=window.app,{folder:e}=O(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new le("Failed to find monthly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=I(i,"month");if(o){let r=N(o,"month");s[r]=i}}}),s}var ue=class extends Error{};function pt(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=$(),[o,r]=yield E(e),l=s.format(n),g=yield U(i,l);try{let c=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,T,w,f)=>{let P=window.moment(),y=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&y.add(parseInt(T,10),w),f?y.format(f.substring(1).trim()):y.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(c,r),c}catch(c){console.error(`Failed to create file: '${g}'`,c),new p.Notice("Unable to create new file.")}})}function ft(s,t){var e;return(e=t[N(s,"quarter")])!=null?e:null}function ht(){let s={};if(!xe())return s;let{vault:t}=window.app,{folder:e}=$(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new ue("Failed to find quarterly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=I(i,"quarter");if(o){let r=N(o,"quarter");s[r]=i}}}),s}var ge=class extends Error{};function bt(s){return a(this,null,function*(){let{vault:t}=window.app,{template:e,format:n,folder:i}=x(),[o,r]=yield E(e),l=s.format(n),g=yield U(i,l);try{let c=yield t.create(g,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(h,d,b,T,w,f)=>{let P=window.moment(),y=s.clone().set({hour:P.get("hour"),minute:P.get("minute"),second:P.get("second")});return b&&y.add(parseInt(T,10),w),f?y.format(f.substring(1).trim()):y.format(n)}).replace(/{{\s*date\s*}}/gi,l).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,l));return window.app.foldManager.save(c,r),c}catch(c){console.error(`Failed to create file: '${g}'`,c),new p.Notice("Unable to create new file.")}})}function wt(s,t){var e;return(e=t[N(s,"year")])!=null?e:null}function yt(){let s={};if(!Ue())return s;let{vault:t}=window.app,{folder:e}=x(),n=t.getAbstractFileByPath(p.normalizePath(e));if(!n)throw new ge("Failed to find yearly notes folder");return p.Vault.recurseChildren(n,i=>{if(i instanceof p.TFile){let o=I(i,"year");if(o){let r=N(o,"year");s[r]=i}}}),s}function Tt(){var n,i;let{app:s}=window,t=s.internalPlugins.plugins["daily-notes"];if(t&&t.enabled)return!0;let e=s.plugins.getPlugin("periodic-notes");return e&&((i=(n=e.settings)==null?void 0:n.daily)==null?void 0:i.enabled)}function Oe(){var e,n;let{app:s}=window;if(s.plugins.getPlugin("calendar"))return!0;let t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.weekly)==null?void 0:n.enabled)}function $e(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.monthly)==null?void 0:n.enabled)}function xe(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.quarterly)==null?void 0:n.enabled)}function Ue(){var e,n;let{app:s}=window,t=s.plugins.getPlugin("periodic-notes");return t&&((n=(e=t.settings)==null?void 0:e.yearly)==null?void 0:n.enabled)}function Pt(s){let t={day:k,week:M,month:O,quarter:$,year:x}[s];return t()}function vt(s,t){return{day:Re,month:Me,week:ke}[s](t)}u.DEFAULT_DAILY_NOTE_FORMAT=se;u.DEFAULT_MONTHLY_NOTE_FORMAT=Ce;u.DEFAULT_QUARTERLY_NOTE_FORMAT=Ee;u.DEFAULT_WEEKLY_NOTE_FORMAT=oe;u.DEFAULT_YEARLY_NOTE_FORMAT=Ie;u.appHasDailyNotesPluginLoaded=Tt;u.appHasMonthlyNotesPluginLoaded=$e;u.appHasQuarterlyNotesPluginLoaded=xe;u.appHasWeeklyNotesPluginLoaded=Oe;u.appHasYearlyNotesPluginLoaded=Ue;u.createDailyNote=Re;u.createMonthlyNote=Me;u.createPeriodicNote=vt;u.createQuarterlyNote=pt;u.createWeeklyNote=ke;u.createYearlyNote=bt;u.getAllDailyNotes=rt;u.getAllMonthlyNotes=mt;u.getAllQuarterlyNotes=ht;u.getAllWeeklyNotes=ct;u.getAllYearlyNotes=yt;u.getDailyNote=at;u.getDailyNoteSettings=k;u.getDateFromFile=I;u.getDateFromPath=ot;u.getDateUID=N;u.getMonthlyNote=dt;u.getMonthlyNoteSettings=O;u.getPeriodicNoteSettings=Pt;u.getQuarterlyNote=ft;u.getQuarterlyNoteSettings=$;u.getTemplateInfo=E;u.getWeeklyNote=gt;u.getWeeklyNoteSettings=M;u.getYearlyNote=wt;u.getYearlyNoteSettings=x});var St={};Ge(St,{default:()=>X});module.exports=Ze(St);var Ye=require("obsidian");var v=require("obsidian");var W=require("obsidian");var de=require("obsidian");var S=class extends de.FuzzySuggestModal{constructor(e){super(e.app);this.scope.register(["Shift"],"Enter",n=>this.enterTrigger(n)),this.scope.register(["Ctrl"],"Enter",n=>this.enterTrigger(n))}setSuggesterData(e){this.data=e}display(e){return a(this,null,function*(){this.callbackFunction=e,this.open()})}getItems(){return this.data}getItemText(e){return e.display}onChooseItem(){}renderSuggestion(e,n){n.createEl("div",{text:e.item.display})}enterTrigger(e){let n=document.querySelector(".suggestion-item.is-selected div").textContent,i=this.data.find(o=>o.display===n);i&&(this.invokeCallback(i,e),this.close())}onChooseSuggestion(e,n){this.invokeCallback(e.item,n)}invokeCallback(e,n){this.callbackFunction(e,n)}};var F=require("obsidian");var Xe="https://raw.githubusercontent.com/",Y=(s,t,e,n=!0)=>a(void 0,null,function*(){let i=`https://github.com/${s}/releases/download/${t}/${e}`;try{let o=yield(0,F.request)({url:i});return o==="Not Found"||o==='{"error":"Not Found"}'?null:o}catch(o){return n&&console.log("error in grabReleaseFileFromRepository",i,o),null}}),me=(s,t=!0,e=!0)=>a(void 0,null,function*(){let n=Xe+s+(t===!0?"/HEAD/manifest.json":"/HEAD/manifest-beta.json");try{let i=yield(0,F.request)({url:n});return i==="404: Not Found"?null:yield JSON.parse(i)}catch(i){return i!="Error: Request failed, status 404"&&e&&console.log(`error in grabManifestJsonFromRepository for ${n}`,i),null}}),pe=(s=!0)=>a(void 0,null,function*(){let t="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-plugins.json";try{let e=yield(0,F.request)({url:t});return e==="404: Not Found"?null:yield JSON.parse(e)}catch(e){return s&&console.log("error in grabCommmunityPluginList",e),null}}),H=(s=!0)=>a(void 0,null,function*(){let t="https://raw.githubusercontent.com/obsidianmd/obsidian-releases/HEAD/community-css-themes.json";try{let e=yield(0,F.request)({url:t});return e==="404: Not Found"?null:yield JSON.parse(e)}catch(e){return s&&console.log("error in grabCommmunityThemesList",e),null}}),ne=(s,t=!0)=>a(void 0,null,function*(){let e=`https://raw.githubusercontent.com/${s}/HEAD/obsidian.css`;try{let n=yield(0,F.request)({url:e});return n==="404: Not Found"?null:n}catch(n){return t&&console.log("error in grabCommmunityThemesList",n),null}}),et=(s,t,e=!0)=>a(void 0,null,function*(){let n=`https://api.github.com/repos/${s}/commits?path=${t}&page=1&per_page=1`;try{let i=yield(0,F.request)({url:n});return i==="404: Not Found"?null:JSON.parse(i)}catch(i){return e&&console.log("error in grabCommmunityThemesList",i),null}}),j=(s,t)=>a(void 0,null,function*(){let e=yield et(s,t);return e[0].commit.committer.date?e[0].commit.committer.date:""});var fe={pluginList:[],pluginSubListFrozenVersion:[],themesList:[],updateAtStartup:!1,updateThemesAtStartup:!1,ribbonIconEnabled:!0,loggingEnabled:!1,loggingPath:"BRAT-log",loggingVerboseEnabled:!1,debuggingMode:!0,notificationsEnabled:!0};function he(s,t,e=""){return a(this,null,function*(){let n=!1;s.settings.pluginList.contains(t)||(s.settings.pluginList.unshift(t),n=!0),e!==""&&s.settings.pluginSubListFrozenVersion.filter(i=>i.repo===t).length===0&&(s.settings.pluginSubListFrozenVersion.unshift({repo:t,version:e}),n=!0),n&&s.saveSettings()})}function be(s,t){return a(this,null,function*(){return s.settings.pluginList.contains(t)})}function we(s,t){return a(this,null,function*(){let e={repo:t,lastUpdate:yield j(t,"obsidian.css")};s.settings.themesList.unshift(e),s.saveSettings()})}function ye(s,t){return a(this,null,function*(){return!!s.settings.themesList.find(n=>n.repo===t)})}function Te(s,t,e){s.settings.themesList.forEach(n=>{n.repo===t&&(n.lastUpdate=e,s.saveSettings())})}var q=require("obsidian");function m(s,t,e=10,n=null){if(s.settings.notificationsEnabled===!1)return;let i=n?q.Platform.isDesktop?"(click=dismiss, right-click=Info)":"(click=dismiss)":"",o=new q.Notice(`BRAT ${t} -${i}`,e*1e3);n&&(o.noticeEl.oncontextmenu=()=>a(this,null,function*(){n()}))}function j(){return a(this,null,function*(){try{let s=yield fetch("https://obsidian.md/?"+Math.random());return s.status>=200&&s.status<300}catch(s){return!1}})}var Pe=s=>(0,q.normalizePath)(s.app.vault.configDir+"/themes")+"/",ne=(s,t,e="")=>a(void 0,null,function*(){let n=yield te(t);if(!n)return m(s,"There is no obsidian.css file in the root path of this repository, so there is no theme to install."),!1;yield ve(s,e,n);let i=`${e} theme installed from ${t}. `;return s.log(i+`[Theme Info](https://github.com/${t})`,!1),m(s,`${i}`,10,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),setTimeout(()=>{s.app.customCss.setTheme(e)},500),!0}),ve=(s,t,e)=>a(void 0,null,function*(){let n=Pe(s),i=s.app.vault.adapter;(yield i.exists(n))===!1&&(yield i.mkdir(n)),yield i.write(n+t+".css",e)}),Se=s=>a(void 0,null,function*(){let t=yield Y(),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i})),n=new S(s);n.setSuggesterData(e),yield n.display(i=>a(void 0,null,function*(){yield ne(s,i.info.repo,i.info.name)}))}),J=s=>("BRAT-"+s.replace("/","----")).substr(0,100),Ne=(s,t)=>a(void 0,null,function*(){s.settings.themesList=s.settings.themesList.filter(n=>n.repo!=t),s.saveSettings(),yield s.app.vault.adapter.remove(Pe(s)+J(t)+".css");let e=`Removed ${t} from BRAT themes list and deleted from vault`;s.log(e,!0),m(s,`${e}`)}),W=(s,t)=>a(void 0,null,function*(){if((yield j())===!1){console.log("BRAT: No internet detected.");return}let e,n="Checking for beta theme updates STARTED";s.log(n,!0),t&&s.settings.notificationsEnabled&&(e=new q.Notice(`BRAT -${n}`,3e4));for(let o of s.settings.themesList){let r=yield V(o.repo,"obsidian.css");r!==o.lastUpdate&&(yield tt(s,o.repo,o.lastUpdate,r))}let i="Checking for beta theme updates COMPLETED";s.log(i,!0),t&&(s.settings.notificationsEnabled&&e.hide(),m(s,i))}),tt=(s,t,e="",n="")=>a(void 0,null,function*(){let i=yield te(t);if(!i)return m(s,"There is no obsidian.css file in the root path of the ${cssGithubRepository} repository, so this theme cannot be updated."),!1;let o=J(t);yield ve(s,o,i),ye(s,t,n);let r=`${o} theme updated from ${t}. From date: ${e} to ${n} `;return s.log(r+`[Theme Info](https://github.com/${t})`,!1),m(s,`${r}`,20,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),!0});var Q=require("obsidian");var C=class extends Q.Modal{constructor(e,n=!1){super(e.app);this.plugin=e,this.address="",this.openSettingsTabAfterwards=n}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield we(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield ne(this.plugin,e,J(e)))&&(yield be(this.plugin,e),this.close())})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta theme:"}),this.contentEl.createEl("form",{},e=>{new Q.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: GitubUserName/repository-name"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Theme"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var G=class extends v.PluginSettingTab{constructor(e,n){super(e,n);this.plugin=n}display(){let{containerEl:e}=this;e.empty(),e.createEl("h2",{text:this.plugin.appName}),new v.Setting(e).setName("Auto-update plugins at startup").setDesc("If enabled all beta plugins will be checked for updates each time Obsidian starts. Note: this does not update frozen version plugins.").addToggle(i=>{i.setValue(this.plugin.settings.updateAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle(i=>{i.setValue(this.plugin.settings.updateThemesAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateThemesAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle(i=>{i.setValue(this.plugin.settings.ribbonIconEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.ribbonIconEnabled=o,this.plugin.settings.ribbonIconEnabled===!1?this.plugin.ribbonIcon.remove():this.plugin.showRibbonButton(),yield this.plugin.saveSettings()}))}),e.createEl("hr"),e.createEl("h2",{text:"Beta Plugin List"}),e.createEl("div",{text:'The following is a list of beta plugins added via the command palette "Add a beta plugin for testing" or "Add a beta plugin with frozen version for testing". A frozen version is a specific release of a plugin based on its releease tag. '}),e.createEl("p"),e.createEl("div",{text:"Click the x button next to a plugin to remove it from the list."}),e.createEl("p"),e.createEl("span").createEl("b",{text:"Note: "}),e.createSpan({text:"This does not delete the plugin, this should be done from the Community Plugins tab in Settings."}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!1)}))});let n=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo));for(let i of this.plugin.settings.pluginList)n.has(i)||new v.Setting(e).setName(i).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i))}))});new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin with frozen version"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!0)}))});for(let i of this.plugin.settings.pluginSubListFrozenVersion)new v.Setting(e).setName(`${i.repo} (version ${i.version})`).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Beta Themes List"}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta Theme"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),new C(this.plugin).open()}))});for(let i of this.plugin.settings.themesList)new v.Setting(e).setName(i.repo).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta theme"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield Ne(this.plugin,i.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Monitoring"}),new v.Setting(e).setName("Enable Notifications").setDesc("BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT.").addToggle(i=>{i.setValue(this.plugin.settings.notificationsEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.notificationsEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Logging").setDesc("Plugin updates will be logged to a file in the log file.").addToggle(i=>{i.setValue(this.plugin.settings.loggingEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(this.containerEl).setName("BRAT Log File Location").setDesc("Logs will be saved to this file. Don't add .md to the file name.").addSearch(i=>{i.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(o=>a(this,null,function*(){this.plugin.settings.loggingPath=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Verbose Logging").setDesc("Get a lot more information in the log.").addToggle(i=>{i.setValue(this.plugin.settings.loggingVerboseEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingVerboseEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Debugging Mode").setDesc("Atomic Bomb level console logging. Can be used for troubleshoting and development.").addToggle(i=>{i.setValue(this.plugin.settings.debuggingMode),i.onChange(o=>a(this,null,function*(){this.plugin.settings.debuggingMode=o,yield this.plugin.saveSettings()}))})}};var I=require("obsidian");var L=class extends I.Modal{constructor(e,n,i=!1,o=!1){super(e.app);this.plugin=e,this.betaPlugins=n,this.address="",this.openSettingsTabAfterwards=i,this.useFrozenVersion=o,this.version=""}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield he(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield this.betaPlugins.addPlugin(e,!1,!1,!1,this.version))&&this.close()})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta plugin:"}),this.contentEl.createEl("form",{},e=>{new I.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: TfTHacker/obsidian-brat)"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),this.useFrozenVersion&&new I.Setting(e).addText(n=>{n.setPlaceholder("Specify the release version tag (example: 1.0.0)"),n.onChange(i=>{this.version=i.trim()}),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Plugin"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var K=require("obsidian");var B=class{constructor(t){this.plugin=t}displayAddNewPluginModal(t=!1,e=!1){return a(this,null,function*(){new L(this.plugin,this,t,e).open()})}validateRepository(t,e=!1,n=!1){return a(this,null,function*(){let o=yield de(t,!e);return o?"id"in o?"version"in o?o:(n&&m(this.plugin,`${t} +${i}`,e*1e3);n&&(o.noticeEl.oncontextmenu=()=>a(this,null,function*(){n()}))}function J(){return a(this,null,function*(){try{let s=yield fetch("https://obsidian.md/?"+Math.random());return s.status>=200&&s.status<300}catch(s){return!1}})}var Pe=s=>(0,W.normalizePath)(s.app.vault.configDir+"/themes")+"/",ie=(s,t,e="")=>a(void 0,null,function*(){let n=yield ne(t,s.settings.debuggingMode);if(!n)return m(s,"There is no obsidian.css file in the root path of this repository, so there is no theme to install."),!1;yield ve(s,e,n);let i=`${e} theme installed from ${t}. `;return s.log(i+`[Theme Info](https://github.com/${t})`,!1),m(s,`${i}`,10,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),setTimeout(()=>{s.app.customCss.setTheme(e)},500),!0}),ve=(s,t,e)=>a(void 0,null,function*(){let n=Pe(s),i=s.app.vault.adapter;(yield i.exists(n))===!1&&(yield i.mkdir(n)),yield i.write(n+t+".css",e)}),Se=s=>a(void 0,null,function*(){let t=yield H(s.settings.debuggingMode),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i})),n=new S(s);n.setSuggesterData(e),yield n.display(i=>a(void 0,null,function*(){yield ie(s,i.info.repo,i.info.name)}))}),Q=s=>("BRAT-"+s.replace("/","----")).substr(0,100),Ne=(s,t)=>a(void 0,null,function*(){s.settings.themesList=s.settings.themesList.filter(n=>n.repo!=t),s.saveSettings(),yield s.app.vault.adapter.remove(Pe(s)+Q(t)+".css");let e=`Removed ${t} from BRAT themes list and deleted from vault`;s.log(e,!0),m(s,`${e}`)}),G=(s,t)=>a(void 0,null,function*(){if((yield J())===!1){console.log("BRAT: No internet detected.");return}let e,n="Checking for beta theme updates STARTED";s.log(n,!0),t&&s.settings.notificationsEnabled&&(e=new W.Notice(`BRAT +${n}`,3e4));for(let o of s.settings.themesList){let r=yield j(o.repo,"obsidian.css");r!==o.lastUpdate&&(yield tt(s,o.repo,o.lastUpdate,r))}let i="Checking for beta theme updates COMPLETED";s.log(i,!0),t&&(s.settings.notificationsEnabled&&e.hide(),m(s,i))}),tt=(s,t,e="",n="")=>a(void 0,null,function*(){let i=yield ne(t,s.settings.debuggingMode);if(!i)return m(s,"There is no obsidian.css file in the root path of the ${cssGithubRepository} repository, so this theme cannot be updated."),!1;let o=Q(t);yield ve(s,o,i),Te(s,t,n);let r=`${o} theme updated from ${t}. From date: ${e} to ${n} `;return s.log(r+`[Theme Info](https://github.com/${t})`,!1),m(s,`${r}`,20,()=>a(void 0,null,function*(){window.open(`https://github.com/${t}`)})),!0});var K=require("obsidian");var C=class extends K.Modal{constructor(e,n=!1){super(e.app);this.plugin=e,this.address="",this.openSettingsTabAfterwards=n}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield ye(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield ie(this.plugin,e,Q(e)))&&(yield we(this.plugin,e),this.close())})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta theme:"}),this.contentEl.createEl("form",{},e=>{new K.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: GitubUserName/repository-name"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Theme"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var Z=class extends v.PluginSettingTab{constructor(e,n){super(e,n);this.plugin=n}display(){let{containerEl:e}=this;e.empty(),e.createEl("h2",{text:this.plugin.appName}),new v.Setting(e).setName("Auto-update plugins at startup").setDesc("If enabled all beta plugins will be checked for updates each time Obsidian starts. Note: this does not update frozen version plugins.").addToggle(i=>{i.setValue(this.plugin.settings.updateAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Auto-update themes at startup").setDesc("If enabled all beta themes will be checked for updates each time Obsidian starts.").addToggle(i=>{i.setValue(this.plugin.settings.updateThemesAtStartup),i.onChange(o=>a(this,null,function*(){this.plugin.settings.updateThemesAtStartup=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Ribbon Button").setDesc("Toggle ribbon button off and on.").addToggle(i=>{i.setValue(this.plugin.settings.ribbonIconEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.ribbonIconEnabled=o,this.plugin.settings.ribbonIconEnabled===!1?this.plugin.ribbonIcon.remove():this.plugin.showRibbonButton(),yield this.plugin.saveSettings()}))}),e.createEl("hr"),e.createEl("h2",{text:"Beta Plugin List"}),e.createEl("div",{text:'The following is a list of beta plugins added via the command palette "Add a beta plugin for testing" or "Add a beta plugin with frozen version for testing". A frozen version is a specific release of a plugin based on its releease tag. '}),e.createEl("p"),e.createEl("div",{text:"Click the x button next to a plugin to remove it from the list."}),e.createEl("p"),e.createEl("span").createEl("b",{text:"Note: "}),e.createSpan({text:"This does not delete the plugin, this should be done from the Community Plugins tab in Settings."}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!1)}))});let n=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo));for(let i of this.plugin.settings.pluginList)n.has(i)||new v.Setting(e).setName(i).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i))}))});new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta plugin with frozen version"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),yield this.plugin.betaPlugins.displayAddNewPluginModal(!0,!0)}))});for(let i of this.plugin.settings.pluginSubListFrozenVersion)new v.Setting(e).setName(`${i.repo} (version ${i.version})`).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta plugin"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield this.plugin.betaPlugins.deletePlugin(i.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Beta Themes List"}),new v.Setting(e).addButton(i=>{i.setButtonText("Add Beta Theme"),i.onClick(()=>a(this,null,function*(){this.plugin.app.setting.close(),new C(this.plugin).open()}))});for(let i of this.plugin.settings.themesList)new v.Setting(e).setName(i.repo).addButton(o=>{o.setIcon("cross"),o.setTooltip("Delete this beta theme"),o.onClick(()=>a(this,null,function*(){o.buttonEl.textContent===""?o.setButtonText("Click once more to confirm removal"):(o.buttonEl.parentElement.parentElement.remove(),yield Ne(this.plugin,i.repo))}))});e.createEl("hr"),e.createEl("h2",{text:"Monitoring"}),new v.Setting(e).setName("Enable Notifications").setDesc("BRAT will provide popup notifications for its various activities. Turn this off means no notifications from BRAT.").addToggle(i=>{i.setValue(this.plugin.settings.notificationsEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.notificationsEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Logging").setDesc("Plugin updates will be logged to a file in the log file.").addToggle(i=>{i.setValue(this.plugin.settings.loggingEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(this.containerEl).setName("BRAT Log File Location").setDesc("Logs will be saved to this file. Don't add .md to the file name.").addSearch(i=>{i.setPlaceholder("Example: BRAT-log").setValue(this.plugin.settings.loggingPath).onChange(o=>a(this,null,function*(){this.plugin.settings.loggingPath=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Enable Verbose Logging").setDesc("Get a lot more information in the log.").addToggle(i=>{i.setValue(this.plugin.settings.loggingVerboseEnabled),i.onChange(o=>a(this,null,function*(){this.plugin.settings.loggingVerboseEnabled=o,yield this.plugin.saveSettings()}))}),new v.Setting(e).setName("Debugging Mode").setDesc("Atomic Bomb level console logging. Can be used for troubleshoting and development.").addToggle(i=>{i.setValue(this.plugin.settings.debuggingMode),i.onChange(o=>a(this,null,function*(){this.plugin.settings.debuggingMode=o,yield this.plugin.saveSettings()}))})}};var L=require("obsidian");var B=class extends L.Modal{constructor(e,n,i=!1,o=!1){super(e.app);this.plugin=e,this.betaPlugins=n,this.address="",this.openSettingsTabAfterwards=i,this.useFrozenVersion=o,this.version=""}submitForm(){return a(this,null,function*(){if(this.address==="")return;let e=this.address.replace("https://github.com/","");if(yield be(this.plugin,e)){m(this.plugin,"This plugin is already in the list for beta testing",10);return}(yield this.betaPlugins.addPlugin(e,!1,!1,!1,this.version))&&this.close()})}onOpen(){this.contentEl.createEl("h4",{text:"Github repository for beta plugin:"}),this.contentEl.createEl("form",{},e=>{new L.Setting(e).addText(n=>{n.setPlaceholder("Repository (example: TfTHacker/obsidian-brat)"),n.onChange(i=>{this.address=i.trim()}),n.inputEl.addEventListener("keydown",i=>a(this,null,function*(){i.key==="Enter"&&this.address!==" "&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(i.preventDefault(),yield this.submitForm())})),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove(),n.inputEl.focus()},10)}),this.useFrozenVersion&&new L.Setting(e).addText(n=>{n.setPlaceholder("Specify the release version tag (example: 1.0.0)"),n.onChange(i=>{this.version=i.trim()}),n.inputEl.style.width="100%",window.setTimeout(()=>{let i=document.querySelector(".setting-item-info");i&&i.remove()},10)}),e.createDiv("modal-button-container",n=>{n.createEl("button",{attr:{type:"button"},text:"Never mind"}).addEventListener("click",()=>this.close()),n.createEl("button",{attr:{type:"submit"},cls:"mod-cta",text:"Add Plugin"})}),e.addEventListener("submit",n=>a(this,null,function*(){n.preventDefault(),this.address!==""&&(this.useFrozenVersion&&this.version!==""||!this.useFrozenVersion)&&(yield this.submitForm())}))})}onClose(){return a(this,null,function*(){this.openSettingsTabAfterwards&&(yield this.plugin.app.setting.open(),yield this.plugin.app.setting.openTabById("obsidian42-brat"))})}};var A=require("obsidian");var D=class{constructor(t){this.plugin=t}displayAddNewPluginModal(t=!1,e=!1){return a(this,null,function*(){new B(this.plugin,this,t,e).open()})}validateRepository(t,e=!1,n=!1){return a(this,null,function*(){let o=yield me(t,!e,this.plugin.settings.debuggingMode);return o?"id"in o?"version"in o?o:(n&&m(this.plugin,`${t} The version attribute for the release is missing from the manifest file`,15),null):(n&&m(this.plugin,`${t} The plugin id attribute for the release is missing from the manifest file`,15),null):(n&&m(this.plugin,`${t} -This does not seem to be an obsidian plugin, as there is no manifest.json file.`,15),null)})}getAllReleaseFiles(t,e,n,i=""){return a(this,null,function*(){let o=i===""?e.version:i,r=n||i!=="";return{mainJs:yield H(t,o,"main.js"),manifest:r?yield H(t,o,"manifest.json"):null,styles:yield H(t,o,"styles.css")}})}writeReleaseFilesToPluginFolder(t,e){return a(this,null,function*(){let n=(0,K.normalizePath)(this.plugin.app.vault.configDir+"/plugins/"+t)+"/",i=this.plugin.app.vault.adapter;((yield i.exists(n))===!1||!(yield i.exists(n+"manifest.json")))&&(yield i.mkdir(n)),yield i.write(n+"main.js",e.mainJs),yield i.write(n+"manifest.json",e.manifest),e.styles&&(yield i.write(n+"styles.css",e.styles))})}addPlugin(t,e=!1,n=!1,i=!1,o=""){return a(this,null,function*(){var h;let l=yield this.validateRepository(t,!0,!1),c=!!l;if(c===!1&&(l=yield this.validateRepository(t,!1,!0)),l===null){let d=`${t} +This does not seem to be an obsidian plugin, as there is no manifest.json file.`,15),null)})}getAllReleaseFiles(t,e,n,i=""){return a(this,null,function*(){let o=i===""?e.version:i,r=n||i!=="";return{mainJs:yield Y(t,o,"main.js",this.plugin.settings.debuggingMode),manifest:r?yield Y(t,o,"manifest.json",this.plugin.settings.debuggingMode):"",styles:yield Y(t,o,"styles.css",this.plugin.settings.debuggingMode)}})}writeReleaseFilesToPluginFolder(t,e){return a(this,null,function*(){let n=(0,A.normalizePath)(this.plugin.app.vault.configDir+"/plugins/"+t)+"/",i=this.plugin.app.vault.adapter;((yield i.exists(n))===!1||!(yield i.exists(n+"manifest.json")))&&(yield i.mkdir(n)),yield i.write(n+"main.js",e.mainJs),yield i.write(n+"manifest.json",e.manifest),e.styles&&(yield i.write(n+"styles.css",e.styles))})}addPlugin(t,e=!1,n=!1,i=!1,o=""){return a(this,null,function*(){var h;let l=yield this.validateRepository(t,!0,!1),g=!!l;if(g===!1&&(l=yield this.validateRepository(t,!1,!0)),l===null){let d=`${t} A manifest.json or manifest-beta.json file does not exist in the root directory of the repository. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}if(!l.hasOwnProperty("version")){let d=`${t} -The manifest${c?"-beta":""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}let g=()=>a(this,null,function*(){let d=yield this.getAllReleaseFiles(t,l,c,o);if((c||d.manifest===null)&&(d.manifest=JSON.stringify(l)),d.mainJs===null){let b=`${t} -The release is not complete and cannot be download. main.js is missing from the Release`;return this.plugin.log(b,!0),m(this.plugin,`${b}`,10),null}return d});if(e===!1){let d=yield g();if(d===null)return;yield this.writeReleaseFilesToPluginFolder(l.id,d),yield fe(this.plugin,t,o),yield this.plugin.app.plugins.loadManifests();let b=o===""?"":` (version: ${o})`,y=`${t}${b} -The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`;this.plugin.log(y,!0),m(this.plugin,y,10)}else{let d=this.plugin.app.vault.configDir+"/plugins/"+l.id+"/",b=null;try{b=yield this.plugin.app.vault.adapter.read(d+"manifest.json")}catch(T){if(T.errno===-4058)return yield this.addPlugin(t,!1,c,!1,o),!0;console.log("BRAT - Local Manifest Load",l.id,JSON.stringify(T,null,2))}if(o!==""||this.plugin.settings.pluginSubListFrozenVersion.map(T=>T.repo).includes(t))return m(this.plugin,`The version of ${t} is frozen, not updating.`,3),!1;let y=yield JSON.parse(b);if(y.version!==l.version){let T=yield g();if(T===null)return;if(n){let f=`There is an update available for ${l.id} from version ${y.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}else{yield this.writeReleaseFilesToPluginFolder(l.id,T),yield this.plugin.app.plugins.loadManifests(),(h=this.plugin.app.plugins.plugins[l.id])!=null&&h.manifest&&(yield this.reloadPlugin(l.id));let f=`${l.id} -Plugin has been updated from version ${y.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}}else i&&m(this.plugin,`No update available for ${t}`,3)}return!0})}reloadPlugin(t){return a(this,null,function*(){let e=this.plugin.app.plugins;try{yield e.disablePlugin(t),yield e.enablePlugin(t)}catch(n){console.log("reload plugin",n)}})}updatePlugin(t,e=!1,n=!1){return a(this,null,function*(){let i=yield this.addPlugin(t,!0,e,n);return i===!1&&e===!1&&m(this.plugin,`${t} -Update of plugin failed.`),i})}checkForUpdatesAndInstallUpdates(t=!1,e=!1){return a(this,null,function*(){if((yield j())===!1){console.log("BRAT: No internet detected.");return}let n,i="Checking for plugin updates STARTED";this.plugin.log(i,!0),t&&this.plugin.settings.notificationsEnabled&&(n=new K.Notice(`BRAT -${i}`,3e4));let o=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(l=>l.repo));for(let l of this.plugin.settings.pluginList)o.has(l)||(yield this.updatePlugin(l,e));let r="Checking for plugin updates COMPLETED";this.plugin.log(r,!0),t&&(n.hide(),m(this.plugin,r,10))})}deletePlugin(t){return a(this,null,function*(){let e=`Removed ${t} from BRAT plugin list`;this.plugin.log(e,!0),this.plugin.settings.pluginList=this.plugin.settings.pluginList.filter(n=>n!=t),this.plugin.settings.pluginSubListFrozenVersion=this.plugin.settings.pluginSubListFrozenVersion.filter(n=>n.repo!=t),this.plugin.saveSettings()})}getEnabledDisabledPlugins(t){let e=this.plugin.app.plugins,n=Object.values(e.manifests),i=Object.values(e.plugins).map(o=>o.manifest);return t?n.filter(o=>i.find(r=>o.id===r.id)):n.filter(o=>!i.find(r=>o.id===r.id))}};var Fe=require("obsidian");function Ce(){(0,Fe.addIcon)("BratIcon",'')}var U=require("obsidian"),_e=Ke(ze());function He(s,t,e=!1){if(s.settings.debuggingMode&&console.log("BRAT: "+t),s.settings.loggingEnabled){if(s.settings.loggingVerboseEnabled===!1&&e===!0)return;{let n=s.settings.loggingPath+".md",i="[["+(0,U.moment)().format((0,_e.getDailyNoteSettings)().format).toString()+"]] "+(0,U.moment)().format("HH:mm"),o=U.Platform.isDesktop?window.require("os").hostname():"MOBILE",r=i+" "+o+" "+t.replace(` +The manifest${g?"-beta":""}.json file in the root directory of the repository does not have a version number in the file. This plugin cannot be installed.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,10),!1}if(l.hasOwnProperty("minAppVersion")&&!(0,A.requireApiVersion)(l.minAppVersion)){let d=`Plugin: ${t} + +The manifest${g?"-beta":""}.json for this plugin indicates that the Obsidian version of the app needs to be ${l.minAppVersion}, but this installation of Obsidian is ${A.apiVersion}. + +You will need to update your Obsidian to use this plugin or contact the plugin developer for more information.`;return this.plugin.log(d,!0),m(this.plugin,`${d}`,30),!1}let c=()=>a(this,null,function*(){let d=yield this.getAllReleaseFiles(t,l,g,o);if((g||d.manifest==="")&&(d.manifest=JSON.stringify(l)),d.mainJs===null){let b=`${t} +The release is not complete and cannot be download. main.js is missing from the Release`;return this.plugin.log(b,!0),m(this.plugin,`${b}`,10),null}return d});if(e===!1){let d=yield c();if(d===null)return!1;yield this.writeReleaseFilesToPluginFolder(l.id,d),yield he(this.plugin,t,o),yield this.plugin.app.plugins.loadManifests();let b=o===""?"":` (version: ${o})`,T=`${t}${b} +The plugin has been registered with BRAT. You may still need to enable it the Community Plugin List.`;this.plugin.log(T,!0),m(this.plugin,T,10)}else{let d=this.plugin.app.vault.configDir+"/plugins/"+l.id+"/",b="";try{b=yield this.plugin.app.vault.adapter.read(d+"manifest.json")}catch(w){if(w.errno===-4058||w.errno===-2)return yield this.addPlugin(t,!1,g,!1,o),!0;console.log("BRAT - Local Manifest Load",l.id,JSON.stringify(w,null,2))}if(o!==""||this.plugin.settings.pluginSubListFrozenVersion.map(w=>w.repo).includes(t))return m(this.plugin,`The version of ${t} is frozen, not updating.`,3),!1;let T=yield JSON.parse(b);if(T.version!==l.version){let w=yield c();if(w===null)return!1;if(n){let f=`There is an update available for ${l.id} from version ${T.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}else{yield this.writeReleaseFilesToPluginFolder(l.id,w),yield this.plugin.app.plugins.loadManifests(),(h=this.plugin.app.plugins.plugins[l.id])!=null&&h.manifest&&(yield this.reloadPlugin(l.id));let f=`${l.id} +Plugin has been updated from version ${T.version} to ${l.version}. `;this.plugin.log(f+`[Release Info](https://github.com/${t}/releases/tag/${l.version})`,!1),m(this.plugin,f,30,()=>a(this,null,function*(){window.open(`https://github.com/${t}/releases/tag/${l.version}`)}))}}else i&&m(this.plugin,`No update available for ${t}`,3)}return!0})}reloadPlugin(t){return a(this,null,function*(){let e=this.plugin.app.plugins;try{yield e.disablePlugin(t),yield e.enablePlugin(t)}catch(n){this.plugin.settings.debuggingMode&&console.log("reload plugin",n)}})}updatePlugin(t,e=!1,n=!1){return a(this,null,function*(){let i=yield this.addPlugin(t,!0,e,n);return i===!1&&e===!1&&m(this.plugin,`${t} +Update of plugin failed.`),i})}checkForUpdatesAndInstallUpdates(t=!1,e=!1){return a(this,null,function*(){if((yield J())===!1){console.log("BRAT: No internet detected.");return}let n,i="Checking for plugin updates STARTED";this.plugin.log(i,!0),t&&this.plugin.settings.notificationsEnabled&&(n=new A.Notice(`BRAT +${i}`,3e4));let o=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(l=>l.repo));for(let l of this.plugin.settings.pluginList)o.has(l)||(yield this.updatePlugin(l,e));let r="Checking for plugin updates COMPLETED";this.plugin.log(r,!0),t&&(n.hide(),m(this.plugin,r,10))})}deletePlugin(t){return a(this,null,function*(){let e=`Removed ${t} from BRAT plugin list`;this.plugin.log(e,!0),this.plugin.settings.pluginList=this.plugin.settings.pluginList.filter(n=>n!=t),this.plugin.settings.pluginSubListFrozenVersion=this.plugin.settings.pluginSubListFrozenVersion.filter(n=>n.repo!=t),this.plugin.saveSettings()})}getEnabledDisabledPlugins(t){let e=this.plugin.app.plugins,n=Object.values(e.manifests),i=Object.values(e.plugins).map(o=>o.manifest);return t?n.filter(o=>i.find(r=>o.id===r.id)):n.filter(o=>!i.find(r=>o.id===r.id))}};var Ae=require("obsidian");function Fe(){(0,Ae.addIcon)("BratIcon",'')}var z=require("obsidian"),_e=Ke(ze());function Ve(s,t,e=!1){if(s.settings.debuggingMode&&console.log("BRAT: "+t),s.settings.loggingEnabled){if(s.settings.loggingVerboseEnabled===!1&&e===!0)return;{let n=s.settings.loggingPath+".md",i="[["+(0,z.moment)().format((0,_e.getDailyNoteSettings)().format).toString()+"]] "+(0,z.moment)().format("HH:mm"),o=z.Platform.isDesktop?window.require("os").hostname():"MOBILE",r=i+" "+o+" "+t.replace(` `," ")+` -`;setTimeout(()=>a(this,null,function*(){if((yield s.app.vault.adapter.exists(n))===!0){let l=yield s.app.vault.adapter.read(n);r=r+l;let c=s.app.vault.getAbstractFileByPath(n);yield s.app.vault.modify(c,r)}else yield s.app.vault.create(n,r)}),10)}}}var z=class{constructor(t){this.bratCommands=[{id:"BRAT-AddBetaPlugin",icon:"BratIcon",name:"Plugins: Add a beta plugin for testing",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!1)})},{id:"BRAT-AddBetaPluginWithFrozenVersion",icon:"BratIcon",name:"Plugins: Add a beta plugin with frozen version based on a release tag",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!0)})},{id:"BRAT-checkForUpdatesAndUpdate",icon:"BratIcon",name:"Plugins: Check for updates to all beta plugins and UPDATE",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!1)})},{id:"BRAT-checkForUpdatesAndDontUpdate",icon:"BratIcon",name:"Plugins: Only check for updates to beta plugins, but don't Update",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!0)})},{id:"BRAT-updateOnePlugin",icon:"BratIcon",name:"Plugins: Choose a single plugin version to update",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo)),e=Object.values(this.plugin.settings.pluginList).filter(i=>!t.has(i)).map(i=>({display:i,info:i})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){let o=`Checking for updates for ${i.info}`;this.plugin.log(o,!0),m(this.plugin,` +`;setTimeout(()=>a(this,null,function*(){if((yield s.app.vault.adapter.exists(n))===!0){let l=yield s.app.vault.adapter.read(n);r=r+l;let g=s.app.vault.getAbstractFileByPath(n);yield s.app.vault.modify(g,r)}else yield s.app.vault.create(n,r)}),10)}}}var _=class{constructor(t){this.bratCommands=[{id:"BRAT-AddBetaPlugin",icon:"BratIcon",name:"Plugins: Add a beta plugin for testing",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!1)})},{id:"BRAT-AddBetaPluginWithFrozenVersion",icon:"BratIcon",name:"Plugins: Add a beta plugin with frozen version based on a release tag",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.displayAddNewPluginModal(!1,!0)})},{id:"BRAT-checkForUpdatesAndUpdate",icon:"BratIcon",name:"Plugins: Check for updates to all beta plugins and UPDATE",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!1)})},{id:"BRAT-checkForUpdatesAndDontUpdate",icon:"BratIcon",name:"Plugins: Only check for updates to beta plugins, but don't Update",showInRibbon:!0,callback:()=>a(this,null,function*(){yield this.plugin.betaPlugins.checkForUpdatesAndInstallUpdates(!0,!0)})},{id:"BRAT-updateOnePlugin",icon:"BratIcon",name:"Plugins: Choose a single plugin version to update",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=new Set(this.plugin.settings.pluginSubListFrozenVersion.map(i=>i.repo)),e=Object.values(this.plugin.settings.pluginList).filter(i=>!t.has(i)).map(i=>({display:i,info:i})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){let o=`Checking for updates for ${i.info}`;this.plugin.log(o,!0),m(this.plugin,` ${o}`,3),yield this.plugin.betaPlugins.updatePlugin(i.info,!1,!0)}))})},{id:"BRAT-restartPlugin",icon:"BratIcon",name:"Plugins: Restart a plugin that is already installed",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.plugins.manifests).map(n=>({display:n.id,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){m(this.plugin,`${n.info} -Plugin reloading .....`,5),yield this.plugin.betaPlugins.reloadPlugin(n.info)}))})},{id:"BRAT-disablePlugin",icon:"BratIcon",name:"Plugins: Disable a plugin - toggle it off",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!0).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin disabled`,!1),yield this.plugin.app.plugins.disablePlugin(n.info)}))})},{id:"BRAT-enablePlugin",icon:"BratIcon",name:"Plugins: Enable a plugin - toggle it on",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!1).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin enabled`,!1),yield this.plugin.app.plugins.enablePlugin(n.info)}))})},{id:"BRAT-openGitHubZRepository",icon:"BratIcon",name:"Plugins: Open the GitHub repository for a plugin",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield me(),e=Object.values(t).map(o=>({display:`Plugin: ${o.name} (${o.repo})`,info:o.repo})),n=Object.values(this.plugin.settings.pluginList).map(o=>({display:"BRAT: "+o,info:o}));e.forEach(o=>n.push(o));let i=new S(this.plugin);i.setSuggesterData(n),yield i.display(o=>a(this,null,function*(){o.info&&window.open(`https://github.com/${o.info}`)}))})},{id:"BRAT-openGitHubRepoTheme",icon:"BratIcon",name:"Themes: Open the GitHub repository for a theme (appearance)",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield Y(),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i.repo})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){i.info&&window.open(`https://github.com/${i.info}`)}))})},{id:"BRAT-opentPluginSettings",icon:"BratIcon",name:"Plugins: Open Plugin Settings Tab",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.app.setting,e=Object.values(t.pluginTabs).map(o=>({display:"Plugin: "+o.name,info:o.id})),n=new S(this.plugin),i=Object.values(t.settingTabs).map(o=>({display:"Core: "+o.name,info:o.id}));e.forEach(o=>i.push(o)),n.setSuggesterData(i),yield n.display(o=>a(this,null,function*(){t.open(),t.openTabById(o.info)}))})},{id:"BRAT-GrabCommunityTheme",icon:"BratIcon",name:"Themes: Grab a community theme",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield Se(this.plugin)})},{id:"BRAT-GrabBetaTheme",icon:"BratIcon",name:"Themes: Grab a beta theme for testing from a Github repository",showInRibbon:!0,callback:()=>a(this,null,function*(){new C(this.plugin).open()})},{id:"BRAT-updateBetaThemes",icon:"BratIcon",name:"Themes: Update beta themes",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield W(this.plugin,!0)})},{id:"BRAT-switchTheme",icon:"BratIcon",name:"Themes: Switch Active Theme ",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.customCss.themes).map(n=>({display:n,info:n}));t.unshift({display:"Obsidian Default Theme",info:""});let e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`Switched to theme ${n.display}`,!1),this.plugin.app.customCss.setTheme(n.info)}))})},{id:"BRAT-allCommands",icon:"BratIcon",name:"All Commands list",showInRibbon:!1,callback:()=>a(this,null,function*(){return this.ribbonDisplayCommands()})}];this.plugin=t,this.bratCommands.forEach(e=>a(this,null,function*(){this.plugin.addCommand({id:e.id,name:e.name,icon:e.icon,callback:()=>a(this,null,function*(){yield e.callback()})})}))}ribbonDisplayCommands(){return a(this,null,function*(){let t=[];this.bratCommands.forEach(r=>{r.showInRibbon&&t.push({display:r.name,info:r.callback})});let e=new S(this.plugin),n=this.plugin.app.setting,i=Object.values(n.settingTabs).map(r=>({display:"Core: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})})),o=Object.values(n.pluginTabs).map(r=>({display:"Plugin: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})}));t.push({display:"---- Core Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),i.forEach(r=>t.push(r)),t.push({display:"---- Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),o.forEach(r=>t.push(r)),e.setSuggesterData(t),yield e.display(r=>a(this,null,function*(){return yield r.info()}))})}};var Z=class extends Ye.Plugin{constructor(){super(...arguments);this.appName="Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)";this.appID="obsidian42-brat"}onload(){return a(this,null,function*(){console.log("loading Obsidian42 - BRAT"),yield this.loadSettings(),this.addSettingTab(new G(this.app,this)),this.betaPlugins=new B(this),this.commands=new z(this),Ce(),this.settings.ribbonIconEnabled&&this.showRibbonButton(),this.app.workspace.onLayoutReady(()=>{this.settings.updateAtStartup&&setTimeout(()=>a(this,null,function*(){yield this.betaPlugins.checkForUpdatesAndInstallUpdates(!1)}),6e4),this.settings.updateThemesAtStartup&&setTimeout(()=>a(this,null,function*(){yield W(this,!1)}),12e4)})})}showRibbonButton(){this.ribbonIcon=this.addRibbonIcon("BratIcon","BRAT",()=>a(this,null,function*(){return this.commands.ribbonDisplayCommands()}))}log(e,n=!1){He(this,e,n)}onunload(){console.log("unloading "+this.appName)}loadSettings(){return a(this,null,function*(){this.settings=Object.assign({},pe,yield this.loadData())})}saveSettings(){return a(this,null,function*(){yield this.saveData(this.settings)})}}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZS9kaXN0L21haW4uanMiLCAiLi4vc3JjL21haW4udHMiLCAiLi4vc3JjL3VpL1NldHRpbmdzVGFiLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy90aGVtZXMudHMiLCAiLi4vc3JjL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3Rlci50cyIsICIuLi9zcmMvZmVhdHVyZXMvZ2l0aHViVXRpbHMudHMiLCAiLi4vc3JjL3VpL3NldHRpbmdzLnRzIiwgIi4uL3NyYy91dGlscy9ub3RpZmljYXRpb25zLnRzIiwgIi4uL3NyYy91dGlscy9pbnRlcm5ldGNvbm5lY3Rpb24udHMiLCAiLi4vc3JjL3VpL0FkZE5ld1RoZW1lLnRzIiwgIi4uL3NyYy91aS9BZGROZXdQbHVnaW5Nb2RhbC50cyIsICIuLi9zcmMvZmVhdHVyZXMvQmV0YVBsdWdpbnMudHMiLCAiLi4vc3JjL3VpL2ljb25zLnRzIiwgIi4uL3NyYy91dGlscy9sb2dnaW5nLnRzIiwgIi4uL3NyYy91aS9QbHVnaW5Db21tYW5kcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5jb25zdCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1bUV1RXCI7XG5jb25zdCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWVwiO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MocGVyaW9kaWNpdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSB3aW5kb3cuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uW3BlcmlvZGljaXR5XT8uZW5hYmxlZDtcbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBkYWlseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbFBsdWdpbnMsIHBsdWdpbnMgfSA9IHdpbmRvdy5hcHA7XG4gICAgICAgIGlmIChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJkYWlseVwiKSkge1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQsIGZvbGRlciwgdGVtcGxhdGUgfSA9IHBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5kYWlseSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmb2xkZXIsIGZvcm1hdCwgdGVtcGxhdGUgfSA9IGludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKFwiZGFpbHktbm90ZXNcIik/Lmluc3RhbmNlPy5vcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIGRhaWx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHdlZWtseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcImNhbGVuZGFyXCIpPy5vcHRpb25zO1xuICAgICAgICBjb25zdCBwZXJpb2RpY05vdGVzU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ud2Vla2x5O1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwid2Vla2x5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGNhbGVuZGFyU2V0dGluZ3MgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLndlZWtseU5vdGVGb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLndlZWtseU5vdGVGb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLndlZWtseU5vdGVUZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHdlZWtseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwibW9udGhseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/Lm1vbnRobHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIG1vbnRobHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwicXVhcnRlcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ucXVhcnRlcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHF1YXJ0ZXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcmx5Tm90ZVNldHRpbmdzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IHdpbmRvdy5hcHAucGx1Z2lucztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJ5ZWFybHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy55ZWFybHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJObyBjdXN0b20geWVhcmx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuXG4vLyBDcmVkaXQ6IEBjcmVhdGlvbml4L3BhdGguanNcbmZ1bmN0aW9uIGpvaW4oLi4ucGFydFNlZ21lbnRzKSB7XG4gICAgLy8gU3BsaXQgdGhlIGlucHV0cyBpbnRvIGEgbGlzdCBvZiBwYXRoIGNvbW1hbmRzLlxuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcGFydFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXJ0U2VnbWVudHNbaV0uc3BsaXQoXCIvXCIpKTtcbiAgICB9XG4gICAgLy8gSW50ZXJwcmV0IHRoZSBwYXRoIGNvbW1hbmRzIHRvIGdldCB0aGUgbmV3IHJlc29sdmVkIHBhdGguXG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC8vIEFsc28gcmVtb3ZlIFwiLlwiIHNlZ21lbnRzXG4gICAgICAgIGlmICghcGFydCB8fCBwYXJ0ID09PSBcIi5cIilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyBQdXNoIG5ldyBwYXRoIHNlZ21lbnRzLlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzbGFzaCBpZiB0aGVyZSB3YXMgb25lLlxuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJcIilcbiAgICAgICAgbmV3UGFydHMudW5zaGlmdChcIlwiKTtcbiAgICAvLyBUdXJuIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgcGF0aC5cbiAgICByZXR1cm4gbmV3UGFydHMuam9pbihcIi9cIik7XG59XG5mdW5jdGlvbiBiYXNlbmFtZShmdWxsUGF0aCkge1xuICAgIGxldCBiYXNlID0gZnVsbFBhdGguc3Vic3RyaW5nKGZ1bGxQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuICAgIGlmIChiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSAhPSAtMSlcbiAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoXCIuXCIpKTtcbiAgICByZXR1cm4gYmFzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUZvbGRlckV4aXN0cyhwYXRoKSB7XG4gICAgY29uc3QgZGlycyA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGRpcnMucG9wKCk7IC8vIHJlbW92ZSBiYXNlbmFtZVxuICAgIGlmIChkaXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaXIgPSBqb2luKC4uLmRpcnMpO1xuICAgICAgICBpZiAoIXdpbmRvdy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGRpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBnZXROb3RlUGF0aChkaXJlY3RvcnksIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuICAgICAgICBmaWxlbmFtZSArPSBcIi5tZFwiO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gb2JzaWRpYW4ubm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpKTtcbiAgICBhd2FpdCBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCk7XG4gICAgcmV0dXJuIHBhdGg7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpIHtcbiAgICBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsIHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgodGVtcGxhdGUpO1xuICAgIGlmICh0ZW1wbGF0ZVBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1wiXCIsIG51bGxdKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0ZW1wbGF0ZVBhdGgsIFwiXCIpO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHZhdWx0LmNhY2hlZFJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgSUZvbGRJbmZvID0gd2luZG93LmFwcC5mb2xkTWFuYWdlci5sb2FkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIHJldHVybiBbY29udGVudHMsIElGb2xkSW5mb107XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGUgJyR7dGVtcGxhdGVQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGVcIik7XG4gICAgICAgIHJldHVybiBbXCJcIiwgbnVsbF07XG4gICAgfVxufVxuXG4vKipcbiAqIGRhdGVVSUQgaXMgYSB3YXkgb2Ygd2Vla2x5IGlkZW50aWZ5aW5nIGRhaWx5L3dlZWtseS9tb250aGx5IG5vdGVzLlxuICogVGhleSBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgZ3JhbnVsYXJpdHkgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICovXG5mdW5jdGlvbiBnZXREYXRlVUlEKGRhdGUsIGdyYW51bGFyaXR5ID0gXCJkYXlcIikge1xuICAgIGNvbnN0IHRzID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpO1xuICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHt0c31gO1xufVxuZnVuY3Rpb24gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9cXFtbXlxcXV0qXFxdL2csIFwiXCIpOyAvLyByZW1vdmUgZXZlcnl0aGluZyB3aXRoaW4gYnJhY2tldHNcbn1cbi8qKlxuICogWFhYOiBXaGVuIHBhcnNpbmcgZGF0ZXMgdGhhdCBjb250YWluIGJvdGggd2VlayBudW1iZXJzIGFuZCBtb250aHMsXG4gKiBNb21lbnQgY2hvc2VzIHRvIGlnbm9yZSB0aGUgd2VlayBudW1iZXJzLiBGb3IgdGhlIHdlZWsgZGF0ZVVJRCwgd2VcbiAqIHdhbnQgdGhlIG9wcG9zaXRlIGJlaGF2aW9yLiBTdHJpcCB0aGUgTU1NIGZyb20gdGhlIGZvcm1hdCB0byBwYXRjaC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkge1xuICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICByZXR1cm4gKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSAmJlxuICAgICAgICAgICAgKC9NezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpIHx8IC9EezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tRmlsZShmaWxlLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGUuYmFzZW5hbWUsIGdyYW51bGFyaXR5KTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tUGF0aChwYXRoLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGJhc2VuYW1lKHBhdGgpLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9O1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFNldHRpbmdzW2dyYW51bGFyaXR5XSgpLmZvcm1hdC5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgY29uc3Qgbm90ZURhdGUgPSB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBmb3JtYXQsIHRydWUpO1xuICAgIGlmICghbm90ZURhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkpIHtcbiAgICAgICAgaWYgKGdyYW51bGFyaXR5ID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICAgICAgaWYgKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBcbiAgICAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgY29udGFpbnMgd2VlaywgcmVtb3ZlIGRheSAmIG1vbnRoIGZvcm1hdHRpbmdcbiAgICAgICAgICAgICAgICBmb3JtYXQucmVwbGFjZSgvTXsxLDR9L2csIFwiXCIpLnJlcGxhY2UoL0R7MSw0fS9nLCBcIlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RlRGF0ZTtcbn1cblxuY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGFpbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcbiAgICBjb25zdCBtb21lbnQgPSB3aW5kb3cubW9tZW50O1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIG1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnllc3RlcmRheVxccyp9fS9naSwgZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KDEsIFwiZGF5XCIpLmZvcm1hdChmb3JtYXQpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRvbW9ycm93XFxzKn19L2dpLCBkYXRlLmNsb25lKCkuYWRkKDEsIFwiZFwiKS5mb3JtYXQoZm9ybWF0KSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcykge1xuICAgIHJldHVybiBkYWlseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJkYXlcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxEYWlseU5vdGVzKCkge1xuICAgIC8qKlxuICAgICAqIEZpbmQgYWxsIGRhaWx5IG5vdGVzIGluIHRoZSBkYWlseSBub3RlIGZvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgZGFpbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIGRhaWx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgZGFpbHlOb3RlcyA9IHt9O1xuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihkYWlseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBkYWlseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYWlseU5vdGVzO1xufVxuXG5jbGFzcyBXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbmZ1bmN0aW9uIGdldERheXNPZldlZWsoKSB7XG4gICAgY29uc3QgeyBtb21lbnQgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCB3ZWVrU3RhcnQgPSBtb21lbnQubG9jYWxlRGF0YSgpLl93ZWVrLmRvdztcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gW1xuICAgICAgICBcInN1bmRheVwiLFxuICAgICAgICBcIm1vbmRheVwiLFxuICAgICAgICBcInR1ZXNkYXlcIixcbiAgICAgICAgXCJ3ZWRuZXNkYXlcIixcbiAgICAgICAgXCJ0aHVyc2RheVwiLFxuICAgICAgICBcImZyaWRheVwiLFxuICAgICAgICBcInNhdHVyZGF5XCIsXG4gICAgXTtcbiAgICB3aGlsZSAod2Vla1N0YXJ0KSB7XG4gICAgICAgIGRheXNPZldlZWsucHVzaChkYXlzT2ZXZWVrLnNoaWZ0KCkpO1xuICAgICAgICB3ZWVrU3RhcnQtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNPZldlZWs7XG59XG5mdW5jdGlvbiBnZXREYXlPZldlZWtOdW1lcmljYWxWYWx1ZShkYXlPZldlZWtOYW1lKSB7XG4gICAgcmV0dXJuIGdldERheXNPZldlZWsoKS5pbmRleE9mKGRheU9mV2Vla05hbWUudG9Mb3dlckNhc2UoKSk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXZWVrbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSlcXHMqOiguKj8pfX0vZ2ksIChfLCBkYXlPZldlZWssIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLndlZWtkYXkoZGF5KS5mb3JtYXQobW9tZW50Rm9ybWF0LnRyaW0oKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGUoZGF0ZSwgd2Vla2x5Tm90ZXMpIHtcbiAgICByZXR1cm4gd2Vla2x5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxXZWVrbHlOb3RlcygpIHtcbiAgICBjb25zdCB3ZWVrbHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gd2Vla2x5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFdlZWtseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHdlZWtseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF3ZWVrbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB3ZWVrbHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4od2Vla2x5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgd2Vla2x5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzO1xufVxuXG5jbGFzcyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vbnRobHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGUoZGF0ZSwgbW9udGhseU5vdGVzKSB7XG4gICAgcmV0dXJuIG1vbnRobHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxNb250aGx5Tm90ZXMoKSB7XG4gICAgY29uc3QgbW9udGhseU5vdGVzID0ge307XG4gICAgaWYgKCFhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gbW9udGhseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgbW9udGhseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFtb250aGx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1vbnRobHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIG1vbnRobHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4obW9udGhseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgbW9udGhseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb250aGx5Tm90ZXM7XG59XG5cbmNsYXNzIFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVRdWFydGVybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlKGRhdGUsIHF1YXJ0ZXJseSkge1xuICAgIHJldHVybiBxdWFydGVybHlbZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxRdWFydGVybHlOb3RlcygpIHtcbiAgICBjb25zdCBxdWFydGVybHkgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHF1YXJ0ZXJseTtcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgcXVhcnRlcmx5Rm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFxdWFydGVybHlGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgcXVhcnRlcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHF1YXJ0ZXJseUZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwicXVhcnRlclwiKTtcbiAgICAgICAgICAgICAgICBxdWFydGVybHlbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHF1YXJ0ZXJseTtcbn1cblxuY2xhc3MgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVllYXJseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFllYXJseU5vdGUoZGF0ZSwgeWVhcmx5Tm90ZXMpIHtcbiAgICByZXR1cm4geWVhcmx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxZZWFybHlOb3RlcygpIHtcbiAgICBjb25zdCB5ZWFybHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4geWVhcmx5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHllYXJseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF5ZWFybHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB5ZWFybHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oeWVhcmx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgeWVhcmx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzO1xufVxuXG5mdW5jdGlvbiBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBkYWlseU5vdGVzUGx1Z2luID0gYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zW1wiZGFpbHktbm90ZXNcIl07XG4gICAgaWYgKGRhaWx5Tm90ZXNQbHVnaW4gJiYgZGFpbHlOb3Rlc1BsdWdpbi5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5kYWlseT8uZW5hYmxlZDtcbn1cbi8qKlxuICogWFhYOiBcIldlZWtseSBOb3Rlc1wiIGxpdmUgaW4gZWl0aGVyIHRoZSBDYWxlbmRhciBwbHVnaW4gb3IgdGhlIHBlcmlvZGljLW5vdGVzIHBsdWdpbi5cbiAqIENoZWNrIGJvdGggdW50aWwgdGhlIHdlZWtseSBub3RlcyBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgQ2FsZW5kYXIgcGx1Z2luLlxuICovXG5mdW5jdGlvbiBhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGFwcC5wbHVnaW5zLmdldFBsdWdpbihcImNhbGVuZGFyXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy53ZWVrbHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5tb250aGx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5xdWFydGVybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGVyaW9kaWNOb3RlcyA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LnllYXJseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGdldFBlcmlvZGljTm90ZVNldHRpbmdzKGdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgZ2V0U2V0dGluZ3MgPSB7XG4gICAgICAgIGRheTogZ2V0RGFpbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHdlZWs6IGdldFdlZWtseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgbW9udGg6IGdldE1vbnRobHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHF1YXJ0ZXI6IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgeWVhcjogZ2V0WWVhcmx5Tm90ZVNldHRpbmdzLFxuICAgIH1bZ3JhbnVsYXJpdHldO1xuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGVyaW9kaWNOb3RlKGdyYW51bGFyaXR5LCBkYXRlKSB7XG4gICAgY29uc3QgY3JlYXRlRm4gPSB7XG4gICAgICAgIGRheTogY3JlYXRlRGFpbHlOb3RlLFxuICAgICAgICBtb250aDogY3JlYXRlTW9udGhseU5vdGUsXG4gICAgICAgIHdlZWs6IGNyZWF0ZVdlZWtseU5vdGUsXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlRm5bZ3JhbnVsYXJpdHldKGRhdGUpO1xufVxuXG5leHBvcnRzLkRFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUID0gREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLmFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmNyZWF0ZURhaWx5Tm90ZSA9IGNyZWF0ZURhaWx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlTW9udGhseU5vdGUgPSBjcmVhdGVNb250aGx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlUGVyaW9kaWNOb3RlID0gY3JlYXRlUGVyaW9kaWNOb3RlO1xuZXhwb3J0cy5jcmVhdGVRdWFydGVybHlOb3RlID0gY3JlYXRlUXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlV2Vla2x5Tm90ZSA9IGNyZWF0ZVdlZWtseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVllYXJseU5vdGUgPSBjcmVhdGVZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRBbGxEYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsTW9udGhseU5vdGVzID0gZ2V0QWxsTW9udGhseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxRdWFydGVybHlOb3RlcyA9IGdldEFsbFF1YXJ0ZXJseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxXZWVrbHlOb3RlcyA9IGdldEFsbFdlZWtseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxZZWFybHlOb3RlcyA9IGdldEFsbFllYXJseU5vdGVzO1xuZXhwb3J0cy5nZXREYWlseU5vdGUgPSBnZXREYWlseU5vdGU7XG5leHBvcnRzLmdldERhaWx5Tm90ZVNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldERhdGVGcm9tRmlsZSA9IGdldERhdGVGcm9tRmlsZTtcbmV4cG9ydHMuZ2V0RGF0ZUZyb21QYXRoID0gZ2V0RGF0ZUZyb21QYXRoO1xuZXhwb3J0cy5nZXREYXRlVUlEID0gZ2V0RGF0ZVVJRDtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGUgPSBnZXRNb250aGx5Tm90ZTtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGVTZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFBlcmlvZGljTm90ZVNldHRpbmdzID0gZ2V0UGVyaW9kaWNOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFF1YXJ0ZXJseU5vdGUgPSBnZXRRdWFydGVybHlOb3RlO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlU2V0dGluZ3MgPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mbztcbmV4cG9ydHMuZ2V0V2Vla2x5Tm90ZSA9IGdldFdlZWtseU5vdGU7XG5leHBvcnRzLmdldFdlZWtseU5vdGVTZXR0aW5ncyA9IGdldFdlZWtseU5vdGVTZXR0aW5ncztcbmV4cG9ydHMuZ2V0WWVhcmx5Tm90ZSA9IGdldFllYXJseU5vdGU7XG5leHBvcnRzLmdldFllYXJseU5vdGVTZXR0aW5ncyA9IGdldFllYXJseU5vdGVTZXR0aW5ncztcbiIsICJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgQnJhdFNldHRpbmdzVGFiIH0gZnJvbSBcIi4vdWkvU2V0dGluZ3NUYWJcIjtcclxuaW1wb3J0IHsgU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwiLi91aS9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgQmV0YVBsdWdpbnMgZnJvbSBcIi4vZmVhdHVyZXMvQmV0YVBsdWdpbnNcIjtcclxuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tIFwiLi91aS9pY29uc1wiO1xyXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi91dGlscy9sb2dnaW5nXCI7XHJcbmltcG9ydCBQbHVnaW5Db21tYW5kcyBmcm9tIFwiLi91aS9QbHVnaW5Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzIH0gZnJvbSBcIi4vZmVhdHVyZXMvdGhlbWVzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdGFwcE5hbWUgPSBcIk9ic2lkaWFuNDIgLSBCZXRhIFJldmlld2VyJ3MgQXV0by11cGRhdGUgVG9vbCAoQlJBVClcIjtcclxuXHRhcHBJRCA9IFwib2JzaWRpYW40Mi1icmF0XCI7XHJcblx0c2V0dGluZ3M6IFNldHRpbmdzO1xyXG5cdGJldGFQbHVnaW5zOiBCZXRhUGx1Z2lucztcclxuXHRyaWJib25JY29uOiBIVE1MRWxlbWVudDtcclxuXHRjb21tYW5kczogUGx1Z2luQ29tbWFuZHM7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnNvbGUubG9nKFwibG9hZGluZyBPYnNpZGlhbjQyIC0gQlJBVFwiKTtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEJyYXRTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYmV0YVBsdWdpbnMgPSBuZXcgQmV0YVBsdWdpbnModGhpcyk7XHJcblx0XHR0aGlzLmNvbW1hbmRzID0gbmV3IFBsdWdpbkNvbW1hbmRzKHRoaXMpO1xyXG5cclxuXHRcdGFkZEljb25zKCk7XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5yaWJib25JY29uRW5hYmxlZCkgdGhpcy5zaG93UmliYm9uQnV0dG9uKCk7XHJcblxyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCk6IHZvaWQgPT4geyAvLyBsZXQgb2JzaWRpYW4gbG9hZCBhbmQgY2FsbSBkb3duIGJlZm9yZSBjaGVja1xyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVBdFN0YXJ0dXApIHsgXHJcblx0XHRcdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJldGFQbHVnaW5zLmNoZWNrRm9yVXBkYXRlc0FuZEluc3RhbGxVcGRhdGVzKGZhbHNlKVxyXG5cdFx0XHRcdH0sIDYwMDAwKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXApIHsgXHJcblx0XHRcdFx0c2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzKHRoaXMsIGZhbHNlKTtcclxuXHRcdFx0XHR9LCAxMjAwMDApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNob3dSaWJib25CdXR0b24oKTogdm9pZCB7IHRoaXMucmliYm9uSWNvbiA9IHRoaXMuYWRkUmliYm9uSWNvbihcIkJyYXRJY29uXCIsIFwiQlJBVFwiLCBhc3luYyAoKSA9PiB0aGlzLmNvbW1hbmRzLnJpYmJvbkRpc3BsYXlDb21tYW5kcygpKSB9XHJcblxyXG5cdGxvZyh0ZXh0VG9Mb2c6IHN0cmluZywgdmVyYm9zZSA9IGZhbHNlKTogdm9pZCB7IGxvZ2dlcih0aGlzLCB0ZXh0VG9Mb2csIHZlcmJvc2UpIH1cclxuXHRcclxuXHRvbnVubG9hZCgpOiB2b2lkIHsgY29uc29sZS5sb2coXCJ1bmxvYWRpbmcgXCIgKyB0aGlzLmFwcE5hbWUpIH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4geyB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKSB9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHsgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKSB9XHJcbn0iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBUb2dnbGVDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgdGhlbWVzRGVsZXRlIH0gZnJvbSAnLi4vZmVhdHVyZXMvdGhlbWVzJztcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuaW1wb3J0IEFkZE5ld1RoZW1lIGZyb20gJy4vQWRkTmV3VGhlbWUnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEJyYXRTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVGhlUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUaGVQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogdGhpcy5wbHVnaW4uYXBwTmFtZSB9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8tdXBkYXRlIHBsdWdpbnMgYXQgc3RhcnR1cCcpXHJcblx0XHRcdC5zZXREZXNjKCdJZiBlbmFibGVkIGFsbCBiZXRhIHBsdWdpbnMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuIE5vdGU6IHRoaXMgZG9lcyBub3QgdXBkYXRlIGZyb3plbiB2ZXJzaW9uIHBsdWdpbnMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZUF0U3RhcnR1cCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVBdFN0YXJ0dXAgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0by11cGRhdGUgdGhlbWVzIGF0IHN0YXJ0dXAnKVxyXG5cdFx0XHQuc2V0RGVzYygnSWYgZW5hYmxlZCBhbGwgYmV0YSB0aGVtZXMgd2lsbCBiZSBjaGVja2VkIGZvciB1cGRhdGVzIGVhY2ggdGltZSBPYnNpZGlhbiBzdGFydHMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVwZGF0ZVRoZW1lc0F0U3RhcnR1cCk7XHJcblx0XHRcdFx0Y2Iub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51cGRhdGVUaGVtZXNBdFN0YXJ0dXAgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVxyXG5cclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1JpYmJvbiBCdXR0b24nKVxyXG5cdFx0XHQuc2V0RGVzYygnVG9nZ2xlIHJpYmJvbiBidXR0b24gb2ZmIGFuZCBvbi4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQpO1xyXG5cdFx0XHRcdGNiLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucmliYm9uSWNvbkVuYWJsZWQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yaWJib25JY29uRW5hYmxlZCA9PT0gZmFsc2UpXHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnJpYmJvbkljb24ucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRlbHNlXHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNob3dSaWJib25CdXR0b24oKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVx0XHRcdFxyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJCZXRhIFBsdWdpbiBMaXN0XCIgfSk7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImRpdlwiLCB7IHRleHQ6IGBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBiZXRhIHBsdWdpbnMgYWRkZWQgdmlhIHRoZSBjb21tYW5kIHBhbGV0dGUgXCJBZGQgYSBiZXRhIHBsdWdpbiBmb3IgdGVzdGluZ1wiIG9yIFwiQWRkIGEgYmV0YSBwbHVnaW4gd2l0aCBmcm96ZW4gdmVyc2lvbiBmb3IgdGVzdGluZ1wiLiBBIGZyb3plbiB2ZXJzaW9uIGlzIGEgc3BlY2lmaWMgcmVsZWFzZSBvZiBhIHBsdWdpbiBiYXNlZCBvbiBpdHMgcmVsZWVhc2UgdGFnLiBgIH0pO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJkaXZcIiwgeyB0ZXh0OiBgQ2xpY2sgdGhlIHggYnV0dG9uIG5leHQgdG8gYSBwbHVnaW4gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuYCB9KTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiKTtcclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3BhblwiKVxyXG5cdFx0XHQuY3JlYXRlRWwoXCJiXCIsIHsgdGV4dDogXCJOb3RlOiBcIiB9KVxyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IHRleHQ6IFwiVGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHBsdWdpbiwgdGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRoZSAgQ29tbXVuaXR5IFBsdWdpbnMgdGFiIGluIFNldHRpbmdzLlwiIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuYWRkQnV0dG9uKChjYjogQnV0dG9uQ29tcG9uZW50KT0+e1xyXG5cdFx0XHRcdGNiLnNldEJ1dHRvblRleHQoXCJBZGQgQmV0YSBwbHVnaW5cIilcclxuXHRcdFx0XHRjYi5vbkNsaWNrKGFzeW5jICgpPT57XHJcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hcHAuc2V0dGluZy5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKHRydWUsIGZhbHNlKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRjb25zdCBwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzXHJcblx0XHRcdD0gbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoeCA9PiB4LnJlcG8pKTtcclxuXHRcdGZvciAoY29uc3QgYnAgb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdCkge1xyXG5cdFx0XHRpZiAocGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb25OYW1lcy5oYXMoYnApKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoYnApXHJcblx0XHRcdFx0LmFkZEJ1dHRvbigoYnRuOiBCdXR0b25Db21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRcdGJ0bi5zZXRJY29uKFwiY3Jvc3NcIik7XHJcblx0XHRcdFx0XHRidG4uc2V0VG9vbHRpcChcIkRlbGV0ZSB0aGlzIGJldGEgcGx1Z2luXCIpO1xyXG5cdFx0XHRcdFx0YnRuLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHQvLyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kZWxldGVQbHVnaW4oYnApO1xyXG5cdFx0XHRcdFx0XHRpZiAoYnRuLmJ1dHRvbkVsLnRleHRDb250ZW50ID09PSBcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdGJ0bi5zZXRCdXR0b25UZXh0KFwiQ2xpY2sgb25jZSBtb3JlIHRvIGNvbmZpcm0gcmVtb3ZhbFwiKTtcclxuXHRcdFx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0YnRuLmJ1dHRvbkVsLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmUoKTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5kZWxldGVQbHVnaW4oYnApXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pXHJcblx0XHR9XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5hZGRCdXR0b24oKGNiOiBCdXR0b25Db21wb25lbnQpPT57XHJcblx0XHRcdFx0Y2Iuc2V0QnV0dG9uVGV4dChcIkFkZCBCZXRhIHBsdWdpbiB3aXRoIGZyb3plbiB2ZXJzaW9uXCIpXHJcblx0XHRcdFx0Y2Iub25DbGljayhhc3luYyAoKT0+e1xyXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXBwLnNldHRpbmcuY2xvc2UoKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmRpc3BsYXlBZGROZXdQbHVnaW5Nb2RhbCh0cnVlLCB0cnVlKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KTtcclxuXHRcdGZvciAoY29uc3QgYnAgb2YgdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb24pIHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoYCR7YnAucmVwb30gKHZlcnNpb24gJHticC52ZXJzaW9ufSlgKVxyXG5cdFx0XHRcdC5hZGRCdXR0b24oKGJ0bjogQnV0dG9uQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0XHRidG4uc2V0SWNvbihcImNyb3NzXCIpO1xyXG5cdFx0XHRcdFx0YnRuLnNldFRvb2x0aXAoXCJEZWxldGUgdGhpcyBiZXRhIHBsdWdpblwiKTtcclxuXHRcdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0Ly8gYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGVsZXRlUGx1Z2luKGJwKTtcclxuXHRcdFx0XHRcdFx0aWYgKGJ0bi5idXR0b25FbC50ZXh0Q29udGVudCA9PT0gXCJcIilcclxuXHRcdFx0XHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dChcIkNsaWNrIG9uY2UgbW9yZSB0byBjb25maXJtIHJlbW92YWxcIik7XHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJ0bi5idXR0b25FbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGVsZXRlUGx1Z2luKGJwLnJlcG8pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaHJcIik7XHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImgyXCIsIHsgdGV4dDogXCJCZXRhIFRoZW1lcyBMaXN0XCIgfSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5hZGRCdXR0b24oKGNiOiBCdXR0b25Db21wb25lbnQpPT57XHJcblx0XHRcdFx0Y2Iuc2V0QnV0dG9uVGV4dChcIkFkZCBCZXRhIFRoZW1lXCIpXHJcblx0XHRcdFx0Y2Iub25DbGljayhhc3luYyAoKT0+e1xyXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXBwLnNldHRpbmcuY2xvc2UoKTtcclxuXHRcdFx0XHRcdChuZXcgQWRkTmV3VGhlbWUodGhpcy5wbHVnaW4pKS5vcGVuKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSk7XHRcdFxyXG5cclxuXHJcblx0XHRmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QpIHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoYnAucmVwbylcclxuXHRcdFx0XHQuYWRkQnV0dG9uKChidG46IEJ1dHRvbkNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdFx0YnRuLnNldEljb24oXCJjcm9zc1wiKTtcclxuXHRcdFx0XHRcdGJ0bi5zZXRUb29sdGlwKFwiRGVsZXRlIHRoaXMgYmV0YSB0aGVtZVwiKTtcclxuXHRcdFx0XHRcdGJ0bi5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKGJ0bi5idXR0b25FbC50ZXh0Q29udGVudCA9PT0gXCJcIilcclxuXHRcdFx0XHRcdFx0XHRidG4uc2V0QnV0dG9uVGV4dChcIkNsaWNrIG9uY2UgbW9yZSB0byBjb25maXJtIHJlbW92YWxcIik7XHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJ0bi5idXR0b25FbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlKCk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhlbWVzRGVsZXRlKHRoaXMucGx1Z2luLCBicC5yZXBvKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSlcclxuXHRcdH1cclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiTW9uaXRvcmluZ1wiIH0pO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRW5hYmxlIE5vdGlmaWNhdGlvbnMnKVxyXG5cdFx0XHQuc2V0RGVzYygnQlJBVCB3aWxsIHByb3ZpZGUgcG9wdXAgbm90aWZpY2F0aW9ucyBmb3IgaXRzIHZhcmlvdXMgYWN0aXZpdGllcy4gVHVybiB0aGlzIG9mZiBtZWFucyAgbm8gbm90aWZpY2F0aW9ucyBmcm9tIEJSQVQuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBMb2dnaW5nJylcclxuXHRcdFx0LnNldERlc2MoJ1BsdWdpbiB1cGRhdGVzIHdpbGwgYmUgbG9nZ2VkIHRvIGEgZmlsZSBpbiB0aGUgbG9nIGZpbGUuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgoY2I6IFRvZ2dsZUNvbXBvbmVudCkgPT4ge1xyXG5cdFx0XHRcdGNiLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSlcclxuXHJcblx0XHRuZXcgU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsKVxyXG4gICAgICAgICAgICAuc2V0TmFtZShcIkJSQVQgTG9nIEZpbGUgTG9jYXRpb25cIilcclxuICAgICAgICAgICAgLnNldERlc2MoXCJMb2dzIHdpbGwgYmUgc2F2ZWQgdG8gdGhpcyBmaWxlLiBEb24ndCBhZGQgLm1kIHRvIHRoZSBmaWxlIG5hbWUuXCIpXHJcbiAgICAgICAgICAgIC5hZGRTZWFyY2goKGNiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYi5zZXRQbGFjZWhvbGRlcihcIkV4YW1wbGU6IEJSQVQtbG9nXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdQYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAobmV3X2ZvbGRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nUGF0aCA9IG5ld19mb2xkZXI7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcdFx0XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgVmVyYm9zZSBMb2dnaW5nJylcclxuXHRcdFx0LnNldERlc2MoJ0dldCBhIGxvdCAgbW9yZSBpbmZvcm1hdGlvbiBpbiAgdGhlIGxvZy4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKChjYjogVG9nZ2xlQ29tcG9uZW50KSA9PiB7XHJcblx0XHRcdFx0Y2Iuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubG9nZ2luZ1ZlcmJvc2VFbmFibGVkKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdWZXJib3NlRW5hYmxlZCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblxyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRGVidWdnaW5nIE1vZGUnKVxyXG5cdFx0XHQuc2V0RGVzYygnQXRvbWljIEJvbWIgbGV2ZWwgY29uc29sZSBsb2dnaW5nLiBDYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob3RpbmcgYW5kIGRldmVsb3BtZW50LicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKGNiOiBUb2dnbGVDb21wb25lbnQpID0+IHtcclxuXHRcdFx0XHRjYi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1Z2dpbmdNb2RlKTtcclxuXHRcdFx0XHRjYi5vbkNoYW5nZShhc3luYyAodmFsdWU6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnZ2luZ01vZGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KVx0XHRcdFxyXG5cdFxyXG5cdH1cclxufVxyXG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplUGF0aCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuaW1wb3J0IHsgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyLCBTdWdnZXN0ZXJJdGVtIH0gZnJvbSBcIi4uL3VpL0dlbmVyaWNGdXp6eVN1Z2dlc3RlclwiO1xyXG5pbXBvcnQgeyB1cGRhdGVCZXRhVGhlbWVMYXN0VXBkYXRlRGF0ZSB9IGZyb20gXCIuLi91aS9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MsIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCwgZ3JhYkxhc3RDb21taXREYXRlRm9yQUZpbGUgfSBmcm9tIFwiLi9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xyXG5pbXBvcnQgeyBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQgfSBmcm9tIFwiLi4vdXRpbHMvaW50ZXJuZXRjb25uZWN0aW9uXCI7XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBwYXRoIHRvIHRoZSB0aGVtZXMgZm9sZGVyIGZvIHJ0aGlzIHZhdWx0XHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gIFRoUGx1Z2luXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtzdHJpbmd9ICAgICAgICAgICAgIHBhdGggdG8gdGhlbWVzIGZvbGRlclxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc1Jvb3RQYXRoID0gKHBsdWdpbjogVGhlUGx1Z2luKTogc3RyaW5nID0+IHtcclxuICAgIHJldHVybiBub3JtYWxpemVQYXRoKHBsdWdpbi5hcHAudmF1bHQuY29uZmlnRGlyICsgXCIvdGhlbWVzXCIpICsgXCIvXCI7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogSW5zdGFsbHMgYSB0aGVtZSwgaW5jbHVkaW5nIGRvd25sb2FkaW5nIGFuZCByZWdpc3RyaW5nIGl0IHdpdGggQlJBVFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgICAgICAgcGx1Z2luICAgICAgICAgICAgICAgVGhlUGx1Z2luXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBjc3NHaXRodWJSZXBvc2l0b3J5ICBUaGUgcmVwb3NpdG9yeSB3aXRoIHRoZSB0aGVtZVxyXG4gKiBAcGFyYW0gICB7dW5kZWZpbmVkPGJvb2xlYW4+fSAgY3NzRmlsZU5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY3NzIGZpbGUgdGhhdCB3aWxsIGJlIHNhdmVkIHRvIHRoZSB0aGVtZXMgZm9sZGVyIGludGhlIHZhdWx0XHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGZvciBzdWNjY2Vzc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lSW5zdGFsbFRoZW1lID0gYXN5bmMgKHBsdWdpbjogVGhlUGx1Z2luLCBjc3NHaXRodWJSZXBvc2l0b3J5OiBzdHJpbmcsIGNzc0ZpbGVOYW1lID0gXCJcIik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgY29uc3QgdGhlbWVDU1MgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MoY3NzR2l0aHViUmVwb3NpdG9yeSk7XHJcbiAgICBpZighdGhlbWVDU1MpIHtcclxuICAgICAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLFwiVGhlcmUgaXMgbm8gb2JzaWRpYW4uY3NzIGZpbGUgaW4gdGhlIHJvb3QgcGF0aCBvZiB0aGlzIHJlcG9zaXRvcnksIHNvIHRoZXJlIGlzIG5vIHRoZW1lIHRvIGluc3RhbGwuXCIpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhlbWVzU2F2ZVRoZW1lKHBsdWdpbiwgY3NzRmlsZU5hbWUsIHRoZW1lQ1NTKTtcclxuICAgIGNvbnN0IG1zZyA9IGAke2Nzc0ZpbGVOYW1lfSB0aGVtZSBpbnN0YWxsZWQgZnJvbSAke2Nzc0dpdGh1YlJlcG9zaXRvcnl9LiBgO1xyXG4gICAgcGx1Z2luLmxvZyhtc2cgKyBgW1RoZW1lIEluZm9dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke2Nzc0dpdGh1YlJlcG9zaXRvcnl9KWAsIGZhbHNlKTtcclxuICAgIFRvYXN0TWVzc2FnZShwbHVnaW4sYCR7bXNnfWAsMTAsIGFzeW5jICgpPT57IHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtjc3NHaXRodWJSZXBvc2l0b3J5fWApfSk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlICAgICAgICAgICAgXHJcbiAgICAgICAgcGx1Z2luLmFwcC5jdXN0b21Dc3Muc2V0VGhlbWUoY3NzRmlsZU5hbWUpO1xyXG4gICAgfSwgNTAwKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG4vKipcclxuICogU2F2ZXMgdGhlICB0aGVtZSBmaWxlIHRvIHRoZSB2YXVsdFxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICBUaGVQbHVnaW5cclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICBjc3NGaWxlTmFtZSAgZmlsZSBuYW1lIHRvIGJlIHVzZWQgaW4gdGhlIHRoZW1lcyBmb2xkZXJcclxuICogQHBhcmFtICAge3N0cmluZzx2b2lkPn0gICBjc3NUZXh0ICAgICAgdGhlIGNzcyBmaWxlIGNvbnRlbnRzXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgIFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc1NhdmVUaGVtZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzRmlsZU5hbWU6IHN0cmluZywgY3NzVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICBjb25zdCB0aGVtZXNUYXJnZXRGb2xkZXJQYXRoID0gdGhlbWVzUm9vdFBhdGgocGx1Z2luKTtcclxuICAgIGNvbnN0IGFkYXB0ZXIgPSBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXI7XHJcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGhlbWVzVGFyZ2V0Rm9sZGVyUGF0aCkgPT09IGZhbHNlKSBhd2FpdCBhZGFwdGVyLm1rZGlyKHRoZW1lc1RhcmdldEZvbGRlclBhdGgpO1xyXG4gICAgYXdhaXQgYWRhcHRlci53cml0ZSh0aGVtZXNUYXJnZXRGb2xkZXJQYXRoICsgY3NzRmlsZU5hbWUgKyBcIi5jc3NcIiwgY3NzVGV4dCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogSW5zdGFsbCBhIHRoZW1lIGZyb20gdGhlIGNvbW11bml0eSBsaXN0LiB0aGlzIGlzIGRvaW5nIHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBidWlsdCBpbiB0aGVtZSBpbnN0YWxsZXIgaW4gb2JzaWRpYW4sIGJ1dCB0aGlzIG1ha2VzIGl0IGZhc3QgdG8gZG8gdGhyb3VnaCBjb21tYW5kIHBhbGV0dGVcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbjx2b2lkPn0gIHBsdWdpbiAgVGhlUGx1Z2luXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt9ICAgICAgICAgICAgW3JldHVybiBkZXNjcmlwdGlvbl1cclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNJbnN0YWxsRnJvbUNvbW11bml0eUxpc3QgPSBhc3luYyAocGx1Z2luOiBUaGVQbHVnaW4pOiBQcm9taXNlPHZvaWQ+ID0+e1xyXG4gICAgY29uc3QgY29tbXVuaXR5VGhlbWUgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lc0xpc3QoKTtcclxuICAgIGNvbnN0IGNvbW11bml0eVRoZW1lTGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyhjb21tdW5pdHlUaGVtZSkubWFwKChwKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGBUaGVtZTogJHtwLm5hbWV9ICAoJHtwLnJlcG99KWAsIGluZm86IHAgfSB9KTtcclxuICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIocGx1Z2luKTtcclxuICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGNvbW11bml0eVRoZW1lTGlzdCk7XHJcbiAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgIGF3YWl0IHRoZW1lSW5zdGFsbFRoZW1lKHBsdWdpbiwgcmVzdWx0cy5pbmZvLnJlcG8sIHJlc3VsdHMuaW5mby5uYW1lKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlcyBhIGZpbGUgbmFtZSBmb3IgdGhlIHRoZW1lLiBJdCBpcyBiYXNlZCBvbiB0aGUgZ2l0aHViIHJlcG9zaXRvcnkgdGhlbWUgbmFtZVxyXG4gKlxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY3NzR2l0aHViUmVwb3NpdG9yeSAgW2Nzc0dpdGh1YlJlcG9zaXRvcnkgZGVzY3JpcHRpb25dXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICBbcmV0dXJuIGRlc2NyaXB0aW9uXVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkgPSAoY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICAgIGNvbnN0IGJldGFOYW1lID0gXCJCUkFULVwiICsgY3NzR2l0aHViUmVwb3NpdG9yeS5yZXBsYWNlKFwiL1wiLCBcIi0tLS1cIik7XHJcbiAgICByZXR1cm4gYmV0YU5hbWUuc3Vic3RyKDAsIDEwMCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRGVsZXRlcyBhIHRoZW0gZnJvbSB0aGUgQlJBVCBsaXN0IGFuZCBhbHNvIHRoZSBwaHlzaWNhbCB0aGVtZSBjc3MgZmlsZSBpbiB0aGUgdmF1bHRcclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gIHBsdWdpbiAgICAgICAgICAgICAgIFRoZVBsdWdpblxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgY3NzR2l0aHViUmVwb3NpdG9yeSAgUmVwb3NpdG9yeSBwYXRoXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt2b2lkfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHRoZW1lc0RlbGV0ZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICBwbHVnaW4uc2V0dGluZ3MudGhlbWVzTGlzdCA9IHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZpbHRlcigodCkgPT4gdC5yZXBvICE9IGNzc0dpdGh1YlJlcG9zaXRvcnkpO1xyXG4gICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLnJlbW92ZSh0aGVtZXNSb290UGF0aChwbHVnaW4pICsgdGhlbWVzRGVyaXZlQmV0YU5hbWVGcm9tUmVwb3NpdG9yeShjc3NHaXRodWJSZXBvc2l0b3J5KSArIFwiLmNzc1wiKTtcclxuICAgIGNvbnN0IG1zZyA9IGBSZW1vdmVkICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0gZnJvbSBCUkFUIHRoZW1lcyBsaXN0IGFuZCBkZWxldGVkIGZyb20gdmF1bHRgO1xyXG4gICAgcGx1Z2luLmxvZyhtc2csIHRydWUpO1xyXG4gICAgVG9hc3RNZXNzYWdlKHBsdWdpbiwgYCR7bXNnfWApO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzICBpZiB0aGVyZSAgYXJlIHRoZW1lIHVwZGF0ZXMgYmFzZWQgb24gdGhlIGNvbW1pdCBkYXRlIG9mIHRoZSBvYnNpZGlhbi5jc3MgZmlsZSBvbiBnaXRodWIgaW4gY29tcGFyaXNvbiB0byB3aGF0IGlzIHN0b3JlZCBpbiB0aGUgQlJBVCB0aGVtZSBsaXN0XHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgcGx1Z2luICAgIFRoZVBsdWdpblxyXG4gKiBAcGFyYW0gICB7Ym9vbGVhbjx2b2lkPn0gIHNob3dJbmZvICBwcm92aWRlICBub3RpY2VzIGR1cmluZyB0aGUgdXBkYXRlIHByb2Nlc1xyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBjb25zdCB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzID0gYXN5bmMgKHBsdWdpbjogVGhlUGx1Z2luLCBzaG93SW5mbzpib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XHJcbiAgICBpZihhd2FpdCBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQoKT09PWZhbHNlKSB7IFxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQlJBVDogTm8gaW50ZXJuZXQgZGV0ZWN0ZWQuXCIpIFxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBuZXdOb3RpY2U6IE5vdGljZTtcclxuICAgIGNvbnN0IG1zZzEgPSBgQ2hlY2tpbmcgZm9yIGJldGEgdGhlbWUgdXBkYXRlcyBTVEFSVEVEYDtcclxuICAgIHBsdWdpbi5sb2cobXNnMSwgdHJ1ZSk7XHJcbiAgICBpZiAoc2hvd0luZm8gJiYgcGx1Z2luLnNldHRpbmdzLm5vdGlmaWNhdGlvbnNFbmFibGVkKSBuZXdOb3RpY2UgPSBuZXcgTm90aWNlKGBCUkFUXFxuJHttc2cxfWAsIDMwMDAwKTtcclxuICAgIGZvcihjb25zdCB0IG9mIHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0KSB7XHJcbiAgICAgICAgY29uc3QgbGFzdFVwZGF0ZU9ubGluZSA9IGF3YWl0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlKHQucmVwbywgXCJvYnNpZGlhbi5jc3NcIik7XHJcbiAgICAgICAgaWYobGFzdFVwZGF0ZU9ubGluZSE9PXQubGFzdFVwZGF0ZSkgXHJcbiAgICAgICAgICAgIGF3YWl0IHRoZW1lVXBkYXRlVGhlbWUocGx1Z2luLCB0LnJlcG8sIHQubGFzdFVwZGF0ZSwgbGFzdFVwZGF0ZU9ubGluZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtc2cyID0gYENoZWNraW5nIGZvciBiZXRhIHRoZW1lIHVwZGF0ZXMgQ09NUExFVEVEYDtcclxuICAgIHBsdWdpbi5sb2cobXNnMiwgdHJ1ZSk7XHJcbiAgICBpZiAoc2hvd0luZm8pIHtcclxuICAgICAgICBpZihwbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpIG5ld05vdGljZS5oaWRlKCk7XHJcbiAgICAgICAgVG9hc3RNZXNzYWdlKHBsdWdpbiwgbXNnMik7XHJcbiAgICB9XHJcbn0gXHJcblxyXG4vKipcclxuICogVXBkYXRlcyBhIHRoZW1lIGFscmVhZHkgcmVnaXN0ZXJlZCAgd2l0aCBCUkFUXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgICBwbHVnaW4gICAgICAgICAgICAgICBUaGVQbHVnaW5cclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgIGNzc0dpdGh1YlJlcG9zaXRvcnkgIFJlcG9zaXRvcnkgcGF0aFxyXG4gKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgb2xkRmlsZURhdGUgICAgICAgICAgT2xkIGZpbGUgZGF0ZSAgZnJvbSB0aGUgQlJBVCB0aGVtZSBsaXN0XHJcbiAqIEBwYXJhbSAgIHt1bmRlZmluZWQ8Ym9vbGVhbj59ICBuZXdGaWxlRGF0ZSAgICAgICAgICBuZXcgZGF0ZSB0byB1c2UgZm9yIHRoaXMgdXBkYXRlXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2NlZWRzXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdGhlbWVVcGRhdGVUaGVtZSA9IGFzeW5jIChwbHVnaW46IFRoZVBsdWdpbiwgY3NzR2l0aHViUmVwb3NpdG9yeTogc3RyaW5nLCBvbGRGaWxlRGF0ZSA9IFwiXCIsIG5ld0ZpbGVEYXRlID0gXCJcIik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgY29uc3QgdGhlbWVDU1MgPSBhd2FpdCBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MoY3NzR2l0aHViUmVwb3NpdG9yeSk7XHJcbiAgICBpZighdGhlbWVDU1MpIHtcclxuICAgICAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLCBcIlRoZXJlIGlzIG5vIG9ic2lkaWFuLmNzcyBmaWxlIGluIHRoZSByb290IHBhdGggb2YgdGhlICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0gcmVwb3NpdG9yeSwgc28gdGhpcyB0aGVtZSBjYW5ub3QgYmUgdXBkYXRlZC5cIilcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjc3NGaWxlTmFtZSA9IHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkoY3NzR2l0aHViUmVwb3NpdG9yeSk7XHJcbiAgICBhd2FpdCB0aGVtZXNTYXZlVGhlbWUocGx1Z2luLCBjc3NGaWxlTmFtZSwgdGhlbWVDU1MpO1xyXG4gICAgdXBkYXRlQmV0YVRoZW1lTGFzdFVwZGF0ZURhdGUocGx1Z2luLCBjc3NHaXRodWJSZXBvc2l0b3J5LCBuZXdGaWxlRGF0ZSk7XHJcbiAgICBjb25zdCBtc2cgPSBgJHtjc3NGaWxlTmFtZX0gdGhlbWUgdXBkYXRlZCBmcm9tICR7Y3NzR2l0aHViUmVwb3NpdG9yeX0uIEZyb20gZGF0ZTogJHtvbGRGaWxlRGF0ZX0gdG8gJHtuZXdGaWxlRGF0ZX0gYDtcclxuICAgIHBsdWdpbi5sb2cobXNnICsgYFtUaGVtZSBJbmZvXShodHRwczovL2dpdGh1Yi5jb20vJHtjc3NHaXRodWJSZXBvc2l0b3J5fSlgLCBmYWxzZSk7XHJcbiAgICBUb2FzdE1lc3NhZ2UocGx1Z2luLCBgJHttc2d9YCwgMjAsIGFzeW5jICgpPT57d2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke2Nzc0dpdGh1YlJlcG9zaXRvcnl9YCl9ICAgKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG59IiwgImltcG9ydCB7IEZ1enp5U3VnZ2VzdE1vZGFsLCBGdXp6eU1hdGNoIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5cclxuLyoqXHJcbiAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIHdoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhbmQgc3RvcmVkIGZvciBzdWdnZXN0ZXJcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdGVySXRlbSB7XHJcbiAgICBkaXNwbGF5OiBzdHJpbmcsICAgICAgICAvLyBkaXNwbGF5ZWQgdG8gdXNlclxyXG4gICAgaW5mbzogYW55ICAgICAgICAgICAgICAgLy8gc3VwcGxtZW50YWwgaW5mbyBmb3IgdGhlIGNhbGxiYWNrXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmljIHN1Z2dlc3RlciBmb3IgcXVpY2sgcmV1c2VcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljRnV6enlTdWdnZXN0ZXIgZXh0ZW5kcyBGdXp6eVN1Z2dlc3RNb2RhbDxTdWdnZXN0ZXJJdGVtPntcclxuICAgIGRhdGE6IFN1Z2dlc3Rlckl0ZW1bXTtcclxuICAgIGNhbGxiYWNrRnVuY3Rpb246IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46IFRoZVBsdWdpbikge1xyXG4gICAgICAgIHN1cGVyKHBsdWdpbi5hcHApO1xyXG4gICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiU2hpZnRcIl0sIFwiRW50ZXJcIiwgZXZ0ID0+IHRoaXMuZW50ZXJUcmlnZ2VyKGV2dCkpO1xyXG4gICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiQ3RybFwiXSwgXCJFbnRlclwiLCBldnQgPT4gdGhpcy5lbnRlclRyaWdnZXIoZXZ0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U3VnZ2VzdGVyRGF0YShzdWdnZXN0ZXJEYXRhOiBBcnJheTxTdWdnZXN0ZXJJdGVtPik6IHZvaWQgeyB0aGlzLmRhdGEgPSBzdWdnZXN0ZXJEYXRhIH1cclxuXHJcbiAgICBhc3luYyBkaXNwbGF5KGNhbGxCYWNrOiAoaXRlbTogU3VnZ2VzdGVySXRlbSwgZXZ0OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja0Z1bmN0aW9uID0gY2FsbEJhY2s7XHJcbiAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbXMoKTogU3VnZ2VzdGVySXRlbVtdIHsgcmV0dXJuIHRoaXMuZGF0YSB9XHJcblxyXG4gICAgZ2V0SXRlbVRleHQoaXRlbTogU3VnZ2VzdGVySXRlbSk6IHN0cmluZyB7IHJldHVybiBpdGVtLmRpc3BsYXkgfVxyXG5cclxuICAgIG9uQ2hvb3NlSXRlbSgpOiB2b2lkIHsgcmV0dXJuIH0gLy8gcmVxdWlyZWQgYnkgVFMsIGJ1dCBub3QgdXNpbmdcclxuXHJcbiAgICByZW5kZXJTdWdnZXN0aW9uKGl0ZW06IEZ1enp5TWF0Y2g8U3VnZ2VzdGVySXRlbT4sIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQgeyBlbC5jcmVhdGVFbCgnZGl2JywgeyB0ZXh0OiBpdGVtLml0ZW0uZGlzcGxheSB9KSB9XHJcblxyXG4gICAgZW50ZXJUcmlnZ2VyKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc3VnZ2VzdGlvbi1pdGVtLmlzLXNlbGVjdGVkIGRpdlwiKS50ZXh0Q29udGVudDtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5kYXRhLmZpbmQoaSA9PiBpLmRpc3BsYXkgPT09IHNlbGVjdGVkVGV4dCk7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5pbnZva2VDYWxsYmFjayhpdGVtLCBldnQpO1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hvb3NlU3VnZ2VzdGlvbihpdGVtOiBGdXp6eU1hdGNoPFN1Z2dlc3Rlckl0ZW0+LCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7IHRoaXMuaW52b2tlQ2FsbGJhY2soaXRlbS5pdGVtLCBldnQpIH1cclxuXHJcbiAgICBpbnZva2VDYWxsYmFjayhpdGVtOiBTdWdnZXN0ZXJJdGVtLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7IHRoaXMuY2FsbGJhY2tGdW5jdGlvbihpdGVtLCBldnQpIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgUGx1Z2luTWFuaWZlc3QsIHJlcXVlc3QgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmNvbnN0IEdJVEhVQl9SQVdfVVNFUkNPTlRFTlRfUEFUSCA9IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1wiO1xyXG5cclxuLyoqXHJcbiAqIHB1bGxzIGZyb20gZ2l0aHViIGEgcmVsZWFzZSBmaWxlIGJ5IGl0cyB2ZXJzaW9uIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgcmVwb3NpdG9yeSAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBpbiBmb3JtYXQgVVNFUk5BTUUvcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgdmVyc2lvbiAgICAgdmVyc2lvbiBvZiByZWxlYXNlIHRvIHJldHJpdmVcclxuICogQHBhcmFtICAge3N0cmluZzxzdHJpbmc+fSAgIGZpbGVOYW1lICAgIG5hbWUgb2YgZmlsZSB0byByZXRyaWV2ZSBmcm9tIHJlbGVhc2VcclxuICpcclxuICogQHJldHVybiAge1Byb21pc2U8c3RyaW5nPn0gICAgICAgICAgICAgIGNvbnRlbnRzIG9mIGZpbGUgYXMgc3RyaW5nIGZyb20gdGhlIHJlcG9zaXRvcnkncyByZWxlYXNlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkgPSBhc3luYyAocmVwb3NpdG9yeTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgVVJMID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L3JlbGVhc2VzL2Rvd25sb2FkLyR7dmVyc2lvbn0vJHtmaWxlTmFtZX1gO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkb3dubG9hZCA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IFVSTCB9KTtcclxuICAgICAgICByZXR1cm4gKChkb3dubG9hZCA9PT0gXCJOb3QgRm91bmRcIiB8fCBkb3dubG9hZCA9PT0gYHtcImVycm9yXCI6XCJOb3QgRm91bmRcIn1gKSA/IG51bGwgOiBkb3dubG9hZCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaW4gZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnlcIiwgVVJMLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGdyYWJzIHRoZSBtYW5pZmVzdC5qc29uIGZyb20gdGhlIHJlcG9zaXRvcnkuIHJvb3RNYW5pZmVzdCAtIGlmIHRydWUgZ3JhYnMgbWFuaWZlc3QuanNvbiBpZiBmYWxzZSBncmFicyBtYW5pZmVzdC1iZXRhLmpzb25cclxuICpcclxuICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBpbiBmb3JtYXQgVVNFUk5BTUUvcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIHJvb3RNYW5pZmVzdCAgICBpZiB0cnVlIGdyYWJzIG1hbmlmZXN0Lmpzb24gaWYgZmFsc2UgZ3JhYnMgbWFuaWZlc3QtYmV0YS5qc29uXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPFBsdWdpbk1hbmlmZXN0Pn0gICAgICAgICAgICAgICAgICAgIHJldHVybnMgbWFuaWZlc3QgZmlsZSBmb3IgIGEgcGx1Z2luXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ3JhYk1hbmlmZXN0SnNvbkZyb21SZXBvc2l0b3J5ID0gYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHJvb3RNYW5pZmVzdCA9IHRydWUpOiBQcm9taXNlPFBsdWdpbk1hbmlmZXN0PiA9PiB7XHJcbiAgICBjb25zdCBtYW5pZmVzdEpzb25QYXRoID0gR0lUSFVCX1JBV19VU0VSQ09OVEVOVF9QQVRIICsgcmVwb3NpdG9yeVBhdGggK1xyXG4gICAgICAgIChyb290TWFuaWZlc3QgPT09IHRydWUgPyBcIi9IRUFEL21hbmlmZXN0Lmpzb25cIiA6IFwiL0hFQUQvbWFuaWZlc3QtYmV0YS5qc29uXCIpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IG1hbmlmZXN0SnNvblBhdGggfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IGF3YWl0IEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGVycm9yIGluIGdyYWJNYW5pZmVzdEpzb25Gcm9tUmVwb3NpdG9yeSBmb3IgJHttYW5pZmVzdEpzb25QYXRofWAsIGVycm9yKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiQ29tbW11bml0eVBsdWdpbkxpc3QgPSBhc3luYyAoKTogUHJvbWlzZTxKU09OPiA9PiB7XHJcbiAgICBjb25zdCBwbHVnaW5MaXN0VVJMID0gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL0hFQUQvY29tbXVuaXR5LXBsdWdpbnMuanNvbmA7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCh7IHVybDogcGx1Z2luTGlzdFVSTCB9KTtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogYXdhaXQgSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5UGx1Z2luTGlzdFwiLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCA9IGFzeW5jICgpOiBQcm9taXNlPEpTT04+ID0+IHtcclxuICAgIGNvbnN0IHRoZW1lc1VSTCA9IGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9IRUFEL2NvbW11bml0eS1jc3MtdGhlbWVzLmpzb25gO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHRoZW1lc1VSTCB9KTtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogYXdhaXQgSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdFwiLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiQ29tbW11bml0eVRoZW1lT2JzaWRpYW5Dc3MgPSBhc3luYyAocmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICBjb25zdCB0aGVtZXNVUkwgPSBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7cmVwb3NpdG9yeVBhdGh9L0hFQUQvb2JzaWRpYW4uY3NzYDtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHsgdXJsOiB0aGVtZXNVUkwgfSk7XHJcbiAgICAgICAgcmV0dXJuIChyZXNwb25zZSA9PT0gXCI0MDQ6IE5vdCBGb3VuZFwiID8gbnVsbCA6IHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBncmFiQ29tbW11bml0eVRoZW1lc0xpc3RcIiwgZXJyb3IpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBncmFiTGFzdENvbW1pdEluZm9Gb3JBRmlsZSA9IGFzeW5jIChyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xyXG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvc2l0b3J5UGF0aH0vY29tbWl0cz9wYXRoPSR7cGF0aH0mcGFnZT0xJnBlcl9wYWdlPTFgO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoeyB1cmw6IHVybCB9KTtcclxuICAgICAgICByZXR1cm4gKHJlc3BvbnNlID09PSBcIjQwNDogTm90IEZvdW5kXCIgPyBudWxsIDogSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdFwiLCBlcnJvcilcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlID0gYXN5bmMgKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICBjb25zdCB0ZXN0ID0gYXdhaXQgZ3JhYkxhc3RDb21taXRJbmZvRm9yQUZpbGUocmVwb3NpdG9yeVBhdGgsIHBhdGgpO1xyXG4gICAgLy9AdHMtaWdub3JlXHJcbiAgICBpZih0ZXN0WzBdLmNvbW1pdC5jb21taXR0ZXIuZGF0ZSl7XHJcbiAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIHRlc3RbMF0uY29tbWl0LmNvbW1pdHRlci5kYXRlXHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbn1cclxuIiwgImltcG9ydCB7IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlIH0gZnJvbSBcIi4uL2ZlYXR1cmVzL2dpdGh1YlV0aWxzXCI7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVJbmZvcmFtdGlvbiB7XHJcbiAgICByZXBvOiBzdHJpbmc7XHJcbiAgICBsYXN0VXBkYXRlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRnJvemVuVmVyc2lvbiB7XHJcbiAgICByZXBvOiBzdHJpbmc7XHJcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgcGx1Z2luTGlzdDogc3RyaW5nW107XHJcbiAgICBwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbjogUGx1Z2luRnJvemVuVmVyc2lvbltdLFxyXG4gICAgdGhlbWVzTGlzdDogVGhlbWVJbmZvcmFtdGlvbltdO1xyXG4gICAgdXBkYXRlQXRTdGFydHVwOiBib29sZWFuO1xyXG4gICAgdXBkYXRlVGhlbWVzQXRTdGFydHVwOiAgYm9vbGVhbjtcclxuICAgIHJpYmJvbkljb25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgbG9nZ2luZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBsb2dnaW5nUGF0aDogc3RyaW5nO1xyXG4gICAgbG9nZ2luZ1ZlcmJvc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgZGVidWdnaW5nTW9kZTogYm9vbGVhbjtcclxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogU2V0dGluZ3MgPSB7XHJcbiAgICBwbHVnaW5MaXN0OiBbXSxcclxuICAgIHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uOiBbXSxcclxuICAgIHRoZW1lc0xpc3Q6IFtdLFxyXG4gICAgdXBkYXRlQXRTdGFydHVwOiBmYWxzZSxcclxuICAgIHVwZGF0ZVRoZW1lc0F0U3RhcnR1cDogZmFsc2UsXHJcbiAgICByaWJib25JY29uRW5hYmxlZDogdHJ1ZSxcclxuICAgIGxvZ2dpbmdFbmFibGVkOiBmYWxzZSxcclxuICAgIGxvZ2dpbmdQYXRoOiBcIkJSQVQtbG9nXCIsXHJcbiAgICBsb2dnaW5nVmVyYm9zZUVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgZGVidWdnaW5nTW9kZTogdHJ1ZSxcclxuICAgIG5vdGlmaWNhdGlvbnNFbmFibGVkOiB0cnVlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGRzIGEgcGx1Z2luIGZvciBiZXRhIHRlc3RpbmcgdG8gdGhlIGRhdGEuanNvbiBmaWxlIG9mIHRoaXMgIHBsdWdpblxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgIHNwZWNpZnlWZXJzaW9uICBpZiB0aGUgcGx1Z2luIG5lZWRzIHRvIHN0YXkgYXQgdGhlIGZyb3plbiB2ZXJzaW9uLCB3ZSBuZWVkIHRvIGFsc28gcmVjb3JkIHRoZSB2ZXJzaW9uXHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgIFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEJldGFQbHVnaW5Ub0xpc3QocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHNhdmUgPSBmYWxzZTtcclxuICAgIGlmICghcGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QuY29udGFpbnMocmVwb3NpdG9yeVBhdGgpKSB7XHJcbiAgICAgICAgcGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QudW5zaGlmdChyZXBvc2l0b3J5UGF0aCk7XHJcbiAgICAgICAgc2F2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgICAgc3BlY2lmeVZlcnNpb24gIT09IFwiXCIgXHJcbiAgICAgICAgJiYgKHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5maWx0ZXIoeCA9PiB4LnJlcG8gPT09IHJlcG9zaXRvcnlQYXRoKS5sZW5ndGggPT09IDApXHJcbiAgICApIHtcclxuICAgICAgICBwbHVnaW4uc2V0dGluZ3MucGx1Z2luU3ViTGlzdEZyb3plblZlcnNpb24udW5zaGlmdCh7XHJcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlQYXRoLFxyXG4gICAgICAgICAgICB2ZXJzaW9uOiBzcGVjaWZ5VmVyc2lvblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNhdmUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKHNhdmUpIHtcclxuICAgICAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiAgYSAgcGx1Z2luICBpcyBpbiBkYXRhLmpzb25cclxuICpcclxuICogQHBhcmFtICAge1RoZVBsdWdpbn0gICAgICAgICBwbHVnaW4gICAgICAgICAgXHJcbiAqIEBwYXJhbSAgIHtzdHJpbmc8Ym9vbGVhbj59ICAgcmVwb3NpdG9yeVBhdGggIHBhdGggdG8gdGhlIEdpdEh1YiByZXBvc2l0b3J5XHJcbiAqXHJcbiAqIEByZXR1cm4gIHtQcm9taXNlPGJvb2xlYW4+fSAgdHJ1ZSBpZiBleGlzdHMgICAgICBcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdEJldGFQbHVnaW5Jbkxpc3QocGx1Z2luOiBUaGVQbHVnaW4sIHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBwbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5jb250YWlucyhyZXBvc2l0b3J5UGF0aCk7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogQWRkcyBhIHRoZW1lIGZvciBiZXRhIHRlc3RpbmcgdG8gdGhlIGRhdGEuanNvbiBmaWxlIG9mIHRoaXMgIHBsdWdpblxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgIHBsdWdpbiAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgICBcclxuICovXHJcbiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkQmV0YVRoZW1lVG9MaXN0KHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgY29uc3QgbmV3VGhlbWU6IFRoZW1lSW5mb3JhbXRpb24gPSB7IFxyXG4gICAgICAgICByZXBvOiByZXBvc2l0b3J5UGF0aCwgXHJcbiAgICAgICAgIGxhc3RVcGRhdGU6IGF3YWl0IGdyYWJMYXN0Q29tbWl0RGF0ZUZvckFGaWxlKHJlcG9zaXRvcnlQYXRoLCBcIm9ic2lkaWFuLmNzc1wiKVxyXG4gICAgfVxyXG4gICAgcGx1Z2luLnNldHRpbmdzLnRoZW1lc0xpc3QudW5zaGlmdChuZXdUaGVtZSk7XHJcbiAgICBwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUZXN0cyBpZiBhICB0aGVtZSAgaXMgaW4gZGF0YS5qc29uXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICAgICAgICAgcGx1Z2luICAgICAgICAgIFxyXG4gKiBAcGFyYW0gICB7c3RyaW5nPGJvb2xlYW4+fSAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gIHRydWUgaWYgZXhpc3RzICAgICAgXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhpc3RCZXRhVGhlbWVpbkluTGlzdChwbHVnaW46IFRoZVBsdWdpbiwgcmVwb3NpdG9yeVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgdGVzdElmVGhlbUV4aXN0cyA9IHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZpbmQodD0+IHQucmVwbyA9PT0gcmVwb3NpdG9yeVBhdGgpO1xyXG4gICAgcmV0dXJuIHRlc3RJZlRoZW1FeGlzdHMgPyB0cnVlIDogZmFsc2U7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogVXBkYXRlIHRoZSBsYXN0VXBhdGUgZmllbGQgZm9yIHRoZSB0aGVtZVxyXG4gKlxyXG4gKiBAcGFyYW0gICB7VGhlUGx1Z2lufSAgICAgICAgIHBsdWdpbiAgICAgICAgICBcclxuICogQHBhcmFtICAge3N0cmluZzxib29sZWFuPn0gICByZXBvc2l0b3J5UGF0aCAgcGF0aCB0byB0aGUgR2l0SHViIHJlcG9zaXRvcnlcclxuICogQHBhcmFtICAge3N0cmluZzxuZXdEYXRlPn0gICBuZXdEYXRlICBsYXN0IHVwZGF0ZSBmb3IgdGhpcyB0aGVtZVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7UHJvbWlzZTxib29sZWFuPn0gIHRydWUgaWYgZXhpc3RzICAgICAgXHJcbiAqL1xyXG4gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUJldGFUaGVtZUxhc3RVcGRhdGVEYXRlKHBsdWdpbjogVGhlUGx1Z2luLCByZXBvc2l0b3J5UGF0aDogc3RyaW5nLCBuZXdEYXRlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHBsdWdpbi5zZXR0aW5ncy50aGVtZXNMaXN0LmZvckVhY2godD0+e1xyXG4gICAgICAgIGlmKHQucmVwbyA9PT0gcmVwb3NpdG9yeVBhdGgpIHtcclxuICAgICAgICAgICAgdC5sYXN0VXBkYXRlID0gbmV3RGF0ZTtcclxuICAgICAgICAgICAgcGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuXHJcbn1cclxuXHJcbiIsICJpbXBvcnQgeyBOb3RpY2UgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5cclxuLyoqXHJcbiAqIERpc3BsYXlzIGEgbm90aWNlIHRvIHRoZSB1c2VyXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICBQbHVnaW4gb2JqZWN0XHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICBtc2cgICAgICAgICAgICAgICB0ZXh0IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXJcclxuICogQHBhcmFtICAge1t0eXBlXX0gICAgIHZlcmJvc2VMb2dnaW5nT24gIFRydWUgaWYgc2hvdWxkIG9ubHkgYmUgbG9nZ2VkIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBlbmFibGVkXHJcbiAqXHJcbiAqIEByZXR1cm4gIHt2b2lkfSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBUb2FzdE1lc3NhZ2UocGx1Z2luOiBUaGVQbHVnaW4sIG1zZzogc3RyaW5nLCB0aW1lb3V0SW5TZWNvbmRzID0gMTAsIGNvbnRleHRNZW51Q2FsbGJhY2sgPSBudWxsKTogdm9pZCB7XHJcbiAgICBpZihwbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQ9PT1mYWxzZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgYWRkaXRpb25hbEluZm8gPSBjb250ZXh0TWVudUNhbGxiYWNrID8gXCIoY2xpY2s9ZGlzbWlzcywgcmlnaHQtY2xpY2s9SW5mbylcIiA6IFwiXCI7XHJcbiAgICBjb25zdCBuZXdOb3RpY2U6IE5vdGljZSA9IG5ldyBOb3RpY2UoYEJSQVRcXG4ke21zZ31cXG4ke2FkZGl0aW9uYWxJbmZvfWAsIHRpbWVvdXRJblNlY29uZHMqMTAwMCk7XHJcbiAgICAvL0B0cy1pZ25vcmVcclxuICAgIGlmKGNvbnRleHRNZW51Q2FsbGJhY2spIG5ld05vdGljZS5ub3RpY2VFbC5vbmNvbnRleHRtZW51ID0gYXN5bmMgKCkgPT4geyBjb250ZXh0TWVudUNhbGxiYWNrKCkgfTtcclxufSIsICJcclxuLyoqXHJcbiAqIFRlc3RzIGlmIHRoZXJlIGlzIGFuIGludGVybmV0IGNvbm5lY3Rpb25cclxuICogQHJldHVybnMgdHJ1ZSBpZiBjb25uZWN0ZWQsIGZhbHNlIGlmIG5vIGludGVybmV0XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNDb25uZWN0ZWRUb0ludGVybmV0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBvbmxpbmUgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vb2JzaWRpYW4ubWQvP1wiICsgTWF0aC5yYW5kb20oKSk7XHJcbiAgICAgICAgcmV0dXJuIG9ubGluZS5zdGF0dXMgPj0gMjAwICYmIG9ubGluZS5zdGF0dXMgPCAzMDA7XHJcbiAgICB9IGNhdGNoKGVycikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBNb2RhbCwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgdGhlbWVJbnN0YWxsVGhlbWUsIHRoZW1lc0Rlcml2ZUJldGFOYW1lRnJvbVJlcG9zaXRvcnkgfSBmcm9tICcuLi9mZWF0dXJlcy90aGVtZXMnO1xyXG5pbXBvcnQgVGhlUGx1Z2luIGZyb20gJy4uL21haW4nO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9ub3RpZmljYXRpb25zJztcclxuaW1wb3J0IHsgYWRkQmV0YVRoZW1lVG9MaXN0LCBleGlzdEJldGFUaGVtZWluSW5MaXN0IH0gZnJvbSAnLi9zZXR0aW5ncyc7XHJcblxyXG4vKipcclxuICogQWRkIGEgYmV0YSB0aGVtZSB0byB0aGUgbGlzdCBvZiBwbHVnaW5zIGJlaW5nIHRyYWNrZWQgYW5kIHVwZGF0ZWRcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkZE5ld1RoZW1lIGV4dGVuZHMgTW9kYWwge1xyXG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XHJcbiAgICBhZGRyZXNzOiBzdHJpbmc7XHJcbiAgICBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzOiBib29sZWFuO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luLCBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gZmFsc2UpIHtcclxuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKTtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgICAgICB0aGlzLmFkZHJlc3MgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMub3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcyA9IG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3VibWl0Rm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc2NydWJiZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzLnJlcGxhY2UoXCJodHRwczovL2dpdGh1Yi5jb20vXCIsIFwiXCIpO1xyXG4gICAgICAgIGlmIChhd2FpdCBleGlzdEJldGFUaGVtZWluSW5MaXN0KHRoaXMucGx1Z2luLCBzY3J1YmJlZEFkZHJlc3MpKSB7XHJcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYFRoaXMgcGx1Z2luIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QgZm9yIGJldGEgdGVzdGluZ2AsIDEwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZihhd2FpdCB0aGVtZUluc3RhbGxUaGVtZSh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzLCB0aGVtZXNEZXJpdmVCZXRhTmFtZUZyb21SZXBvc2l0b3J5KHNjcnViYmVkQWRkcmVzcykpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFkZEJldGFUaGVtZVRvTGlzdCh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzKTtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpOyAgICBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25PcGVuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdoNCcsIHsgdGV4dDogXCJHaXRodWIgcmVwb3NpdG9yeSBmb3IgYmV0YSB0aGVtZTpcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZm9ybScsIHt9LCAoZm9ybUVsKSA9PiB7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1JlcG9zaXRvcnkgKGV4YW1wbGU6IEdpdHViVXNlck5hbWUvcmVwb3NpdG9yeS1uYW1lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEVsLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEVsLmlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGFzeW5jIChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiB0aGlzLmFkZHJlc3MgIT09ICcgJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnNldHRpbmctaXRlbS1pbmZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHRpdGxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5mb2N1cygpXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBmb3JtRWwuY3JlYXRlRGl2KCdtb2RhbC1idXR0b24tY29udGFpbmVyJywgKGJ1dHRvbkNvbnRhaW5lckVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25Db250YWluZXJFbFxyXG4gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFbCgnYnV0dG9uJywgeyBhdHRyOiB7IHR5cGU6ICdidXR0b24nIH0sIHRleHQ6ICdOZXZlciBtaW5kJyB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XHJcbiAgICAgICAgICAgICAgICBidXR0b25Db250YWluZXJFbC5jcmVhdGVFbCgnYnV0dG9uJywge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHI6IHsgdHlwZTogJ3N1Ym1pdCcgfSxcclxuICAgICAgICAgICAgICAgICAgICBjbHM6ICdtb2QtY3RhJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQWRkIFRoZW1lJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGludm9rZWQgd2hlbiBidXR0b24gaXMgY2xpY2tlZC4gXHJcbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3MgIT09ICcnKSBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW4oKTtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMucGx1Z2luIGFzIGFueSkuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQoXCJvYnNpZGlhbjQyLWJyYXRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxufSIsICJpbXBvcnQgeyBNb2RhbCwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IEJldGFQbHVnaW5zIGZyb20gJy4uL2ZlYXR1cmVzL0JldGFQbHVnaW5zJztcclxuaW1wb3J0IFRoZVBsdWdpbiBmcm9tICcuLi9tYWluJztcclxuaW1wb3J0IHsgVG9hc3RNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvbm90aWZpY2F0aW9ucyc7XHJcbmltcG9ydCB7IGV4aXN0QmV0YVBsdWdpbkluTGlzdCB9IGZyb20gJy4vc2V0dGluZ3MnO1xyXG5cclxuLyoqXHJcbiAqIEFkZCBhIGJldGEgcGx1Z2luIHRvIHRoZSBsaXN0IG9mIHBsdWdpbnMgYmVpbmcgdHJhY2tlZCBhbmQgdXBkYXRlZFxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkTmV3UGx1Z2luTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XHJcbiAgICBwbHVnaW46IFRoZVBsdWdpbjtcclxuICAgIGJldGFQbHVnaW5zOiBCZXRhUGx1Z2lucztcclxuICAgIGFkZHJlc3M6IHN0cmluZztcclxuICAgIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHM6IGJvb2xlYW47XHJcbiAgICByZWFkb25seSB1c2VGcm96ZW5WZXJzaW9uOiBib29sZWFuO1xyXG4gICAgdmVyc2lvbjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luLCBiZXRhUGx1Z2luczogQmV0YVBsdWdpbnMsIG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSwgdXNlRnJvemVuVmVyc2lvbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgc3VwZXIocGx1Z2luLmFwcCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgICAgICAgdGhpcy5iZXRhUGx1Z2lucyA9IGJldGFQbHVnaW5zO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5vcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzID0gb3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcztcclxuICAgICAgICB0aGlzLnVzZUZyb3plblZlcnNpb24gPSB1c2VGcm96ZW5WZXJzaW9uO1xyXG4gICAgICAgIHRoaXMudmVyc2lvbiA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3VibWl0Rm9ybSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzID09PSBcIlwiKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc2NydWJiZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzLnJlcGxhY2UoXCJodHRwczovL2dpdGh1Yi5jb20vXCIsXCJcIik7XHJcbiAgICAgICAgaWYgKGF3YWl0IGV4aXN0QmV0YVBsdWdpbkluTGlzdCh0aGlzLnBsdWdpbiwgc2NydWJiZWRBZGRyZXNzKSkge1xyXG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBUaGlzIHBsdWdpbiBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IGZvciBiZXRhIHRlc3RpbmdgLCAxMCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5iZXRhUGx1Z2lucy5hZGRQbHVnaW4oc2NydWJiZWRBZGRyZXNzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0aGlzLnZlcnNpb24pO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbk9wZW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50RWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiBcIkdpdGh1YiByZXBvc2l0b3J5IGZvciBiZXRhIHBsdWdpbjpcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5jcmVhdGVFbCgnZm9ybScsIHt9LCAoZm9ybUVsKSA9PiB7XHJcbiAgICAgICAgICAgIG5ldyBTZXR0aW5nKGZvcm1FbClcclxuICAgICAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0RWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1JlcG9zaXRvcnkgKGV4YW1wbGU6IFRmVEhhY2tlci9vYnNpZGlhbi1icmF0KScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gdmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRleHRFbC5pbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgdGhpcy5hZGRyZXNzICE9PSAnICcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy51c2VGcm96ZW5WZXJzaW9uICYmIHRoaXMudmVyc2lvbiAhPT0gXCJcIikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCF0aGlzLnVzZUZyb3plblZlcnNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdWJtaXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnNldHRpbmctaXRlbS1pbmZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHRpdGxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5mb2N1cygpXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy51c2VGcm96ZW5WZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBuZXcgU2V0dGluZyhmb3JtRWwpXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZFRleHQoKHRleHRFbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuc2V0UGxhY2Vob2xkZXIoJ1NwZWNpZnkgdGhlIHJlbGVhc2UgdmVyc2lvbiB0YWcgKGV4YW1wbGU6IDEuMC4wKScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RWwuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2V0dGluZy1pdGVtLWluZm9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHRpdGxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvcm1FbC5jcmVhdGVEaXYoJ21vZGFsLWJ1dHRvbi1jb250YWluZXInLCAoYnV0dG9uQ29udGFpbmVyRWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsXHJcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVsKCdidXR0b24nLCB7IGF0dHI6IHsgdHlwZTogJ2J1dHRvbicgfSwgdGV4dDogJ05ldmVyIG1pbmQnIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0cjogeyB0eXBlOiAnc3VibWl0JyB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ21vZC1jdGEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdBZGQgUGx1Z2luJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGludm9rZWQgd2hlbiBidXR0b24gaXMgY2xpY2tlZC4gXHJcbiAgICAgICAgICAgIGZvcm1FbC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBhc3luYyAoZTogRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3MgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy51c2VGcm96ZW5WZXJzaW9uICYmIHRoaXMudmVyc2lvbiAhPT0gXCJcIikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghdGhpcy51c2VGcm96ZW5WZXJzaW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN1Ym1pdEZvcm0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhc3luYyBvbkNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmKHRoaXMub3BlblNldHRpbmdzVGFiQWZ0ZXJ3YXJkcykge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5wbHVnaW4gYXMgYW55KS5hcHAuc2V0dGluZy5vcGVuKCk7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFwcC5zZXR0aW5nLm9wZW5UYWJCeUlkKFwib2JzaWRpYW40Mi1icmF0XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IFRoZVBsdWdpbiBmcm9tIFwiLi4vbWFpblwiO1xyXG5pbXBvcnQgQWRkTmV3UGx1Z2luTW9kYWwgZnJvbSBcIi4uL3VpL0FkZE5ld1BsdWdpbk1vZGFsXCI7XHJcbmltcG9ydCB7IGdyYWJNYW5pZmVzdEpzb25Gcm9tUmVwb3NpdG9yeSwgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgeyBub3JtYWxpemVQYXRoLCBQbHVnaW5NYW5pZmVzdCwgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IGFkZEJldGFQbHVnaW5Ub0xpc3QgfSBmcm9tIFwiLi4vdWkvc2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgVG9hc3RNZXNzYWdlIH0gZnJvbSBcIi4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcclxuaW1wb3J0IHsgaXNDb25uZWN0ZWRUb0ludGVybmV0IH0gZnJvbSBcIi4uL3V0aWxzL2ludGVybmV0Y29ubmVjdGlvblwiO1xyXG5cclxuLyoqXHJcbiAqIGFsbCB0aGUgZmlsZXMgbmVlZGVkIGZvciBhIHBsdWdpbiBiYXNlZCBvbiB0aGUgcmVsZWFzZSBmaWxlcyBhcmUgaHJlXHJcbiAqL1xyXG5pbnRlcmZhY2UgUmVsZWFzZUZpbGVzIHtcclxuICAgIG1haW5Kczogc3RyaW5nO1xyXG4gICAgbWFuaWZlc3Q6IHN0cmluZztcclxuICAgIHN0eWxlczogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogUHJpbWFyeSBoYW5kbGVyIGZvciBhZGRpbmcsIHVwZGF0aW5nLCBkZWxldGluZyBiZXRhIHBsdWdpbnMgdHJhY2tlZCBieSB0aGlzIHBsdWdpblxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmV0YVBsdWdpbnMge1xyXG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XHJcblxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBUaGVQbHVnaW4pIHtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIG9wZW5zIHRoZSBBZGROZXdQbHVnaW5Nb2RhbCB0byBnZXQgaW5mbyBmb3IgIGEgbmV3IGJldGEgcGx1Z2luXHJcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzIHdpbGwgb3BlbiBzZXR0aW5ncyBzY3JlZW4gYWZ0ZXJ3YXJkcy4gVXNlZCB3aGVuIHRoaXMgY29tbWFuZCBpcyBjYWxsZWQgZnJvbSBzZXR0aW5ncyB0YWJcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgIHVzZUZyb3plblZlcnNpb24gICAgICAgICAgaW5zdGFsbCB0aGUgcGx1Z2luIHVzaW5nIGZyb3plbiB2ZXJzaW9uLlxyXG4gICAgICogQHJldHVybiAgezxQcm9taXNlPjx2b2lkPn1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKG9wZW5TZXR0aW5nc1RhYkFmdGVyd2FyZHMgPSBmYWxzZSwgdXNlRnJvemVuVmVyc2lvbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gbmV3IEFkZE5ld1BsdWdpbk1vZGFsKHRoaXMucGx1Z2luLCB0aGlzLCBvcGVuU2V0dGluZ3NUYWJBZnRlcndhcmRzLCB1c2VGcm96ZW5WZXJzaW9uKTtcclxuICAgICAgICBuZXdQbHVnaW4ub3BlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoYXQgYSBHaXRIdWIgcmVwb3NpdG9yeSBpcyBwbHVnaW5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlQYXRoICAgR2l0aHViVXNlci9SZXBvc2l0b3J5TmFtZSAoZXhhbXBsZTogVGZUaGFja2VyL29ic2lkaWFuNDItYnJhdClcclxuICAgICAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgZ2V0QmV0YU1hbmlmZXN0ICB0ZXN0IHRoZSBiZXRhIHZlcnNpb24gb2YgdGhlIG1hbmlmZXN0LCBub3QgYXQgdGhlIHJvb3RcclxuICAgICAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgZmFsc2UgICAgICAgICAgICBbZmFsc2UgZGVzY3JpcHRpb25dXHJcbiAgICAgKiBAcGFyYW0gICB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgIHJlcG9ydElzc3VlcyAgICAgIHdpbGwgZGlzcGxheSBub3RpY2VzIGFzIGl0IGZpbmRzIGlzc3Vlc1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPFBsdWdpbk1hbmlmZXN0Pn0gICAgICAgICAgICAgICAgICAgICB0aGUgbWFuaWZlc3QgZmlsZSBpZiBmb3VuZCwgb3IgbnVsbCBpZiBpdHMgaW5jb21wbGV0ZVxyXG4gICAgICovXHJcbiAgICBhc3luYyB2YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGg6IHN0cmluZywgZ2V0QmV0YU1hbmlmZXN0ID0gZmFsc2UsIHJlcG9ydElzc3VlcyA9IGZhbHNlKTogUHJvbWlzZTxQbHVnaW5NYW5pZmVzdD4ge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZVRpbWVvdXQgPSAxNTtcclxuICAgICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBhd2FpdCBncmFiTWFuaWZlc3RKc29uRnJvbVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsICFnZXRCZXRhTWFuaWZlc3QpO1xyXG4gICAgICAgIGlmICghbWFuaWZlc3RKc29uKSB7IC8vIHRoaXMgaXMgYSBwbHVnaW4gd2l0aCBhIG1hbmlmZXN0IGpzb24sIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBiZXRhIHZlcnNpb25cclxuICAgICAgICAgICAgaWYgKHJlcG9ydElzc3VlcykgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgYW4gb2JzaWRpYW4gcGx1Z2luLCBhcyB0aGVyZSBpcyBubyBtYW5pZmVzdC5qc29uIGZpbGUuYCwgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIG1haW5mZXN0IGhhcyBzb21lIGtleSBlbGVtZW50cywgbGlrZSBJRCBhbmQgdmVyc2lvblxyXG4gICAgICAgIGlmICghKFwiaWRcIiBpbiBtYW5pZmVzdEpzb24pKSB7IC8vIHRoaXMgaXMgYSBwbHVnaW4gd2l0aCBhIG1hbmlmZXN0IGpzb24sIHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBiZXRhIHZlcnNpb25cclxuICAgICAgICAgICAgaWYgKHJlcG9ydElzc3VlcykgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLGAke3JlcG9zaXRvcnlQYXRofVxcblRoZSBwbHVnaW4gaWQgYXR0cmlidXRlIGZvciB0aGUgcmVsZWFzZSBpcyBtaXNzaW5nIGZyb20gdGhlIG1hbmlmZXN0IGZpbGVgLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKFwidmVyc2lvblwiIGluIG1hbmlmZXN0SnNvbikpIHsgLy8gdGhpcyBpcyBhIHBsdWdpbiB3aXRoIGEgbWFuaWZlc3QganNvbiwgdHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIGJldGEgdmVyc2lvblxyXG4gICAgICAgICAgICBpZiAocmVwb3J0SXNzdWVzKSBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sYCR7cmVwb3NpdG9yeVBhdGh9XFxuVGhlIHZlcnNpb24gYXR0cmlidXRlIGZvciB0aGUgcmVsZWFzZSBpcyBtaXNzaW5nIGZyb20gdGhlIG1hbmlmZXN0IGZpbGVgLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYW5pZmVzdEpzb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCB0aGUgcmVsZXNlIGZpbGVzIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgbWFuaWZlc3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlQYXRoICBwYXRoIHRvIHRoZSBHaXRIdWIgcmVwb3NpdG9yeVxyXG4gICAgICogQHBhcmFtICAge1BsdWdpbk1hbmlmZXN0PFJlbGVhc2VGaWxlcz59ICBtYW5pZmVzdCAgICAgICAgbWFuaWZlc3QgZmlsZVxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgICBnZXRNYW5pZmVzdCAgICAgZ3JhYiB0aGUgcmVtb3RlIG1hbmlmZXN0IGZpbGVcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeVZlcnNpb24gIGdyYWIgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGlmIHNldFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPFJlbGVhc2VGaWxlcz59ICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCByZWxhc2UgZmlsZXMgYXMgc3RyaW5ncyBiYXNlZCBvbiB0aGUgUmVsZWFzZUZpbGVzIGludGVyYWZhY2VcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0QWxsUmVsZWFzZUZpbGVzKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIG1hbmlmZXN0OiBQbHVnaW5NYW5pZmVzdCwgZ2V0TWFuaWZlc3Q6IGJvb2xlYW4sIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8UmVsZWFzZUZpbGVzPiB7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHNwZWNpZnlWZXJzaW9uID09PSBcIlwiID8gbWFuaWZlc3QudmVyc2lvbiA6IHNwZWNpZnlWZXJzaW9uO1xyXG5cclxuICAgICAgICAvLyBpZiB3ZSBoYXZlIHZlcnNpb24gc3BlY2lmaWVkLCB3ZSBhbHdheXMgd2FudCB0byBnZXQgdGhlIHJlbW90ZSBtYW5pZmVzdCBmaWxlLlxyXG4gICAgICAgIGNvbnN0IHJlYWxseUdldE1hbmlmZXN0T3JOb3QgPSBnZXRNYW5pZmVzdCB8fCAoc3BlY2lmeVZlcnNpb24gIT09IFwiXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBtYWluSnM6IGF3YWl0IGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5KHJlcG9zaXRvcnlQYXRoLCB2ZXJzaW9uLCBcIm1haW4uanNcIiksXHJcbiAgICAgICAgICAgIG1hbmlmZXN0OiByZWFsbHlHZXRNYW5pZmVzdE9yTm90ID8gYXdhaXQgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIHZlcnNpb24sIFwibWFuaWZlc3QuanNvblwiKSA6IG51bGwsXHJcbiAgICAgICAgICAgIHN0eWxlczogYXdhaXQgZ3JhYlJlbGVhc2VGaWxlRnJvbVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIHZlcnNpb24sIFwic3R5bGVzLmNzc1wiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlcyB0aGUgcGx1Z2luIHJlbGVhc2UgZmlsZXMgdG8gdGhlIGxvY2FsIG9ic2lkaWFuIC5wbHVnaW5zIGZvbGRlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICBiZXRhUGx1Z2luSUQgIHRoZSBpZCBvZiB0aGUgcGx1Z2luIChub3QgdGhlIHJlcG9zaXRvcnkgcGF0aClcclxuICAgICAqIEBwYXJhbSAgIHtSZWxlYXNlRmlsZXM8dm9pZD59ICByZWxGaWxlcyAgICAgIHJlbGVhc2UgZmlsZSBhcyBzdHJpbmdzLCBiYXNlZCBvbiB0aGUgUmVsZWFzZUZpbGVzIGludGVyZmFjZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gIHtQcm9taXNlPHZvaWQ+fSAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBhc3luYyB3cml0ZVJlbGVhc2VGaWxlc1RvUGx1Z2luRm9sZGVyKGJldGFQbHVnaW5JRDogc3RyaW5nLCByZWxGaWxlczogUmVsZWFzZUZpbGVzKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCA9IG5vcm1hbGl6ZVBhdGgodGhpcy5wbHVnaW4uYXBwLnZhdWx0LmNvbmZpZ0RpciArIFwiL3BsdWdpbnMvXCIgKyBiZXRhUGx1Z2luSUQpICsgXCIvXCI7XHJcbiAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyO1xyXG4gICAgICAgIGlmIChhd2FpdCBhZGFwdGVyLmV4aXN0cyhwbHVnaW5UYXJnZXRGb2xkZXJQYXRoKSA9PT0gZmFsc2UgfHxcclxuICAgICAgICAgICAgIShhd2FpdCBhZGFwdGVyLmV4aXN0cyhwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIpKSkge1xyXG4gICAgICAgICAgICAvLyBpZiBwbHVnaW4gZm9sZGVyIGRvZXNudCBleGlzdCBvciBtYW5pZmVzdC5qc29uIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdCBhbmQgc2F2ZSB0aGUgcGx1Z2luIGZpbGVzXHJcbiAgICAgICAgICAgIGF3YWl0IGFkYXB0ZXIubWtkaXIocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IGFkYXB0ZXIud3JpdGUocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCArIFwibWFpbi5qc1wiLCByZWxGaWxlcy5tYWluSnMpO1xyXG4gICAgICAgIGF3YWl0IGFkYXB0ZXIud3JpdGUocGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCArIFwibWFuaWZlc3QuanNvblwiLCByZWxGaWxlcy5tYW5pZmVzdCk7XHJcbiAgICAgICAgaWYgKHJlbEZpbGVzLnN0eWxlcykgYXdhaXQgYWRhcHRlci53cml0ZShwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJzdHlsZXMuY3NzXCIsIHJlbEZpbGVzLnN0eWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmltYXJ5IGZ1bmN0aW9uIGZvciBhZGRpbmcgYSBuZXcgYmV0YSBwbHVnaW4gdG8gb2JzaWRpYW4uIEFsc28gdGhpcyBmdW5jdGlvbiBpcyB1c2UgZm9yIHVwZGF0aW5nXHJcbiAgICAgKiBleGlzdGluZyBwbHVnaW5zLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgICAgICAgICByZXBvc2l0b3J5UGF0aCAgICAgcGF0aCB0byBHaXRIdWIgcmVwb3NpdG9yeSBmb3JtYXRlZCBhcyBVU0VSTkFNRS9yZXBvc2l0b3J5XHJcbiAgICAgKiBAcGFyYW0gICB7Ym9vbGVhbn0gICAgICAgICAgICAgdXBkYXRlUGx1Z2luRmlsZXMgIHRydWUgaWYgdGhpcyBpcyBqdXN0IGFuIHVwZGF0ZSBub3QgYW4gaW5zdGFsbFxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICAgIHNlZUlmVXBkYXRlZE9ubHkgICBpZiB0cnVlLCBhbmQgdXBkYXRlUGx1Z2luRmlsZXMgdHJ1ZSwgd2lsbCBqdXN0IGNoZWNrIGZvciB1cGRhdGVzLCBidXQgbm90IGRvIHRoZSB1cGRhdGUuIHdpbGwgcmVwb3J0IHRvIHVzZXIgdGhhdCB0aGVyZSBpcyBhIG5ldyBwbHVnaW5cclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgICAgICAgICAgICByZXBvcnRJZk5vdFVwZHRlZCAgaWYgdHJ1ZSwgcmVwb3J0IGlmIGFuIHVwZGF0ZSBoYXMgbm90IHN1Y2NlZFxyXG4gICAgICogQHBhcmFtICAge3N0cmluZ30gICAgICAgICAgICAgIHNwZWNpZnlWZXJzaW9uICAgICBpZiBub3QgZW1wdHksIG5lZWQgdG8gaW5zdGFsbCBhIHNwZWNpZmllZCB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIHZhbHVlIGluIG1hbmlmZXN0ey1iZXRhfS5qc29uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8Ym9vbGVhbj59ICAgICAgICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2NlZWRzXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFkZFBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nLCB1cGRhdGVQbHVnaW5GaWxlcyA9IGZhbHNlLCBzZWVJZlVwZGF0ZWRPbmx5ID0gZmFsc2UsIHJlcG9ydElmTm90VXBkdGVkID0gZmFsc2UsIHNwZWNpZnlWZXJzaW9uID0gXCJcIik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IG5vdGljZVRpbWVvdXQgPSAxMDtcclxuICAgICAgICBsZXQgcHJpbWFyeU1hbmlmZXN0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIHRydWUsIGZhbHNlKTsgLy8gYXR0ZW1wdCB0byBnZXQgbWFuaWZlc3QtYmV0YS5qc29uXHJcbiAgICAgICAgY29uc3QgdXNpbmdCZXRhTWFuaWZlc3Q6IGJvb2xlYW4gPSBwcmltYXJ5TWFuaWZlc3QgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgaWYgKHVzaW5nQmV0YU1hbmlmZXN0ID09PSBmYWxzZSlcclxuICAgICAgICAgICAgcHJpbWFyeU1hbmlmZXN0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZVJlcG9zaXRvcnkocmVwb3NpdG9yeVBhdGgsIGZhbHNlLCB0cnVlKTsgLy8gYXR0ZW1wdCB0byBnZXQgbWFuaWZlc3QuanNvblxyXG5cclxuICAgICAgICBpZiAocHJpbWFyeU1hbmlmZXN0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofVxcbkEgbWFuaWZlc3QuanNvbiBvciBtYW5pZmVzdC1iZXRhLmpzb24gZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHJlcG9zaXRvcnkuIFRoaXMgcGx1Z2luIGNhbm5vdCBiZSBpbnN0YWxsZWQuYDtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7bXNnfWAsIG5vdGljZVRpbWVvdXQpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXByaW1hcnlNYW5pZmVzdC5oYXNPd25Qcm9wZXJ0eSgndmVyc2lvbicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofVxcblRoZSBtYW5pZmVzdCR7dXNpbmdCZXRhTWFuaWZlc3QgPyBcIi1iZXRhXCIgOiBcIlwifS5qc29uIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IGhhdmUgYSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZmlsZS4gVGhpcyBwbHVnaW4gY2Fubm90IGJlIGluc3RhbGxlZC5gO1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHttc2d9YCwgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGdldFJlbGVhc2UgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0QWxsUmVsZWFzZUZpbGVzKHJlcG9zaXRvcnlQYXRoLCBwcmltYXJ5TWFuaWZlc3QsIHVzaW5nQmV0YU1hbmlmZXN0LCBzcGVjaWZ5VmVyc2lvbik7XHJcbiAgICAgICAgICAgIGlmICh1c2luZ0JldGFNYW5pZmVzdCB8fCByRmlsZXMubWFuaWZlc3QgPT09IG51bGwpICAvL2lmIGJldGEsIHVzZSB0aGF0IG1hbmlmZXN0LCBvciBpZiB0aGVyZSBpcyBubyBtYW5pZmVzdCBpbiByZWxlYXNlLCB1c2UgdGhlIHByaW1hcnlNYW5pZmVzdFxyXG4gICAgICAgICAgICAgICAgckZpbGVzLm1hbmlmZXN0ID0gSlNPTi5zdHJpbmdpZnkocHJpbWFyeU1hbmlmZXN0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyRmlsZXMubWFpbkpzID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtyZXBvc2l0b3J5UGF0aH1cXG5UaGUgcmVsZWFzZSBpcyBub3QgY29tcGxldGUgYW5kIGNhbm5vdCBiZSBkb3dubG9hZC4gbWFpbi5qcyBpcyBtaXNzaW5nIGZyb20gdGhlIFJlbGVhc2VgO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGAke21zZ31gLCBub3RpY2VUaW1lb3V0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByRmlsZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodXBkYXRlUGx1Z2luRmlsZXMgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VGaWxlcyA9IGF3YWl0IGdldFJlbGVhc2UoKTtcclxuICAgICAgICAgICAgaWYgKHJlbGVhc2VGaWxlcyA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlUmVsZWFzZUZpbGVzVG9QbHVnaW5Gb2xkZXIocHJpbWFyeU1hbmlmZXN0LmlkLCByZWxlYXNlRmlsZXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBhZGRCZXRhUGx1Z2luVG9MaXN0KHRoaXMucGx1Z2luLCByZXBvc2l0b3J5UGF0aCwgc3BlY2lmeVZlcnNpb24pO1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMubG9hZE1hbmlmZXN0cygpO1xyXG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uVGV4dCA9IHNwZWNpZnlWZXJzaW9uID09PSBcIlwiID8gXCJcIiA6IGAgKHZlcnNpb246ICR7c3BlY2lmeVZlcnNpb259KWA7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3JlcG9zaXRvcnlQYXRofSR7dmVyc2lvblRleHR9XFxuVGhlIHBsdWdpbiBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggQlJBVC4gWW91IG1heSBzdGlsbCBuZWVkIHRvIGVuYWJsZSBpdCB0aGUgQ29tbXVuaXR5IFBsdWdpbiBMaXN0LmA7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2csIHRydWUpO1xyXG4gICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIG1zZywgbm90aWNlVGltZW91dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGVzdCBpZiB0aGUgcGx1Z2luIG5lZWRzIHRvIGJlIHVwZGF0ZWRcclxuICAgICAgICAgICAgLy8gaWYgYSBzcGVjaWZpZWQgdmVyc2lvbiBpcyBwcm92aWRlZCwgdGhlbiB3ZSBzaGFsbCBza2lwIHRoZSB1cGRhdGVcclxuICAgICAgICAgICAgY29uc3QgcGx1Z2luVGFyZ2V0Rm9sZGVyUGF0aCA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5jb25maWdEaXIgKyBcIi9wbHVnaW5zL1wiICsgcHJpbWFyeU1hbmlmZXN0LmlkICsgXCIvXCI7XHJcbiAgICAgICAgICAgIGxldCBsb2NhbE1hbmlmZXN0Q29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxNYW5pZmVzdENvbnRlbnRzID0gYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIucmVhZChwbHVnaW5UYXJnZXRGb2xkZXJQYXRoICsgXCJtYW5pZmVzdC5qc29uXCIpXHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmVycm5vID09PSAtNDA1OCkgeyAvLyBmaWxlIGRvZXMgbm90IGV4aXN0LCB0cnkgaW5zdGFsbGluZyB0aGUgcGx1Z2luXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRQbHVnaW4ocmVwb3NpdG9yeVBhdGgsIGZhbHNlLCB1c2luZ0JldGFNYW5pZmVzdCwgZmFsc2UsIHNwZWNpZnlWZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gZXZlbiB0aG91Z2ggZmFpbGVkLCByZXR1cm4gdHJ1ZSBzaW5jZSBpbnN0YWxsIHdpbGwgYmUgYXR0ZW1wdGVkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJCUkFUIC0gTG9jYWwgTWFuaWZlc3QgTG9hZFwiLCBwcmltYXJ5TWFuaWZlc3QuaWQsIEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3BlY2lmeVZlcnNpb24gIT09IFwiXCIgXHJcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoeD0+eC5yZXBvKS5pbmNsdWRlcyhyZXBvc2l0b3J5UGF0aClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBmcm96ZW4gdmVyc2lvbiBwbHVnaW5cclxuICAgICAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYFRoZSB2ZXJzaW9uIG9mICR7cmVwb3NpdG9yeVBhdGh9IGlzIGZyb3plbiwgbm90IHVwZGF0aW5nLmAsIDMpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2NhbE1hbmlmZXN0SlNPTiA9IGF3YWl0IEpTT04ucGFyc2UobG9jYWxNYW5pZmVzdENvbnRlbnRzKTtcclxuICAgICAgICAgICAgaWYgKGxvY2FsTWFuaWZlc3RKU09OLnZlcnNpb24gIT09IHByaW1hcnlNYW5pZmVzdC52ZXJzaW9uKSB7IC8vbWFuaWZlc3QgZmlsZXMgYXJlIG5vdCB0aGUgc2FtZSwgZG8gYW4gdXBkYXRlXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWxlYXNlRmlsZXMgPSBhd2FpdCBnZXRSZWxlYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVsZWFzZUZpbGVzID09PSBudWxsKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlZUlmVXBkYXRlZE9ubHkpIHsgLy8gZG9udCB1cGRhdGUsIGp1c3QgcmVwb3J0IGl0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yICR7cHJpbWFyeU1hbmlmZXN0LmlkfSBmcm9tIHZlcnNpb24gJHtsb2NhbE1hbmlmZXN0SlNPTi52ZXJzaW9ufSB0byAke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufS4gYDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnICsgYFtSZWxlYXNlIEluZm9dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnlQYXRofS9yZWxlYXNlcy90YWcvJHtwcmltYXJ5TWFuaWZlc3QudmVyc2lvbn0pYCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgbXNnLCAzMCwgYXN5bmMgKCkgPT4geyB3aW5kb3cub3BlbihgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeVBhdGh9L3JlbGVhc2VzL3RhZy8ke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufWApfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVSZWxlYXNlRmlsZXNUb1BsdWdpbkZvbGRlcihwcmltYXJ5TWFuaWZlc3QuaWQsIHJlbGVhc2VGaWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnMubG9hZE1hbmlmZXN0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbi5hcHAucGx1Z2lucy5wbHVnaW5zW3ByaW1hcnlNYW5pZmVzdC5pZF0/Lm1hbmlmZXN0KSBhd2FpdCB0aGlzLnJlbG9hZFBsdWdpbihwcmltYXJ5TWFuaWZlc3QuaWQpOyAvL3JlbG9hZCBpZiBlbmFibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7cHJpbWFyeU1hbmlmZXN0LmlkfVxcblBsdWdpbiBoYXMgYmVlbiB1cGRhdGVkIGZyb20gdmVyc2lvbiAke2xvY2FsTWFuaWZlc3RKU09OLnZlcnNpb259IHRvICR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259LiBgO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cgKyBgW1JlbGVhc2UgSW5mb10oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeVBhdGh9L3JlbGVhc2VzL3RhZy8ke3ByaW1hcnlNYW5pZmVzdC52ZXJzaW9ufSlgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2csIDMwLCBhc3luYyAoKSA9PiB7IHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5UGF0aH0vcmVsZWFzZXMvdGFnLyR7cHJpbWFyeU1hbmlmZXN0LnZlcnNpb259YCkgfSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRJZk5vdFVwZHRlZCkgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgTm8gdXBkYXRlIGF2YWlsYWJsZSBmb3IgJHtyZXBvc2l0b3J5UGF0aH1gLCAzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZWxvYWRzIGEgcGx1Z2luIChhc3N1bWluZyBpdCBoYXMgYmVlbiBlbmFibGVkIGJ5IHVzZXIpXHJcbiAgICAgKiBwamVieSwgVGhhbmtzIEJybyBodHRwczovL2dpdGh1Yi5jb20vcGplYnkvaG90LXJlbG9hZC9ibG9iL21hc3Rlci9tYWluLmpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmc8dm9pZD59ICAgcGx1Z2luTmFtZSAgbmFtZSBvZiBwbHVnaW5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgIFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZWxvYWRQbHVnaW4ocGx1Z2luTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLnBsdWdpbi5hcHAucGx1Z2lucztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBwbHVnaW5zLmRpc2FibGVQbHVnaW4ocGx1Z2luTmFtZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHBsdWdpbnMuZW5hYmxlUGx1Z2luKHBsdWdpbk5hbWUpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5sb2coXCJyZWxvYWQgcGx1Z2luXCIsIGUpIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVwZGF0ZXMgYSBiZXRhIHBsdWdpblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgcmVwb3NpdG9yeVBhdGggIHJlcG9zaXRvcnkgcGF0aCBvbiBHaXRIdWJcclxuICAgICAqIEBwYXJhbSAgIHtib29sZWFufSAgb25seUNoZWNrRG9udFVwZGF0ZSBvbmx5IGxvb2tzIGZvciB1cGRhdGVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuICB7UHJvbWlzZTx2b2lkPn0gICAgICAgICAgICAgICAgICBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdXBkYXRlUGx1Z2luKHJlcG9zaXRvcnlQYXRoOiBzdHJpbmcsIG9ubHlDaGVja0RvbnRVcGRhdGUgPSBmYWxzZSwgcmVwb3J0SWZOb3RVcGR0ZWQgPSBmYWxzZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkUGx1Z2luKHJlcG9zaXRvcnlQYXRoLCB0cnVlLCBvbmx5Q2hlY2tEb250VXBkYXRlLCByZXBvcnRJZk5vdFVwZHRlZCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UgJiYgb25seUNoZWNrRG9udFVwZGF0ZSA9PT0gZmFsc2UpXHJcbiAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBgJHtyZXBvc2l0b3J5UGF0aH1cXG5VcGRhdGUgb2YgcGx1Z2luIGZhaWxlZC5gKVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3YWxrcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHBsdWdpbnMgd2l0aG91dCBmcm96ZW4gdmVyc2lvbiBhbmQgcGVyZm9ybXMgYW4gdXBkYXRlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW59ICAgICAgICAgICBzaG93SW5mbyAgc2hvdWxkIHRoaXMgd2l0aCBhIHN0YXJ0ZWQvY29tcGxldGVkIG1lc3NhZ2UgLSB1c2VmdWwgd2hlbiByYW4gZnJvbSBDUFxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgY2hlY2tGb3JVcGRhdGVzQW5kSW5zdGFsbFVwZGF0ZXMoc2hvd0luZm8gPSBmYWxzZSwgb25seUNoZWNrRG9udFVwZGF0ZSA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYoYXdhaXQgaXNDb25uZWN0ZWRUb0ludGVybmV0KCk9PT1mYWxzZSkgeyBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJCUkFUOiBObyBpbnRlcm5ldCBkZXRlY3RlZC5cIikgXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG5ld05vdGljZTogTm90aWNlO1xyXG4gICAgICAgIGNvbnN0IG1zZzEgPSBgQ2hlY2tpbmcgZm9yIHBsdWdpbiB1cGRhdGVzIFNUQVJURURgO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cxLCB0cnVlKTtcclxuICAgICAgICBpZiAoc2hvd0luZm8gJiYgdGhpcy5wbHVnaW4uc2V0dGluZ3Mubm90aWZpY2F0aW9uc0VuYWJsZWQpIG5ld05vdGljZSA9IG5ldyBOb3RpY2UoYEJSQVRcXG4ke21zZzF9YCwgMzAwMDApO1xyXG4gICAgICAgIGNvbnN0IHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXMgPSBcclxuICAgICAgICAgICAgbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoZiA9PiBmLnJlcG8pKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJwIG9mIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QpIHtcclxuICAgICAgICAgICAgaWYgKHBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uTmFtZXMuaGFzKGJwKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVQbHVnaW4oYnAsIG9ubHlDaGVja0RvbnRVcGRhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtc2cyID0gYENoZWNraW5nIGZvciBwbHVnaW4gdXBkYXRlcyBDT01QTEVURURgO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLmxvZyhtc2cyLCB0cnVlKTtcclxuICAgICAgICBpZiAoc2hvd0luZm8pIHtcclxuICAgICAgICAgICAgbmV3Tm90aWNlLmhpZGUoKTtcclxuICAgICAgICAgICAgVG9hc3RNZXNzYWdlKHRoaXMucGx1Z2luLCBtc2cyLCAxMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgYmV0YSBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBiZXRhIHBsdWdpbnMgKGRvZXMgbm90IGRlbGV0ZSB0aGVtIGZyb20gZGlzaylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gICB7c3RyaW5nPHZvaWQ+fSAgIGJldGFQbHVnaW5JRCAgcmVwb3NpdG9yeSBwYXRoXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1Byb21pc2U8dm9pZD59ICAgICAgICAgICAgICAgIFtyZXR1cm4gZGVzY3JpcHRpb25dXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZVBsdWdpbihyZXBvc2l0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgbXNnID0gYFJlbW92ZWQgJHtyZXBvc2l0b3J5UGF0aH0gZnJvbSBCUkFUIHBsdWdpbiBsaXN0YDtcclxuICAgICAgICB0aGlzLnBsdWdpbi5sb2cobXNnLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luTGlzdC5maWx0ZXIoKGIpID0+IGIgIT0gcmVwb3NpdG9yeVBhdGgpO1xyXG4gICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uID0gXHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpblN1Ykxpc3RGcm96ZW5WZXJzaW9uLmZpbHRlcihcclxuICAgICAgICAgICAgICAgIChiKSA9PiBiLnJlcG8gIT0gcmVwb3NpdG9yeVBhdGhcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHBsdWdpbnMgdGhhdCBhcmUgY3VycmVudGx5IGVuYWJsZWQgb3IgY3VycmVudGx5IGRpc2FibGVkXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtICAge2Jvb2xlYW5bXX0gICAgICAgIGVuYWJsZWQgIHRydWUgZm9yIGVuYWJsZWQgcGx1Z2lucywgZmFsc2UgZm9yIGRpc2FibGVkIHBsdXRpbmdzXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybiAge1BsdWdpbk1hbmlmZXN0W119ICAgICAgICAgICBtYW5pZmVzdHMgIG9mIHBsdWdpbnNcclxuICAgICAqL1xyXG4gICAgZ2V0RW5hYmxlZERpc2FibGVkUGx1Z2lucyhlbmFibGVkOiBib29sZWFuKTogUGx1Z2luTWFuaWZlc3RbXSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5wbHVnaW4uYXBwLnBsdWdpbnM7XHJcbiAgICAgICAgY29uc3QgbWFuaWZlc3RzOiBQbHVnaW5NYW5pZmVzdFtdID0gT2JqZWN0LnZhbHVlcyhwbC5tYW5pZmVzdHMpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBjb25zdCBlbmFibGVkUGx1Z2luczogUGx1Z2luTWFuaWZlc3RbXSA9IE9iamVjdC52YWx1ZXMocGwucGx1Z2lucykubWFwKHAgPT4gcC5tYW5pZmVzdCk7XHJcbiAgICAgICAgcmV0dXJuIGVuYWJsZWQgP1xyXG4gICAgICAgICAgICBtYW5pZmVzdHMuZmlsdGVyKG1hbmlmZXN0ID0+IGVuYWJsZWRQbHVnaW5zLmZpbmQocGx1Z2luTmFtZSA9PiBtYW5pZmVzdC5pZCA9PT0gcGx1Z2luTmFtZS5pZCkpIDpcclxuICAgICAgICAgICAgbWFuaWZlc3RzLmZpbHRlcihtYW5pZmVzdCA9PiAhZW5hYmxlZFBsdWdpbnMuZmluZChwbHVnaW5OYW1lID0+IG1hbmlmZXN0LmlkID09PSBwbHVnaW5OYW1lLmlkKSk7XHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IHsgYWRkSWNvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRJY29ucygpOiB2b2lkIHtcclxuICAgIGFkZEljb24oXHJcbiAgICAgICAgXCJCcmF0SWNvblwiLFxyXG4gICAgICAgIGA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgIGQ9XCJNIDQxLjY2Nzk2OSA0MS42Njc5NjkgQyA0MS42Njc5NjkgMzkuMzY3MTg4IDM5LjgwMDc4MSAzNy41IDM3LjUgMzcuNSBDIDM1LjE5OTIxOSAzNy41IDMzLjMzMjAzMSAzOS4zNjcxODggMzMuMzMyMDMxIDQxLjY2Nzk2OSBDIDMzLjMzMjAzMSA0My45Njg3NSAzNS4xOTkyMTkgNDUuODMyMDMxIDM3LjUgNDUuODMyMDMxIEMgMzkuODAwNzgxIDQ1LjgzMjAzMSA0MS42Njc5NjkgNDMuOTY4NzUgNDEuNjY3OTY5IDQxLjY2Nzk2OSBaIE0gNjAuNDE3OTY5IDU4LjU4MjAzMSBDIDU5LjQ2MDkzOCA1OC4wMjM0MzggNTguMzIwMzEyIDU3Ljg2NzE4OCA1Ny4yNSA1OC4xNDg0MzggQyA1Ni4xNzk2ODggNTguNDI5Njg4IDU1LjI2NTYyNSA1OS4xMjUgNTQuNzA3MDMxIDYwLjA4MjAzMSBDIDUzLjc0NjA5NCA2MS43NzczNDQgNTEuOTQ5MjE5IDYyLjgyMDMxMiA1MCA2Mi44MjAzMTIgQyA0OC4wNTA3ODEgNjIuODIwMzEyIDQ2LjI1MzkwNiA2MS43NzczNDQgNDUuMjkyOTY5IDYwLjA4MjAzMSBDIDQ0LjczNDM3NSA1OS4xMjUgNDMuODIwMzEyIDU4LjQyOTY4OCA0Mi43NSA1OC4xNDg0MzggQyA0MS42Nzk2ODggNTcuODY3MTg4IDQwLjUzOTA2MiA1OC4wMjM0MzggMzkuNTgyMDMxIDU4LjU4MjAzMSBDIDM3LjU5NzY1NiA1OS43MjY1NjIgMzYuOTEwMTU2IDYyLjI1NzgxMiAzOC4wNDI5NjkgNjQuMjUgQyA0MC41IDY4LjUzMTI1IDQ1LjA2MjUgNzEuMTcxODc1IDUwIDcxLjE3MTg3NSBDIDU0LjkzNzUgNzEuMTcxODc1IDU5LjUgNjguNTMxMjUgNjEuOTU3MDMxIDY0LjI1IEMgNjMuMDg5ODQ0IDYyLjI1NzgxMiA2Mi40MDIzNDQgNTkuNzI2NTYyIDYwLjQxNzk2OSA1OC41ODIwMzEgWiBNIDYyLjUgMzcuNSBDIDYwLjE5OTIxOSAzNy41IDU4LjMzMjAzMSAzOS4zNjcxODggNTguMzMyMDMxIDQxLjY2Nzk2OSBDIDU4LjMzMjAzMSA0My45Njg3NSA2MC4xOTkyMTkgNDUuODMyMDMxIDYyLjUgNDUuODMyMDMxIEMgNjQuODAwNzgxIDQ1LjgzMjAzMSA2Ni42Njc5NjkgNDMuOTY4NzUgNjYuNjY3OTY5IDQxLjY2Nzk2OSBDIDY2LjY2Nzk2OSAzOS4zNjcxODggNjQuODAwNzgxIDM3LjUgNjIuNSAzNy41IFogTSA1MCA4LjMzMjAzMSBDIDI2Ljk4ODI4MSA4LjMzMjAzMSA4LjMzMjAzMSAyNi45ODgyODEgOC4zMzIwMzEgNTAgQyA4LjMzMjAzMSA3My4wMTE3MTkgMjYuOTg4MjgxIDkxLjY2Nzk2OSA1MCA5MS42Njc5NjkgQyA3My4wMTE3MTkgOTEuNjY3OTY5IDkxLjY2Nzk2OSA3My4wMTE3MTkgOTEuNjY3OTY5IDUwIEMgOTEuNjY3OTY5IDI2Ljk4ODI4MSA3My4wMTE3MTkgOC4zMzIwMzEgNTAgOC4zMzIwMzEgWiBNIDUwIDgzLjMzMjAzMSBDIDMzLjk4ODI4MSA4My40MDIzNDQgMjAuMTkxNDA2IDcyLjA3ODEyNSAxNy4xMzY3MTkgNTYuMzYzMjgxIEMgMTQuMDc4MTI1IDQwLjY0NDUzMSAyMi42Mjg5MDYgMjQuOTc2NTYyIDM3LjUgMTkuMDQyOTY5IEMgMzcuNDU3MDMxIDE5LjYzNjcxOSAzNy40NTcwMzEgMjAuMjM4MjgxIDM3LjUgMjAuODMyMDMxIEMgMzcuNSAyNy43MzgyODEgNDMuMDk3NjU2IDMzLjMzMjAzMSA1MCAzMy4zMzIwMzEgQyA1Mi4zMDA3ODEgMzMuMzMyMDMxIDU0LjE2Nzk2OSAzMS40Njg3NSA1NC4xNjc5NjkgMjkuMTY3OTY5IEMgNTQuMTY3OTY5IDI2Ljg2NzE4OCA1Mi4zMDA3ODEgMjUgNTAgMjUgQyA0Ny42OTkyMTkgMjUgNDUuODMyMDMxIDIzLjEzMjgxMiA0NS44MzIwMzEgMjAuODMyMDMxIEMgNDUuODMyMDMxIDE4LjUzMTI1IDQ3LjY5OTIxOSAxNi42Njc5NjkgNTAgMTYuNjY3OTY5IEMgNjguNDEwMTU2IDE2LjY2Nzk2OSA4My4zMzIwMzEgMzEuNTg5ODQ0IDgzLjMzMjAzMSA1MCBDIDgzLjMzMjAzMSA2OC40MTAxNTYgNjguNDEwMTU2IDgzLjMzMjAzMSA1MCA4My4zMzIwMzEgWiBNIDUwIDgzLjMzMjAzMSBcIiAvPmBcclxuICAgICk7XHJcbn0iLCAiaW1wb3J0IHsgbW9tZW50LCBURmlsZSwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgZ2V0RGFpbHlOb3RlU2V0dGluZ3MgfSBmcm9tIFwib2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlXCI7XHJcbmltcG9ydCBUaGVQbHVnaW4gZnJvbSBcIi4uL21haW5cIjtcclxuXHJcbi8qKlxyXG4gKiBMb2dzIGV2ZW50cyB0byBhIGxvZyBmaWxlXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtUaGVQbHVnaW59ICBwbHVnaW4gICAgICAgICAgICBQbHVnaW4gb2JqZWN0XHJcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICB0ZXh0VG9Mb2cgICAgICAgICB0ZXh0IHRvIGJlIHNhdmVkIHRvIGxvZyBmaWxlXHJcbiAqIEBwYXJhbSAgIHtbdHlwZV19ICAgICB2ZXJib3NlTG9nZ2luZ09uICBUcnVlIGlmIHNob3VsZCBvbmx5IGJlIGxvZ2dlZCBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgZW5hYmxlZFxyXG4gKlxyXG4gKiBAcmV0dXJuICB7dm9pZH0gICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKHBsdWdpbjogVGhlUGx1Z2luLCB0ZXh0VG9Mb2c6IHN0cmluZywgdmVyYm9zZUxvZ2dpbmdPbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBpZihwbHVnaW4uc2V0dGluZ3MuZGVidWdnaW5nTW9kZSkgY29uc29sZS5sb2coXCJCUkFUOiBcIiArIHRleHRUb0xvZyk7XHJcbiAgICBpZiAocGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdFbmFibGVkKSB7XHJcbiAgICAgICAgaWYgKHBsdWdpbi5zZXR0aW5ncy5sb2dnaW5nVmVyYm9zZUVuYWJsZWQgPT09IGZhbHNlICYmIHZlcmJvc2VMb2dnaW5nT24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGx1Z2luLnNldHRpbmdzLmxvZ2dpbmdQYXRoICsgXCIubWRcIjtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZU91dHB1dCA9IFwiW1tcIiArIG1vbWVudCgpLmZvcm1hdChnZXREYWlseU5vdGVTZXR0aW5ncygpLmZvcm1hdCkudG9TdHJpbmcoKSArIFwiXV0gXCIgK1xyXG4gICAgICAgICAgICAgICAgbW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hY2hpbmVOYW1lID0gUGxhdGZvcm0uaXNEZXNrdG9wID8gd2luZG93LnJlcXVpcmUoXCJvc1wiKS5ob3N0bmFtZSgpIDogXCJNT0JJTEVcIjtcclxuICAgICAgICAgICAgbGV0IG91dHB1dCA9IGRhdGVPdXRwdXQgKyBcIiBcIiArIG1hY2hpbmVOYW1lICsgXCIgXCIgKyB0ZXh0VG9Mb2cucmVwbGFjZShcIlxcblwiLFwiIFwiKSArIFwiXFxuXFxuXCI7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoZmlsZU5hbWUpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgcGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQoZmlsZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCArIGZpbGVDb250ZW50cztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gcGx1Z2luLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZmlsZU5hbWUpIGFzIFRGaWxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbi5hcHAudmF1bHQubW9kaWZ5KGZpbGUsIG91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNyZWF0ZShmaWxlTmFtZSwgb3V0cHV0KTtcclxuICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsICJpbXBvcnQgVGhlUGx1Z2luIGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IEdlbmVyaWNGdXp6eVN1Z2dlc3RlciwgU3VnZ2VzdGVySXRlbSB9IGZyb20gXCIuL0dlbmVyaWNGdXp6eVN1Z2dlc3RlclwiO1xyXG5pbXBvcnQgeyBncmFiQ29tbW11bml0eVBsdWdpbkxpc3QsIGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCB9IGZyb20gXCIuLi9mZWF0dXJlcy9naXRodWJVdGlsc1wiO1xyXG5pbXBvcnQgeyB0aGVtZXNlQ2hlY2tBbmRVcGRhdGVzLCB0aGVtZXNJbnN0YWxsRnJvbUNvbW11bml0eUxpc3QgfSBmcm9tIFwiLi4vZmVhdHVyZXMvdGhlbWVzXCI7XHJcbmltcG9ydCBBZGROZXdUaGVtZSBmcm9tIFwiLi9BZGROZXdUaGVtZVwiO1xyXG5pbXBvcnQgeyBUb2FzdE1lc3NhZ2UgfSBmcm9tIFwiLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luQ29tbWFuZHMge1xyXG4gICAgcGx1Z2luOiBUaGVQbHVnaW47XHJcbiAgICBicmF0Q29tbWFuZHMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULUFkZEJldGFQbHVnaW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IEFkZCBhIGJldGEgcGx1Z2luIGZvciB0ZXN0aW5nXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKGZhbHNlLCBmYWxzZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULUFkZEJldGFQbHVnaW5XaXRoRnJvemVuVmVyc2lvblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogQWRkIGEgYmV0YSBwbHVnaW4gd2l0aCBmcm96ZW4gdmVyc2lvbiBiYXNlZCBvbiBhIHJlbGVhc2UgdGFnXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuZGlzcGxheUFkZE5ld1BsdWdpbk1vZGFsKGZhbHNlLCB0cnVlKSB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtY2hlY2tGb3JVcGRhdGVzQW5kVXBkYXRlXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBDaGVjayBmb3IgdXBkYXRlcyB0byBhbGwgYmV0YSBwbHVnaW5zIGFuZCBVUERBVEVcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4geyBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5jaGVja0ZvclVwZGF0ZXNBbmRJbnN0YWxsVXBkYXRlcyh0cnVlLCBmYWxzZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULWNoZWNrRm9yVXBkYXRlc0FuZERvbnRVcGRhdGVcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9ubHkgY2hlY2sgZm9yIHVwZGF0ZXMgdG8gYmV0YSBwbHVnaW5zLCBidXQgZG9uJ3QgVXBkYXRlXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5wbHVnaW4uYmV0YVBsdWdpbnMuY2hlY2tGb3JVcGRhdGVzQW5kSW5zdGFsbFVwZGF0ZXModHJ1ZSwgdHJ1ZSkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXVwZGF0ZU9uZVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogQ2hvb3NlIGEgc2luZ2xlIHBsdWdpbiB2ZXJzaW9uIHRvIHVwZGF0ZVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzID0gXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IFNldCh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbi5tYXAoZiA9PiBmLnJlcG8pKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkxpc3Q6IFN1Z2dlc3Rlckl0ZW1bXSA9IFxyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKHRoaXMucGx1Z2luLnNldHRpbmdzLnBsdWdpbkxpc3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFwbHVnaW5TdWJMaXN0RnJvemVuVmVyc2lvbk5hbWVzLmhhcyhmKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgobSkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBtLCBpbmZvOiBtIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgQ2hlY2tpbmcgZm9yIHVwZGF0ZXMgZm9yICR7cmVzdWx0cy5pbmZvfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKG1zZyx0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICBUb2FzdE1lc3NhZ2UodGhpcy5wbHVnaW4sIGBcXG4ke21zZ31gLCAzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy51cGRhdGVQbHVnaW4ocmVzdWx0cy5pbmZvLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXJlc3RhcnRQbHVnaW5cIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IFJlc3RhcnQgYSBwbHVnaW4gdGhhdCBpcyBhbHJlYWR5IGluc3RhbGxlZFwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5MaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLm1hbmlmZXN0cykubWFwKChtKSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IG0uaWQsIGluZm86IG0uaWQgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEocGx1Z2luTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIFRvYXN0TWVzc2FnZSh0aGlzLnBsdWdpbiwgYCR7cmVzdWx0cy5pbmZvfVxcblBsdWdpbiByZWxvYWRpbmcgLi4uLi5gLCA1KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5iZXRhUGx1Z2lucy5yZWxvYWRQbHVnaW4ocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtZGlzYWJsZVBsdWdpblwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogRGlzYWJsZSBhIHBsdWdpbiAtIHRvZ2dsZSBpdCBvZmZcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmdldEVuYWJsZWREaXNhYmxlZFBsdWdpbnModHJ1ZSkubWFwKG1hbmlmZXN0ID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYCR7bWFuaWZlc3QubmFtZX0gKCR7bWFuaWZlc3QuaWR9KWAsIGluZm86IG1hbmlmZXN0LmlkIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKHBsdWdpbkxpc3QpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2ZzLmRpc3BsYXkoYXN5bmMgKHJlc3VsdHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5sb2coYCR7cmVzdWx0cy5kaXNwbGF5fSBwbHVnaW4gZGlzYWJsZWRgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLmRpc2FibGVQbHVnaW4ocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtZW5hYmxlUGx1Z2luXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJQbHVnaW5zOiBFbmFibGUgYSBwbHVnaW4gLSB0b2dnbGUgaXQgb25cIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTGlzdCA9IHRoaXMucGx1Z2luLmJldGFQbHVnaW5zLmdldEVuYWJsZWREaXNhYmxlZFBsdWdpbnMoZmFsc2UpLm1hcChtYW5pZmVzdCA9PiB7IHJldHVybiB7IGRpc3BsYXk6IGAke21hbmlmZXN0Lm5hbWV9ICgke21hbmlmZXN0LmlkfSlgLCBpbmZvOiBtYW5pZmVzdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShwbHVnaW5MaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKGAke3Jlc3VsdHMuZGlzcGxheX0gcGx1Z2luIGVuYWJsZWRgLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLmFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbihyZXN1bHRzLmluZm8pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1vcGVuR2l0SHViWlJlcG9zaXRvcnlcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlBsdWdpbnM6IE9wZW4gdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciBhIHBsdWdpblwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlQbHVnaW5zID0gYXdhaXQgZ3JhYkNvbW1tdW5pdHlQbHVnaW5MaXN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlQbHVnaW5MaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKGNvbW11bml0eVBsdWdpbnMpLm1hcCgocCkgPT4geyByZXR1cm4geyBkaXNwbGF5OiBgUGx1Z2luOiAke3AubmFtZX0gICgke3AucmVwb30pYCwgaW5mbzogcC5yZXBvIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmF0TGlzdDogU3VnZ2VzdGVySXRlbVtdID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wbHVnaW5MaXN0KS5tYXAoKHApID0+IHsgcmV0dXJuIHsgZGlzcGxheTogXCJCUkFUOiBcIiArIHAsIGluZm86IHAgfSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbW11bml0eVBsdWdpbkxpc3QuZm9yRWFjaChzaSA9PiBicmF0TGlzdC5wdXNoKHNpKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGJyYXRMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuaW5mbykgd2luZG93Lm9wZW4oYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3Jlc3VsdHMuaW5mb31gKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1vcGVuR2l0SHViUmVwb1RoZW1lXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJUaGVtZXM6IE9wZW4gdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciBhIHRoZW1lIChhcHBlYXJhbmNlKVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tdW5pdHlUaGVtZSA9IGF3YWl0IGdyYWJDb21tbXVuaXR5VGhlbWVzTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWVMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKGNvbW11bml0eVRoZW1lKS5tYXAoKHApID0+IHsgcmV0dXJuIHsgZGlzcGxheTogYFRoZW1lOiAke3AubmFtZX0gICgke3AucmVwb30pYCwgaW5mbzogcC5yZXBvIH0gfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnZnMgPSBuZXcgR2VuZXJpY0Z1enp5U3VnZ2VzdGVyKHRoaXMucGx1Z2luKTtcclxuICAgICAgICAgICAgICAgIGdmcy5zZXRTdWdnZXN0ZXJEYXRhKGNvbW11bml0eVRoZW1lTGlzdCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmluZm8pIHdpbmRvdy5vcGVuKGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXN1bHRzLmluZm99YClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtb3BlbnRQbHVnaW5TZXR0aW5nc1wiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiUGx1Z2luczogT3BlbiBQbHVnaW4gU2V0dGluZ3MgVGFiXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uYXBwLnNldHRpbmc7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0T2ZQbHVnaW5TZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3MucGx1Z2luVGFicykubWFwKCh0KSA9PiB7IHJldHVybiB7IGRpc3BsYXk6IFwiUGx1Z2luOiBcIiArIHQubmFtZSwgaW5mbzogdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0T2ZDb3JlU2V0dGluZ3NUYWJzOiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLnNldHRpbmdUYWJzKS5tYXAoKHQpID0+IHsgcmV0dXJuIHsgZGlzcGxheTogXCJDb3JlOiBcIiArIHQubmFtZSwgaW5mbzogdC5pZCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzLmZvckVhY2goc2kgPT4gbGlzdE9mQ29yZVNldHRpbmdzVGFicy5wdXNoKHNpKSk7XHJcbiAgICAgICAgICAgICAgICBnZnMuc2V0U3VnZ2VzdGVyRGF0YShsaXN0T2ZDb3JlU2V0dGluZ3NUYWJzKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW5UYWJCeUlkKHJlc3VsdHMuaW5mbyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULUdyYWJDb21tdW5pdHlUaGVtZVwiLFxyXG4gICAgICAgICAgICBpY29uOiBcIkJyYXRJY29uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiVGhlbWVzOiBHcmFiIGEgY29tbXVuaXR5IHRoZW1lXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRoZW1lc0luc3RhbGxGcm9tQ29tbXVuaXR5TGlzdCh0aGlzLnBsdWdpbilcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWQ6IFwiQlJBVC1HcmFiQmV0YVRoZW1lXCIsXHJcbiAgICAgICAgICAgIGljb246IFwiQnJhdEljb25cIixcclxuICAgICAgICAgICAgbmFtZTogXCJUaGVtZXM6IEdyYWIgYSBiZXRhIHRoZW1lIGZvciB0ZXN0aW5nIGZyb20gYSBHaXRodWIgcmVwb3NpdG9yeVwiLFxyXG4gICAgICAgICAgICBzaG93SW5SaWJib246IHRydWUsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7IChuZXcgQWRkTmV3VGhlbWUodGhpcy5wbHVnaW4pKS5vcGVuKCkgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZDogXCJCUkFULXVwZGF0ZUJldGFUaGVtZXNcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlRoZW1lczogVXBkYXRlIGJldGEgdGhlbWVzXCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogdHJ1ZSxcclxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IGF3YWl0IHRoZW1lc2VDaGVja0FuZFVwZGF0ZXModGhpcy5wbHVnaW4sIHRydWUpIFxyXG4gICAgICAgIH0sICAgICAgICBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtc3dpdGNoVGhlbWVcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIlRoZW1lczogU3dpdGNoIEFjdGl2ZSBUaGVtZSBcIixcclxuICAgICAgICAgICAgc2hvd0luUmliYm9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbXVuaXR5VGhlbWVMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBPYmplY3QudmFsdWVzKHRoaXMucGx1Z2luLmFwcC5jdXN0b21Dc3MudGhlbWVzKS5tYXAoKHQpID0+IHsgcmV0dXJuIHsgZGlzcGxheTogdCwgaW5mbzogdCB9IH0pO1xyXG4gICAgICAgICAgICAgICAgY29tbXVuaXR5VGhlbWVMaXN0LnVuc2hpZnQoeyBkaXNwbGF5OiBcIk9ic2lkaWFuIERlZmF1bHQgVGhlbWVcIiwgaW5mbzogXCJcIiB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdmcyA9IG5ldyBHZW5lcmljRnV6enlTdWdnZXN0ZXIodGhpcy5wbHVnaW4pO1xyXG4gICAgICAgICAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEoY29tbXVuaXR5VGhlbWVMaXN0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGdmcy5kaXNwbGF5KGFzeW5jIChyZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4ubG9nKGBTd2l0Y2hlZCB0byB0aGVtZSAke3Jlc3VsdHMuZGlzcGxheX1gLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmFwcC5jdXN0b21Dc3Muc2V0VGhlbWUocmVzdWx0cy5pbmZvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlkOiBcIkJSQVQtYWxsQ29tbWFuZHNcIixcclxuICAgICAgICAgICAgaWNvbjogXCJCcmF0SWNvblwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcIkFsbCBDb21tYW5kcyBsaXN0XCIsXHJcbiAgICAgICAgICAgIHNob3dJblJpYmJvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB0aGlzLnJpYmJvbkRpc3BsYXlDb21tYW5kcygpXHJcbiAgICAgICAgfSxcclxuICAgIF1cclxuXHJcbiAgICBhc3luYyByaWJib25EaXNwbGF5Q29tbWFuZHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgYnJhdENvbW1hbmRMaXN0OiBTdWdnZXN0ZXJJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmJyYXRDb21tYW5kcy5mb3JFYWNoKGNtZCA9PiB7IGlmIChjbWQuc2hvd0luUmliYm9uKSBicmF0Q29tbWFuZExpc3QucHVzaCh7IGRpc3BsYXk6IGNtZC5uYW1lLCBpbmZvOiBjbWQuY2FsbGJhY2sgfSkgfSk7XHJcbiAgICAgICAgY29uc3QgZ2ZzID0gbmV3IEdlbmVyaWNGdXp6eVN1Z2dlc3Rlcih0aGlzLnBsdWdpbik7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wbHVnaW4uYXBwLnNldHRpbmc7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIGNvbnN0IGxpc3RPZkNvcmVTZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3Muc2V0dGluZ1RhYnMpLm1hcCgodDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcIkNvcmU6IFwiICsgdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaW5mbzogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm9wZW4oKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuVGFiQnlJZCh0LmlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBjb25zdCBsaXN0T2ZQbHVnaW5TZXR0aW5nc1RhYnM6IFN1Z2dlc3Rlckl0ZW1bXSA9IE9iamVjdC52YWx1ZXMoc2V0dGluZ3MucGx1Z2luVGFicykubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiUGx1Z2luOiBcIiArIHQubmFtZSxcclxuICAgICAgICAgICAgICAgIGluZm86IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mub3BlblRhYkJ5SWQodC5pZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYnJhdENvbW1hbmRMaXN0LnB1c2goeyBkaXNwbGF5OiBcIi0tLS0gQ29yZSBQbHVnaW4gU2V0dGluZ3MgLS0tLVwiLCBpbmZvOiBhc3luYyAoKSA9PiB7IGF3YWl0IHRoaXMucmliYm9uRGlzcGxheUNvbW1hbmRzKCkgfSB9KVxyXG4gICAgICAgIGxpc3RPZkNvcmVTZXR0aW5nc1RhYnMuZm9yRWFjaChzaSA9PiBicmF0Q29tbWFuZExpc3QucHVzaChzaSkpO1xyXG4gICAgICAgIGJyYXRDb21tYW5kTGlzdC5wdXNoKHsgZGlzcGxheTogXCItLS0tIFBsdWdpbiBTZXR0aW5ncyAtLS0tXCIsIGluZm86IGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5yaWJib25EaXNwbGF5Q29tbWFuZHMoKSB9IH0pXHJcbiAgICAgICAgbGlzdE9mUGx1Z2luU2V0dGluZ3NUYWJzLmZvckVhY2goc2kgPT4gYnJhdENvbW1hbmRMaXN0LnB1c2goc2kpKTtcclxuXHJcbiAgICAgICAgZ2ZzLnNldFN1Z2dlc3RlckRhdGEoYnJhdENvbW1hbmRMaXN0KTtcclxuICAgICAgICBhd2FpdCBnZnMuZGlzcGxheShhc3luYyAocmVzdWx0cykgPT4gYXdhaXQgcmVzdWx0cy5pbmZvKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogVGhlUGx1Z2luKSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblxyXG4gICAgICAgIHRoaXMuYnJhdENvbW1hbmRzLmZvckVhY2goYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uYWRkQ29tbWFuZCh7XHJcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgICAgICAgICAgIGljb246IGl0ZW0uaWNvbixcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7IGF3YWl0IGl0ZW0uY2FsbGJhY2soKSB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4iXSwKICAibWFwcGluZ3MiOiAicTBCQUFBLDJCQUVBLE9BQU8sZUFBZSxFQUFTLGFBQWMsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUU1RCxHQUFJLEdBQVcsUUFBUSxZQUVqQixHQUE0QixhQUM1QixHQUE2QixhQUM3QixHQUE4QixV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 +Plugin reloading .....`,5),yield this.plugin.betaPlugins.reloadPlugin(n.info)}))})},{id:"BRAT-disablePlugin",icon:"BratIcon",name:"Plugins: Disable a plugin - toggle it off",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!0).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin disabled`,!1),this.plugin.settings.debuggingMode&&console.log(n.info),yield this.plugin.app.plugins.disablePluginAndSave(n.info)}))})},{id:"BRAT-enablePlugin",icon:"BratIcon",name:"Plugins: Enable a plugin - toggle it on",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.betaPlugins.getEnabledDisabledPlugins(!1).map(n=>({display:`${n.name} (${n.id})`,info:n.id})),e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`${n.display} plugin enabled`,!1),yield this.plugin.app.plugins.enablePluginAndSave(n.info)}))})},{id:"BRAT-openGitHubZRepository",icon:"BratIcon",name:"Plugins: Open the GitHub repository for a plugin",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield pe(this.plugin.settings.debuggingMode),e=Object.values(t).map(o=>({display:`Plugin: ${o.name} (${o.repo})`,info:o.repo})),n=Object.values(this.plugin.settings.pluginList).map(o=>({display:"BRAT: "+o,info:o}));e.forEach(o=>n.push(o));let i=new S(this.plugin);i.setSuggesterData(n),yield i.display(o=>a(this,null,function*(){o.info&&window.open(`https://github.com/${o.info}`)}))})},{id:"BRAT-openGitHubRepoTheme",icon:"BratIcon",name:"Themes: Open the GitHub repository for a theme (appearance)",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=yield H(this.plugin.settings.debuggingMode),e=Object.values(t).map(i=>({display:`Theme: ${i.name} (${i.repo})`,info:i.repo})),n=new S(this.plugin);n.setSuggesterData(e),yield n.display(i=>a(this,null,function*(){i.info&&window.open(`https://github.com/${i.info}`)}))})},{id:"BRAT-opentPluginSettings",icon:"BratIcon",name:"Plugins: Open Plugin Settings Tab",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=this.plugin.app.setting,e=Object.values(t.pluginTabs).map(o=>({display:"Plugin: "+o.name,info:o.id})),n=new S(this.plugin),i=Object.values(t.settingTabs).map(o=>({display:"Core: "+o.name,info:o.id}));e.forEach(o=>i.push(o)),n.setSuggesterData(i),yield n.display(o=>a(this,null,function*(){t.open(),t.openTabById(o.info)}))})},{id:"BRAT-GrabCommunityTheme",icon:"BratIcon",name:"Themes: Grab a community theme",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield Se(this.plugin)})},{id:"BRAT-GrabBetaTheme",icon:"BratIcon",name:"Themes: Grab a beta theme for testing from a Github repository",showInRibbon:!0,callback:()=>a(this,null,function*(){new C(this.plugin).open()})},{id:"BRAT-updateBetaThemes",icon:"BratIcon",name:"Themes: Update beta themes",showInRibbon:!0,callback:()=>a(this,null,function*(){return yield G(this.plugin,!0)})},{id:"BRAT-switchTheme",icon:"BratIcon",name:"Themes: Switch Active Theme ",showInRibbon:!0,callback:()=>a(this,null,function*(){let t=Object.values(this.plugin.app.customCss.themes).map(n=>({display:n,info:n}));t.unshift({display:"Obsidian Default Theme",info:""});let e=new S(this.plugin);e.setSuggesterData(t),yield e.display(n=>a(this,null,function*(){this.plugin.log(`Switched to theme ${n.display}`,!1),this.plugin.app.customCss.setTheme(n.info)}))})},{id:"BRAT-allCommands",icon:"BratIcon",name:"All Commands list",showInRibbon:!1,callback:()=>a(this,null,function*(){return this.ribbonDisplayCommands()})}];this.plugin=t,this.bratCommands.forEach(e=>a(this,null,function*(){this.plugin.addCommand({id:e.id,name:e.name,icon:e.icon,callback:()=>a(this,null,function*(){yield e.callback()})})}))}ribbonDisplayCommands(){return a(this,null,function*(){let t=[];this.bratCommands.forEach(r=>{r.showInRibbon&&t.push({display:r.name,info:r.callback})});let e=new S(this.plugin),n=this.plugin.app.setting,i=Object.values(n.settingTabs).map(r=>({display:"Core: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})})),o=Object.values(n.pluginTabs).map(r=>({display:"Plugin: "+r.name,info:()=>a(this,null,function*(){n.open(),n.openTabById(r.id)})}));t.push({display:"---- Core Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),i.forEach(r=>t.push(r)),t.push({display:"---- Plugin Settings ----",info:()=>a(this,null,function*(){yield this.ribbonDisplayCommands()})}),o.forEach(r=>t.push(r)),e.setSuggesterData(t),yield e.display(r=>a(this,null,function*(){return yield r.info()}))})}};var X=class extends Ye.Plugin{constructor(){super(...arguments);this.appName="Obsidian42 - Beta Reviewer's Auto-update Tool (BRAT)";this.appID="obsidian42-brat"}onload(){return a(this,null,function*(){console.log("loading Obsidian42 - BRAT"),yield this.loadSettings(),this.addSettingTab(new Z(this.app,this)),this.betaPlugins=new D(this),this.commands=new _(this),Fe(),this.settings.ribbonIconEnabled&&this.showRibbonButton(),this.app.workspace.onLayoutReady(()=>{this.settings.updateAtStartup&&setTimeout(()=>a(this,null,function*(){yield this.betaPlugins.checkForUpdatesAndInstallUpdates(!1)}),6e4),this.settings.updateThemesAtStartup&&setTimeout(()=>a(this,null,function*(){yield G(this,!1)}),12e4)})})}showRibbonButton(){this.ribbonIcon=this.addRibbonIcon("BratIcon","BRAT",()=>a(this,null,function*(){return this.commands.ribbonDisplayCommands()}))}log(e,n=!1){Ve(this,e,n)}onunload(){console.log("unloading "+this.appName)}loadSettings(){return a(this,null,function*(){this.settings=Object.assign({},fe,yield this.loadData())})}saveSettings(){return a(this,null,function*(){yield this.saveData(this.settings)})}}; diff --git a/.obsidian/plugins/obsidian42-brat/manifest.json b/.obsidian/plugins/obsidian42-brat/manifest.json index b0070919..fd44f6f7 100644 --- a/.obsidian/plugins/obsidian42-brat/manifest.json +++ b/.obsidian/plugins/obsidian42-brat/manifest.json @@ -1,10 +1,10 @@ -{ - "id": "obsidian42-brat", - "name": "Obsidian42 - BRAT", - "version": "0.6.34", - "minAppVersion": "0.13.21", - "description": "Easily install a beta version of a plugin for testing.", - "author": "TfTHacker", - "authorUrl": "https://github.com/TfTHacker/obsidian42-brat", - "isDesktopOnly": false +{ + "id": "obsidian42-brat", + "name": "Obsidian42 - BRAT", + "version": "0.6.35", + "minAppVersion": "0.15.9", + "description": "Easily install a beta version of a plugin for testing.", + "author": "TfTHacker", + "authorUrl": "https://github.com/TfTHacker/obsidian42-brat", + "isDesktopOnly": false } \ No newline at end of file diff --git a/.obsidian/workspace b/.obsidian/workspace index 64777b94..3ca93412 100644 --- a/.obsidian/workspace +++ b/.obsidian/workspace @@ -4,12 +4,12 @@ "type": "split", "children": [ { - "id": "810e155ef7f6612e", + "id": "97c4224e1e731edc", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "05.01 Computer setup/Jellyfin.md", + "file": "01.02 Home/@Main Dashboard.md", "mode": "preview", "source": false } @@ -19,156 +19,157 @@ "direction": "vertical" }, "left": { - "id": "f66c7efcfbb97521", - "type": "split", + "id": "f074102039f2fcaa", + "type": "mobile-drawer", "children": [ { - "id": "e59faba3e73f3ac8", - "type": "tabs", - "children": [ - { - "id": "7d2534607470244a", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": {} - } - }, - { - "id": "8279617549e1a456", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - } - } - }, - { - "id": "866ad84e73ad6000", - "type": "leaf", - "state": { - "type": "VIEW_TYPE_LONGFORM_EXPLORER", - "state": {} - } + "id": "1f6a6b4151d812b3", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": {} + } + }, + { + "id": "4e46ae5bf975f6c1", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" } - ] + } + }, + { + "id": "f2f6c9b29ed65fd4", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "c4b207c5aa35ba04", + "type": "leaf", + "state": { + "type": "VIEW_TYPE_LONGFORM_EXPLORER", + "state": {} + } } ], - "direction": "horizontal", - "width": 300 + "currentTab": 0 }, "right": { - "id": "947da1d7e25a98a8", - "type": "split", + "id": "5aad8a4c68b0a22e", + "type": "mobile-drawer", "children": [ { - "id": "8890063013441e68", - "type": "tabs", - "children": [ - { - "id": "73174f8ad3861e55", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "file": "05.01 Computer setup/Jellyfin.md", - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "25dee9f1e5eff32e", - "type": "leaf", - "state": { - "type": "outgoing-link", - "state": { - "file": "05.01 Computer setup/Jellyfin.md", - "linksCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "ac28eba20dd91d27", - "type": "leaf", - "state": { - "type": "tag", - "state": { - "sortOrder": "frequency", - "useHierarchy": true - } - } - }, - { - "id": "3983767a2a2c2f60", - "type": "leaf", - "state": { - "type": "DICE_ROLLER_VIEW", - "state": {} - } - }, - { - "id": "34bd330fab7fa302", - "type": "leaf", - "state": { - "type": "hackernews-view", - "state": {} - } - }, - { - "id": "557fc3e87efdc53d", - "type": "leaf", - "state": { - "type": "reminder-list", - "state": {} - } - }, - { - "id": "74ac839a6cdf327e", - "type": "leaf", - "state": { - "type": "online.tokuhirom.obsidian-stopwatch-plugin", - "state": {} - } - }, - { - "id": "b88a436505117cc2", - "type": "leaf", - "state": { - "type": "podcast_player_view", - "state": {} - } + "id": "f7776a9d170a0f9f", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "01.02 Home/@Main Dashboard.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": false } - ], - "currentTab": 4 + } + }, + { + "id": "e912968a094a8dbe", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "01.02 Home/@Main Dashboard.md", + "linksCollapsed": false, + "unlinkedCollapsed": false + } + } + }, + { + "id": "b97781c9415c1b78", + "type": "leaf", + "state": { + "type": "hackernews-view", + "state": {} + } + }, + { + "id": "a64402126e020fab", + "type": "leaf", + "state": { + "type": "online.tokuhirom.obsidian-stopwatch-plugin", + "state": {} + } + }, + { + "id": "0a9128e6906fd0b4", + "type": "leaf", + "state": { + "type": "RSS_FEED", + "state": {} + } + }, + { + "id": "c8e3e73aa58f1fd8", + "type": "leaf", + "state": { + "type": "advanced-tables-toolbar", + "state": {} + } + }, + { + "id": "7780204a63e8a6d2", + "type": "leaf", + "state": { + "type": "reminder-list", + "state": {} + } + }, + { + "id": "b069f500d88e39cb", + "type": "leaf", + "state": { + "type": "podcast_player_view", + "state": {} + } + }, + { + "id": "ad0945235fa35655", + "type": "leaf", + "state": { + "type": "DICE_ROLLER_VIEW", + "state": {} + } } ], - "direction": "horizontal", - "width": 300 + "currentTab": 2 }, - "active": "810e155ef7f6612e", + "active": "97c4224e1e731edc", "lastOpenFiles": [ - "05.01 Computer setup/Nextcloud.md", - "05.01 Computer setup/Jellyfin.md", - "05.01 Computer setup/NextDNS.md", + "00.03 News/Extroverts destroy the world.md", "01.02 Home/@Main Dashboard.md", - "05.01 Computer setup/Git.md", - "01.02 Home/@Shopping list.md", - "00.01 Admin/Test sheet.md", "05.02 Networks/Server Cloud.md", - "03.02 Travels/Geneva.md", - "05.02 Networks/Configuring UFW.md" + "05.01 Computer setup/Jellyfin.md", + "05.02 Networks/Server Tools.md", + "00.01 Admin/Calendars/2022-09-02.md", + "00.01 Admin/Calendars/2022-09-01.md", + "01.02 Home/Cinematheque.md", + "01.02 Home/Household.md", + "01.02 Home/@Shopping list.md" ] } \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-08-31.md b/00.01 Admin/Calendars/2022-08-31.md index 26325dad..00c2f094 100644 --- a/00.01 Admin/Calendars/2022-08-31.md +++ b/00.01 Admin/Calendars/2022-08-31.md @@ -13,9 +13,9 @@ Stress: 25 FrontHeadBar: 5 EarHeadBar: 30 BackHeadBar: 20 -Water: 2 +Water: 2.75 Coffee: 4 -Steps: +Steps: 1602 Ski: Riding: Racket: @@ -80,9 +80,10 @@ This section does serve for quick memos.   - [ ] 15:13 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: write documentation Jellyfin 📆2022-09-04 -- [ ] 15:14 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: find iOS & Mac clients that work well 📆2022-09-14 -- [ ] 15:15 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: understand how live TV works 📆2022-09-14 +- [x] 15:14 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: find iOS & Mac clients that work well 📅 2022-09-14 ✅ 2022-09-01 +- [x] 15:15 :shark: [[2022-08-31|Memo]], [[Server Cloud|Mediatheque]]: understand how live TV works 📅 2022-09-14 ✅ 2022-09-02 - [x] 18:21 📡 [[2022-08-31|Memo]], [[@IT & Computer|Obsidian]]: understand the full toolkit of git 📅 2022-09-10 ✅ 2022-08-31 +- 22:36 [[Game of Thrones (2011–2019)|Game of Thrones]] with [[MRCK|Meggi-mo]] %% --- %%   diff --git a/00.01 Admin/Calendars/2022-09-01.md b/00.01 Admin/Calendars/2022-09-01.md new file mode 100644 index 00000000..78b7e85a --- /dev/null +++ b/00.01 Admin/Calendars/2022-09-01.md @@ -0,0 +1,113 @@ +--- + +Date: 2022-09-01 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 8 +Happiness: 90 +Gratefulness: 90 +Stress: 27.5 +FrontHeadBar: 5 +EarHeadBar: 35 +BackHeadBar: 20 +Water: 4.83 +Coffee: 5 +Steps: 8356 +Ski: +Riding: 1 +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-08-31|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-09-02|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-09-01Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-09-01NSave + +  + +# 2022-09-01 + +  + +> [!summary]+ +> Daily note for 2022-09-01 + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  +- 09:11 [[Polo Park Zürich|Stick&Ball]] +- 21:55 [[Game of Thrones (2011–2019)|Game of Thrones]] with [[MRCK|Meggi-mo]] + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2022-09-01]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-09-02.md b/00.01 Admin/Calendars/2022-09-02.md new file mode 100644 index 00000000..4523e92a --- /dev/null +++ b/00.01 Admin/Calendars/2022-09-02.md @@ -0,0 +1,111 @@ +--- + +Date: 2022-09-02 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 7.5 +Happiness: 90 +Gratefulness: 90 +Stress: 25 +FrontHeadBar: 5 +EarHeadBar: 30 +BackHeadBar: 20 +Water: 2.25 +Coffee: 4 +Steps: +Ski: +Riding: +Racket: +Football: +Swim: + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-09-01|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-09-03|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-09-02Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-09-02NSave + +  + +# 2022-09-02 + +  + +> [!summary]+ +> Daily note for 2022-09-02 + +  + +```toc +style: number +``` + +  + +--- + +  + +### 📝 Memos + +  + +This section does serve for quick memos. + +  + + +%% --- %% +  + +--- + +  + +### 🗒 Notes + +  + +Loret ipsum + +  + +--- + +  + +### :link: Linked activity + +  + +```dataview +Table from [[2022-09-02]] +``` + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-09-17 Diner Raph & Dalia à la maison.md b/00.01 Admin/Calendars/2022-09-17 Diner Raph & Dalia à la maison.md new file mode 100644 index 00000000..70b28dcf --- /dev/null +++ b/00.01 Admin/Calendars/2022-09-17 Diner Raph & Dalia à la maison.md @@ -0,0 +1,7 @@ +--- +title: Diner Raph & Dalia à la maison +allDay: false +startTime: 20:00 +endTime: 22:30 +date: 2022-09-17 +--- diff --git a/00.03 News/Extroverts destroy the world.md b/00.03 News/Extroverts destroy the world.md new file mode 100644 index 00000000..5281f701 --- /dev/null +++ b/00.03 News/Extroverts destroy the world.md @@ -0,0 +1,63 @@ +--- + +Tag: ["Human", "Society", "Extrovert"] +Date: 2022-09-02 +DocType: "WebClipping" +Hierarchy: +TimeStamp: 2022-09-02 +Link: https://nypost.com/2012/02/05/extroverts-destroy-the-world/ +location: +CollapseMetaTable: Yes + +--- + +Parent:: [[@News|News]] +Read:: [[2022-09-02]] + +--- + +  + +```button +name Save +type command +action Save current file +id Save +``` +^button-ExtrovertsdestroytheworldNSave + +  + +# Extroverts destroy the world + +**Extroverts are such a pain and a poison that we feel Virgil Starkwell’s agony when, in “Take the Money and Run,” he breaks the rules while working on a chain gang and “for several days he is locked in a sweatbox with an insurance salesman.”** + +But in considering the more thoughtful personality type, Susan Cain’s new book, “Quiet: The Power of Introverts in a World That Can’t Stop Talking” (Crown), demonstrates just how deep and disturbing is this plague of extroverts — the showoffs, risk-takers, salesmen, charmers, charlatans and politicians. They may not be responsible for all the evil in the world, but they did give us such pernicious results as Enron, Hollywood, the financial crisis, Washington, infomercials and Harvard Business School. + +Cain traces the birth of the cult of extroversion back to 1913, when Dale Carnegie started publishing his success manuals. Carnegie (born Carnagey — he changed it, with the consummate skills typical of the extrovert, so as to create a spurious association with the tycoon Andrew Carnegie) took advantage of an America that was changing from a nation of farms and small towns, in which people tended to die not far from where they were born and everyone knew everyone. There was no need to sparkle or scintillate. + +But big business demanded salesmen (like Carnegie), who hit the road and realized their core product was themselves. By 1920, more than a third of the population lived in cities filled with strangers. Workers realized getting promoted by bosses who didn’t really know them could depend more on making a dazzling impression than the quality of their work. Historian Warren Susman said that a “culture of character” gave way to a “culture of personality” and “every American was to become a performing self.” + +Susman noted that the qualities most often lauded in the advice manuals of the 19th century were “citizenship, duty, work, golden deeds, honor, reputation, morals, manners and integrity.” In the post-Carnegie era, these concepts were replaced by words such as “magnetic, fascinating, stunning, attractive, glowing, dominant, forceful and energetic.” + +Substance, then, was being replaced with surface, and the era of B.S. had begun. Fast-forward a hundred years and you can see Carnegie’s descendants trained in the highest BS — HBS, or Harvard Business School. Cain visits the campus and discovers an island of the absurdly ebullient — overconfident, tricked-out show ponies born smiling, with business cards in their diapers. The school’s emphasis on networking above studious reflection makes outcasts of, for instance, many brilliant but introverted Asian students who feel out of place in this cheerleader hell. + +A student reveals how, at one team-building exercise that involved working on a plan to survive subarctic temperatures, “Our action plan hinged on what the most vocal people suggested. When the less vocal people put out ideas, those ideas were discarded. The ideas that were rejected would have kept us alive and out of trouble, but they were dismissed because of the conviction with which the more vocal people suggested their ideas.” + +The HBS creature is both cause and effect of a business world where, Cain reports, a middle manager at GE once told her, “People here don’t even want to meet with you if you don’t have a PowerPoint and a ‘pitch’ for them. Even if you’re just making a recommendation to your colleague, you can’t sit down in someone’s office and tell them what you think. You have to make a presentation.” + +Showmanship rules. “We want to attract creative people,” one HR director at a major media company told Cain. Asked to clarify, the HR person said, “You have to be outgoing, fun, and jazzed up to work here.” So: no van Goghs need apply. Who wants to party with that drip? + +At the far end of the extrovert pipeline is, for instance, the sludge that trickles out of Hollywood, where jazzed-up HBS-type executives spend millions for scripts that haven’t even been written (reading and writing being for boring, introverted twerps) based on how entertained they feel during a 15-minute pitch delivered by a writer/shill who won’t be appearing in the movie. Back east, at Hollywood for ugly people, vapid politicians who achieved their rank based on their ability to remember the names of everyone they’ve ever shaken hands with prove highly skilled at kicking problems down the road for the next coiffure-and-cufflinks huckster to avoid. + +And guess who winds up running Enron, Lehman, Fannie Mae? Financier Boykin Curry described in Newsweek how the 2008 financial meltdown happened: “For 20 years, the DNA of nearly every financial institution . . . morphed dangerously. Every time someone at the table pressed for more leverage and more risk, the next few years proved them ‘right’ . . . The cautious types were increasingly intimidated, passed over for promotion.” + +Curry told Cain, “People who are congenitally more cautious and introverted and statistical in their thinking become discredited and pushed aside.” + +Maybe we should stop thinking of extroverts as fun, lively enchanters and more as hollow, greasy pickpockets. At least thieves can steal only whatever valuables you have on you, though. Rarely do they clean out your 401(k). + +  +  + +--- +`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))` \ No newline at end of file diff --git a/01.02 Home/Cinematheque.md b/01.02 Home/Cinematheque.md index bf565b51..56039b9e 100644 --- a/01.02 Home/Cinematheque.md +++ b/01.02 Home/Cinematheque.md @@ -12,7 +12,7 @@ CollapseMetaTable: Yes TVShow: Name: "Game of Thrones" Season: 2 - Episode: 5 + Episode: 9 Source: Internal --- diff --git a/01.02 Home/Household.md b/01.02 Home/Household.md index 836ec8f9..a53f26e4 100644 --- a/01.02 Home/Household.md +++ b/01.02 Home/Household.md @@ -83,7 +83,8 @@ This section on different household obligations. - [ ] 🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%% 🔁 every month on the last Saturday 🛫 2022-08-29 📅 2022-09-24 - [x] 🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%% 🔁 every month on the last Saturday 🛫 2022-08-01 📅 2022-08-27 ✅ 2022-08-27 -- [ ] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-09-05 +- [ ] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-09-12 +- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-09-05 ✅ 2022-09-02 - [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-08-29 ✅ 2022-08-27 - [ ] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2022-09-03 diff --git a/05.01 Computer setup/Jellyfin.md b/05.01 Computer setup/Jellyfin.md index 041da8db..60362063 100644 --- a/05.01 Computer setup/Jellyfin.md +++ b/05.01 Computer setup/Jellyfin.md @@ -85,7 +85,8 @@ Jellyfin is an open-source project to offer a media server that can be easily [[ #### Server -The server points towards file repositories within the server it is installed on but does not manage the upload phase. +The server points towards file repositories within the server it is installed on but does not manage the upload phase. [[Server Cloud#Data transfer|Other services]] can do that. + It offers the following features: 1. Organisation of the media files (video, audio, pictures) 2. Generation of automatic lists (currently watching, next to watch, etc…) @@ -96,6 +97,16 @@ It offers the following features: #### Clients +Native clients exist for computers and phones. +Other non-native clients exist for every platform. + +  + +|   |   | +| ------- | --------------- | +| **iOS** | Music: *Finamp* | +| **Mac** | All media: *Jellyfin Media Player*
All media: *Kodi* | +   --- @@ -106,6 +117,53 @@ It offers the following features: &emsp: +Jellyfin is quite user friendly and does not require much set-up. Mainly it is about `ftp`-ing or `ssh`-ing content into the server. +Metadata and most screens populate automatically. +The second main angle of setup is the admin panel. + +  + +#### Data Transfer + +Please refer to the [[Server Cloud#Data transfer|relevant section]] on rclone. + +The media paths are sketched out below: + +> [!path] Movies +> ```bash +> ~/jellyfin/media/movies +> ``` + +  + +> [!path] TV Shows +> ```bash +> ~/jellyfin/media/tvshows +> ``` + +  + +> [!path] Music +> ```bash +> ~/jellyfin/media2/music +> ``` + +  + +> [!path] Pictures +> ```bash +> ~/jellyfin/media2/photos +> ``` + +  + +#### Admin panel + +The admin panel allows for two things: +- manage users +- Manage add-ons + +On the latter, several add-ons are required to watch live TV or link to other platforms like Kodi. &emsp: @@ -117,7 +175,7 @@ It offers the following features:   -Loret ipsum +Free to host   @@ -141,7 +199,7 @@ Loret ipsum   -Loret ipsum +- [Home | Documentation - Jellyfin Project](https://jellyfin.org/docs/)     \ No newline at end of file diff --git a/05.02 Networks/Configuring UFW.md b/05.02 Networks/Configuring UFW.md index fef3d794..e3533193 100644 --- a/05.02 Networks/Configuring UFW.md +++ b/05.02 Networks/Configuring UFW.md @@ -237,7 +237,8 @@ sudo bash /etc/addip4ban/addip4ban.sh #### Ban List Tasks -- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2022-09-03 +- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2022-09-10 +- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2022-09-03 ✅ 2022-09-02 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2022-08-27 ✅ 2022-08-26 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2022-08-20 ✅ 2022-08-19 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2022-08-13 ✅ 2022-08-12 @@ -262,7 +263,8 @@ sudo bash /etc/addip4ban/addip4ban.sh - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-02 ✅ 2022-04-02 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-03-26 ✅ 2022-03-26 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-03-19 ✅ 2022-03-18 -- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-09-03 +- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-09-10 +- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-09-03 ✅ 2022-09-02 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-08-27 ✅ 2022-08-26 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-08-20 ✅ 2022-08-19 - [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-08-13 ✅ 2022-08-12 diff --git a/05.02 Networks/Server Cloud.md b/05.02 Networks/Server Cloud.md index 0676b1b7..af73c877 100644 --- a/05.02 Networks/Server Cloud.md +++ b/05.02 Networks/Server Cloud.md @@ -144,13 +144,6 @@ LWERS4M7njDLiAJe5A6gkv9jRDabvnzBGyYk9vPr1F5dY0LMu47FSjB0v21BAE83rYTOksElzcYmioWA   -##### Logwatch -[[#^Top|TOP]] - -TO FILL - -  - ##### fail2ban [[#^Top|TOP]] Classic [[Configuring Fail2ban|fail2ban]] installation with a dedicated configuration: @@ -205,8 +198,6 @@ List of monitored services: - [[Configuring Fail2ban|Fail2ban]] - cron - Postfix -- MySQL -- Apache   diff --git a/06.02 Investments/Crypto Tasks.md b/06.02 Investments/Crypto Tasks.md index fd9b9367..0ac74822 100644 --- a/06.02 Investments/Crypto Tasks.md +++ b/06.02 Investments/Crypto Tasks.md @@ -72,7 +72,8 @@ All tasks and to-dos Crypto-related. [[#^Top|TOP]]   -- [ ] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-02 +- [ ] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-09 +- [x] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-02 ✅ 2022-09-02 - [x] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-26 ✅ 2022-08-26 - [x] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-19 ✅ 2022-08-19 - [x] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-12 ✅ 2022-08-12 diff --git a/06.02 Investments/Equity Tasks.md b/06.02 Investments/Equity Tasks.md index a3bc79a6..5079236f 100644 --- a/06.02 Investments/Equity Tasks.md +++ b/06.02 Investments/Equity Tasks.md @@ -72,7 +72,8 @@ Note summarising all tasks and to-dos for Listed Equity investments. [[#^Top|TOP]]   -- [ ] 💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-02 +- [ ] 💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-09 +- [x] 💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-02 ✅ 2022-09-02 - [x] 💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-26 ✅ 2022-08-26 - [x] 💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-19 ✅ 2022-08-19 - [x] 💰[[Equity Tasks#internet alerts|monitor Equity news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-12 ✅ 2022-08-12 diff --git a/06.02 Investments/VC Tasks.md b/06.02 Investments/VC Tasks.md index a6b1f5bd..1ed32caa 100644 --- a/06.02 Investments/VC Tasks.md +++ b/06.02 Investments/VC Tasks.md @@ -72,7 +72,8 @@ Tasks and to-dos for VC investments. [[#^Top|TOP]]   -- [ ] 💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-02 +- [ ] 💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-09 +- [x] 💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-09-02 ✅ 2022-09-02 - [x] 💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-26 ✅ 2022-08-26 - [x] 💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-19 ✅ 2022-08-19 - [x] 💰[[VC Tasks#internet alerts|monitor VC news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-08-12 ✅ 2022-08-12