/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins github repository */ 'use strict'; var obsidian = require('obsidian'); var state = require('@codemirror/state'); var view = require('@codemirror/view'); var language = require('@codemirror/language'); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; const matchTypes = { 'exact': "Exact match", 'contains': "Contains value", 'whiteSpace': "Value within whitespace separated words", 'startswith': "Starts with this value", 'endswith': "Ends with this value" }; const matchSign = { 'exact': "", 'contains': "*", 'startswith': "^", 'endswith': "$", 'whiteSpace': "~" }; const matchPreview = { 'exact': "with value", 'contains': "containing", 'whiteSpace': "containing", 'startswith': "starting with", 'endswith': "ending with" }; const matchPreviewPath = { 'exact': "is", 'contains': "contains", 'whiteSpace': "contains", 'startswith': "starts with", 'endswith': "ends with" }; const selectorType = { 'attribute': 'Attribute value', 'tag': 'Tag', 'path': 'Note path' }; class CSSLink { constructor() { this.type = 'attribute'; this.name = ""; this.value = ""; this.matchCaseSensitive = false; this.match = "exact"; let s4 = () => { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); }; //return id of format 'aaaaaaaa'-'aaaa'-'aaaa'-'aaaa'-'aaaaaaaaaaaa' this.uid = s4() + "-" + s4(); this.selectText = true; this.selectAppend = true; this.selectPrepend = true; this.selectBackground = true; } } function displayText(link, settings) { if (link.type === 'tag') { if (!link.value) { return "Please choose a tag"; } return `Note has tag #${link.value}`; } else if (link.type === 'attribute') { if (settings.targetAttributes.length === 0) { return `No attributes added to "Target attributes". Go to plugin settings to add them.`; } if (!link.name) { return "Please choose an attribute name."; } if (!link.value) { return "Please choose an attribute value."; } return `Note has attribute ${link.name} ${matchPreview[link.match]} ${link.value}.`; } if (!link.value) { return "Please choose a path."; } return `The path of the note ${matchPreviewPath[link.match]} ${link.value}`; } function updateDisplay(textArea, link, settings) { let toDisplay = displayText(link, settings); let disabled = false; if (link.type === 'tag') { if (!link.value) { disabled = true; } } else if (link.type === 'attribute') { if (settings.targetAttributes.length === 0) { disabled = true; } else if (!link.name) { disabled = true; } else if (!link.value) { disabled = true; } } else { if (!link.value) { disabled = true; } } textArea.innerHTML = toDisplay; return disabled; } class CSSBuilderModal extends obsidian.Modal { constructor(plugin, saveCallback, cssLink = null) { super(plugin.app); this.cssLink = cssLink; if (!cssLink) { this.cssLink = new CSSLink(); } this.plugin = plugin; this.saveCallback = saveCallback; } onOpen() { this.titleEl.setText(`Select what links to style!`); // is tag const matchAttrPlaceholder = "Attribute value to match."; const matchTagPlaceholder = "Note tag to match (without #)."; const matchPathPlaceholder = "File path to match."; const matchAttrTxt = "Attribute value"; const matchTagTxt = "Tag"; const matchPathTxt = "Path"; const cssLink = this.cssLink; const plugin = this.plugin; this.contentEl.addClass("supercharged-modal"); // Type new obsidian.Setting(this.contentEl) .setName("Type of selector") .setDesc("Attributes selects YAML and DataView attributes" + ", tags chooses the tags of a note, and path considers the name of the note including in what folder it is.") .addDropdown(dc => { Object.keys(selectorType).forEach((type) => { dc.addOption(type, selectorType[type]); if (type === this.cssLink.type) { dc.setValue(type); } }); dc.onChange((type) => { cssLink.type = type; updateContainer(cssLink.type); saveButton.setDisabled(updateDisplay(preview, this.cssLink, this.plugin.settings)); }); }); // attribute name const attrName = new obsidian.Setting(this.contentEl) .setName("Attribute name") .setDesc("What attribute to target? Make sure to first add target attributes to the settings at the top!") .addDropdown(dc => { plugin.settings.targetAttributes.forEach((attribute) => { dc.addOption(attribute, attribute); if (attribute === cssLink.name) { dc.setValue(attribute); } }); dc.onChange(name => { cssLink.name = name; saveButton.setDisabled(updateDisplay(preview, cssLink, plugin.settings)); }); }); // attribute value const attrValue = new obsidian.Setting(this.contentEl) .setName("Value to match") .setDesc("TODO") .addText(t => { t.setValue(cssLink.value); t.onChange(value => { cssLink.value = value; saveButton.setDisabled(updateDisplay(preview, cssLink, plugin.settings)); }); }); this.contentEl.createEl('h4', { text: 'Advanced' }); // matching type const matchingType = new obsidian.Setting(this.contentEl) .setName("Matching type") .setDesc("How to compare the attribute or path with the given value.") .addDropdown(dc => { Object.keys(matchTypes).forEach((key) => { dc.addOption(key, matchTypes[key]); if (key == cssLink.match) { dc.setValue(key); } }); dc.onChange((value) => { cssLink.match = value; saveButton.setDisabled(updateDisplay(preview, cssLink, plugin.settings)); }); }); // case sensitive const caseSensitiveTogglerContainer = new obsidian.Setting(this.contentEl) .setName("Case sensitive matching") .setDesc("Should the matching of the value be case sensitive?") .addToggle(b => { b.setValue(cssLink.matchCaseSensitive); b.onChange(value => { cssLink.matchCaseSensitive = value; b.setDisabled(updateDisplay(preview, cssLink, plugin.settings)); }); }); if (!this.cssLink.name && this.plugin.settings.targetAttributes.length > 0) { this.cssLink.name = this.plugin.settings.targetAttributes[0]; } const updateContainer = function (type) { if (type === 'attribute') { attrName.settingEl.show(); attrValue.nameEl.setText(matchAttrTxt); attrValue.descEl.setText(matchAttrPlaceholder); matchingType.settingEl.show(); caseSensitiveTogglerContainer.settingEl.show(); } else if (type === 'tag') { attrName.settingEl.hide(); attrValue.nameEl.setText(matchTagTxt); attrValue.descEl.setText(matchTagPlaceholder); matchingType.settingEl.hide(); caseSensitiveTogglerContainer.settingEl.hide(); } else { attrName.settingEl.hide(); attrValue.nameEl.setText(matchPathTxt); attrValue.descEl.setText(matchPathPlaceholder); matchingType.settingEl.show(); caseSensitiveTogglerContainer.settingEl.show(); } }; new obsidian.Setting(this.contentEl) .setName("Style options") .setDesc("What styling options are active? " + "Disabling options you won't use can improve performance slightly.") .addToggle(t => { t.onChange(value => { cssLink.selectText = value; }); t.setValue(cssLink.selectText); t.setTooltip("Style link text"); }) .addToggle(t => { t.onChange(value => { cssLink.selectPrepend = value; }); t.setValue(cssLink.selectPrepend); t.setTooltip("Add content before link"); }) .addToggle(t => { t.onChange(value => { cssLink.selectAppend = value; }); t.setValue(cssLink.selectAppend); t.setTooltip("Add content after link"); }) .addToggle(t => { t.onChange(value => { cssLink.selectBackground = value; }); t.setValue(cssLink.selectBackground); t.setTooltip("Add optional background or underline to link"); }); this.contentEl.createEl('h4', { text: 'Result' }); const modal = this; const saveButton = new obsidian.Setting(this.contentEl) .setName("Preview") .setDesc("") .addButton(b => { b.setButtonText("Save"); b.onClick(() => { modal.saveCallback(cssLink); modal.close(); }); }); // generate button const preview = saveButton.nameEl; updateContainer(cssLink.type); saveButton.setDisabled(updateDisplay(preview, this.cssLink, this.plugin.settings)); } } const colorSet = [[ '#0089BA', '#2C73D2', '#008E9B', '#0081CF', '#008F7A', '#008E9B', ], [ '#D65DB1', '#0082C1', '#9270D3', '#007F93', '#007ED9', '#007660', ], [ '#FF9671', '#A36AAA', '#F27D88', '#6967A9', '#D26F9D', '#1b6299', ], [ '#FFC75F', '#4C9A52', '#C3BB4E', '#00855B', '#88AC4B', '#006F61', ], [ '#FF6F91', '#6F7F22', '#E07250', '#257A3E', '#AC7C26', '#006F5F', ], [ '#d9d867', '#2FAB63', '#B8E067', '#008E63', '#78C664', '#007160', ]]; const colors = []; for (const i of Array(6).keys()) { for (const j of Array(6).keys()) { colors.push(colorSet[j][i]); } } function hash(uid) { let hash = 0; for (let i = 0; i < uid.length; i++) { const char = uid.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash = hash & hash; // Convert to 32bit integer } hash = Math.abs(hash); return hash; } function buildCSS(selectors, plugin) { var _a; return __awaiter(this, void 0, void 0, function* () { const instructions = [ "/* WARNING: This file will be overwritten by the plugin.", "Do not edit this file directly! First copy this file and rename it if you want to edit things. */", "", ":root {" ]; selectors.forEach((selector, i) => { if (selector.selectText) { instructions.push(` --${selector.uid}-color: ${colors[hash(selector.uid) % 36]};`); instructions.push(` --${selector.uid}-weight: initial;`); } if (selector.selectPrepend) { instructions.push(` --${selector.uid}-before: '';`); } if (selector.selectAppend) { instructions.push(` --${selector.uid}-after: '';`); } if (selector.selectBackground) { instructions.push(` --${selector.uid}-background-color: #ffffff;`); instructions.push(` --${selector.uid}-decoration: initial;`); } }); instructions.push("}"); selectors.forEach(selector => { let cssSelector; if (selector.type === 'attribute') { cssSelector = `[data-link-${selector.name}${matchSign[selector.match]}="${selector.value}" ${selector.matchCaseSensitive ? "" : " i"}]`; } else if (selector.type === 'tag') { cssSelector = `[data-link-tags*="${selector.value}" i]`; } else { cssSelector = `[data-link-path${matchSign[selector.match]}="${selector.value}" ${selector.matchCaseSensitive ? "" : "i"}]`; } if (selector.selectText) { instructions.push(...[ "", `div[data-id="${selector.uid}"] div.setting-item-description,`, cssSelector + " {", ` color: var(--${selector.uid}-color) !important;`, ` font-weight: var(--${selector.uid}-weight);`, "}" ]); } if (selector.selectBackground) { instructions.push(...["", `.c-${selector.uid}-use-background div[data-id="${selector.uid}"] div.setting-item-description,`, `.c-${selector.uid}-use-background .data-link-text${cssSelector} {`, ` background-color: var(--${selector.uid}-background-color) !important;`, ` border-radius: 5px;`, ` padding-left: 2px;`, ` padding-right: 2px;`, ` text-decoration: var(--${selector.uid}-decoration) !important;`, "}"]); } if (selector.selectPrepend) { instructions.push(...["", `div[data-id="${selector.uid}"] div.setting-item-description::before,`, `.data-link-icon${cssSelector}::before {`, ` content: var(--${selector.uid}-before);`, "}"]); } if (selector.selectAppend) { instructions.push(...["", `div[data-id="${selector.uid}"] div.setting-item-description::after,`, `.data-link-icon-after${cssSelector}::after {`, ` content: var(--${selector.uid}-after);`, "}"]); } }); instructions.push(...[ "/* @settings", "name: Supercharged Links", "id: supercharged-links", "settings:", ]); selectors.forEach((selector, i) => { let name = selector.name; let value = selector.value; if (selector.type === 'tag') { name = 'tag'; // value = "\#" + value; } else if (selector.type === 'path') { name = 'path'; } instructions.push(...[ " - ", ` id: ${selector.uid}`, ` title: ${name} is ${value}`, ` description: Example note`, " type: heading", " collapsed: true", " level: 3" ]); if (selector.selectText) { instructions.push(...[ " - ", ` id: ${selector.uid}-color`, ` title: Link color`, " type: variable-color", " format: hex", ` default: '${colors[hash(selector.uid) % 36]}'`, " - ", ` id: ${selector.uid}-weight`, ` title: Font weight`, " type: variable-select", ` default: initial`, ` options:`, ` - initial`, ` - lighter`, ` - normal`, ` - bold`, ` - bolder`, " - ", ` id: ${selector.uid}-decoration`, ` title: Font decoration`, " type: variable-select", ` default: initial`, ` options:`, ` - initial`, ` - underline`, ` - overline`, ` - line-through` ]); } if (selector.selectPrepend) { instructions.push(...[" - ", ` id: ${selector.uid}-before`, ` title: Prepend text`, ` description: Add some text, such as an emoji, before the links.`, " type: variable-text", ` default: ''`, ` quotes: true`]); } if (selector.selectAppend) { instructions.push(...[" - ", ` id: ${selector.uid}-after`, ` title: Append text`, ` description: Add some text, such as an emoji, after the links.`, " type: variable-text", ` default: ''`, ` quotes: true`]); } if (selector.selectBackground) { instructions.push(...[" - ", ` id: c-${selector.uid}-use-background`, ` title: Use background color`, ` description: Adds a background color to the link. This can look buggy in live preview.`, " type: class-toggle", " - ", ` id: ${selector.uid}-background-color`, ` title: Background color`, " type: variable-color", " format: hex", ` default: '#ffffff'`]); } }); instructions.push("*/"); const vault = plugin.app.vault; const configDir = (_a = vault.configDir) !== null && _a !== void 0 ? _a : ".obsidian"; const pathDir = configDir + "/snippets"; yield vault.adapter.mkdir(pathDir); const path = pathDir + "/supercharged-links-gen.css"; if (yield vault.adapter.exists(path)) { yield vault.adapter.remove(path); } yield plugin.app.vault.create(path, instructions.join('\n')); // Activate snippet if (plugin.settings.activateSnippet) { // @ts-ignore const customCss = plugin.app.customCss; customCss.enabledSnippets.add('supercharged-links-gen'); customCss.requestLoadSnippets(); } // Ensure Style Settings reads changes plugin.app.workspace.trigger("parse-style-settings"); }); } function clearExtraAttributes(link) { Object.values(link.attributes).forEach(attr => { if (attr.name.includes("data-link")) { link.removeAttribute(attr.name); } }); } function fetchTargetAttributesSync(app, settings, dest, addDataHref) { var _a; let new_props = { tags: "" }; const cache = app.metadataCache.getFileCache(dest); if (!cache) return new_props; const frontmatter = cache.frontmatter; if (frontmatter) { settings.targetAttributes.forEach(attribute => { if (Object.keys(frontmatter).includes(attribute)) { if (attribute === 'tag' || attribute === 'tags') { new_props['tags'] += frontmatter[attribute]; } else { new_props[attribute] = frontmatter[attribute]; } } }); } if (settings.targetTags) { new_props["tags"] += obsidian.getAllTags(cache).join(' '); } if (addDataHref) { new_props['data-href'] = dest.basename; } new_props['path'] = dest.path; //@ts-ignore const getResults = (api) => { const page = api.page(dest.path); if (!page) { return; } settings.targetAttributes.forEach((field) => { const value = page[field]; if (value) new_props[field] = value; }); }; if (settings.getFromInlineField && app.plugins.enabledPlugins.has("dataview")) { const api = (_a = app.plugins.plugins.dataview) === null || _a === void 0 ? void 0 : _a.api; if (api) { getResults(api); } else this.plugin.registerEvent(this.app.metadataCache.on("dataview:api-ready", (api) => getResults(api))); } return new_props; } function setLinkNewProps(link, new_props) { // @ts-ignore for (const a of link.attributes) { if (a.name.includes("data-link") && !(a.name in new_props)) { link.removeAttribute(a.name); } } Object.keys(new_props).forEach(key => { var _a; const name = "data-link-" + key; const newValue = new_props[key]; const curValue = link.getAttribute(name); // Only update if value is different if (!newValue || curValue != newValue) { link.setAttribute("data-link-" + key, new_props[key]); if (((_a = new_props[key]) === null || _a === void 0 ? void 0 : _a.startsWith) && (new_props[key].startsWith('http') || new_props[key].startsWith('data:'))) { link.style.setProperty(`--data-link-${key}`, `url(${new_props[key]})`); } else { link.style.setProperty(`--data-link-${key}`, new_props[key]); } } }); if (!link.hasClass("data-link-icon")) { link.addClass("data-link-icon"); } if (!link.hasClass("data-link-icon-after")) { link.addClass("data-link-icon-after"); } if (!link.hasClass("data-link-text")) { link.addClass("data-link-text"); } } function updateLinkExtraAttributes(app, settings, link, destName) { const linkHref = link.getAttribute('href').split('#')[0]; const dest = app.metadataCache.getFirstLinkpathDest(linkHref, destName); if (dest) { const new_props = fetchTargetAttributesSync(app, settings, dest, false); setLinkNewProps(link, new_props); } } function updateDivExtraAttributes(app, settings, link, destName, linkName) { if (link.parentElement.getAttribute("class").contains('mod-collapsible')) return; // Bookmarks Folder if (!linkName) { linkName = link.textContent; } if (!!link.parentElement.getAttribute('data-path')) { // File Browser linkName = link.parentElement.getAttribute('data-path'); } else if (link.parentElement.getAttribute("class") == "suggestion-content" && !!link.nextElementSibling) { // Auto complete linkName = link.nextElementSibling.textContent + linkName; } const dest = app.metadataCache.getFirstLinkpathDest(obsidian.getLinkpath(linkName), destName); if (dest) { const new_props = fetchTargetAttributesSync(app, settings, dest, true); setLinkNewProps(link, new_props); } } function updateElLinks(app, plugin, el, ctx) { const settings = plugin.settings; const links = el.querySelectorAll('a.internal-link'); const destName = ctx.sourcePath.replace(/(.*).md/, "$1"); links.forEach((link) => { updateLinkExtraAttributes(app, settings, link, destName); }); } function updatePropertiesPane(propertiesEl, file, app, plugin) { var _a; const frontmatter = (_a = app.metadataCache.getCache(file.path)) === null || _a === void 0 ? void 0 : _a.frontmatter; if (!!frontmatter) { const nodes = propertiesEl.querySelectorAll("div.internal-link > .multi-select-pill-content"); for (let i = 0; i < nodes.length; ++i) { const el = nodes[i]; const linkText = el.textContent; const keyEl = el.parentElement.parentElement.parentElement.parentElement.children[0].children[1]; // @ts-ignore const key = keyEl.value; const listOfLinks = frontmatter[key]; let foundS = null; if (!listOfLinks) { continue; } for (const s of listOfLinks) { if (s.length > 4 && s.startsWith("[[") && s.endsWith("]]")) { const slicedS = s.slice(2, -2); const split = slicedS.split("|"); if (split.length == 1 && split[0] == linkText) { foundS = split[0]; break; } else if (split.length == 2 && split[1] == linkText) { foundS = split[0]; break; } } } if (!!foundS) { updateDivExtraAttributes(plugin.app, plugin.settings, el, "", foundS); } } const singleNodes = propertiesEl.querySelectorAll("div.metadata-link-inner"); for (let i = 0; i < singleNodes.length; ++i) { const el = singleNodes[i]; const linkText = el.textContent; const keyEl = el.parentElement.parentElement.parentElement.children[0].children[1]; // @ts-ignore const key = keyEl.value; const link = frontmatter[key]; if (!link) { continue; } let foundS = null; if ((link === null || link === void 0 ? void 0 : link.length) > 4 && link.startsWith("[[") && link.endsWith("]]")) { const slicedS = link.slice(2, -2); const split = slicedS.split("|"); if (split.length == 1 && split[0] == linkText) { foundS = split[0]; } else if (split.length == 2 && split[1] == linkText) { foundS = split[0]; } } if (!!foundS) { updateDivExtraAttributes(plugin.app, plugin.settings, el, "", foundS); } } } } function updateVisibleLinks(app, plugin) { const settings = plugin.settings; app.workspace.iterateRootLeaves((leaf) => { var _a, _b; if (leaf.view instanceof obsidian.MarkdownView && leaf.view.file) { const file = leaf.view.file; const cachedFile = app.metadataCache.getFileCache(file); // @ts-ignore const metadata = (_b = (_a = leaf.view) === null || _a === void 0 ? void 0 : _a.metadataEditor) === null || _b === void 0 ? void 0 : _b.contentEl; if (!!metadata) { updatePropertiesPane(metadata, file, app, plugin); } //@ts-ignore const tabHeader = leaf.tabHeaderInnerTitleEl; if (settings.enableTabHeader) { // Supercharge tab headers updateDivExtraAttributes(app, settings, tabHeader, "", file.path); } else { clearExtraAttributes(tabHeader); } if (cachedFile === null || cachedFile === void 0 ? void 0 : cachedFile.links) { cachedFile.links.forEach((link) => { const fileName = file.path.replace(/(.*).md/, "$1"); const dest = app.metadataCache.getFirstLinkpathDest(link.link, fileName); if (dest) { const new_props = fetchTargetAttributesSync(app, settings, dest, false); const internalLinks = leaf.view.containerEl.querySelectorAll(`a.internal-link[href="${link.link}"]`); internalLinks.forEach((internalLink) => setLinkNewProps(internalLink, new_props)); } }); } } }); } class SuperchargedLinksSettingTab extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; this.debouncedGenerate = obsidian.debounce(this._generateSnippet, 1000, true); // Generate CSS immediately rather than 1 second - feels laggy this._generateSnippet(); } display() { let { containerEl } = this; containerEl.empty(); /* Managing extra attirbutes for a.internal-link */ new obsidian.Setting(containerEl) .setName('Target Attributes for styling') .setDesc('Frontmatter attributes to target, comma separated') .addTextArea((text) => { text .setPlaceholder('Enter attributes as string, comma separated') .setValue(this.plugin.settings.targetAttributes.join(', ')) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.targetAttributes = value.replace(/\s/g, '').split(','); if (this.plugin.settings.targetAttributes.length === 1 && !this.plugin.settings.targetAttributes[0]) { this.plugin.settings.targetAttributes = []; } yield this.plugin.saveSettings(); })); text.inputEl.rows = 6; text.inputEl.cols = 25; }); containerEl.createEl('h4', { text: 'Styling' }); const styleSettingDescription = containerEl.createDiv(); styleSettingDescription.innerHTML = ` Styling can be done using the Style Settings plugin.
  1. Create selectors down below.
  2. Go to the Style Settings tab and style your links!
`; const selectorDiv = containerEl.createDiv(); this.drawSelectors(selectorDiv); containerEl.createEl('h4', { text: 'Settings' }); new obsidian.Setting(containerEl) .setName('Enable in Editor') .setDesc('If true, this will also supercharge internal links in the editor view of a note.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.enableEditor); toggle.onChange(value => { this.plugin.settings.enableEditor = value; this.plugin.saveSettings(); updateVisibleLinks(app, this.plugin); }); }); new obsidian.Setting(containerEl) .setName('Enable in tab headers') .setDesc('If true, this will also supercharge the headers of a tab.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.enableTabHeader); toggle.onChange(value => { this.plugin.settings.enableTabHeader = value; this.plugin.saveSettings(); updateVisibleLinks(app, this.plugin); }); }); new obsidian.Setting(containerEl) .setName('Enable in File Browser') .setDesc('If true, this will also supercharge the file browser.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.enableFileList); toggle.onChange(value => { this.plugin.settings.enableFileList = value; this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Enable in Plugins') .setDesc('If true, this will also supercharge plugins like the backlinks and forward links panels.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.enableBacklinks); toggle.onChange(value => { this.plugin.settings.enableBacklinks = value; this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Enable in Quick Switcher') .setDesc('If true, this will also supercharge the quick switcher.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.enableQuickSwitcher); toggle.onChange(value => { this.plugin.settings.enableQuickSwitcher = value; this.plugin.saveSettings(); }); }); new obsidian.Setting(containerEl) .setName('Enable in Link Autocompleter') .setDesc('If true, this will also supercharge the link autocompleter.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.enableSuggestor); toggle.onChange(value => { this.plugin.settings.enableSuggestor = value; this.plugin.saveSettings(); }); }); containerEl.createEl('h4', { text: 'Advanced' }); // Managing choice wether you want to parse tags both from normal tags and in the frontmatter new obsidian.Setting(containerEl) .setName('Parse all tags in the file') .setDesc('Sets the `data-link-tags`-attribute to look for tags both in the frontmatter and in the file as #tag-name') .addToggle(toggle => { toggle.setValue(this.plugin.settings.targetTags); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.targetTags = value; yield this.plugin.saveSettings(); })); }); // Managing choice wether you get attributes from inline fields and frontmatter or only frontmater new obsidian.Setting(containerEl) .setName('Search for attribute in Inline fields like ') .setDesc('Sets the `data-link-`-attribute to the value of inline fields') .addToggle(toggle => { toggle.setValue(this.plugin.settings.getFromInlineField); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.getFromInlineField = value; yield this.plugin.saveSettings(); })); }); // Automatically activate snippet new obsidian.Setting(containerEl) .setName('Automatically activate snippet') .setDesc('If true, this will automatically activate the generated CSS snippet "supercharged-links-gen.css". ' + 'Turn this off if you don\'t want this to happen.') .addToggle(toggle => { toggle.setValue(this.plugin.settings.activateSnippet); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.activateSnippet = value; yield this.plugin.saveSettings(); })); }); /* Managing predefined values for properties */ /* Manage menu options display*/ new obsidian.Setting(containerEl) .setName("Display field options in context menu") .setDesc("This feature has been migrated to metadata-menu plugin https://github.com/mdelobelle/metadatamenu"); } generateSnippet() { this.debouncedGenerate(); } _generateSnippet() { return __awaiter(this, void 0, void 0, function* () { yield buildCSS(this.plugin.settings.selectors, this.plugin); // new Notice("Generated supercharged-links-gen.css"); }); } drawSelectors(div) { div.empty(); this.generateSnippet(); const selectors = this.plugin.settings.selectors; selectors.forEach((selector, i) => { const s = new obsidian.Setting(div) .addButton(button => { button.onClick(() => { const oldSelector = selectors[i + 1]; selectors[i + 1] = selector; selectors[i] = oldSelector; this.drawSelectors(div); }); button.setIcon("down-arrow-with-tail"); button.setTooltip("Move selector down"); if (i === selectors.length - 1) { button.setDisabled(true); } }) .addButton(button => { button.onClick(() => { const oldSelector = selectors[i - 1]; selectors[i - 1] = selector; selectors[i] = oldSelector; this.drawSelectors(div); }); button.setIcon("up-arrow-with-tail"); button.setTooltip("Move selector up"); if (i === 0) { button.setDisabled(true); } }) .addButton(button => { button.onClick(() => { const formModal = new CSSBuilderModal(this.plugin, (newSelector) => { this.plugin.settings.selectors[i] = newSelector; this.plugin.saveSettings(); updateDisplay(s.nameEl, selector, this.plugin.settings); this.generateSnippet(); }, selector); formModal.open(); }); button.setIcon("pencil"); button.setTooltip("Edit selector"); }) .addButton(button => { button.onClick(() => { this.plugin.settings.selectors.remove(selector); this.plugin.saveSettings(); this.drawSelectors(div); }); button.setIcon("cross"); button.setTooltip("Remove selector"); }); updateDisplay(s.nameEl, selector, this.plugin.settings); }); new obsidian.Setting(div) .setName("New selector") .setDesc("Create a new selector to style with Style Settings.") .addButton(button => { button.onClick(() => { const formModal = new CSSBuilderModal(this.plugin, (newSelector) => { this.plugin.settings.selectors.push(newSelector); this.plugin.saveSettings(); this.drawSelectors(div); // TODO: Force redraw somehow? }); formModal.open(); }); button.setButtonText("New"); }); } } const DEFAULT_SETTINGS = { targetAttributes: [], targetTags: true, getFromInlineField: true, enableTabHeader: true, activateSnippet: true, enableEditor: true, enableFileList: true, enableBacklinks: true, enableQuickSwitcher: true, enableSuggestor: true, selectors: [] }; function buildCMViewPlugin(app, _settings) { // Implements the live preview supercharging // Code structure based on https://github.com/nothingislost/obsidian-cm6-attributes/blob/743d71b0aa616407149a0b6ea5ffea28e2154158/src/main.ts // Code help credits to @NothingIsLost! They have been a great help getting this to work properly. class HeaderWidget extends view.WidgetType { constructor(attributes, after) { super(); this.attributes = attributes; this.after = after; } toDOM() { var _a; let headerEl = document.createElement("span"); headerEl.setAttrs(this.attributes); for (let key in this.attributes) { // CSS doesn't allow interpolation of variables for URLs, so do it beforehand to be nice. if (((_a = this.attributes[key]) === null || _a === void 0 ? void 0 : _a.startsWith) && (this.attributes[key].startsWith('http') || this.attributes[key].startsWith('data:'))) { headerEl.style.setProperty(`--${key}`, `url(${this.attributes[key]})`); } else { headerEl.style.setProperty(`--${key}`, this.attributes[key]); } } if (this.after) { headerEl.addClass('data-link-icon-after'); } else { headerEl.addClass('data-link-icon'); } // create a naive bread crumb return headerEl; } ignoreEvent() { return true; } } const settings = _settings; const viewPlugin = view.ViewPlugin.fromClass(class { constructor(view) { this.decorations = this.buildDecorations(view); } update(update) { if (update.docChanged) { this.decorations = this.decorations.map(update.changes); update.changes.iterChanges((fromA, toA, fromB, toB, t) => { // Update all 'line blocks' between the range changed. Prevents weird graphical bugs const minFrom = update.view.lineBlockAt(fromB).from; const maxTo = update.view.lineBlockAt(toB).to; // remove things within bounds this.decorations = this.decorations.update({ filter: (from, to) => to < minFrom || from > maxTo }); // Update decorations within bounds this.decorations = state.RangeSet.join([this.decorations, this.buildDecorations(update.view, minFrom, maxTo)]); }); } else if (update.viewportChanged) { this.decorations = this.buildDecorations(update.view); } } destroy() { } buildDecorations(view$1, updateFrom = -1, updateTo = -1) { let builder = new state.RangeSetBuilder(); if (!settings.enableEditor) { return builder.finish(); } const mdView = view$1.state.field(obsidian.editorViewField); let lastAttributes = {}; let iconDecoAfter = null; let iconDecoAfterWhere = null; let mdAliasFrom = null; let mdAliasTo = null; for (let { from, to } of view$1.visibleRanges) { // When updating, only changes the range given. if (updateFrom !== -1 && (to < updateFrom || from > updateTo)) continue; language.syntaxTree(view$1.state).iterate({ from, to, enter: (node) => { if (updateFrom !== -1 && (node.to < updateFrom || node.from > updateTo)) return; const tokenProps = node.type.prop(language.tokenClassNodeProp); if (tokenProps) { const props = new Set(tokenProps.split(" ")); // Square Brackets of links both internal (`[[`, `]]`) and md link (`[`, `]`) const isMDFormatting = props.has('formatting-link') || props.has('formatting-link-string'); if (isMDFormatting) return; // Parts of internal links const isLink = props.has("hmd-internal-link"); // [[`Note` or `|` or `Alias`]] const isAlias = props.has("link-alias"); // [[Note| `Alias`]] const isPipe = props.has("link-alias-pipe"); // [[Note `|` Alias]] // The 'alias' of the md link (or its brackets) const isMDLink = props.has('link'); // `[` or `Alias` or `]`(URL) // The 'internal link' of the md link (or its brackets) const isMDUrl = props.has('url'); // [Alias]`(` or `URL` or `)` if (isMDLink) { // This catches the alias of md links i.e. [ `Alias` ](URL) // We'll apply the styling in the next iteration when we analyze the `URL` mdAliasFrom = node.from; mdAliasTo = node.to; } if (!isPipe && !isAlias) { if (iconDecoAfter) { builder.add(iconDecoAfterWhere, iconDecoAfterWhere, iconDecoAfter); iconDecoAfter = null; iconDecoAfterWhere = null; } } if (isLink && !isAlias && !isPipe || isMDUrl) { let linkText = view$1.state.doc.sliceString(node.from, node.to); linkText = linkText.split("#")[0]; let file = app.metadataCache.getFirstLinkpathDest(linkText, mdView.file.basename); if (isMDUrl && !file) { try { file = app.vault.getAbstractFileByPath(decodeURIComponent(linkText)); } catch (e) { } } if (file) { let _attributes = fetchTargetAttributesSync(app, settings, file, true); let attributes = {}; for (let key in _attributes) { attributes["data-link-" + key] = _attributes[key]; } let deco = view.Decoration.mark({ attributes, class: "data-link-text" }); let iconDecoBefore = view.Decoration.widget({ widget: new HeaderWidget(attributes, false), }); iconDecoAfter = view.Decoration.widget({ widget: new HeaderWidget(attributes, true), }); if (isMDUrl) { // Apply retroactively to the alias found before let deco = view.Decoration.mark({ attributes: attributes, class: "data-link-text" }); builder.add(mdAliasFrom, mdAliasFrom, iconDecoBefore); builder.add(mdAliasFrom, mdAliasTo, deco); if (iconDecoAfter) { builder.add(mdAliasTo, mdAliasTo, iconDecoAfter); iconDecoAfter = null; iconDecoAfterWhere = null; mdAliasFrom = null; mdAliasTo = null; } } else { builder.add(node.from, node.from, iconDecoBefore); } builder.add(node.from, node.to, deco); lastAttributes = attributes; iconDecoAfterWhere = node.to; } } else if (isLink && isAlias) { let deco = view.Decoration.mark({ attributes: lastAttributes, class: "data-link-text" }); builder.add(node.from, node.to, deco); if (iconDecoAfter) { builder.add(node.to, node.to, iconDecoAfter); iconDecoAfter = null; iconDecoAfterWhere = null; } } } } }); } return builder.finish(); } }, { decorations: v => v.decorations }); return viewPlugin; } class SuperchargedLinks extends obsidian.Plugin { constructor() { super(...arguments); this.modalObservers = []; } onload() { return __awaiter(this, void 0, void 0, function* () { console.log('Supercharged links loaded'); yield this.loadSettings(); this.addSettingTab(new SuperchargedLinksSettingTab(this.app, this)); this.registerMarkdownPostProcessor((el, ctx) => { updateElLinks(this.app, this, el, ctx); }); const plugin = this; const updateLinks = function (_file) { updateVisibleLinks(plugin.app, plugin); plugin.observers.forEach(([observer, type, own_class]) => { const leaves = plugin.app.workspace.getLeavesOfType(type); leaves.forEach(leaf => { plugin.updateContainer(leaf.view.containerEl, plugin, own_class); }); }); }; // Live preview const ext = state.Prec.lowest(buildCMViewPlugin(this.app, this.settings)); this.registerEditorExtension(ext); this.observers = []; this.app.workspace.onLayoutReady(() => { this.initViewObservers(this); this.initModalObservers(this, document); updateVisibleLinks(this.app, this); }); // Initialization this.registerEvent(this.app.workspace.on("window-open", (window, win) => this.initModalObservers(this, window.getContainer().doc))); // Update when // Debounced to prevent lag when writing this.registerEvent(this.app.metadataCache.on('changed', obsidian.debounce(updateLinks, 500, true))); // Update when layout changes // @ts-ignore this.registerEvent(this.app.workspace.on("layout-change", obsidian.debounce(updateLinks, 10, true))); // Update plugin views when layout changes // TODO: This is an expensive operation that seems like it is called fairly frequently. Maybe we can do this more efficiently? this.registerEvent(this.app.workspace.on("layout-change", () => this.initViewObservers(this))); }); } initViewObservers(plugin) { var _a, _b, _c, _d, _e, _f; // Reset observers plugin.observers.forEach(([observer, type]) => { observer.disconnect(); }); plugin.observers = []; // Register new observers plugin.registerViewType('backlink', plugin, ".tree-item-inner", true); plugin.registerViewType('outgoing-link', plugin, ".tree-item-inner", true); plugin.registerViewType('search', plugin, ".tree-item-inner"); plugin.registerViewType('BC-matrix', plugin, '.BC-Link'); plugin.registerViewType('BC-ducks', plugin, '.internal-link'); plugin.registerViewType('BC-tree', plugin, 'a.internal-link'); plugin.registerViewType('graph-analysis', plugin, '.internal-link'); plugin.registerViewType('starred', plugin, '.nav-file-title-content'); plugin.registerViewType('file-explorer', plugin, '.nav-file-title-content'); plugin.registerViewType('recent-files', plugin, '.nav-file-title-content'); plugin.registerViewType('bookmarks', plugin, '.tree-item-inner'); // If backlinks in editor is on // @ts-ignore if ((_f = (_e = (_d = (_c = (_b = (_a = plugin.app) === null || _a === void 0 ? void 0 : _a.internalPlugins) === null || _b === void 0 ? void 0 : _b.plugins) === null || _c === void 0 ? void 0 : _c.backlink) === null || _d === void 0 ? void 0 : _d.instance) === null || _e === void 0 ? void 0 : _e.options) === null || _f === void 0 ? void 0 : _f.backlinkInDocument) { plugin.registerViewType('markdown', plugin, '.tree-item-inner', true); } const propertyLeaves = this.app.workspace.getLeavesOfType("file-properties"); for (let i = 0; i < propertyLeaves.length; i++) { const container = propertyLeaves[i].view.containerEl; let observer = new MutationObserver((records, _) => { const file = app.workspace.getActiveFile(); if (!!file) { updatePropertiesPane(container, app.workspace.getActiveFile(), app, plugin); } }); observer.observe(container, { subtree: true, childList: true, attributes: false }); plugin.observers.push([observer, "file-properties" + i, ""]); // TODO: No proper unloading! } plugin.registerViewType('file-properties', plugin, 'div.internal-link > .multi-select-pill-content'); } initModalObservers(plugin, doc) { const config = { subtree: false, childList: true, attributes: false }; this.modalObservers.push(new MutationObserver(records => { records.forEach((mutation) => { if (mutation.type === 'childList') { mutation.addedNodes.forEach(n => { if ('className' in n && // @ts-ignore (n.className.includes('modal-container') && plugin.settings.enableQuickSwitcher // @ts-ignore || n.className.includes('suggestion-container') && plugin.settings.enableSuggestor)) { let selector = ".suggestion-title, .suggestion-note, .another-quick-switcher__item__title, .omnisearch-result__title"; // @ts-ignore if (n.className.includes('suggestion-container')) { selector = ".suggestion-title, .suggestion-note"; } plugin.updateContainer(n, plugin, selector); plugin._watchContainer(null, n, plugin, selector); } }); } }); })); this.modalObservers.last().observe(doc.body, config); } registerViewType(viewTypeName, plugin, selector, updateDynamic = false) { const leaves = this.app.workspace.getLeavesOfType(viewTypeName); // if (leaves.length > 1) { for (let i = 0; i < leaves.length; i++) { const container = leaves[i].view.containerEl; if (updateDynamic) { plugin._watchContainerDynamic(viewTypeName + i, container, plugin, selector); } else { plugin._watchContainer(viewTypeName + i, container, plugin, selector); } } // } // else if (leaves.length < 1) return; // else { // const container = leaves[0].view.containerEl; // this.updateContainer(container, plugin, selector); // if (updateDynamic) { // plugin._watchContainerDynamic(viewTypeName, container, plugin, selector) // } // else { // plugin._watchContainer(viewTypeName, container, plugin, selector); // } // } } updateContainer(container, plugin, selector) { if (!plugin.settings.enableBacklinks && container.getAttribute("data-type") !== "file-explorer") return; if (!plugin.settings.enableFileList && container.getAttribute("data-type") === "file-explorer") return; const nodes = container.findAll(selector); for (let i = 0; i < nodes.length; ++i) { const el = nodes[i]; updateDivExtraAttributes(plugin.app, plugin.settings, el, ""); } } removeFromContainer(container, selector) { const nodes = container.findAll(selector); for (let i = 0; i < nodes.length; ++i) { const el = nodes[i]; clearExtraAttributes(el); } } _watchContainer(viewType, container, plugin, selector) { let observer = new MutationObserver((records, _) => { plugin.updateContainer(container, plugin, selector); }); observer.observe(container, { subtree: true, childList: true, attributes: false }); if (viewType) { plugin.observers.push([observer, viewType, selector]); } } _watchContainerDynamic(viewType, container, plugin, selector, own_class = 'tree-item-inner', parent_class = 'tree-item') { // Used for efficient updating of the backlinks panel // Only loops through newly added DOM nodes instead of changing all of them if (!plugin.settings.enableBacklinks) return; let observer = new MutationObserver((records, _) => { records.forEach((mutation) => { if (mutation.type === 'childList') { mutation.addedNodes.forEach((n) => { if ('className' in n) { // @ts-ignore if (n.className.includes && typeof n.className.includes === 'function' && n.className.includes(parent_class)) { const fileDivs = n.getElementsByClassName(own_class); for (let i = 0; i < fileDivs.length; ++i) { const link = fileDivs[i]; updateDivExtraAttributes(plugin.app, plugin.settings, link, ""); } } } }); } }); }); observer.observe(container, { subtree: true, childList: true, attributes: false }); plugin.observers.push([observer, viewType, selector]); } onunload() { this.observers.forEach(([observer, type, own_class]) => { observer.disconnect(); const leaves = this.app.workspace.getLeavesOfType(type); leaves.forEach(leaf => { this.removeFromContainer(leaf.view.containerEl, own_class); }); }); for (const observer of this.modalObservers) { observer.disconnect(); } console.log('Supercharged links unloaded'); } loadSettings() { return __awaiter(this, void 0, void 0, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __awaiter(this, void 0, void 0, function* () { yield this.saveData(this.settings); }); } } module.exports = SuperchargedLinks; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9jc3NCdWlsZGVyL2Nzc0xpbmsudHMiLCJzcmMvY3NzQnVpbGRlci9jc3NCdWlsZGVyTW9kYWwudHMiLCJzcmMvY3NzQnVpbGRlci9jc3NCdWlsZGVyLnRzIiwic3JjL2xpbmtBdHRyaWJ1dGVzL2xpbmtBdHRyaWJ1dGVzLnRzIiwic3JjL3NldHRpbmdzL1N1cGVyY2hhcmdlZExpbmtzU2V0dGluZ1RhYi50cyIsInNyYy9zZXR0aW5ncy9TdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdzLnRzIiwic3JjL2xpbmtBdHRyaWJ1dGVzL2xpdmVQcmV2aWV3LnRzIiwibWFpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlO1xyXG4gICAgICAgIGlmIChhc3luYykge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG59O1xyXG4iLCJleHBvcnQgdHlwZSBNYXRjaFR5cGVzID0gJ2V4YWN0JyB8ICdjb250YWlucycgfCAnc3RhcnRzd2l0aCcgfCAnZW5kc3dpdGgnIHwgJ3doaXRlU3BhY2UnO1xuZXhwb3J0IHR5cGUgU2VsZWN0b3JUeXBlcyA9ICdhdHRyaWJ1dGUnIHwgJ3RhZycgfCAncGF0aCc7XG5pbnRlcmZhY2UgQ1NTTGluayB7XG4gICAgdHlwZTogU2VsZWN0b3JUeXBlc1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHZhbHVlOiBzdHJpbmdcbiAgICBtYXRjaENhc2VTZW5zaXRpdmU6IGJvb2xlYW5cbiAgICBtYXRjaDogTWF0Y2hUeXBlc1xuICAgIHVpZDogc3RyaW5nXG4gICAgc2VsZWN0VGV4dDogYm9vbGVhblxuICAgIHNlbGVjdEJhY2tncm91bmQ6IGJvb2xlYW5cbiAgICBzZWxlY3RBcHBlbmQ6IGJvb2xlYW5cbiAgICBzZWxlY3RQcmVwZW5kOiBib29sZWFuXG59XG5cbmNvbnN0IG1hdGNoVHlwZXM6IFJlY29yZDxNYXRjaFR5cGVzLCBzdHJpbmc+ID0ge1xuICAgICdleGFjdCc6IFwiRXhhY3QgbWF0Y2hcIixcbiAgICAnY29udGFpbnMnOiBcIkNvbnRhaW5zIHZhbHVlXCIsXG4gICAgJ3doaXRlU3BhY2UnOiBcIlZhbHVlIHdpdGhpbiB3aGl0ZXNwYWNlIHNlcGFyYXRlZCB3b3Jkc1wiLFxuICAgICdzdGFydHN3aXRoJzogXCJTdGFydHMgd2l0aCB0aGlzIHZhbHVlXCIsXG4gICAgJ2VuZHN3aXRoJzogXCJFbmRzIHdpdGggdGhpcyB2YWx1ZVwiXG59XG5cbmV4cG9ydCBjb25zdCBtYXRjaFNpZ246IFJlY29yZDxNYXRjaFR5cGVzLCBzdHJpbmc+ID0ge1xuICAgICdleGFjdCc6IFwiXCIsXG4gICAgJ2NvbnRhaW5zJzogXCIqXCIsXG4gICAgJ3N0YXJ0c3dpdGgnOiBcIl5cIixcbiAgICAnZW5kc3dpdGgnOiBcIiRcIixcbiAgICAnd2hpdGVTcGFjZSc6IFwiflwiXG59XG5cbmV4cG9ydCBjb25zdCBtYXRjaFByZXZpZXc6IFJlY29yZDxNYXRjaFR5cGVzLCBzdHJpbmc+ID0ge1xuICAgICdleGFjdCc6IFwid2l0aCB2YWx1ZVwiLFxuICAgICdjb250YWlucyc6IFwiY29udGFpbmluZ1wiLFxuICAgICd3aGl0ZVNwYWNlJzogXCJjb250YWluaW5nXCIsXG4gICAgJ3N0YXJ0c3dpdGgnOiBcInN0YXJ0aW5nIHdpdGhcIixcbiAgICAnZW5kc3dpdGgnOiBcImVuZGluZyB3aXRoXCJcbn1cblxuZXhwb3J0IGNvbnN0IG1hdGNoUHJldmlld1BhdGg6IFJlY29yZDxNYXRjaFR5cGVzLCBzdHJpbmc+ID0ge1xuICAgICdleGFjdCc6IFwiaXNcIixcbiAgICAnY29udGFpbnMnOiBcImNvbnRhaW5zXCIsXG4gICAgJ3doaXRlU3BhY2UnOiBcImNvbnRhaW5zXCIsXG4gICAgJ3N0YXJ0c3dpdGgnOiBcInN0YXJ0cyB3aXRoXCIsXG4gICAgJ2VuZHN3aXRoJzogXCJlbmRzIHdpdGhcIlxufVxuXG5leHBvcnQgY29uc3Qgc2VsZWN0b3JUeXBlOiBSZWNvcmQ8U2VsZWN0b3JUeXBlcywgc3RyaW5nPiA9IHtcbiAgICAnYXR0cmlidXRlJzogJ0F0dHJpYnV0ZSB2YWx1ZScsXG4gICAgJ3RhZyc6ICdUYWcnLFxuICAgICdwYXRoJzogJ05vdGUgcGF0aCdcbn1cblxuY2xhc3MgQ1NTTGluayB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhdHRyaWJ1dGUnO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlwiO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgdGhpcy5tYXRjaENhc2VTZW5zaXRpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXRjaCA9IFwiZXhhY3RcIjtcbiAgICAgICAgbGV0IHM0ID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gaWQgb2YgZm9ybWF0ICdhYWFhYWFhYSctJ2FhYWEnLSdhYWFhJy0nYWFhYSctJ2FhYWFhYWFhYWFhYSdcbiAgICAgICAgdGhpcy51aWQgPSBzNCgpICsgXCItXCIgKyBzNCgpO1xuICAgICAgICB0aGlzLnNlbGVjdFRleHQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdEFwcGVuZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0UHJlcGVuZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0QmFja2dyb3VuZCA9IHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgeyBtYXRjaFR5cGVzLCBDU1NMaW5rIH0iLCJpbXBvcnQgU3VwZXJjaGFyZ2VkTGlua3MgZnJvbSBcIm1haW5cIlxuaW1wb3J0IHtcbiAgICBNb2RhbCxcbiAgICBTZXR0aW5nXG59IGZyb20gXCJvYnNpZGlhblwiXG5pbXBvcnQge21hdGNoVHlwZXMsIG1hdGNoUHJldmlldywgQ1NTTGluaywgbWF0Y2hQcmV2aWV3UGF0aCwgc2VsZWN0b3JUeXBlLCBTZWxlY3RvclR5cGVzLCBNYXRjaFR5cGVzfSBmcm9tICcuL2Nzc0xpbmsnXG5pbXBvcnQge1N1cGVyY2hhcmdlZExpbmtzU2V0dGluZ3N9IGZyb20gXCIuLi9zZXR0aW5ncy9TdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5VGV4dChsaW5rOiBDU1NMaW5rLCBzZXR0aW5nczogU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5ncyk6IHN0cmluZyB7XG4gICAgaWYgKGxpbmsudHlwZSA9PT0gJ3RhZycpIHtcbiAgICAgICAgaWYgKCFsaW5rLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI8Yj5QbGVhc2UgY2hvb3NlIGEgdGFnPC9iPlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJkYXRhLWxpbmstaWNvbiBkYXRhLWxpbmstdGV4dCBkYXRhLWxpbmstaWNvbi1hZnRlclwiIGRhdGEtbGluay10YWdzPVwiJHtsaW5rLnZhbHVlfVwiPk5vdGU8L3NwYW4+IGhhcyB0YWcgPGEgY2xhc3M9XCJ0YWdcIj4jJHtsaW5rLnZhbHVlfTwvYT5gO1xuICAgIH1cbiAgICBlbHNlIGlmIChsaW5rLnR5cGUgPT09ICdhdHRyaWJ1dGUnKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy50YXJnZXRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGA8Yj5ObyBhdHRyaWJ1dGVzIGFkZGVkIHRvIFwiVGFyZ2V0IGF0dHJpYnV0ZXNcIi4gR28gdG8gcGx1Z2luIHNldHRpbmdzIHRvIGFkZCB0aGVtLjwvYj5gXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsaW5rLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjxiPlBsZWFzZSBjaG9vc2UgYW4gYXR0cmlidXRlIG5hbWUuPC9iPlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGluay52YWx1ZSl7XG4gICAgICAgICAgICByZXR1cm4gXCI8Yj5QbGVhc2UgY2hvb3NlIGFuIGF0dHJpYnV0ZSB2YWx1ZS48L2I+XCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiZGF0YS1saW5rLWljb24gZGF0YS1saW5rLXRleHQgZGF0YS1saW5rLWljb24tYWZ0ZXJcIiBkYXRhLWxpbmstJHtsaW5rLm5hbWV9PVwiJHtsaW5rLnZhbHVlfVwiPk5vdGU8L3NwYW4+IGhhcyBhdHRyaWJ1dGUgPGI+JHtsaW5rLm5hbWV9PC9iPiAke21hdGNoUHJldmlld1tsaW5rLm1hdGNoXX0gPGI+JHtsaW5rLnZhbHVlfTwvYj4uYDtcbiAgICB9XG4gICAgaWYgKCFsaW5rLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBcIjxiPlBsZWFzZSBjaG9vc2UgYSBwYXRoLjwvYj5cIlxuICAgIH1cbiAgICByZXR1cm4gYFRoZSBwYXRoIG9mIHRoZSA8c3BhbiBjbGFzcz1cImRhdGEtbGluay1pY29uIGRhdGEtbGluay10ZXh0IGRhdGEtbGluay1pY29uLWFmdGVyXCIgZGF0YS1saW5rLXBhdGg9XCIke2xpbmsudmFsdWV9XCI+bm90ZTwvc3Bhbj4gJHttYXRjaFByZXZpZXdQYXRoW2xpbmsubWF0Y2hdfSA8Yj4ke2xpbmsudmFsdWV9PC9iPmBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXkodGV4dEFyZWE6IEhUTUxFbGVtZW50LCBsaW5rOiBDU1NMaW5rLCBzZXR0aW5nczogU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5ncyk6IGJvb2xlYW4ge1xuICAgIGxldCB0b0Rpc3BsYXk6IHN0cmluZyA9IGRpc3BsYXlUZXh0KGxpbmssIHNldHRpbmdzKTtcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAobGluay50eXBlID09PSAndGFnJykge1xuICAgICAgICBpZiAoIWxpbmsudmFsdWUpIHtcbiAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChsaW5rLnR5cGUgPT09ICdhdHRyaWJ1dGUnKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy50YXJnZXRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFsaW5rLm5hbWUpIHtcbiAgICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbGluay52YWx1ZSl7XG4gICAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghbGluay52YWx1ZSkge1xuICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRleHRBcmVhLmlubmVySFRNTCA9IHRvRGlzcGxheTtcbiAgICByZXR1cm4gZGlzYWJsZWQ7XG59XG5cbmNsYXNzIENTU0J1aWxkZXJNb2RhbCBleHRlbmRzIE1vZGFsIHtcblxuICAgIHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3NcbiAgICBjc3NMaW5rOiBDU1NMaW5rXG4gICAgc2F2ZUNhbGxiYWNrOiAoY3NzTGluazogQ1NTTGluaykgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3MsIHNhdmVDYWxsYmFjazogKGNzc0xpbms6IENTU0xpbmspID0+IHZvaWQsIGNzc0xpbms6IENTU0xpbms9bnVsbCkge1xuICAgICAgICBzdXBlcihwbHVnaW4uYXBwKVxuICAgICAgICB0aGlzLmNzc0xpbmsgPSBjc3NMaW5rO1xuICAgICAgICBpZiAoIWNzc0xpbmspIHtcbiAgICAgICAgICAgIHRoaXMuY3NzTGluayA9IG5ldyBDU1NMaW5rKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgICAgIHRoaXMuc2F2ZUNhbGxiYWNrID0gc2F2ZUNhbGxiYWNrO1xuICAgIH1cblxuXG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KGBTZWxlY3Qgd2hhdCBsaW5rcyB0byBzdHlsZSFgKVxuICAgICAgICAvLyBpcyB0YWdcbiAgICAgICAgY29uc3QgbWF0Y2hBdHRyUGxhY2Vob2xkZXIgPSBcIkF0dHJpYnV0ZSB2YWx1ZSB0byBtYXRjaC5cIjtcbiAgICAgICAgY29uc3QgbWF0Y2hUYWdQbGFjZWhvbGRlciA9IFwiTm90ZSB0YWcgdG8gbWF0Y2ggKHdpdGhvdXQgIykuXCI7XG4gICAgICAgIGNvbnN0IG1hdGNoUGF0aFBsYWNlaG9sZGVyID0gXCJGaWxlIHBhdGggdG8gbWF0Y2guXCI7XG4gICAgICAgIGNvbnN0IG1hdGNoQXR0clR4dCA9IFwiQXR0cmlidXRlIHZhbHVlXCI7XG4gICAgICAgIGNvbnN0IG1hdGNoVGFnVHh0ID0gXCJUYWdcIjtcbiAgICAgICAgY29uc3QgbWF0Y2hQYXRoVHh0ID0gXCJQYXRoXCI7XG5cbiAgICAgICAgY29uc3QgY3NzTGluayA9IHRoaXMuY3NzTGluaztcbiAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5wbHVnaW47XG5cbiAgICAgICAgdGhpcy5jb250ZW50RWwuYWRkQ2xhc3MoXCJzdXBlcmNoYXJnZWQtbW9kYWxcIik7XG5cbiAgICAgICAgLy8gVHlwZVxuICAgICAgICBuZXcgU2V0dGluZyh0aGlzLmNvbnRlbnRFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiVHlwZSBvZiBzZWxlY3RvclwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJBdHRyaWJ1dGVzIHNlbGVjdHMgWUFNTCBhbmQgRGF0YVZpZXcgYXR0cmlidXRlc1wiICtcbiAgICAgICAgICAgICAgICBcIiwgdGFncyBjaG9vc2VzIHRoZSB0YWdzIG9mIGEgbm90ZSwgYW5kIHBhdGggY29uc2lkZXJzIHRoZSBuYW1lIG9mIHRoZSBub3RlIGluY2x1ZGluZyBpbiB3aGF0IGZvbGRlciBpdCBpcy5cIilcbiAgICAgICAgICAgIC5hZGREcm9wZG93bihkYyA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VsZWN0b3JUeXBlKS5mb3JFYWNoKCh0eXBlOiBTZWxlY3RvclR5cGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRjLmFkZE9wdGlvbih0eXBlLCBzZWxlY3RvclR5cGVbdHlwZV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gdGhpcy5jc3NMaW5rLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRjLnNldFZhbHVlKHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGMub25DaGFuZ2UoKHR5cGU6IFNlbGVjdG9yVHlwZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3NzTGluay50eXBlID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyKGNzc0xpbmsudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIHNhdmVCdXR0b24uc2V0RGlzYWJsZWQodXBkYXRlRGlzcGxheShwcmV2aWV3LCB0aGlzLmNzc0xpbmssIHRoaXMucGx1Z2luLnNldHRpbmdzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICBjb25zdCBhdHRyTmFtZSA9IG5ldyBTZXR0aW5nKHRoaXMuY29udGVudEVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJBdHRyaWJ1dGUgbmFtZVwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJXaGF0IGF0dHJpYnV0ZSB0byB0YXJnZXQ/IE1ha2Ugc3VyZSB0byBmaXJzdCBhZGQgdGFyZ2V0IGF0dHJpYnV0ZXMgdG8gdGhlIHNldHRpbmdzIGF0IHRoZSB0b3AhXCIpXG4gICAgICAgICAgICAuYWRkRHJvcGRvd24oZGMgPT4ge1xuICAgICAgICAgICAgICAgIHBsdWdpbi5zZXR0aW5ncy50YXJnZXRBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRjLmFkZE9wdGlvbihhdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IGNzc0xpbmsubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGMuc2V0VmFsdWUoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRjLm9uQ2hhbmdlKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjc3NMaW5rLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICBzYXZlQnV0dG9uLnNldERpc2FibGVkKHVwZGF0ZURpc3BsYXkocHJldmlldywgY3NzTGluaywgcGx1Z2luLnNldHRpbmdzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgLy8gYXR0cmlidXRlIHZhbHVlXG4gICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IG5ldyBTZXR0aW5nKHRoaXMuY29udGVudEVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJWYWx1ZSB0byBtYXRjaFwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJUT0RPXCIpXG4gICAgICAgICAgICAuYWRkVGV4dCh0ID0+IHtcbiAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGNzc0xpbmsudmFsdWUpO1xuICAgICAgICAgICAgICAgIHQub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzTGluay52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUJ1dHRvbi5zZXREaXNhYmxlZCh1cGRhdGVEaXNwbGF5KHByZXZpZXcsIGNzc0xpbmssIHBsdWdpbi5zZXR0aW5ncykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50RWwuY3JlYXRlRWwoJ2g0Jywge3RleHQ6ICdBZHZhbmNlZCd9KTtcbiAgICAgICAgLy8gbWF0Y2hpbmcgdHlwZVxuICAgICAgICBjb25zdCBtYXRjaGluZ1R5cGUgPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRlbnRFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiTWF0Y2hpbmcgdHlwZVwiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJIb3cgdG8gY29tcGFyZSB0aGUgYXR0cmlidXRlIG9yIHBhdGggd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXCIpXG4gICAgICAgICAgICAuYWRkRHJvcGRvd24oZGMgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG1hdGNoVHlwZXMpLmZvckVhY2goKGtleTogTWF0Y2hUeXBlcyk9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRjLmFkZE9wdGlvbihrZXksIG1hdGNoVHlwZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBjc3NMaW5rLm1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYy5zZXRWYWx1ZShrZXkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGRjLm9uQ2hhbmdlKCh2YWx1ZTogXCJleGFjdFwiIHwgXCJjb250YWluc1wiIHwgXCJzdGFydHN3aXRoXCIgfCBcImVuZHN3aXRoXCIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3NzTGluay5tYXRjaCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzYXZlQnV0dG9uLnNldERpc2FibGVkKHVwZGF0ZURpc3BsYXkocHJldmlldywgY3NzTGluaywgcGx1Z2luLnNldHRpbmdzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuXG5cbiAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZVRvZ2dsZXJDb250YWluZXIgPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRlbnRFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiQ2FzZSBzZW5zaXRpdmUgbWF0Y2hpbmdcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiU2hvdWxkIHRoZSBtYXRjaGluZyBvZiB0aGUgdmFsdWUgYmUgY2FzZSBzZW5zaXRpdmU/XCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKGIgPT4ge1xuICAgICAgICAgICAgICAgIGIuc2V0VmFsdWUoY3NzTGluay5tYXRjaENhc2VTZW5zaXRpdmUpO1xuICAgICAgICAgICAgICAgIGIub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjc3NMaW5rLm1hdGNoQ2FzZVNlbnNpdGl2ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBiLnNldERpc2FibGVkKHVwZGF0ZURpc3BsYXkocHJldmlldywgY3NzTGluaywgcGx1Z2luLnNldHRpbmdzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGlmICghdGhpcy5jc3NMaW5rLm5hbWUgJiYgdGhpcy5wbHVnaW4uc2V0dGluZ3MudGFyZ2V0QXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgIHRoaXMuY3NzTGluay5uYW1lID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudGFyZ2V0QXR0cmlidXRlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lciA9IGZ1bmN0aW9uKHR5cGU6IFNlbGVjdG9yVHlwZXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnYXR0cmlidXRlJykge1xuICAgICAgICAgICAgICAgIGF0dHJOYW1lLnNldHRpbmdFbC5zaG93KCk7XG4gICAgICAgICAgICAgICAgYXR0clZhbHVlLm5hbWVFbC5zZXRUZXh0KG1hdGNoQXR0clR4dCk7XG4gICAgICAgICAgICAgICAgYXR0clZhbHVlLmRlc2NFbC5zZXRUZXh0KG1hdGNoQXR0clBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ1R5cGUuc2V0dGluZ0VsLnNob3coKTtcbiAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlVG9nZ2xlckNvbnRhaW5lci5zZXR0aW5nRWwuc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3RhZycpIHtcbiAgICAgICAgICAgICAgICBhdHRyTmFtZS5zZXR0aW5nRWwuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5uYW1lRWwuc2V0VGV4dChtYXRjaFRhZ1R4dCk7XG4gICAgICAgICAgICAgICAgYXR0clZhbHVlLmRlc2NFbC5zZXRUZXh0KG1hdGNoVGFnUGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIG1hdGNoaW5nVHlwZS5zZXR0aW5nRWwuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmVUb2dnbGVyQ29udGFpbmVyLnNldHRpbmdFbC5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhdHRyTmFtZS5zZXR0aW5nRWwuaGlkZSgpO1xuICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5uYW1lRWwuc2V0VGV4dChtYXRjaFBhdGhUeHQpO1xuICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5kZXNjRWwuc2V0VGV4dChtYXRjaFBhdGhQbGFjZWhvbGRlcik7XG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdUeXBlLnNldHRpbmdFbC5zaG93KCk7XG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZVRvZ2dsZXJDb250YWluZXIuc2V0dGluZ0VsLnNob3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKHRoaXMuY29udGVudEVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJTdHlsZSBvcHRpb25zXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIldoYXQgc3R5bGluZyBvcHRpb25zIGFyZSBhY3RpdmU/IFwiICtcbiAgICAgICAgICAgICAgICBcIkRpc2FibGluZyBvcHRpb25zIHlvdSB3b24ndCB1c2UgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2Ugc2xpZ2h0bHkuXCIpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKHQgPT4ge1xuICAgICAgICAgICAgICAgIHQub25DaGFuZ2UodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjc3NMaW5rLnNlbGVjdFRleHQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoY3NzTGluay5zZWxlY3RUZXh0KTtcbiAgICAgICAgICAgICAgICB0LnNldFRvb2x0aXAoXCJTdHlsZSBsaW5rIHRleHRcIik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3NzTGluay5zZWxlY3RQcmVwZW5kID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGNzc0xpbmsuc2VsZWN0UHJlcGVuZCk7XG4gICAgICAgICAgICAgICAgdC5zZXRUb29sdGlwKFwiQWRkIGNvbnRlbnQgYmVmb3JlIGxpbmtcIik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3NzTGluay5zZWxlY3RBcHBlbmQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoY3NzTGluay5zZWxlY3RBcHBlbmQpO1xuICAgICAgICAgICAgICAgIHQuc2V0VG9vbHRpcChcIkFkZCBjb250ZW50IGFmdGVyIGxpbmtcIik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSh0ID0+IHtcbiAgICAgICAgICAgICAgICB0Lm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3NzTGluay5zZWxlY3RCYWNrZ3JvdW5kID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGNzc0xpbmsuc2VsZWN0QmFja2dyb3VuZCk7XG4gICAgICAgICAgICAgICAgdC5zZXRUb29sdGlwKFwiQWRkIG9wdGlvbmFsIGJhY2tncm91bmQgb3IgdW5kZXJsaW5lIHRvIGxpbmtcIik7XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdoNCcsIHt0ZXh0OiAnUmVzdWx0J30pO1xuICAgICAgICBjb25zdCBtb2RhbCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHNhdmVCdXR0b24gPSBuZXcgU2V0dGluZyh0aGlzLmNvbnRlbnRFbClcbiAgICAgICAgICAgIC5zZXROYW1lKFwiUHJldmlld1wiKVxuICAgICAgICAgICAgLnNldERlc2MoXCJcIilcbiAgICAgICAgICAgIC5hZGRCdXR0b24oYiA9PiB7XG4gICAgICAgICAgICAgICAgYi5zZXRCdXR0b25UZXh0KFwiU2F2ZVwiKVxuICAgICAgICAgICAgICAgIGIub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLnNhdmVDYWxsYmFjayhjc3NMaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBidXR0b25cblxuICAgICAgICBjb25zdCBwcmV2aWV3ID0gc2F2ZUJ1dHRvbi5uYW1lRWw7XG4gICAgICAgIHVwZGF0ZUNvbnRhaW5lcihjc3NMaW5rLnR5cGUpO1xuICAgICAgICBzYXZlQnV0dG9uLnNldERpc2FibGVkKHVwZGF0ZURpc3BsYXkocHJldmlldywgdGhpcy5jc3NMaW5rLCB0aGlzLnBsdWdpbi5zZXR0aW5ncykpO1xuICAgIH1cblxufVxuXG5leHBvcnQgeyBDU1NCdWlsZGVyTW9kYWwgfSIsImltcG9ydCB7Q1NTTGluaywgbWF0Y2hTaWdufSBmcm9tIFwiLi9jc3NMaW5rXCI7XG5pbXBvcnQgU3VwZXJjaGFyZ2VkTGlua3MgZnJvbSBcIi4uLy4uL21haW5cIjtcblxuXG5jb25zdCBjb2xvclNldCA9IFtbXG4gICAgJyMwMDg5QkEnLFxuICAgICcjMkM3M0QyJyxcbiAgICAnIzAwOEU5QicsXG4gICAgJyMwMDgxQ0YnLFxuICAgICcjMDA4RjdBJyxcbiAgICAnIzAwOEU5QicsXG5dLCBbXG4gICAgJyNENjVEQjEnLFxuICAgICcjMDA4MkMxJyxcbiAgICAnIzkyNzBEMycsXG4gICAgJyMwMDdGOTMnLFxuICAgICcjMDA3RUQ5JyxcbiAgICAnIzAwNzY2MCcsXG5dLCBbXG4gICAgJyNGRjk2NzEnLFxuICAgICcjQTM2QUFBJyxcbiAgICAnI0YyN0Q4OCcsXG4gICAgJyM2OTY3QTknLFxuICAgICcjRDI2RjlEJyxcbiAgICAnIzFiNjI5OScsXG5dLCBbXG4gICAgJyNGRkM3NUYnLFxuICAgICcjNEM5QTUyJyxcbiAgICAnI0MzQkI0RScsXG4gICAgJyMwMDg1NUInLFxuICAgICcjODhBQzRCJyxcbiAgICAnIzAwNkY2MScsXG5dLCBbXG4gICAgJyNGRjZGOTEnLFxuICAgICcjNkY3RjIyJyxcbiAgICAnI0UwNzI1MCcsXG4gICAgJyMyNTdBM0UnLFxuICAgICcjQUM3QzI2JyxcbiAgICAnIzAwNkY1RicsXG5dLCBbXG4gICAgJyNkOWQ4NjcnLFxuICAgICcjMkZBQjYzJyxcbiAgICAnI0I4RTA2NycsXG4gICAgJyMwMDhFNjMnLFxuICAgICcjNzhDNjY0JyxcbiAgICAnIzAwNzE2MCcsXG5dXTtcbmNvbnN0IGNvbG9yczogc3RyaW5nW10gPSBbXTtcbmZvciAoY29uc3QgaSBvZiBBcnJheSg2KS5rZXlzKCkpIHtcbiAgICBmb3IgKGNvbnN0IGogb2YgQXJyYXkoNikua2V5cygpKSB7XG4gICAgICAgIGNvbG9ycy5wdXNoKGNvbG9yU2V0W2pdW2ldKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhc2godWlkOiBzdHJpbmcpIHtcbiAgICBsZXQgaGFzaCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhciA9IHVpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaGFyO1xuICAgICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICAgIH1cbiAgICBoYXNoID0gTWF0aC5hYnMoaGFzaCk7XG4gICAgcmV0dXJuIGhhc2hcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ1NTKHNlbGVjdG9yczogQ1NTTGlua1tdLCBwbHVnaW46IFN1cGVyY2hhcmdlZExpbmtzKSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXCIvKiBXQVJOSU5HOiBUaGlzIGZpbGUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgcGx1Z2luLlwiLFxuICAgICAgICBcIkRvIG5vdCBlZGl0IHRoaXMgZmlsZSBkaXJlY3RseSEgRmlyc3QgY29weSB0aGlzIGZpbGUgYW5kIHJlbmFtZSBpdCBpZiB5b3Ugd2FudCB0byBlZGl0IHRoaW5ncy4gKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgXCI6cm9vdCB7XCJcbiAgICBdO1xuXG5cbiAgICBzZWxlY3RvcnMuZm9yRWFjaCgoc2VsZWN0b3IsIGkpID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdG9yLnNlbGVjdFRleHQpIHtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKGAgICAgLS0ke3NlbGVjdG9yLnVpZH0tY29sb3I6ICR7Y29sb3JzW2hhc2goc2VsZWN0b3IudWlkKSAlIDM2XX07YCk7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChgICAgIC0tJHtzZWxlY3Rvci51aWR9LXdlaWdodDogaW5pdGlhbDtgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0b3Iuc2VsZWN0UHJlcGVuZCkge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goYCAgICAtLSR7c2VsZWN0b3IudWlkfS1iZWZvcmU6ICcnO2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3Rvci5zZWxlY3RBcHBlbmQpIHtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKGAgICAgLS0ke3NlbGVjdG9yLnVpZH0tYWZ0ZXI6ICcnO2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3Rvci5zZWxlY3RCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChgICAgIC0tJHtzZWxlY3Rvci51aWR9LWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7YCk7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChgICAgIC0tJHtzZWxlY3Rvci51aWR9LWRlY29yYXRpb246IGluaXRpYWw7YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0cnVjdGlvbnMucHVzaChcIn1cIik7XG5cbiAgICBzZWxlY3RvcnMuZm9yRWFjaChzZWxlY3RvciA9PiB7XG4gICAgICAgIGxldCBjc3NTZWxlY3Rvcjogc3RyaW5nO1xuICAgICAgICBpZiAoc2VsZWN0b3IudHlwZSA9PT0gJ2F0dHJpYnV0ZScpIHtcbiAgICAgICAgICAgIGNzc1NlbGVjdG9yID0gYFtkYXRhLWxpbmstJHtzZWxlY3Rvci5uYW1lfSR7bWF0Y2hTaWduW3NlbGVjdG9yLm1hdGNoXX09XCIke3NlbGVjdG9yLnZhbHVlfVwiICR7c2VsZWN0b3IubWF0Y2hDYXNlU2Vuc2l0aXZlID9cIlwiIDogXCIgaVwifV1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnKSB7XG4gICAgICAgICAgICBjc3NTZWxlY3RvciA9IGBbZGF0YS1saW5rLXRhZ3MqPVwiJHtzZWxlY3Rvci52YWx1ZX1cIiBpXWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjc3NTZWxlY3RvciA9IGBbZGF0YS1saW5rLXBhdGgke21hdGNoU2lnbltzZWxlY3Rvci5tYXRjaF19PVwiJHtzZWxlY3Rvci52YWx1ZX1cIiAke3NlbGVjdG9yLm1hdGNoQ2FzZVNlbnNpdGl2ZSA/XCJcIiA6IFwiaVwifV1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yLnNlbGVjdFRleHQpIHtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLltcbiAgICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICAgIGBkaXZbZGF0YS1pZD1cIiR7c2VsZWN0b3IudWlkfVwiXSBkaXYuc2V0dGluZy1pdGVtLWRlc2NyaXB0aW9uLGAsXG4gICAgICAgICAgICAgICAgY3NzU2VsZWN0b3IgKyBcIiB7XCIsXG4gICAgICAgICAgICAgICAgYCAgICBjb2xvcjogdmFyKC0tJHtzZWxlY3Rvci51aWR9LWNvbG9yKSAhaW1wb3J0YW50O2AsXG4gICAgICAgICAgICAgICAgYCAgICBmb250LXdlaWdodDogdmFyKC0tJHtzZWxlY3Rvci51aWR9LXdlaWdodCk7YCxcbiAgICAgICAgICAgICAgICBcIn1cIl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3Rvci5zZWxlY3RCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5bXCJcIixcbiAgICAgICAgICAgICAgICBgLmMtJHtzZWxlY3Rvci51aWR9LXVzZS1iYWNrZ3JvdW5kIGRpdltkYXRhLWlkPVwiJHtzZWxlY3Rvci51aWR9XCJdIGRpdi5zZXR0aW5nLWl0ZW0tZGVzY3JpcHRpb24sYCxcbiAgICAgICAgICAgICAgICBgLmMtJHtzZWxlY3Rvci51aWR9LXVzZS1iYWNrZ3JvdW5kIC5kYXRhLWxpbmstdGV4dCR7Y3NzU2VsZWN0b3J9IHtgLFxuICAgICAgICAgICAgICAgIGAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tJHtzZWxlY3Rvci51aWR9LWJhY2tncm91bmQtY29sb3IpICFpbXBvcnRhbnQ7YCxcbiAgICAgICAgICAgICAgICBgICAgIGJvcmRlci1yYWRpdXM6IDVweDtgLFxuICAgICAgICAgICAgICAgIGAgICAgcGFkZGluZy1sZWZ0OiAycHg7YCxcbiAgICAgICAgICAgICAgICBgICAgIHBhZGRpbmctcmlnaHQ6IDJweDtgLFxuICAgICAgICAgICAgICAgIGAgICAgdGV4dC1kZWNvcmF0aW9uOiB2YXIoLS0ke3NlbGVjdG9yLnVpZH0tZGVjb3JhdGlvbikgIWltcG9ydGFudDtgLFxuICAgICAgICAgICAgICAgIFwifVwiXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdG9yLnNlbGVjdFByZXBlbmQpIHtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLltcIlwiLFxuICAgICAgICAgICAgICAgIGBkaXZbZGF0YS1pZD1cIiR7c2VsZWN0b3IudWlkfVwiXSBkaXYuc2V0dGluZy1pdGVtLWRlc2NyaXB0aW9uOjpiZWZvcmUsYCxcbiAgICAgICAgICAgICAgICBgLmRhdGEtbGluay1pY29uJHtjc3NTZWxlY3Rvcn06OmJlZm9yZSB7YCxcbiAgICAgICAgICAgICAgICBgICAgIGNvbnRlbnQ6IHZhcigtLSR7c2VsZWN0b3IudWlkfS1iZWZvcmUpO2AsXG4gICAgICAgICAgICAgICAgXCJ9XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0b3Iuc2VsZWN0QXBwZW5kKSB7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5bXCJcIixcbiAgICAgICAgICAgICAgICBgZGl2W2RhdGEtaWQ9XCIke3NlbGVjdG9yLnVpZH1cIl0gZGl2LnNldHRpbmctaXRlbS1kZXNjcmlwdGlvbjo6YWZ0ZXIsYCxcbiAgICAgICAgICAgICAgICBgLmRhdGEtbGluay1pY29uLWFmdGVyJHtjc3NTZWxlY3Rvcn06OmFmdGVyIHtgLFxuICAgICAgICAgICAgICAgIGAgICAgY29udGVudDogdmFyKC0tJHtzZWxlY3Rvci51aWR9LWFmdGVyKTtgLFxuICAgICAgICAgICAgICAgIFwifVwiXSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLltcbiAgICAgICAgXCIvKiBAc2V0dGluZ3NcIixcbiAgICAgICAgXCJuYW1lOiBTdXBlcmNoYXJnZWQgTGlua3NcIixcbiAgICAgICAgXCJpZDogc3VwZXJjaGFyZ2VkLWxpbmtzXCIsXG4gICAgICAgIFwic2V0dGluZ3M6XCIsXG4gICAgXSk7XG5cbiAgICBzZWxlY3RvcnMuZm9yRWFjaCgoc2VsZWN0b3IsIGkpID0+IHtcbiAgICAgICAgbGV0IG5hbWUgPSBzZWxlY3Rvci5uYW1lO1xuICAgICAgICBsZXQgdmFsdWUgPSBzZWxlY3Rvci52YWx1ZTtcbiAgICAgICAgaWYgKHNlbGVjdG9yLnR5cGUgPT09ICd0YWcnKSB7XG4gICAgICAgICAgICBuYW1lID0gJ3RhZyc7XG4gICAgICAgICAgICAvLyB2YWx1ZSA9IFwiXFwjXCIgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzZWxlY3Rvci50eXBlID09PSAncGF0aCcpe1xuICAgICAgICAgICAgbmFtZSA9ICdwYXRoJztcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5bXG4gICAgICAgICAgICBcIiAgICAtIFwiLFxuICAgICAgICAgICAgYCAgICAgICAgaWQ6ICR7c2VsZWN0b3IudWlkfWAsXG4gICAgICAgICAgICBgICAgICAgICB0aXRsZTogJHtuYW1lfSBpcyAke3ZhbHVlfWAsXG4gICAgICAgICAgICBgICAgICAgICBkZXNjcmlwdGlvbjogRXhhbXBsZSBub3RlYCxcbiAgICAgICAgICAgIFwiICAgICAgICB0eXBlOiBoZWFkaW5nXCIsXG4gICAgICAgICAgICBcIiAgICAgICAgY29sbGFwc2VkOiB0cnVlXCIsXG4gICAgICAgICAgICBcIiAgICAgICAgbGV2ZWw6IDNcIl0pO1xuICAgICAgICBpZiAoc2VsZWN0b3Iuc2VsZWN0VGV4dCkge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goLi4uW1xuICAgICAgICAgICAgICAgIFwiICAgIC0gXCIsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgaWQ6ICR7c2VsZWN0b3IudWlkfS1jb2xvcmAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgdGl0bGU6IExpbmsgY29sb3JgLFxuICAgICAgICAgICAgICAgIFwiICAgICAgICB0eXBlOiB2YXJpYWJsZS1jb2xvclwiLFxuICAgICAgICAgICAgICAgIFwiICAgICAgICBmb3JtYXQ6IGhleFwiLFxuICAgICAgICAgICAgICAgIGAgICAgICAgIGRlZmF1bHQ6ICcke2NvbG9yc1toYXNoKHNlbGVjdG9yLnVpZCkgJSAzNl19J2AsXG4gICAgICAgICAgICAgICAgXCIgICAgLSBcIixcbiAgICAgICAgICAgICAgICBgICAgICAgICBpZDogJHtzZWxlY3Rvci51aWR9LXdlaWdodGAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgdGl0bGU6IEZvbnQgd2VpZ2h0YCxcbiAgICAgICAgICAgICAgICBcIiAgICAgICAgdHlwZTogdmFyaWFibGUtc2VsZWN0XCIsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgZGVmYXVsdDogaW5pdGlhbGAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgb3B0aW9uczpgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgICAgICAtIGluaXRpYWxgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgICAgICAtIGxpZ2h0ZXJgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgICAgICAtIG5vcm1hbGAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgICAgIC0gYm9sZGAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgICAgIC0gYm9sZGVyYCxcbiAgICAgICAgICAgICAgICBcIiAgICAtIFwiLFxuICAgICAgICAgICAgICAgIGAgICAgICAgIGlkOiAke3NlbGVjdG9yLnVpZH0tZGVjb3JhdGlvbmAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgdGl0bGU6IEZvbnQgZGVjb3JhdGlvbmAsXG4gICAgICAgICAgICAgICAgXCIgICAgICAgIHR5cGU6IHZhcmlhYmxlLXNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIGAgICAgICAgIGRlZmF1bHQ6IGluaXRpYWxgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgIG9wdGlvbnM6YCxcbiAgICAgICAgICAgICAgICBgICAgICAgICAgICAgLSBpbml0aWFsYCxcbiAgICAgICAgICAgICAgICBgICAgICAgICAgICAgLSB1bmRlcmxpbmVgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgICAgICAtIG92ZXJsaW5lYCxcbiAgICAgICAgICAgICAgICBgICAgICAgICAgICAgLSBsaW5lLXRocm91Z2hgXSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0b3Iuc2VsZWN0UHJlcGVuZCkge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goLi4uW1wiICAgIC0gXCIsXG4gICAgICAgICAgICBgICAgICAgICBpZDogJHtzZWxlY3Rvci51aWR9LWJlZm9yZWAsXG4gICAgICAgICAgICBgICAgICAgICB0aXRsZTogUHJlcGVuZCB0ZXh0YCxcbiAgICAgICAgICAgIGAgICAgICAgIGRlc2NyaXB0aW9uOiBBZGQgc29tZSB0ZXh0LCBzdWNoIGFzIGFuIGVtb2ppLCBiZWZvcmUgdGhlIGxpbmtzLmAsXG4gICAgICAgICAgICBcIiAgICAgICAgdHlwZTogdmFyaWFibGUtdGV4dFwiLFxuICAgICAgICAgICAgYCAgICAgICAgZGVmYXVsdDogJydgLFxuICAgICAgICAgICAgYCAgICAgICAgcXVvdGVzOiB0cnVlYF0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdG9yLnNlbGVjdEFwcGVuZCkge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goLi4uW1wiICAgIC0gXCIsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgaWQ6ICR7c2VsZWN0b3IudWlkfS1hZnRlcmAsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgdGl0bGU6IEFwcGVuZCB0ZXh0YCxcbiAgICAgICAgICAgICAgICBgICAgICAgICBkZXNjcmlwdGlvbjogQWRkIHNvbWUgdGV4dCwgc3VjaCBhcyBhbiBlbW9qaSwgYWZ0ZXIgdGhlIGxpbmtzLmAsXG4gICAgICAgICAgICAgICAgXCIgICAgICAgIHR5cGU6IHZhcmlhYmxlLXRleHRcIixcbiAgICAgICAgICAgICAgICBgICAgICAgICBkZWZhdWx0OiAnJ2AsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgcXVvdGVzOiB0cnVlYF0pXG4gICAgICAgIH1cbiAgICAgICAgaWYoc2VsZWN0b3Iuc2VsZWN0QmFja2dyb3VuZCkge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goLi4uW1wiICAgIC0gXCIsXG4gICAgICAgICAgICAgICAgYCAgICAgICAgaWQ6IGMtJHtzZWxlY3Rvci51aWR9LXVzZS1iYWNrZ3JvdW5kYCxcbiAgICAgICAgICAgICAgICBgICAgICAgICB0aXRsZTogVXNlIGJhY2tncm91bmQgY29sb3JgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgIGRlc2NyaXB0aW9uOiBBZGRzIGEgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgbGluay4gVGhpcyBjYW4gbG9vayBidWdneSBpbiBsaXZlIHByZXZpZXcuYCxcbiAgICAgICAgICAgICAgICBcIiAgICAgICAgdHlwZTogY2xhc3MtdG9nZ2xlXCIsXG4gICAgICAgICAgICAgICAgXCIgICAgLSBcIixcbiAgICAgICAgICAgICAgICBgICAgICAgICBpZDogJHtzZWxlY3Rvci51aWR9LWJhY2tncm91bmQtY29sb3JgLFxuICAgICAgICAgICAgICAgIGAgICAgICAgIHRpdGxlOiBCYWNrZ3JvdW5kIGNvbG9yYCxcbiAgICAgICAgICAgICAgICBcIiAgICAgICAgdHlwZTogdmFyaWFibGUtY29sb3JcIixcbiAgICAgICAgICAgICAgICBcIiAgICAgICAgZm9ybWF0OiBoZXhcIixcbiAgICAgICAgICAgICAgICBgICAgICAgICBkZWZhdWx0OiAnI2ZmZmZmZidgXSlcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydWN0aW9ucy5wdXNoKFwiKi9cIik7XG5cbiAgICBjb25zdCB2YXVsdCA9IHBsdWdpbi5hcHAudmF1bHQ7XG4gICAgY29uc3QgY29uZmlnRGlyID0gdmF1bHQuY29uZmlnRGlyID8/IFwiLm9ic2lkaWFuXCI7XG4gICAgY29uc3QgcGF0aERpciA9IGNvbmZpZ0RpciArIFwiL3NuaXBwZXRzXCI7XG4gICAgYXdhaXQgdmF1bHQuYWRhcHRlci5ta2RpcihwYXRoRGlyKTtcbiAgICBjb25zdCBwYXRoID0gcGF0aERpciArIFwiL3N1cGVyY2hhcmdlZC1saW5rcy1nZW4uY3NzXCI7XG4gICAgaWYgKGF3YWl0IHZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICAgIGF3YWl0IHZhdWx0LmFkYXB0ZXIucmVtb3ZlKHBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCBpbnN0cnVjdGlvbnMuam9pbignXFxuJykpO1xuXG4gICAgLy8gQWN0aXZhdGUgc25pcHBldFxuICAgIGlmIChwbHVnaW4uc2V0dGluZ3MuYWN0aXZhdGVTbmlwcGV0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgY3VzdG9tQ3NzID0gcGx1Z2luLmFwcC5jdXN0b21Dc3M7XG4gICAgICAgIGN1c3RvbUNzcy5lbmFibGVkU25pcHBldHMuYWRkKCdzdXBlcmNoYXJnZWQtbGlua3MtZ2VuJyk7XG4gICAgICAgIGN1c3RvbUNzcy5yZXF1ZXN0TG9hZFNuaXBwZXRzKCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIFN0eWxlIFNldHRpbmdzIHJlYWRzIGNoYW5nZXNcbiAgICBwbHVnaW4uYXBwLndvcmtzcGFjZS50cmlnZ2VyKFwicGFyc2Utc3R5bGUtc2V0dGluZ3NcIik7XG59XG4iLCJpbXBvcnQgeyBBcHAsIGdldEFsbFRhZ3MsIGdldExpbmtwYXRoLCBMaW5rQ2FjaGUsIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsIE1hcmtkb3duVmlldywgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIlxuaW1wb3J0IHsgU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5ncyB9IGZyb20gXCJzcmMvc2V0dGluZ3MvU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5nc1wiXG5pbXBvcnQgU3VwZXJjaGFyZ2VkTGlua3MgZnJvbSBcIi4uLy4uL21haW5cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRXh0cmFBdHRyaWJ1dGVzKGxpbms6IEhUTUxFbGVtZW50KSB7XG4gICAgT2JqZWN0LnZhbHVlcyhsaW5rLmF0dHJpYnV0ZXMpLmZvckVhY2goYXR0ciA9PiB7XG4gICAgICAgIGlmIChhdHRyLm5hbWUuaW5jbHVkZXMoXCJkYXRhLWxpbmtcIikpIHtcbiAgICAgICAgICAgIGxpbmsucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgICAgfVxuICAgIH0pXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoVGFyZ2V0QXR0cmlidXRlc1N5bmMoYXBwOiBBcHAsIHNldHRpbmdzOiBTdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdzLCBkZXN0OiBURmlsZSwgYWRkRGF0YUhyZWY6IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBsZXQgbmV3X3Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyB0YWdzOiBcIlwiIH1cbiAgICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShkZXN0KVxuICAgIGlmICghY2FjaGUpIHJldHVybiBuZXdfcHJvcHM7XG5cbiAgICBjb25zdCBmcm9udG1hdHRlciA9IGNhY2hlLmZyb250bWF0dGVyXG5cbiAgICBpZiAoZnJvbnRtYXR0ZXIpIHtcbiAgICAgICAgc2V0dGluZ3MudGFyZ2V0QXR0cmlidXRlcy5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZnJvbnRtYXR0ZXIpLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSAndGFnJyB8fCBhdHRyaWJ1dGUgPT09ICd0YWdzJykge1xuICAgICAgICAgICAgICAgICAgICBuZXdfcHJvcHNbJ3RhZ3MnXSArPSBmcm9udG1hdHRlclthdHRyaWJ1dGVdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld19wcm9wc1thdHRyaWJ1dGVdID0gZnJvbnRtYXR0ZXJbYXR0cmlidXRlXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MudGFyZ2V0VGFncykge1xuICAgICAgICBuZXdfcHJvcHNbXCJ0YWdzXCJdICs9IGdldEFsbFRhZ3MoY2FjaGUpLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBpZiAoYWRkRGF0YUhyZWYpIHtcbiAgICAgICAgbmV3X3Byb3BzWydkYXRhLWhyZWYnXSA9IGRlc3QuYmFzZW5hbWU7XG4gICAgfVxuICAgIG5ld19wcm9wc1sncGF0aCddID0gZGVzdC5wYXRoO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnN0IGdldFJlc3VsdHMgPSAoYXBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhcGkucGFnZShkZXN0LnBhdGgpO1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy50YXJnZXRBdHRyaWJ1dGVzLmZvckVhY2goKGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFnZVtmaWVsZF07XG4gICAgICAgICAgICBpZiAodmFsdWUpIG5ld19wcm9wc1tmaWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgfSlcbiAgICB9O1xuXG4gICAgaWYgKHNldHRpbmdzLmdldEZyb21JbmxpbmVGaWVsZCAmJiBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMoXCJkYXRhdmlld1wiKSkge1xuICAgICAgICBjb25zdCBhcGkgPSBhcHAucGx1Z2lucy5wbHVnaW5zLmRhdGF2aWV3Py5hcGk7XG4gICAgICAgIGlmIChhcGkpIHtcbiAgICAgICAgICAgIGdldFJlc3VsdHMoYXBpKVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgICAgICAgICAgICAgdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbihcImRhdGF2aWV3OmFwaS1yZWFkeVwiLCAoYXBpOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIGdldFJlc3VsdHMoYXBpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld19wcm9wc1xufVxuXG5mdW5jdGlvbiBzZXRMaW5rTmV3UHJvcHMobGluazogSFRNTEVsZW1lbnQsIG5ld19wcm9wczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBmb3IgKGNvbnN0IGEgb2YgbGluay5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmIChhLm5hbWUuaW5jbHVkZXMoXCJkYXRhLWxpbmtcIikgJiYgIShhLm5hbWUgaW4gbmV3X3Byb3BzKSkge1xuICAgICAgICAgICAgbGluay5yZW1vdmVBdHRyaWJ1dGUoYS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYmplY3Qua2V5cyhuZXdfcHJvcHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFwiZGF0YS1saW5rLVwiICsga2V5O1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld19wcm9wc1trZXldO1xuICAgICAgICBjb25zdCBjdXJWYWx1ZSA9IGxpbmsuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIHZhbHVlIGlzIGRpZmZlcmVudFxuICAgICAgICBpZiAoIW5ld1ZhbHVlIHx8IGN1clZhbHVlICE9IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZShcImRhdGEtbGluay1cIiArIGtleSwgbmV3X3Byb3BzW2tleV0pXG4gICAgICAgICAgICBpZiAobmV3X3Byb3BzW2tleV0/LnN0YXJ0c1dpdGggJiYgKG5ld19wcm9wc1trZXldLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCBuZXdfcHJvcHNba2V5XS5zdGFydHNXaXRoKCdkYXRhOicpKSkge1xuICAgICAgICAgICAgICAgIGxpbmsuc3R5bGUuc2V0UHJvcGVydHkoYC0tZGF0YS1saW5rLSR7a2V5fWAsIGB1cmwoJHtuZXdfcHJvcHNba2V5XX0pYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmsuc3R5bGUuc2V0UHJvcGVydHkoYC0tZGF0YS1saW5rLSR7a2V5fWAsIG5ld19wcm9wc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghbGluay5oYXNDbGFzcyhcImRhdGEtbGluay1pY29uXCIpKSB7XG4gICAgICAgIGxpbmsuYWRkQ2xhc3MoXCJkYXRhLWxpbmstaWNvblwiKTtcbiAgICB9XG4gICAgaWYgKCFsaW5rLmhhc0NsYXNzKFwiZGF0YS1saW5rLWljb24tYWZ0ZXJcIikpIHtcbiAgICAgICAgbGluay5hZGRDbGFzcyhcImRhdGEtbGluay1pY29uLWFmdGVyXCIpO1xuICAgIH1cbiAgICBpZiAoIWxpbmsuaGFzQ2xhc3MoXCJkYXRhLWxpbmstdGV4dFwiKSkge1xuICAgICAgICBsaW5rLmFkZENsYXNzKFwiZGF0YS1saW5rLXRleHRcIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rRXh0cmFBdHRyaWJ1dGVzKGFwcDogQXBwLCBzZXR0aW5nczogU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5ncywgbGluazogSFRNTEVsZW1lbnQsIGRlc3ROYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaW5rSHJlZiA9IGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykuc3BsaXQoJyMnKVswXTtcbiAgICBjb25zdCBkZXN0ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua0hyZWYsIGRlc3ROYW1lKTtcblxuICAgIGlmIChkZXN0KSB7XG4gICAgICAgIGNvbnN0IG5ld19wcm9wcyA9IGZldGNoVGFyZ2V0QXR0cmlidXRlc1N5bmMoYXBwLCBzZXR0aW5ncywgZGVzdCwgZmFsc2UpO1xuICAgICAgICBzZXRMaW5rTmV3UHJvcHMobGluaywgbmV3X3Byb3BzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaXZFeHRyYUF0dHJpYnV0ZXMoYXBwOiBBcHAsIHNldHRpbmdzOiBTdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdzLCBsaW5rOiBIVE1MRWxlbWVudCwgZGVzdE5hbWU6IHN0cmluZywgbGlua05hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAobGluay5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpLmNvbnRhaW5zKCdtb2QtY29sbGFwc2libGUnKSkgcmV0dXJuOyAvLyBCb29rbWFya3MgRm9sZGVyXG4gICAgaWYgKCFsaW5rTmFtZSkge1xuICAgICAgICBsaW5rTmFtZSA9IGxpbmsudGV4dENvbnRlbnQ7XG4gICAgfVxuICAgIGlmICghIWxpbmsucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGF0aCcpKSB7XG4gICAgICAgIC8vIEZpbGUgQnJvd3NlclxuICAgICAgICBsaW5rTmFtZSA9IGxpbmsucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGF0aCcpO1xuICAgIH0gZWxzZSBpZiAobGluay5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpID09IFwic3VnZ2VzdGlvbi1jb250ZW50XCIgJiYgISFsaW5rLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgICAvLyBBdXRvIGNvbXBsZXRlXG4gICAgICAgIGxpbmtOYW1lID0gbGluay5uZXh0RWxlbWVudFNpYmxpbmcudGV4dENvbnRlbnQgKyBsaW5rTmFtZTtcbiAgICB9XG4gICAgY29uc3QgZGVzdCA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKGxpbmtOYW1lKSwgZGVzdE5hbWUpXG5cbiAgICBpZiAoZGVzdCkge1xuICAgICAgICBjb25zdCBuZXdfcHJvcHMgPSBmZXRjaFRhcmdldEF0dHJpYnV0ZXNTeW5jKGFwcCwgc2V0dGluZ3MsIGRlc3QsIHRydWUpO1xuICAgICAgICBzZXRMaW5rTmV3UHJvcHMobGluaywgbmV3X3Byb3BzKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUVsTGlua3MoYXBwOiBBcHAsIHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3MsIGVsOiBIVE1MRWxlbWVudCwgY3R4OiBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0KSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBwbHVnaW4uc2V0dGluZ3M7XG4gICAgY29uc3QgbGlua3MgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCdhLmludGVybmFsLWxpbmsnKTtcbiAgICBjb25zdCBkZXN0TmFtZSA9IGN0eC5zb3VyY2VQYXRoLnJlcGxhY2UoLyguKikubWQvLCBcIiQxXCIpO1xuICAgIGxpbmtzLmZvckVhY2goKGxpbms6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIHVwZGF0ZUxpbmtFeHRyYUF0dHJpYnV0ZXMoYXBwLCBzZXR0aW5ncywgbGluaywgZGVzdE5hbWUpO1xuICAgIH0pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzUGFuZShwcm9wZXJ0aWVzRWw6IEhUTUxFbGVtZW50LCBmaWxlOiBURmlsZSwgYXBwOiBBcHAsIHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3MpIHtcbiAgICBjb25zdCBmcm9udG1hdHRlciA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZpbGUucGF0aCk/LmZyb250bWF0dGVyO1xuICAgIGlmKCEhZnJvbnRtYXR0ZXIpIHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBwcm9wZXJ0aWVzRWwucXVlcnlTZWxlY3RvckFsbChcImRpdi5pbnRlcm5hbC1saW5rID4gLm11bHRpLXNlbGVjdC1waWxsLWNvbnRlbnRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBsaW5rVGV4dCA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICAgICAgY29uc3Qga2V5RWwgPSBlbC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5RWwudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBsaXN0T2ZMaW5rczogW3N0cmluZ10gPSBmcm9udG1hdHRlcltrZXldO1xuICAgICAgICAgICAgbGV0IGZvdW5kUyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIWxpc3RPZkxpbmtzKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgbGlzdE9mTGlua3MpIHtcbiAgICAgICAgICAgICAgICBpZiAocy5sZW5ndGggPiA0ICYmIHMuc3RhcnRzV2l0aChcIltbXCIpICYmIHMuZW5kc1dpdGgoXCJdXVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzbGljZWRTID0gcy5zbGljZSgyLCAtMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gc2xpY2VkUy5zcGxpdChcInxcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdC5sZW5ndGggPT0gMSAmJiBzcGxpdFswXSA9PSBsaW5rVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTID0gc3BsaXRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcGxpdC5sZW5ndGggPT0gMiAmJiBzcGxpdFsxXSA9PSBsaW5rVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTID0gc3BsaXRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIWZvdW5kUykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZURpdkV4dHJhQXR0cmlidXRlcyhwbHVnaW4uYXBwLCBwbHVnaW4uc2V0dGluZ3MsIGVsLCBcIlwiLCBmb3VuZFMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpbmdsZU5vZGVzID0gcHJvcGVydGllc0VsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJkaXYubWV0YWRhdGEtbGluay1pbm5lclwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaW5nbGVOb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBzaW5nbGVOb2Rlc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtUZXh0ID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBrZXlFbCA9IGVsLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5RWwudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBsaW5rOiBzdHJpbmcgPSBmcm9udG1hdHRlcltrZXldO1xuICAgICAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZm91bmRTOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGxpbms/Lmxlbmd0aCA+IDQgJiYgbGluay5zdGFydHNXaXRoKFwiW1tcIikgJiYgbGluay5lbmRzV2l0aChcIl1dXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpY2VkUyA9IGxpbmsuc2xpY2UoMiwgLTIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0gc2xpY2VkUy5zcGxpdChcInxcIik7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA9PSAxICYmIHNwbGl0WzBdID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kUyA9IHNwbGl0WzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BsaXQubGVuZ3RoID09IDIgJiYgc3BsaXRbMV0gPT0gbGlua1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRTID0gc3BsaXRbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEhZm91bmRTKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRGl2RXh0cmFBdHRyaWJ1dGVzKHBsdWdpbi5hcHAsIHBsdWdpbi5zZXR0aW5ncywgZWwsIFwiXCIsIGZvdW5kUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZpc2libGVMaW5rcyhhcHA6IEFwcCwgcGx1Z2luOiBTdXBlcmNoYXJnZWRMaW5rcykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gcGx1Z2luLnNldHRpbmdzO1xuICAgIGFwcC53b3Jrc3BhY2UuaXRlcmF0ZVJvb3RMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgaWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyAmJiBsZWFmLnZpZXcuZmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZTogVEZpbGUgPSBsZWFmLnZpZXcuZmlsZTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZEZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSk7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbGVhZi52aWV3Py5tZXRhZGF0YUVkaXRvcj8uY29udGVudEVsO1xuICAgICAgICAgICAgaWYgKCEhbWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzUGFuZShtZXRhZGF0YSwgZmlsZSwgYXBwLCBwbHVnaW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHRhYkhlYWRlcjogSFRNTEVsZW1lbnQgPSBsZWFmLnRhYkhlYWRlcklubmVyVGl0bGVFbDtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5lbmFibGVUYWJIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBTdXBlcmNoYXJnZSB0YWIgaGVhZGVyc1xuICAgICAgICAgICAgICAgIHVwZGF0ZURpdkV4dHJhQXR0cmlidXRlcyhhcHAsIHNldHRpbmdzLCB0YWJIZWFkZXIsIFwiXCIsIGZpbGUucGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGVhckV4dHJhQXR0cmlidXRlcyh0YWJIZWFkZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkRmlsZT8ubGlua3MpIHtcbiAgICAgICAgICAgICAgICBjYWNoZWRGaWxlLmxpbmtzLmZvckVhY2goKGxpbms6IExpbmtDYWNoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGZpbGUucGF0aC5yZXBsYWNlKC8oLiopLm1kLywgXCIkMVwiKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGluay5saW5rLCBmaWxlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld19wcm9wcyA9IGZldGNoVGFyZ2V0QXR0cmlidXRlc1N5bmMoYXBwLCBzZXR0aW5ncywgZGVzdCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbExpbmtzID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoYGEuaW50ZXJuYWwtbGlua1tocmVmPVwiJHtsaW5rLmxpbmt9XCJdYClcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsTGlua3MuZm9yRWFjaCgoaW50ZXJuYWxMaW5rOiBIVE1MRWxlbWVudCkgPT4gc2V0TGlua05ld1Byb3BzKGludGVybmFsTGluaywgbmV3X3Byb3BzKSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuIiwiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBkZWJvdW5jZSB9IGZyb20gXCJvYnNpZGlhblwiXG5pbXBvcnQgU3VwZXJjaGFyZ2VkTGlua3MgZnJvbSBcIm1haW5cIlxuaW1wb3J0IHsgQ1NTQnVpbGRlck1vZGFsLCB1cGRhdGVEaXNwbGF5IH0gZnJvbSBcIi4uL2Nzc0J1aWxkZXIvY3NzQnVpbGRlck1vZGFsXCI7XG5pbXBvcnQgeyBidWlsZENTUyB9IGZyb20gXCIuLi9jc3NCdWlsZGVyL2Nzc0J1aWxkZXJcIjtcbmltcG9ydCB7dXBkYXRlVmlzaWJsZUxpbmtzfSBmcm9tIFwiLi4vbGlua0F0dHJpYnV0ZXMvbGlua0F0dHJpYnV0ZXNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cdHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3M7XG5cdGRlYm91bmNlZEdlbmVyYXRlOiBGdW5jdGlvbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTdXBlcmNoYXJnZWRMaW5rcykge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0XHR0aGlzLmRlYm91bmNlZEdlbmVyYXRlID0gZGVib3VuY2UodGhpcy5fZ2VuZXJhdGVTbmlwcGV0LCAxMDAwLCB0cnVlKTtcblx0XHQvLyBHZW5lcmF0ZSBDU1MgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gMSBzZWNvbmQgLSBmZWVscyBsYWdneVxuXHRcdHRoaXMuX2dlbmVyYXRlU25pcHBldCgpO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHQvKiBNYW5hZ2luZyBleHRyYSBhdHRpcmJ1dGVzIGZvciBhLmludGVybmFsLWxpbmsgKi9cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdUYXJnZXQgQXR0cmlidXRlcyBmb3Igc3R5bGluZycpXG5cdFx0XHQuc2V0RGVzYygnRnJvbnRtYXR0ZXIgYXR0cmlidXRlcyB0byB0YXJnZXQsIGNvbW1hIHNlcGFyYXRlZCcpXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcblx0XHRcdFx0dGV4dFxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignRW50ZXIgYXR0cmlidXRlcyBhcyBzdHJpbmcsIGNvbW1hIHNlcGFyYXRlZCcpXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhcmdldEF0dHJpYnV0ZXMuam9pbignLCAnKSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50YXJnZXRBdHRyaWJ1dGVzID0gdmFsdWUucmVwbGFjZSgvXFxzL2csICcnKS5zcGxpdCgnLCcpO1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLnRhcmdldEF0dHJpYnV0ZXMubGVuZ3RoID09PSAxICYmICF0aGlzLnBsdWdpbi5zZXR0aW5ncy50YXJnZXRBdHRyaWJ1dGVzWzBdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRhcmdldEF0dHJpYnV0ZXMgPSBbXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdHRleHQuaW5wdXRFbC5yb3dzID0gNjtcblx0XHRcdFx0dGV4dC5pbnB1dEVsLmNvbHMgPSAyNTtcblx0XHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnU3R5bGluZycgfSk7XG5cdFx0Y29uc3Qgc3R5bGVTZXR0aW5nRGVzY3JpcHRpb24gPSBjb250YWluZXJFbC5jcmVhdGVEaXYoKTtcblx0XHRzdHlsZVNldHRpbmdEZXNjcmlwdGlvbi5pbm5lckhUTUwgPSBgXG5TdHlsaW5nIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBTdHlsZSBTZXR0aW5ncyBwbHVnaW4uIFxuIDxvbD5cbiA8bGk+Q3JlYXRlIHNlbGVjdG9ycyBkb3duIGJlbG93LjwvbGk+XG4gPGxpPkdvIHRvIHRoZSBTdHlsZSBTZXR0aW5ncyB0YWIgYW5kIHN0eWxlIHlvdXIgbGlua3MhPC9saT5cbjwvb2w+YFxuXHRcdGNvbnN0IHNlbGVjdG9yRGl2ID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KCk7XG5cdFx0dGhpcy5kcmF3U2VsZWN0b3JzKHNlbGVjdG9yRGl2KTtcblxuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnU2V0dGluZ3MnIH0pO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBpbiBFZGl0b3InKVxuXHRcdFx0LnNldERlc2MoJ0lmIHRydWUsIHRoaXMgd2lsbCBhbHNvIHN1cGVyY2hhcmdlIGludGVybmFsIGxpbmtzIGluIHRoZSBlZGl0b3IgdmlldyBvZiBhIG5vdGUuJylcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUVkaXRvcilcblx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKHZhbHVlID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVFZGl0b3IgPSB2YWx1ZVxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG5cdFx0XHRcdFx0dXBkYXRlVmlzaWJsZUxpbmtzKGFwcCwgdGhpcy5wbHVnaW4pO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBpbiB0YWIgaGVhZGVycycpXG5cdFx0XHQuc2V0RGVzYygnSWYgdHJ1ZSwgdGhpcyB3aWxsIGFsc28gc3VwZXJjaGFyZ2UgdGhlIGhlYWRlcnMgb2YgYSB0YWIuJylcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZVRhYkhlYWRlcilcblx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKHZhbHVlID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVUYWJIZWFkZXIgPSB2YWx1ZVxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG5cdFx0XHRcdFx0dXBkYXRlVmlzaWJsZUxpbmtzKGFwcCwgdGhpcy5wbHVnaW4pO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBpbiBGaWxlIEJyb3dzZXInKVxuXHRcdFx0LnNldERlc2MoJ0lmIHRydWUsIHRoaXMgd2lsbCBhbHNvIHN1cGVyY2hhcmdlIHRoZSBmaWxlIGJyb3dzZXIuJylcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVMaXN0KVxuXHRcdFx0XHR0b2dnbGUub25DaGFuZ2UodmFsdWUgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVMaXN0ID0gdmFsdWVcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0VuYWJsZSBpbiBQbHVnaW5zJylcblx0XHRcdC5zZXREZXNjKCdJZiB0cnVlLCB0aGlzIHdpbGwgYWxzbyBzdXBlcmNoYXJnZSBwbHVnaW5zIGxpa2UgdGhlIGJhY2tsaW5rcyBhbmQgZm9yd2FyZCBsaW5rcyBwYW5lbHMuJylcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUJhY2tsaW5rcylcblx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKHZhbHVlID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVCYWNrbGlua3MgPSB2YWx1ZVxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRW5hYmxlIGluIFF1aWNrIFN3aXRjaGVyJylcblx0XHRcdC5zZXREZXNjKCdJZiB0cnVlLCB0aGlzIHdpbGwgYWxzbyBzdXBlcmNoYXJnZSB0aGUgcXVpY2sgc3dpdGNoZXIuJylcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZVF1aWNrU3dpdGNoZXIpXG5cdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZSh2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlUXVpY2tTd2l0Y2hlciA9IHZhbHVlXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdFbmFibGUgaW4gTGluayBBdXRvY29tcGxldGVyJylcblx0XHRcdC5zZXREZXNjKCdJZiB0cnVlLCB0aGlzIHdpbGwgYWxzbyBzdXBlcmNoYXJnZSB0aGUgbGluayBhdXRvY29tcGxldGVyLicpXG5cdFx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVTdWdnZXN0b3IpXG5cdFx0XHRcdHRvZ2dsZS5vbkNoYW5nZSh2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlU3VnZ2VzdG9yID0gdmFsdWVcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2g0JywgeyB0ZXh0OiAnQWR2YW5jZWQnIH0pO1xuXHRcdC8vIE1hbmFnaW5nIGNob2ljZSB3ZXRoZXIgeW91IHdhbnQgdG8gcGFyc2UgdGFncyBib3RoIGZyb20gbm9ybWFsIHRhZ3MgYW5kIGluIHRoZSBmcm9udG1hdHRlclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1BhcnNlIGFsbCB0YWdzIGluIHRoZSBmaWxlJylcblx0XHRcdC5zZXREZXNjKCdTZXRzIHRoZSBgZGF0YS1saW5rLXRhZ3NgLWF0dHJpYnV0ZSB0byBsb29rIGZvciB0YWdzIGJvdGggaW4gdGhlIGZyb250bWF0dGVyIGFuZCBpbiB0aGUgZmlsZSBhcyAjdGFnLW5hbWUnKVxuXHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGFyZ2V0VGFncylcblx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50YXJnZXRUYWdzID0gdmFsdWVcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pXG5cblx0XHQvLyBNYW5hZ2luZyBjaG9pY2Ugd2V0aGVyIHlvdSBnZXQgYXR0cmlidXRlcyBmcm9tIGlubGluZSBmaWVsZHMgYW5kIGZyb250bWF0dGVyIG9yIG9ubHkgZnJvbnRtYXRlclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1NlYXJjaCBmb3IgYXR0cmlidXRlIGluIElubGluZSBmaWVsZHMgbGlrZSA8ZmllbGQ6Oj4nKVxuXHRcdFx0LnNldERlc2MoJ1NldHMgdGhlIGBkYXRhLWxpbmstPGZpZWxkPmAtYXR0cmlidXRlIHRvIHRoZSB2YWx1ZSBvZiBpbmxpbmUgZmllbGRzJylcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmdldEZyb21JbmxpbmVGaWVsZClcblx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5nZXRGcm9tSW5saW5lRmllbGQgPSB2YWx1ZVxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBBdXRvbWF0aWNhbGx5IGFjdGl2YXRlIHNuaXBwZXRcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdBdXRvbWF0aWNhbGx5IGFjdGl2YXRlIHNuaXBwZXQnKVxuXHRcdFx0LnNldERlc2MoJ0lmIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlIHRoZSBnZW5lcmF0ZWQgQ1NTIHNuaXBwZXQgXCJzdXBlcmNoYXJnZWQtbGlua3MtZ2VuLmNzc1wiLiAnICtcblx0XHRcdFx0J1R1cm4gdGhpcyBvZmYgaWYgeW91IGRvblxcJ3Qgd2FudCB0aGlzIHRvIGhhcHBlbi4nKVxuXHRcdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYWN0aXZhdGVTbmlwcGV0KVxuXHRcdFx0XHR0b2dnbGUub25DaGFuZ2UoYXN5bmMgdmFsdWUgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFjdGl2YXRlU25pcHBldCA9IHZhbHVlXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdC8qIE1hbmFnaW5nIHByZWRlZmluZWQgdmFsdWVzIGZvciBwcm9wZXJ0aWVzICovXG5cdFx0LyogTWFuYWdlIG1lbnUgb3B0aW9ucyBkaXNwbGF5Ki9cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKFwiRGlzcGxheSBmaWVsZCBvcHRpb25zIGluIGNvbnRleHQgbWVudVwiKVxuXHRcdFx0LnNldERlc2MoXCJUaGlzIGZlYXR1cmUgaGFzIGJlZW4gbWlncmF0ZWQgdG8gbWV0YWRhdGEtbWVudSBwbHVnaW4gaHR0cHM6Ly9naXRodWIuY29tL21kZWxvYmVsbGUvbWV0YWRhdGFtZW51XCIpXG5cdH1cblxuXHRnZW5lcmF0ZVNuaXBwZXQoKSB7XG5cdFx0dGhpcy5kZWJvdW5jZWRHZW5lcmF0ZSgpO1xuXHR9XG5cblx0YXN5bmMgX2dlbmVyYXRlU25pcHBldCgpIHtcblx0XHRhd2FpdCBidWlsZENTUyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RvcnMsIHRoaXMucGx1Z2luKTtcblx0XHQvLyBuZXcgTm90aWNlKFwiR2VuZXJhdGVkIHN1cGVyY2hhcmdlZC1saW5rcy1nZW4uY3NzXCIpO1xuXHR9XG5cblx0ZHJhd1NlbGVjdG9ycyhkaXY6IEhUTUxFbGVtZW50KSB7XG5cdFx0ZGl2LmVtcHR5KCk7XG5cdFx0dGhpcy5nZW5lcmF0ZVNuaXBwZXQoKTtcblx0XHRjb25zdCBzZWxlY3RvcnMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RvcnM7XG5cdFx0c2VsZWN0b3JzLmZvckVhY2goKHNlbGVjdG9yLCBpKSA9PiB7XG5cdFx0XHRjb25zdCBzID0gbmV3IFNldHRpbmcoZGl2KVxuXHRcdFx0XHQuYWRkQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb2xkU2VsZWN0b3IgPSBzZWxlY3RvcnNbaSArIDFdO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3JzW2kgKyAxXSA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3JzW2ldID0gb2xkU2VsZWN0b3I7XG5cdFx0XHRcdFx0XHR0aGlzLmRyYXdTZWxlY3RvcnMoZGl2KTtcblxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiZG93bi1hcnJvdy13aXRoLXRhaWxcIik7XG5cdFx0XHRcdFx0YnV0dG9uLnNldFRvb2x0aXAoXCJNb3ZlIHNlbGVjdG9yIGRvd25cIik7XG5cdFx0XHRcdFx0aWYgKGkgPT09IHNlbGVjdG9ycy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRidXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuYWRkQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb2xkU2VsZWN0b3IgPSBzZWxlY3RvcnNbaSAtIDFdO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3JzW2kgLSAxXSA9IHNlbGVjdG9yO1xuXHRcdFx0XHRcdFx0c2VsZWN0b3JzW2ldID0gb2xkU2VsZWN0b3I7XG5cdFx0XHRcdFx0XHR0aGlzLmRyYXdTZWxlY3RvcnMoZGl2KTtcblxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwidXAtYXJyb3ctd2l0aC10YWlsXCIpO1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRUb29sdGlwKFwiTW92ZSBzZWxlY3RvciB1cFwiKTtcblx0XHRcdFx0XHRpZiAoaSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0YnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmFkZEJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGZvcm1Nb2RhbCA9IG5ldyBDU1NCdWlsZGVyTW9kYWwodGhpcy5wbHVnaW4sIChuZXdTZWxlY3RvcikgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RvcnNbaV0gPSBuZXdTZWxlY3Rvcjtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZURpc3BsYXkocy5uYW1lRWwsIHNlbGVjdG9yLCB0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2VuZXJhdGVTbmlwcGV0KCk7XG5cdFx0XHRcdFx0XHR9LCBzZWxlY3Rvcik7XG5cdFx0XHRcdFx0XHRmb3JtTW9kYWwub3BlbigpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwicGVuY2lsXCIpO1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRUb29sdGlwKFwiRWRpdCBzZWxlY3RvclwiKVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuYWRkQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2VsZWN0b3JzLnJlbW92ZShzZWxlY3Rvcik7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdHRoaXMuZHJhd1NlbGVjdG9ycyhkaXYpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiY3Jvc3NcIik7XG5cdFx0XHRcdFx0YnV0dG9uLnNldFRvb2x0aXAoXCJSZW1vdmUgc2VsZWN0b3JcIik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0dXBkYXRlRGlzcGxheShzLm5hbWVFbCwgc2VsZWN0b3IsIHRoaXMucGx1Z2luLnNldHRpbmdzKTtcblx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGRpdilcblx0XHRcdC5zZXROYW1lKFwiTmV3IHNlbGVjdG9yXCIpXG5cdFx0XHQuc2V0RGVzYyhcIkNyZWF0ZSBhIG5ldyBzZWxlY3RvciB0byBzdHlsZSB3aXRoIFN0eWxlIFNldHRpbmdzLlwiKVxuXHRcdFx0LmFkZEJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRidXR0b24ub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZm9ybU1vZGFsID0gbmV3IENTU0J1aWxkZXJNb2RhbCh0aGlzLnBsdWdpbiwgKG5ld1NlbGVjdG9yKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zZWxlY3RvcnMucHVzaChuZXdTZWxlY3Rvcik7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdHRoaXMuZHJhd1NlbGVjdG9ycyhkaXYpO1xuXHRcdFx0XHRcdFx0Ly8gVE9ETzogRm9yY2UgcmVkcmF3IHNvbWVob3c/XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Zm9ybU1vZGFsLm9wZW4oKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJ1dHRvbi5zZXRCdXR0b25UZXh0KFwiTmV3XCIpO1xuXHRcdFx0fSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENTU0xpbmsgfSBmcm9tIFwiLi4vY3NzQnVpbGRlci9jc3NMaW5rXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5ncyB7XG5cdHRhcmdldEF0dHJpYnV0ZXM6IEFycmF5PHN0cmluZz47XG5cdHRhcmdldFRhZ3M6IGJvb2xlYW47XG5cdGdldEZyb21JbmxpbmVGaWVsZDogYm9vbGVhbjtcblx0YWN0aXZhdGVTbmlwcGV0OiBib29sZWFuO1xuXHRlbmFibGVFZGl0b3I6IGJvb2xlYW47XG5cdGVuYWJsZVRhYkhlYWRlcjogYm9vbGVhbjtcblx0ZW5hYmxlRmlsZUxpc3Q6IGJvb2xlYW47XG5cdGVuYWJsZUJhY2tsaW5rczogYm9vbGVhbjtcblx0ZW5hYmxlUXVpY2tTd2l0Y2hlcjogYm9vbGVhbjtcblx0ZW5hYmxlU3VnZ2VzdG9yOiBib29sZWFuO1xuXHRzZWxlY3RvcnM6IENTU0xpbmtbXTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFN1cGVyY2hhcmdlZExpbmtzU2V0dGluZ3MgPSB7XG5cdHRhcmdldEF0dHJpYnV0ZXM6IFtdLFxuXHR0YXJnZXRUYWdzOiB0cnVlLFxuXHRnZXRGcm9tSW5saW5lRmllbGQ6IHRydWUsXG5cdGVuYWJsZVRhYkhlYWRlcjogdHJ1ZSxcblx0YWN0aXZhdGVTbmlwcGV0OiB0cnVlLFxuXHRlbmFibGVFZGl0b3I6IHRydWUsXG5cdGVuYWJsZUZpbGVMaXN0OiB0cnVlLFxuXHRlbmFibGVCYWNrbGlua3M6IHRydWUsXG5cdGVuYWJsZVF1aWNrU3dpdGNoZXI6IHRydWUsXG5cdGVuYWJsZVN1Z2dlc3RvcjogdHJ1ZSxcblx0c2VsZWN0b3JzOiBbXVxufSIsImltcG9ydCB7QXBwLCBkZWJvdW5jZSwgRGVib3VuY2VyLCBlZGl0b3JWaWV3RmllbGQsIE1hcmtkb3duVmlldywgVEZpbGV9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHtTdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdzfSBmcm9tIFwiLi4vc2V0dGluZ3MvU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5nc1wiO1xuaW1wb3J0IHtEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3LCBWaWV3UGx1Z2luLCBWaWV3VXBkYXRlLCBXaWRnZXRUeXBlfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuaW1wb3J0IHtSYW5nZVNldCwgUmFuZ2VTZXRCdWlsZGVyfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7c3ludGF4VHJlZX0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XG5pbXBvcnQge3Rva2VuQ2xhc3NOb2RlUHJvcH0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XG5pbXBvcnQge2ZldGNoVGFyZ2V0QXR0cmlidXRlc1N5bmN9IGZyb20gXCIuL2xpbmtBdHRyaWJ1dGVzXCI7XG5pbXBvcnQge0RlZmF1bHRGdW5jdGlvbnN9IGZyb20gXCJvYnNpZGlhbi1kYXRhdmlldy9saWIvZXhwcmVzc2lvbi9mdW5jdGlvbnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ01WaWV3UGx1Z2luKGFwcDogQXBwLCBfc2V0dGluZ3M6IFN1cGVyY2hhcmdlZExpbmtzU2V0dGluZ3MpXG57XG4gICAgLy8gSW1wbGVtZW50cyB0aGUgbGl2ZSBwcmV2aWV3IHN1cGVyY2hhcmdpbmdcbiAgICAvLyBDb2RlIHN0cnVjdHVyZSBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbm90aGluZ2lzbG9zdC9vYnNpZGlhbi1jbTYtYXR0cmlidXRlcy9ibG9iLzc0M2Q3MWIwYWE2MTY0MDcxNDlhMGI2ZWE1ZmZlYTI4ZTIxNTQxNTgvc3JjL21haW4udHNcbiAgICAvLyBDb2RlIGhlbHAgY3JlZGl0cyB0byBATm90aGluZ0lzTG9zdCEgVGhleSBoYXZlIGJlZW4gYSBncmVhdCBoZWxwIGdldHRpbmcgdGhpcyB0byB3b3JrIHByb3Blcmx5LlxuICAgIGNsYXNzIEhlYWRlcldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICAgICAgICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgICAgIGFmdGVyOiBib29sZWFuXG5cbiAgICAgICAgY29uc3RydWN0b3IoYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgYWZ0ZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICB0aGlzLmFmdGVyID0gYWZ0ZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHRvRE9NKCkge1xuICAgICAgICAgICAgbGV0IGhlYWRlckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICBoZWFkZXJFbC5zZXRBdHRycyh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIC8vIENTUyBkb2Vzbid0IGFsbG93IGludGVycG9sYXRpb24gb2YgdmFyaWFibGVzIGZvciBVUkxzLCBzbyBkbyBpdCBiZWZvcmVoYW5kIHRvIGJlIG5pY2UuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlc1trZXldPy5zdGFydHNXaXRoICYmICh0aGlzLmF0dHJpYnV0ZXNba2V5XS5zdGFydHNXaXRoKCdodHRwJykgfHwgdGhpcy5hdHRyaWJ1dGVzW2tleV0uc3RhcnRzV2l0aCgnZGF0YTonKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyRWwuc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgYHVybCgke3RoaXMuYXR0cmlidXRlc1trZXldfSlgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbC5zdHlsZS5zZXRQcm9wZXJ0eShgLS0ke2tleX1gLCB0aGlzLmF0dHJpYnV0ZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJFbC5hZGRDbGFzcygnZGF0YS1saW5rLWljb24tYWZ0ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhlYWRlckVsLmFkZENsYXNzKCdkYXRhLWxpbmstaWNvbicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjcmVhdGUgYSBuYWl2ZSBicmVhZCBjcnVtYlxuICAgICAgICAgICAgcmV0dXJuIGhlYWRlckVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWdub3JlRXZlbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gX3NldHRpbmdzO1xuICAgIGNvbnN0IHZpZXdQbHVnaW4gPSBWaWV3UGx1Z2luLmZyb21DbGFzcyhcbiAgICAgICAgY2xhc3Mge1xuICAgICAgICAgICAgZGVjb3JhdGlvbnM6IERlY29yYXRpb25TZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHZpZXc6IEVkaXRvclZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY29yYXRpb25zKHZpZXcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGlvbnMgPSB0aGlzLmRlY29yYXRpb25zLm1hcCh1cGRhdGUuY2hhbmdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlLmNoYW5nZXMuaXRlckNoYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IsIHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgJ2xpbmUgYmxvY2tzJyBiZXR3ZWVuIHRoZSByYW5nZSBjaGFuZ2VkLiBQcmV2ZW50cyB3ZWlyZCBncmFwaGljYWwgYnVnc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluRnJvbSA9IHVwZGF0ZS52aWV3LmxpbmVCbG9ja0F0KGZyb21CKS5mcm9tO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4VG8gPSB1cGRhdGUudmlldy5saW5lQmxvY2tBdCh0b0IpLnRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoaW5ncyB3aXRoaW4gYm91bmRzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5kZWNvcmF0aW9ucy51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogKGZyb20sIHRvKSA9PiB0byA8IG1pbkZyb20gfHwgZnJvbSA+IG1heFRvfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWNvcmF0aW9ucyB3aXRoaW4gYm91bmRzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gUmFuZ2VTZXQuam9pbihbdGhpcy5kZWNvcmF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRGVjb3JhdGlvbnModXBkYXRlLnZpZXcsIG1pbkZyb20sIG1heFRvKV0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodXBkYXRlLnZpZXdwb3J0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5idWlsZERlY29yYXRpb25zKHVwZGF0ZS52aWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJ1aWxkRGVjb3JhdGlvbnModmlldzogRWRpdG9yVmlldywgdXBkYXRlRnJvbTogbnVtYmVyID0gLTEsIHVwZGF0ZVRvOiBudW1iZXI9LTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4oKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmVuYWJsZUVkaXRvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWRWaWV3ID0gdmlldy5zdGF0ZS5maWVsZChlZGl0b3JWaWV3RmllbGQpIGFzIE1hcmtkb3duVmlldztcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICBsZXQgaWNvbkRlY29BZnRlcjogRGVjb3JhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGljb25EZWNvQWZ0ZXJXaGVyZTogbnVtYmVyID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGxldCBtZEFsaWFzRnJvbTogbnVtYmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgbWRBbGlhc1RvOiBudW1iZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHtmcm9tLCB0b30gb2Ygdmlldy52aXNpYmxlUmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXBkYXRpbmcsIG9ubHkgY2hhbmdlcyB0aGUgcmFuZ2UgZ2l2ZW4uXG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVGcm9tICE9PSAtMSAmJiAodG8gPCB1cGRhdGVGcm9tIHx8IGZyb20gPiB1cGRhdGVUbykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBzeW50YXhUcmVlKHZpZXcuc3RhdGUpLml0ZXJhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXI6IChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUZyb20gIT09IC0xICYmIChub2RlLnRvIDwgdXBkYXRlRnJvbSB8fCBub2RlLmZyb20gPiB1cGRhdGVUbykpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlblByb3BzID0gbm9kZS50eXBlLnByb3AodG9rZW5DbGFzc05vZGVQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5Qcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IG5ldyBTZXQodG9rZW5Qcm9wcy5zcGxpdChcIiBcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNxdWFyZSBCcmFja2V0cyBvZiBsaW5rcyBib3RoIGludGVybmFsIChgW1tgLCBgXV1gKSBhbmQgbWQgbGluayAoYFtgLCBgXWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTURGb3JtYXR0aW5nID0gcHJvcHMuaGFzKCdmb3JtYXR0aW5nLWxpbmsnKSB8fCBwcm9wcy5oYXMoJ2Zvcm1hdHRpbmctbGluay1zdHJpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTURGb3JtYXR0aW5nKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFydHMgb2YgaW50ZXJuYWwgbGlua3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNMaW5rID0gcHJvcHMuaGFzKFwiaG1kLWludGVybmFsLWxpbmtcIik7IC8vIFtbYE5vdGVgIG9yIGB8YCBvciBgQWxpYXNgXV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBbGlhcyA9IHByb3BzLmhhcyhcImxpbmstYWxpYXNcIik7IC8vIFtbTm90ZXwgYEFsaWFzYF1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUGlwZSA9IHByb3BzLmhhcyhcImxpbmstYWxpYXMtcGlwZVwiKTsgLy8gW1tOb3RlIGB8YCBBbGlhc11dXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlICdhbGlhcycgb2YgdGhlIG1kIGxpbmsgKG9yIGl0cyBicmFja2V0cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNRExpbmsgPSBwcm9wcy5oYXMoJ2xpbmsnKTsgLy8gYFtgIG9yIGBBbGlhc2Agb3IgYF1gKFVSTClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlICdpbnRlcm5hbCBsaW5rJyBvZiB0aGUgbWQgbGluayAob3IgaXRzIGJyYWNrZXRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc01EVXJsID0gcHJvcHMuaGFzKCd1cmwnKTsgLy8gW0FsaWFzXWAoYCBvciBgVVJMYCBvciBgKWBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNNRExpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB0aGUgYWxpYXMgb2YgbWQgbGlua3MgaS5lLiBbIGBBbGlhc2AgXShVUkwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCBhcHBseSB0aGUgc3R5bGluZyBpbiB0aGUgbmV4dCBpdGVyYXRpb24gd2hlbiB3ZSBhbmFseXplIHRoZSBgVVJMYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRBbGlhc0Zyb20gPSBub2RlLmZyb207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZEFsaWFzVG8gPSBub2RlLnRvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BpcGUgJiYgIWlzQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpY29uRGVjb0FmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoaWNvbkRlY29BZnRlcldoZXJlLCBpY29uRGVjb0FmdGVyV2hlcmUsIGljb25EZWNvQWZ0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25EZWNvQWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25EZWNvQWZ0ZXJXaGVyZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGluayAmJiAhaXNBbGlhcyAmJiAhaXNQaXBlIHx8IGlzTURVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rVGV4dCA9IHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKG5vZGUuZnJvbSwgbm9kZS50byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0LnNwbGl0KFwiI1wiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua1RleHQsIG1kVmlldy5maWxlLmJhc2VuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01EVXJsICYmICFmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZGVjb2RlVVJJQ29tcG9uZW50KGxpbmtUZXh0KSkgYXMgVEZpbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfYXR0cmlidXRlcyA9IGZldGNoVGFyZ2V0QXR0cmlidXRlc1N5bmMoYXBwLCBzZXR0aW5ncywgZmlsZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gX2F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1tcImRhdGEtbGluay1cIiArIGtleV0gPSBfYXR0cmlidXRlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjbyA9IERlY29yYXRpb24ubWFyayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcImRhdGEtbGluay10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvbkRlY29CZWZvcmUgPSBEZWNvcmF0aW9uLndpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldDogbmV3IEhlYWRlcldpZGdldChhdHRyaWJ1dGVzLCBmYWxzZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkRlY29BZnRlciA9IERlY29yYXRpb24ud2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0OiBuZXcgSGVhZGVyV2lkZ2V0KGF0dHJpYnV0ZXMsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTURVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcmV0cm9hY3RpdmVseSB0byB0aGUgYWxpYXMgZm91bmQgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWNvID0gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogXCJkYXRhLWxpbmstdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG1kQWxpYXNGcm9tLCBtZEFsaWFzRnJvbSwgaWNvbkRlY29CZWZvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChtZEFsaWFzRnJvbSwgbWRBbGlhc1RvLCBkZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljb25EZWNvQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG1kQWxpYXNUbywgbWRBbGlhc1RvLCBpY29uRGVjb0FmdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25EZWNvQWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkRlY29BZnRlcldoZXJlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kQWxpYXNGcm9tID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kQWxpYXNUbyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChub2RlLmZyb20sIG5vZGUuZnJvbSwgaWNvbkRlY29CZWZvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG5vZGUuZnJvbSwgbm9kZS50bywgZGVjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25EZWNvQWZ0ZXJXaGVyZSA9IG5vZGUudG87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNMaW5rICYmIGlzQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWNvID0gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBsYXN0QXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogXCJkYXRhLWxpbmstdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG5vZGUuZnJvbSwgbm9kZS50bywgZGVjbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWNvbkRlY29BZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKG5vZGUudG8sIG5vZGUudG8sIGljb25EZWNvQWZ0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25EZWNvQWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25EZWNvQWZ0ZXJXaGVyZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZmluaXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGRlY29yYXRpb25zOiB2ID0+IHYuZGVjb3JhdGlvbnNcbiAgICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHZpZXdQbHVnaW47XG59XG4iLCJpbXBvcnQge1BsdWdpbiwgZGVib3VuY2UsIFRGaWxlfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBTdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdUYWIgZnJvbSBcInNyYy9zZXR0aW5ncy9TdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdUYWJcIlxyXG5pbXBvcnQge1xyXG5cdHVwZGF0ZUVsTGlua3MsXHJcblx0dXBkYXRlVmlzaWJsZUxpbmtzLFxyXG5cdGNsZWFyRXh0cmFBdHRyaWJ1dGVzLFxyXG5cdHVwZGF0ZURpdkV4dHJhQXR0cmlidXRlcywgdXBkYXRlUHJvcGVydGllc1BhbmUsXHJcbn0gZnJvbSBcInNyYy9saW5rQXR0cmlidXRlcy9saW5rQXR0cmlidXRlc1wiXHJcbmltcG9ydCB7IFN1cGVyY2hhcmdlZExpbmtzU2V0dGluZ3MsIERFRkFVTFRfU0VUVElOR1MgfSBmcm9tIFwic3JjL3NldHRpbmdzL1N1cGVyY2hhcmdlZExpbmtzU2V0dGluZ3NcIlxyXG5pbXBvcnQgeyBQcmVjIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XHJcbmltcG9ydCB7IGJ1aWxkQ01WaWV3UGx1Z2luIH0gZnJvbSBcIi4vc3JjL2xpbmtBdHRyaWJ1dGVzL2xpdmVQcmV2aWV3XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdXBlcmNoYXJnZWRMaW5rcyBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFN1cGVyY2hhcmdlZExpbmtzU2V0dGluZ3M7XHJcblx0c2V0dGluZ1RhYjogU3VwZXJjaGFyZ2VkTGlua3NTZXR0aW5nVGFiXHJcblx0cHJpdmF0ZSBvYnNlcnZlcnM6IFtNdXRhdGlvbk9ic2VydmVyLCBzdHJpbmcsIHN0cmluZ11bXTtcclxuXHRwcml2YXRlIG1vZGFsT2JzZXJ2ZXJzOiBNdXRhdGlvbk9ic2VydmVyW10gPSBbXTtcclxuXHJcblx0YXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc29sZS5sb2coJ1N1cGVyY2hhcmdlZCBsaW5rcyBsb2FkZWQnKTtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTdXBlcmNoYXJnZWRMaW5rc1NldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93blBvc3RQcm9jZXNzb3IoKGVsLCBjdHgpID0+IHtcclxuXHRcdFx0dXBkYXRlRWxMaW5rcyh0aGlzLmFwcCwgdGhpcywgZWwsIGN0eClcclxuXHRcdH0pO1xyXG5cclxuXHRcdGNvbnN0IHBsdWdpbiA9IHRoaXM7XHJcblx0XHRjb25zdCB1cGRhdGVMaW5rcyA9IGZ1bmN0aW9uKF9maWxlOiBURmlsZSkge1xyXG5cdFx0XHR1cGRhdGVWaXNpYmxlTGlua3MocGx1Z2luLmFwcCwgcGx1Z2luKTtcclxuXHRcdFx0cGx1Z2luLm9ic2VydmVycy5mb3JFYWNoKChbb2JzZXJ2ZXIsIHR5cGUsIG93bl9jbGFzc10pID0+IHtcclxuXHRcdFx0XHRjb25zdCBsZWF2ZXMgPSBwbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUodHlwZSk7XHJcblx0XHRcdFx0bGVhdmVzLmZvckVhY2gobGVhZiA9PiB7XHJcblx0XHRcdFx0XHRwbHVnaW4udXBkYXRlQ29udGFpbmVyKGxlYWYudmlldy5jb250YWluZXJFbCwgcGx1Z2luLCBvd25fY2xhc3MpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExpdmUgcHJldmlld1xyXG5cdFx0Y29uc3QgZXh0ID0gUHJlYy5sb3dlc3QoYnVpbGRDTVZpZXdQbHVnaW4odGhpcy5hcHAsIHRoaXMuc2V0dGluZ3MpKTtcclxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oZXh0KTtcclxuXHJcblx0XHR0aGlzLm9ic2VydmVycyA9IFtdO1xyXG5cclxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcclxuXHRcdFx0dGhpcy5pbml0Vmlld09ic2VydmVycyh0aGlzKTtcclxuXHRcdFx0dGhpcy5pbml0TW9kYWxPYnNlcnZlcnModGhpcywgZG9jdW1lbnQpO1xyXG5cdFx0XHR1cGRhdGVWaXNpYmxlTGlua3ModGhpcy5hcHAsIHRoaXMpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gSW5pdGlhbGl6YXRpb25cclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJ3aW5kb3ctb3BlblwiLCAod2luZG93LCB3aW4pID0+IHRoaXMuaW5pdE1vZGFsT2JzZXJ2ZXJzKHRoaXMsIHdpbmRvdy5nZXRDb250YWluZXIoKS5kb2MpKSk7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHdoZW5cclxuXHRcdC8vIERlYm91bmNlZCB0byBwcmV2ZW50IGxhZyB3aGVuIHdyaXRpbmdcclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdjaGFuZ2VkJywgZGVib3VuY2UodXBkYXRlTGlua3MsIDUwMCwgdHJ1ZSkpKTtcclxuXHJcblx0XHQvLyBVcGRhdGUgd2hlbiBsYXlvdXQgY2hhbmdlc1xyXG5cdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImxheW91dC1jaGFuZ2VcIiwgZGVib3VuY2UodXBkYXRlTGlua3MsIDEwLCB0cnVlKSkpO1xyXG5cdFx0Ly8gVXBkYXRlIHBsdWdpbiB2aWV3cyB3aGVuIGxheW91dCBjaGFuZ2VzXHJcblx0XHQvLyBUT0RPOiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gdGhhdCBzZWVtcyBsaWtlIGl0IGlzIGNhbGxlZCBmYWlybHkgZnJlcXVlbnRseS4gTWF5YmUgd2UgY2FuIGRvIHRoaXMgbW9yZSBlZmZpY2llbnRseT9cclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsICgpID0+IHRoaXMuaW5pdFZpZXdPYnNlcnZlcnModGhpcykpKTtcclxuXHR9XHJcblxyXG5cdGluaXRWaWV3T2JzZXJ2ZXJzKHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3MpIHtcclxuXHRcdC8vIFJlc2V0IG9ic2VydmVyc1xyXG5cdFx0cGx1Z2luLm9ic2VydmVycy5mb3JFYWNoKChbb2JzZXJ2ZXIsIHR5cGVdKSA9PiB7XHJcblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuXHRcdH0pO1xyXG5cdFx0cGx1Z2luLm9ic2VydmVycyA9IFtdO1xyXG5cclxuXHRcdC8vIFJlZ2lzdGVyIG5ldyBvYnNlcnZlcnNcclxuXHRcdHBsdWdpbi5yZWdpc3RlclZpZXdUeXBlKCdiYWNrbGluaycsIHBsdWdpbiwgXCIudHJlZS1pdGVtLWlubmVyXCIsIHRydWUpO1xyXG5cdFx0cGx1Z2luLnJlZ2lzdGVyVmlld1R5cGUoJ291dGdvaW5nLWxpbmsnLCBwbHVnaW4sIFwiLnRyZWUtaXRlbS1pbm5lclwiLCB0cnVlKTtcclxuXHRcdHBsdWdpbi5yZWdpc3RlclZpZXdUeXBlKCdzZWFyY2gnLCBwbHVnaW4sIFwiLnRyZWUtaXRlbS1pbm5lclwiKTtcclxuXHRcdHBsdWdpbi5yZWdpc3RlclZpZXdUeXBlKCdCQy1tYXRyaXgnLCBwbHVnaW4sICcuQkMtTGluaycpO1xyXG5cdFx0cGx1Z2luLnJlZ2lzdGVyVmlld1R5cGUoJ0JDLWR1Y2tzJywgcGx1Z2luLCAnLmludGVybmFsLWxpbmsnKTtcclxuXHRcdHBsdWdpbi5yZWdpc3RlclZpZXdUeXBlKCdCQy10cmVlJywgcGx1Z2luLCAnYS5pbnRlcm5hbC1saW5rJyk7XHJcblx0XHRwbHVnaW4ucmVnaXN0ZXJWaWV3VHlwZSgnZ3JhcGgtYW5hbHlzaXMnLCBwbHVnaW4sICcuaW50ZXJuYWwtbGluaycpO1xyXG5cdFx0cGx1Z2luLnJlZ2lzdGVyVmlld1R5cGUoJ3N0YXJyZWQnLCBwbHVnaW4sICcubmF2LWZpbGUtdGl0bGUtY29udGVudCcpO1xyXG5cdFx0cGx1Z2luLnJlZ2lzdGVyVmlld1R5cGUoJ2ZpbGUtZXhwbG9yZXInLCBwbHVnaW4sICcubmF2LWZpbGUtdGl0bGUtY29udGVudCcpO1xyXG5cdFx0cGx1Z2luLnJlZ2lzdGVyVmlld1R5cGUoJ3JlY2VudC1maWxlcycsIHBsdWdpbiwgJy5uYXYtZmlsZS10aXRsZS1jb250ZW50Jyk7XHJcblx0XHRwbHVnaW4ucmVnaXN0ZXJWaWV3VHlwZSgnYm9va21hcmtzJywgcGx1Z2luLCAnLnRyZWUtaXRlbS1pbm5lcicpO1xyXG5cdFx0Ly8gSWYgYmFja2xpbmtzIGluIGVkaXRvciBpcyBvblxyXG5cdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0aWYgKHBsdWdpbi5hcHA/LmludGVybmFsUGx1Z2lucz8ucGx1Z2lucz8uYmFja2xpbms/Lmluc3RhbmNlPy5vcHRpb25zPy5iYWNrbGlua0luRG9jdW1lbnQpIHtcclxuXHRcdFx0cGx1Z2luLnJlZ2lzdGVyVmlld1R5cGUoJ21hcmtkb3duJywgcGx1Z2luLCAnLnRyZWUtaXRlbS1pbm5lcicsIHRydWUpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcHJvcGVydHlMZWF2ZXMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwiZmlsZS1wcm9wZXJ0aWVzXCIpO1xyXG5cdFx0IGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlMZWF2ZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0IGNvbnN0IGNvbnRhaW5lciA9IHByb3BlcnR5TGVhdmVzW2ldLnZpZXcuY29udGFpbmVyRWw7XHJcblx0XHRcdCBsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigocmVjb3JkcywgXykgPT57XHJcblx0XHRcdFx0IGNvbnN0IGZpbGUgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcclxuXHRcdFx0XHQgaWYgKCEhZmlsZSkge1xyXG5cdFx0XHRcdFx0IHVwZGF0ZVByb3BlcnRpZXNQYW5lKGNvbnRhaW5lciwgYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCksIGFwcCwgcGx1Z2luKTtcclxuXHRcdFx0XHQgfVxyXG5cdFx0XHQgfSk7XHJcblx0XHRcdCBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lciwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgYXR0cmlidXRlczogZmFsc2V9KTtcclxuXHRcdFx0IHBsdWdpbi5vYnNlcnZlcnMucHVzaChbb2JzZXJ2ZXIsIFwiZmlsZS1wcm9wZXJ0aWVzXCIgKyBpLCBcIlwiXSk7XHJcblx0XHRcdCAvLyBUT0RPOiBObyBwcm9wZXIgdW5sb2FkaW5nIVxyXG5cdFx0IH1cclxuXHRcdHBsdWdpbi5yZWdpc3RlclZpZXdUeXBlKCdmaWxlLXByb3BlcnRpZXMnLCBwbHVnaW4sICdkaXYuaW50ZXJuYWwtbGluayA+IC5tdWx0aS1zZWxlY3QtcGlsbC1jb250ZW50Jyk7XHJcblx0fVxyXG5cclxuXHRpbml0TW9kYWxPYnNlcnZlcnMocGx1Z2luOiBTdXBlcmNoYXJnZWRMaW5rcywgZG9jOiBEb2N1bWVudCkge1xyXG5cdFx0Y29uc3QgY29uZmlnID0ge1xyXG5cdFx0XHRzdWJ0cmVlOiBmYWxzZSxcclxuXHRcdFx0Y2hpbGRMaXN0OiB0cnVlLFxyXG5cdFx0XHRhdHRyaWJ1dGVzOiBmYWxzZVxyXG5cdFx0fTtcclxuXHJcblx0XHR0aGlzLm1vZGFsT2JzZXJ2ZXJzLnB1c2gobmV3IE11dGF0aW9uT2JzZXJ2ZXIocmVjb3JkcyA9PiB7XHJcblx0XHRcdHJlY29yZHMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcclxuXHRcdFx0XHRpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcpIHtcclxuXHRcdFx0XHRcdG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChuID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKCdjbGFzc05hbWUnIGluIG4gJiZcclxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0XHRcdFx0KG4uY2xhc3NOYW1lLmluY2x1ZGVzKCdtb2RhbC1jb250YWluZXInKSAmJiBwbHVnaW4uc2V0dGluZ3MuZW5hYmxlUXVpY2tTd2l0Y2hlclxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRcdFx0XHRcdFx0fHwgbi5jbGFzc05hbWUuaW5jbHVkZXMoJ3N1Z2dlc3Rpb24tY29udGFpbmVyJykgJiYgcGx1Z2luLnNldHRpbmdzLmVuYWJsZVN1Z2dlc3RvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgc2VsZWN0b3IgPSBcIi5zdWdnZXN0aW9uLXRpdGxlLCAuc3VnZ2VzdGlvbi1ub3RlLCAuYW5vdGhlci1xdWljay1zd2l0Y2hlcl9faXRlbV9fdGl0bGUsIC5vbW5pc2VhcmNoLXJlc3VsdF9fdGl0bGVcIjtcclxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0XHRcdFx0aWYgKG4uY2xhc3NOYW1lLmluY2x1ZGVzKCdzdWdnZXN0aW9uLWNvbnRhaW5lcicpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3RvciA9IFwiLnN1Z2dlc3Rpb24tdGl0bGUsIC5zdWdnZXN0aW9uLW5vdGVcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cGx1Z2luLnVwZGF0ZUNvbnRhaW5lcihuIGFzIEhUTUxFbGVtZW50LCBwbHVnaW4sIHNlbGVjdG9yKTtcclxuXHRcdFx0XHRcdFx0XHRwbHVnaW4uX3dhdGNoQ29udGFpbmVyKG51bGwsIG4gYXMgSFRNTEVsZW1lbnQsIHBsdWdpbiwgc2VsZWN0b3IpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSkpO1xyXG5cdFx0dGhpcy5tb2RhbE9ic2VydmVycy5sYXN0KCkub2JzZXJ2ZShkb2MuYm9keSwgY29uZmlnKTtcclxuXHR9XHJcblxyXG5cdHJlZ2lzdGVyVmlld1R5cGUodmlld1R5cGVOYW1lOiBzdHJpbmcsIHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3MsIHNlbGVjdG9yOiBzdHJpbmcsIHVwZGF0ZUR5bmFtaWMgPSBmYWxzZSkge1xyXG5cdFx0Y29uc3QgbGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZSh2aWV3VHlwZU5hbWUpO1xyXG5cdFx0Ly8gaWYgKGxlYXZlcy5sZW5ndGggPiAxKSB7XHJcblx0XHQgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWF2ZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0IGNvbnN0IGNvbnRhaW5lciA9IGxlYXZlc1tpXS52aWV3LmNvbnRhaW5lckVsO1xyXG5cdFx0XHQgaWYgKHVwZGF0ZUR5bmFtaWMpIHtcclxuXHRcdFx0XHQgcGx1Z2luLl93YXRjaENvbnRhaW5lckR5bmFtaWModmlld1R5cGVOYW1lICsgaSwgY29udGFpbmVyLCBwbHVnaW4sIHNlbGVjdG9yKVxyXG5cdFx0XHQgfVxyXG5cdFx0XHQgZWxzZSB7XHJcblx0XHRcdFx0IHBsdWdpbi5fd2F0Y2hDb250YWluZXIodmlld1R5cGVOYW1lICsgaSwgY29udGFpbmVyLCBwbHVnaW4sIHNlbGVjdG9yKTtcclxuXHRcdFx0IH1cclxuXHRcdCB9XHJcblx0XHQvLyB9XHJcblx0XHQvLyBlbHNlIGlmIChsZWF2ZXMubGVuZ3RoIDwgMSkgcmV0dXJuO1xyXG5cdFx0Ly8gZWxzZSB7XHJcblx0XHQvLyBcdGNvbnN0IGNvbnRhaW5lciA9IGxlYXZlc1swXS52aWV3LmNvbnRhaW5lckVsO1xyXG5cdFx0Ly8gXHR0aGlzLnVwZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIHBsdWdpbiwgc2VsZWN0b3IpO1xyXG5cdFx0Ly8gXHRpZiAodXBkYXRlRHluYW1pYykge1xyXG5cdFx0Ly8gXHRcdHBsdWdpbi5fd2F0Y2hDb250YWluZXJEeW5hbWljKHZpZXdUeXBlTmFtZSwgY29udGFpbmVyLCBwbHVnaW4sIHNlbGVjdG9yKVxyXG5cdFx0Ly8gXHR9XHJcblx0XHQvLyBcdGVsc2Uge1xyXG5cdFx0Ly8gXHRcdHBsdWdpbi5fd2F0Y2hDb250YWluZXIodmlld1R5cGVOYW1lLCBjb250YWluZXIsIHBsdWdpbiwgc2VsZWN0b3IpO1xyXG5cdFx0Ly8gXHR9XHJcblx0XHQvLyB9XHJcblx0fVxyXG5cclxuXHR1cGRhdGVDb250YWluZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcGx1Z2luOiBTdXBlcmNoYXJnZWRMaW5rcywgc2VsZWN0b3I6IHN0cmluZykge1xyXG5cdFx0aWYgKCFwbHVnaW4uc2V0dGluZ3MuZW5hYmxlQmFja2xpbmtzICYmIGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoXCJkYXRhLXR5cGVcIikgIT09IFwiZmlsZS1leHBsb3JlclwiKSByZXR1cm47XHJcblx0XHRpZiAoIXBsdWdpbi5zZXR0aW5ncy5lbmFibGVGaWxlTGlzdCAmJiBjb250YWluZXIuZ2V0QXR0cmlidXRlKFwiZGF0YS10eXBlXCIpID09PSBcImZpbGUtZXhwbG9yZXJcIikgcmV0dXJuO1xyXG5cdFx0Y29uc3Qgbm9kZXMgPSBjb250YWluZXIuZmluZEFsbChzZWxlY3Rvcik7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7XHJcblx0XHRcdGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRcdHVwZGF0ZURpdkV4dHJhQXR0cmlidXRlcyhwbHVnaW4uYXBwLCBwbHVnaW4uc2V0dGluZ3MsIGVsLCBcIlwiKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJlbW92ZUZyb21Db250YWluZXIoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZykge1xyXG5cdFx0Y29uc3Qgbm9kZXMgPSBjb250YWluZXIuZmluZEFsbChzZWxlY3Rvcik7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgKytpKSB7XHJcblx0XHRcdGNvbnN0IGVsID0gbm9kZXNbaV0gYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRcdGNsZWFyRXh0cmFBdHRyaWJ1dGVzKGVsKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdF93YXRjaENvbnRhaW5lcih2aWV3VHlwZTogc3RyaW5nLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwbHVnaW46IFN1cGVyY2hhcmdlZExpbmtzLCBzZWxlY3Rvcjogc3RyaW5nKSB7XHJcblx0XHRsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigocmVjb3JkcywgXykgPT4ge1xyXG5cdFx0XHRwbHVnaW4udXBkYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgcGx1Z2luLCBzZWxlY3Rvcik7XHJcblx0XHR9KTtcclxuXHRcdG9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyLCB7IHN1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgYXR0cmlidXRlczogZmFsc2UgfSk7XHJcblx0XHRpZiAodmlld1R5cGUpIHtcclxuXHRcdFx0cGx1Z2luLm9ic2VydmVycy5wdXNoKFtvYnNlcnZlciwgdmlld1R5cGUsIHNlbGVjdG9yXSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRfd2F0Y2hDb250YWluZXJEeW5hbWljKHZpZXdUeXBlOiBzdHJpbmcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHBsdWdpbjogU3VwZXJjaGFyZ2VkTGlua3MsIHNlbGVjdG9yOiBzdHJpbmcsIG93bl9jbGFzcyA9ICd0cmVlLWl0ZW0taW5uZXInLCBwYXJlbnRfY2xhc3MgPSAndHJlZS1pdGVtJykge1xyXG5cdFx0Ly8gVXNlZCBmb3IgZWZmaWNpZW50IHVwZGF0aW5nIG9mIHRoZSBiYWNrbGlua3MgcGFuZWxcclxuXHRcdC8vIE9ubHkgbG9vcHMgdGhyb3VnaCBuZXdseSBhZGRlZCBET00gbm9kZXMgaW5zdGVhZCBvZiBjaGFuZ2luZyBhbGwgb2YgdGhlbVxyXG5cdFx0aWYgKCFwbHVnaW4uc2V0dGluZ3MuZW5hYmxlQmFja2xpbmtzKSByZXR1cm47XHJcblx0XHRsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigocmVjb3JkcywgXykgPT4ge1xyXG5cdFx0XHRyZWNvcmRzLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0aWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnKSB7XHJcblx0XHRcdFx0XHRtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKG4pID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKCdjbGFzc05hbWUnIGluIG4pIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRcdFx0XHRcdFx0aWYgKG4uY2xhc3NOYW1lLmluY2x1ZGVzICYmIHR5cGVvZiBuLmNsYXNzTmFtZS5pbmNsdWRlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBuLmNsYXNzTmFtZS5pbmNsdWRlcyhwYXJlbnRfY2xhc3MpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmaWxlRGl2cyA9IChuIGFzIEhUTUxFbGVtZW50KS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG93bl9jbGFzcyk7XHJcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVEaXZzLmxlbmd0aDsgKytpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxpbmsgPSBmaWxlRGl2c1tpXSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlRGl2RXh0cmFBdHRyaWJ1dGVzKHBsdWdpbi5hcHAsIHBsdWdpbi5zZXR0aW5ncywgbGluaywgXCJcIik7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0XHRvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lciwgeyBzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGF0dHJpYnV0ZXM6IGZhbHNlIH0pO1xyXG5cdFx0cGx1Z2luLm9ic2VydmVycy5wdXNoKFtvYnNlcnZlciwgdmlld1R5cGUsIHNlbGVjdG9yXSk7XHJcblx0fVxyXG5cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHR0aGlzLm9ic2VydmVycy5mb3JFYWNoKChbb2JzZXJ2ZXIsIHR5cGUsIG93bl9jbGFzc10pID0+IHtcclxuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRjb25zdCBsZWF2ZXMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKHR5cGUpO1xyXG5cdFx0XHRsZWF2ZXMuZm9yRWFjaChsZWFmID0+IHtcclxuXHRcdFx0XHR0aGlzLnJlbW92ZUZyb21Db250YWluZXIobGVhZi52aWV3LmNvbnRhaW5lckVsLCBvd25fY2xhc3MpO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSk7XHJcblx0XHRmb3IgKGNvbnN0IG9ic2VydmVyIG9mIHRoaXMubW9kYWxPYnNlcnZlcnMpIHtcclxuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0fVxyXG5cdFx0Y29uc29sZS5sb2coJ1N1cGVyY2hhcmdlZCBsaW5rcyB1bmxvYWRlZCcpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdH1cclxufVxyXG4iXSwibmFtZXMiOlsiTW9kYWwiLCJTZXR0aW5nIiwiZ2V0QWxsVGFncyIsImdldExpbmtwYXRoIiwiTWFya2Rvd25WaWV3IiwiUGx1Z2luU2V0dGluZ1RhYiIsImRlYm91bmNlIiwiV2lkZ2V0VHlwZSIsIlZpZXdQbHVnaW4iLCJSYW5nZVNldCIsInZpZXciLCJSYW5nZVNldEJ1aWxkZXIiLCJlZGl0b3JWaWV3RmllbGQiLCJzeW50YXhUcmVlIiwidG9rZW5DbGFzc05vZGVQcm9wIiwiRGVjb3JhdGlvbiIsIlBsdWdpbiIsIlByZWMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFvR0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFF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