Skip to content

Instantly share code, notes, and snippets.

@jeansordes
Created October 26, 2022 17:33
Show Gist options
  • Save jeansordes/9ccd17911d1743b4aaecd20a858d84e5 to your computer and use it in GitHub Desktop.
Save jeansordes/9ccd17911d1743b4aaecd20a858d84e5 to your computer and use it in GitHub Desktop.
Built file in response to ArianaKhit/text-snippets-obsidian#47
/*
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');
/*! *****************************************************************************
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());
});
}
class TextSnippets extends obsidian.Plugin {
onInit() { }
onload() {
return __awaiter(this, void 0, void 0, function* () {
console.log("Loading snippets plugin");
yield this.loadSettings();
this.addSettingTab(new TextSnippetsSettingsTab(this.app, this));
//expected warning
var isLegacy = this.app.vault.config.legacyEditor;
if (!isLegacy != this.settings.isWYSIWYG) {
this.settings.isWYSIWYG = !isLegacy;
yield this.saveSettings();
}
this.addCommand({
id: "text-snippets",
name: "Run snippet replacement",
callback: () => this.SnippetOnTrigger(),
hotkeys: [{
modifiers: ["Mod"],
key: "tab"
}],
});
if (isLegacy) {
this.cmEditors = [];
this.registerCodeMirror((cm) => {
this.cmEditors.push(cm);
// the callback has to be called through another function in order for 'this' to work
cm.on('keydown', (cm, event) => this.handleKeyDown(event));
});
}
else {
this.app.workspace.onLayoutReady(() => {
this.registerDomEvent(document, 'keydown', (event) => this.handleKeyDown(event));
});
}
});
}
onunload() {
return __awaiter(this, void 0, void 0, function* () {
console.log("Unloading text snippet plugin");
if (!this.settings.isWYSIWYG) {
this.cmEditors = [];
this.registerCodeMirror((cm) => {
this.cmEditors.push(cm);
// the callback has to be called through another function in order for 'this' to work
cm.off('keydown', (cm, event) => this.handleKeyDown(event));
});
}
});
}
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);
});
}
UpdateSplit(newlineSymbol) {
var nlSymb = newlineSymbol;
var nlSymb = nlSymb.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
var rg = '(?<!' + nlSymb + ')\\n';
const regex = new RegExp(rg);
var splited = this.settings.snippets_file.split(regex);
splited = splited.filter(item => item);
this.settings.snippets = splited;
}
getSelectedText(editor) {
if (editor.somethingSelected()) {
return editor.getSelection();
}
else {
var wordBoundaries = this.getWordBoundaries(editor);
editor.getDoc().setSelection(wordBoundaries.start, wordBoundaries.end);
return editor.getSelection();
}
}
isWord(c) {
//if character is not a whiespace or a delimiter
var notWord = ' \t\n\r\v' + this.settings.wordDelimiters;
if (notWord.indexOf(c) <= -1) {
return true;
}
return false;
}
SnippetsWordAt(cm, pos) {
var start = pos.ch, end = start, line = cm.getLine(pos.line);
while (start && this.isWord(line.charAt(start - 1)))
--start;
while (end < line.length && this.isWord(line.charAt(end)))
++end;
var fr = { line: pos.line, ch: start };
var t = { line: pos.line, ch: end };
return { from: fr, to: t, word: line.slice(start, end) };
}
getWordBoundaries(editor) {
var cursor = editor.getCursor();
var line = cursor.line;
cursor.ch;
var word = this.SnippetsWordAt(editor, cursor);
var wordStart = word.from.ch;
var wordEnd = word.to.ch;
return {
start: {
line: line,
ch: wordStart
},
end: {
line: line,
ch: wordEnd
},
};
}
findSnippet(editor, cursorOrig, cursor) {
var selectedText = this.getSelectedText(editor);
Array.from(this.settings.wordDelimiters);
'' + selectedText.split(' ').join('');
var newStr = "";
// without this finds next stop everywhere in file
// if (selectedWoSpaces == '' || (selectedWoSpaces.length > 0 && wordDelimiters.indexOf(selectedWoSpaces[0]) >= 0 && cursorOrig.ch == cursor.ch)) {
// editor.execCommand('goWordLeft');
// editor.execCommand('goWordLeft');
// selectedText = this.getSelectedText(editor);
// var cursor = editor.getCursor('from');
// }
var i;
var snippets = this.settings.snippets;
for (i in snippets) {
var snippet = snippets[i].split(' : ');
if (selectedText == snippet[0]) {
newStr = snippet[1];
}
}
return newStr;
}
calculateCursorEndPos(nStr, cursor, endPosition) {
var nlSymb = this.settings.newlineSymbol;
var endSymbol = this.settings.endSymbol;
var stopSymbol = this.settings.stopSymbol;
var newStr = nStr.split('\n').join('');
if (newStr.indexOf(stopSymbol) == -1) {
var rawEnd = newStr.indexOf(endSymbol);
if (rawEnd == -1)
rawEnd = newStr.length;
var lastNl = newStr.substring(0, rawEnd).lastIndexOf(nlSymb);
if (lastNl != -1)
var endPosIndex = rawEnd - lastNl - nlSymb.length - cursor.ch;
else
var endPosIndex = rawEnd;
}
else {
var endPosIndex = 0;
}
nlSymb = nlSymb.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); //no special symbols in nlSymb
var rg = nlSymb + '\\n' + '|' + nlSymb;
const regex = new RegExp(rg);
const regexF = new RegExp(rg, 'g');
var nlinesCount = (newStr.substring(0, rawEnd).match(regexF) || []).length;
endPosition.nlinesCount = nlinesCount;
endPosition.position = endPosIndex;
newStr = newStr.split(regex).join('\n');
newStr = newStr.replace(endSymbol, '');
return newStr;
}
insertSnippet(key = '', snippetStartpos = { ch: -1, line: -1 }) {
let activeLeaf = this.app.workspace.activeLeaf;
let editor = activeLeaf.view.sourceMode.cmEditor;
// let editor = activeLeaf.view.editor;
var cursorOrig = editor.getCursor();
var wasSelection = editor.somethingSelected();
var cursor = editor.getCursor('from');
if (wasSelection) {
({ start: cursor, end: editor.getCursor('to') });
}
else {
this.getWordBoundaries(editor);
}
var stopSymbol = this.settings.stopSymbol;
var pasteSymbol = this.settings.pasteSymbol;
var stopFound = false;
var newStr = "";
newStr = this.findSnippet(editor, cursorOrig, cursor);
cursor = editor.getCursor('from');
//proceed Tab and Spacebar
var endCursor = editor.getCursor('to');
if (newStr == "" ||
(key == 'Space' && (cursorOrig.ch != endCursor.ch || cursorOrig.line != endCursor.line))) {
if (wasSelection == false) {
editor.getDoc().setSelection(cursorOrig, cursorOrig);
}
if (key == 'Space')
return false;
if (newStr == "") {
editor.setCursor(cursorOrig);
return this.nextStop();
}
}
//find end position
var endPosition = { nlinesCount: 0, position: 0 };
newStr = this.calculateCursorEndPos(newStr, cursor, endPosition);
if (newStr.indexOf(stopSymbol) != -1)
stopFound = true;
if (newStr.indexOf(pasteSymbol) != -1)
snippetStartpos = cursor;
editor.replaceSelection(newStr);
if (stopFound) {
editor.setCursor({
line: cursor.line,
ch: cursor.ch
});
return this.nextStop();
}
else {
editor.setCursor({
line: cursor.line + endPosition.nlinesCount,
ch: cursor.ch + endPosition.position
});
}
editor.focus();
return true;
}
adjustCursor(editor, cursor, newStr, oldStr) {
var cursorOffset = newStr.length - oldStr.length;
this.adjustCursorOffset(editor, cursor, cursorOffset);
}
adjustCursorOffset(editor, cursor, cursorOffset) {
editor.setCursor({
line: cursor.line,
ch: cursor.ch + cursorOffset
});
}
handleKeyDown(event) {
if (this.app.workspace.getActiveViewOfType(obsidian.MarkdownView) == null) {
return;
}
if ((event.key == 'Tab' && this.settings.useTab) || (event.code == 'Space' && this.settings.useSpace)) {
this.SnippetOnTrigger(event.code, true);
}
}
SnippetOnTrigger(key = '', preventDef = false) {
let activeLeaf = this.app.workspace.activeLeaf;
let cm = activeLeaf.view.sourceMode.cmEditor;
var cursorSt = cm.getCursor();
if (this.insertSnippet(key, cursorSt)) {
if (preventDef) {
event.preventDefault();
if (this.settings.isWYSIWYG && key == 'Tab') {
// delete '\t' in Live preview
var search = cm.searchCursor('\t', cursorSt);
if (search.findPrevious()) {
search.replace('');
}
}
}
if (cursorSt.ch >= 0 && cursorSt.line >= 0) { //paste text from clipboard
cm.getCursor();
navigator.clipboard.readText().then((clipText) => {
if (this.settings.isWYSIWYG == false) {
var search = cm.getSearchCursor(this.settings.pasteSymbol, cursorSt);
}
else {
var search = cm.searchCursor(this.settings.pasteSymbol, cursorSt);
}
if (search.findNext()) {
search.replace(clipText);
}
});
}
return true;
}
return this.nextStop();
}
nextStop() {
let activeLeaf = this.app.workspace.activeLeaf;
let cm = activeLeaf.view.sourceMode.cmEditor;
if (this.settings.isWYSIWYG == false) {
var search = cm.getSearchCursor(this.settings.stopSymbol, cm.getCursor());
}
else {
var search = cm.searchCursor(this.settings.stopSymbol, cm.getCursor());
}
if (search.findNext()) {
search.replace("");
if (this.settings.isWYSIWYG == false) {
cm.setCursor(search.from());
}
else {
cm.setCursor(search.current().from);
}
return true;
}
else if (this.settings.useTab) {
return false;
}
return false;
}
}
const DEFAULT_SETTINGS = {
snippets_file: "snippets : It is an obsidian plugin, that replaces your selected text.",
snippets: ["snippets : It is an obsidian plugin, that replaces your selected text."],
endSymbol: '$end$',
newlineSymbol: '$nl$',
stopSymbol: "$tb$",
pasteSymbol: "$pst$",
useTab: true,
useSpace: false,
wordDelimiters: "$()[]{}<>,.!?;:\'\"\\/",
isWYSIWYG: false,
};
class TextSnippetsSettingsTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl('h2', { text: 'Text Snippets - Settings' });
new obsidian.Setting(containerEl)
.setName("Snippets")
.setDesc("Type here your snippets in format 'snippet : result', one per line. Empty lines will be ignored. Ctrl+Tab to replace (hotkey can be changed).")
.setClass("text-snippets-class")
.addTextArea((text) => text
.setPlaceholder("before : after")
.setValue(this.plugin.settings.snippets_file)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.snippets_file = value;
this.plugin.UpdateSplit(this.plugin.settings.newlineSymbol);
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName("Cursor end position mark")
.setDesc("Places the cursor to the mark position after inserting a snippet (default: $end$).\nMark does not appear anywhere within the snippet. Do not use together with Stop Symbol.")
.setClass("text-snippets-cursor")
.addTextArea((text) => text
.setPlaceholder("$end$")
.setValue(this.plugin.settings.endSymbol)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
if (value == '') {
value = '$end$';
}
this.plugin.settings.endSymbol = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName("Newline mark")
.setDesc("Ignores newline after mark, replace it with a newline character after expanding (default: $nl$).\nNecessary to write before every line break in multiline snippets.")
.setClass("text-snippets-newline")
.addTextArea((text) => text
.setPlaceholder("$nl$")
.setValue(this.plugin.settings.newlineSymbol)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
if (value == '') {
value = '$nl$';
}
this.plugin.settings.newlineSymbol = value;
this.plugin.UpdateSplit(value);
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Stop Symbol')
.setDesc('Symbol to jump to when command is called.')
.setClass("text-snippets-tabstops")
.addTextArea((text) => text
.setPlaceholder('')
.setValue(this.plugin.settings.stopSymbol)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
if (value == '') {
value = '$tb$';
}
this.plugin.settings.stopSymbol = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Clipboard paste Symbol')
.setDesc('Symbol to be replaced with clipboard content.')
.setClass("text-snippets-tabstops")
.addTextArea((text) => text
.setPlaceholder('')
.setValue(this.plugin.settings.pasteSymbol)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
if (value == '') {
value = '$pst$';
}
this.plugin.settings.pasteSymbol = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName("Expand on Tab")
.setDesc("Use the Tab key as the trigger.")
.addToggle(toggle => toggle.setValue(this.plugin.settings.useTab)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.useTab = !this.plugin.settings.useTab;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName("Expand on Space")
.setDesc("Use the Space bar button as the trigger.")
.addToggle(toggle => toggle.setValue(this.plugin.settings.useSpace)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.useSpace = !this.plugin.settings.useSpace;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName("Live Preview Mode")
.setDesc("Toggle manually if not correct. You should restart plugin after changing this option.")
.addToggle(toggle => toggle.setValue(this.plugin.settings.isWYSIWYG)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.isWYSIWYG = !this.plugin.settings.isWYSIWYG;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Word delimiters')
.setDesc('Сharacters for specifying the boundary between separate words.')
.setClass("text-snippets-delimiter")
.addTextArea((text) => text
.setPlaceholder('')
.setValue(this.plugin.settings.wordDelimiters)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.wordDelimiters = value;
yield this.plugin.saveSettings();
})));
}
}
module.exports = TextSnippets;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIEFwcCxcclxuICBFZGl0b3IsXHJcbiAgTWFya2Rvd25WaWV3LFxyXG4gIC8vIE5vdGljZSxcclxuICBQbHVnaW4sXHJcbiAgUGx1Z2luU2V0dGluZ1RhYixcclxuICBTZXR0aW5nLFxyXG59IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHRTbmlwcGV0cyBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFRleHRTbmlwcGV0c1NldHRpbmdzO1xyXG5cdHByaXZhdGUgY21FZGl0b3JzOiBDb2RlTWlycm9yLkVkaXRvcltdO1xyXG5cclxuXHRvbkluaXQoKSB7fVxyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZyhcIkxvYWRpbmcgc25pcHBldHMgcGx1Z2luXCIpO1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHRcdFxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBUZXh0U25pcHBldHNTZXR0aW5nc1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdFx0Ly9leHBlY3RlZCB3YXJuaW5nXHJcblx0XHR2YXIgaXNMZWdhY3kgPSB0aGlzLmFwcC52YXVsdC5jb25maWcubGVnYWN5RWRpdG9yO1xyXG5cdFx0aWYgKCFpc0xlZ2FjeSAhPSB0aGlzLnNldHRpbmdzLmlzV1lTSVdZRykge1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzLmlzV1lTSVdZRyA9ICFpc0xlZ2FjeTtcclxuXHRcdFx0YXdhaXQgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogXCJ0ZXh0LXNuaXBwZXRzXCIsXHJcblx0XHRcdG5hbWU6IFwiUnVuIHNuaXBwZXQgcmVwbGFjZW1lbnRcIixcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuU25pcHBldE9uVHJpZ2dlcigpLFxyXG5cdFx0XHRob3RrZXlzOiBbe1xyXG5cdFx0XHRcdG1vZGlmaWVyczogW1wiTW9kXCJdLFxyXG5cdFx0XHRcdGtleTogXCJ0YWJcIlxyXG5cdFx0XHR9XSxcclxuXHRcdH0pO1xyXG5cdFx0XHJcblx0XHRpZiAoaXNMZWdhY3kpIHtcclxuXHRcdFx0dGhpcy5jbUVkaXRvcnMgPSBbXTtcclxuXHRcdFx0dGhpcy5yZWdpc3RlckNvZGVNaXJyb3IoKGNtKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jbUVkaXRvcnMucHVzaChjbSk7XHJcblx0XHRcdFx0Ly8gdGhlIGNhbGxiYWNrIGhhcyB0byBiZSBjYWxsZWQgdGhyb3VnaCBhbm90aGVyIGZ1bmN0aW9uIGluIG9yZGVyIGZvciAndGhpcycgdG8gd29ya1xyXG5cdFx0XHRcdGNtLm9uKCdrZXlkb3duJywgKGNtLCBldmVudCkgPT4gdGhpcy5oYW5kbGVLZXlEb3duKGV2ZW50KSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVnaXN0ZXJEb21FdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMuaGFuZGxlS2V5RG93bihldmVudCkpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIG9udW5sb2FkKCkge1xyXG5cdFx0Y29uc29sZS5sb2coXCJVbmxvYWRpbmcgdGV4dCBzbmlwcGV0IHBsdWdpblwiKTtcclxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5pc1dZU0lXWUcpIHtcclxuXHRcdFx0dGhpcy5jbUVkaXRvcnMgPSBbXTtcclxuXHRcdFx0dGhpcy5yZWdpc3RlckNvZGVNaXJyb3IoKGNtKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jbUVkaXRvcnMucHVzaChjbSk7XHJcblx0XHRcdFx0Ly8gdGhlIGNhbGxiYWNrIGhhcyB0byBiZSBjYWxsZWQgdGhyb3VnaCBhbm90aGVyIGZ1bmN0aW9uIGluIG9yZGVyIGZvciAndGhpcycgdG8gd29ya1xyXG5cdFx0XHRcdGNtLm9mZigna2V5ZG93bicsIChjbSwgZXZlbnQpID0+IHRoaXMuaGFuZGxlS2V5RG93bihldmVudCkpO1xyXG5cdFx0XHR9KTtcclxuICAgICAgICAgICAgfVxyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpXHJcblx0fVxyXG5cclxuXHRVcGRhdGVTcGxpdChuZXdsaW5lU3ltYm9sOiBzdHJpbmcpIHtcclxuXHRcdHZhciBubFN5bWIgPSBuZXdsaW5lU3ltYm9sO1xyXG5cdFx0dmFyIG5sU3ltYiA9IG5sU3ltYi5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpO1xyXG5cdFx0dmFyIHJnID0gJyg/PCEnICsgbmxTeW1iICsnKVxcXFxuJztcclxuXHRcdGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChyZyk7XHJcblx0XHR2YXIgc3BsaXRlZCA9IHRoaXMuc2V0dGluZ3Muc25pcHBldHNfZmlsZS5zcGxpdChyZWdleCk7XHJcblx0XHRzcGxpdGVkID0gc3BsaXRlZC5maWx0ZXIoaXRlbSA9PiBpdGVtKTtcclxuXHRcdHRoaXMuc2V0dGluZ3Muc25pcHBldHMgPSBzcGxpdGVkO1xyXG5cdH1cclxuXHJcblx0Z2V0U2VsZWN0ZWRUZXh0KGVkaXRvcjogQ29kZU1pcnJvci5FZGl0b3IpIHtcclxuXHRcdGlmIChlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSkge1xyXG5cdFx0XHRyZXR1cm4gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIHdvcmRCb3VuZGFyaWVzID0gdGhpcy5nZXRXb3JkQm91bmRhcmllcyhlZGl0b3IpO1xyXG5cdFx0XHRlZGl0b3IuZ2V0RG9jKCkuc2V0U2VsZWN0aW9uKHdvcmRCb3VuZGFyaWVzLnN0YXJ0LCB3b3JkQm91bmRhcmllcy5lbmQpO1xyXG5cdFx0XHRyZXR1cm4gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aXNXb3JkKGM6IGFueSkgOiBib29sZWFuIHtcclxuXHRcdC8vaWYgY2hhcmFjdGVyIGlzIG5vdCBhIHdoaWVzcGFjZSBvciBhIGRlbGltaXRlclxyXG5cdFx0dmFyIG5vdFdvcmQgPSAnIFxcdFxcblxcclxcdicgKyB0aGlzLnNldHRpbmdzLndvcmREZWxpbWl0ZXJzO1xyXG5cdFx0aWYgKG5vdFdvcmQuaW5kZXhPZihjKSA8PSAtMSApIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cdFNuaXBwZXRzV29yZEF0KGNtIDogQ29kZU1pcnJvci5FZGl0b3IsIHBvczogQ29kZU1pcnJvci5Qb3NpdGlvbikgOiBhbnkge1xyXG5cdFx0dmFyIHN0YXJ0ID0gcG9zLmNoLCBlbmQgPSBzdGFydCwgbGluZSA9IGNtLmdldExpbmUocG9zLmxpbmUpO1xyXG5cdFx0d2hpbGUgKHN0YXJ0ICYmIHRoaXMuaXNXb3JkKGxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0O1xyXG5cdFx0d2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIHRoaXMuaXNXb3JkKGxpbmUuY2hhckF0KGVuZCkpKSArK2VuZDtcclxuXHRcdHZhciBmciA9IHtsaW5lOiBwb3MubGluZSwgY2g6IHN0YXJ0fTtcclxuXHRcdHZhciB0ID0ge2xpbmU6IHBvcy5saW5lLCBjaDogZW5kfTtcclxuXHRcdHJldHVybiB7ZnJvbTogZnIsIHRvOiB0LCB3b3JkOiBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpfTtcclxuXHR9XHJcblxyXG5cdGdldFdvcmRCb3VuZGFyaWVzKGVkaXRvcjogQ29kZU1pcnJvci5FZGl0b3IpIHtcclxuXHRcdHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHR2YXIgbGluZSA9IGN1cnNvci5saW5lO1xyXG5cdFx0dmFyIGNoID0gY3Vyc29yLmNoO1xyXG5cclxuXHRcdHZhciB3b3JkID0gdGhpcy5TbmlwcGV0c1dvcmRBdChlZGl0b3IsIGN1cnNvcik7XHJcblx0XHR2YXIgd29yZFN0YXJ0ID0gd29yZC5mcm9tLmNoO1xyXG5cdFx0dmFyIHdvcmRFbmQgPSB3b3JkLnRvLmNoO1xyXG5cdFx0XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRzdGFydDoge1xyXG5cdFx0XHRcdGxpbmU6IGxpbmUsXHJcblx0XHRcdFx0Y2g6IHdvcmRTdGFydFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRlbmQ6IHtcclxuXHRcdFx0XHRsaW5lOiBsaW5lLFxyXG5cdFx0XHRcdGNoOiB3b3JkRW5kXHJcblx0XHRcdH0sXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZmluZFNuaXBwZXQoZWRpdG9yIDogQ29kZU1pcnJvci5FZGl0b3IsIGN1cnNvck9yaWcgOiBDb2RlTWlycm9yLlBvc2l0aW9uLCBjdXJzb3IgOiBDb2RlTWlycm9yLlBvc2l0aW9uKSA6IHN0cmluZyB7XHJcblx0XHR2YXIgc2VsZWN0ZWRUZXh0ID0gdGhpcy5nZXRTZWxlY3RlZFRleHQoZWRpdG9yKTtcclxuXHRcdHZhciB3b3JkRGVsaW1pdGVycyA9IEFycmF5LmZyb20odGhpcy5zZXR0aW5ncy53b3JkRGVsaW1pdGVycyk7XHJcblx0XHR2YXIgc2VsZWN0ZWRXb1NwYWNlcyA9ICcnICsgc2VsZWN0ZWRUZXh0LnNwbGl0KCcgJykuam9pbignJyk7XHJcblx0XHR2YXIgbmV3U3RyID0gXCJcIjtcclxuXHRcdC8vIHdpdGhvdXQgdGhpcyBmaW5kcyBuZXh0IHN0b3AgZXZlcnl3aGVyZSBpbiBmaWxlXHJcblx0XHQvLyBpZiAoc2VsZWN0ZWRXb1NwYWNlcyA9PSAnJyB8fCAoc2VsZWN0ZWRXb1NwYWNlcy5sZW5ndGggPiAwICYmIHdvcmREZWxpbWl0ZXJzLmluZGV4T2Yoc2VsZWN0ZWRXb1NwYWNlc1swXSkgPj0gMCAmJiBjdXJzb3JPcmlnLmNoID09IGN1cnNvci5jaCkpIHtcclxuXHRcdFx0Ly8gZWRpdG9yLmV4ZWNDb21tYW5kKCdnb1dvcmRMZWZ0Jyk7XHJcblx0XHRcdC8vIGVkaXRvci5leGVjQ29tbWFuZCgnZ29Xb3JkTGVmdCcpO1xyXG5cdFx0XHQvLyBzZWxlY3RlZFRleHQgPSB0aGlzLmdldFNlbGVjdGVkVGV4dChlZGl0b3IpO1xyXG5cdFx0XHQvLyB2YXIgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvcignZnJvbScpO1xyXG5cdFx0Ly8gfVxyXG5cclxuXHRcdHZhciBpO1xyXG5cdFx0dmFyIHNuaXBwZXRzID0gIHRoaXMuc2V0dGluZ3Muc25pcHBldHM7XHJcblx0XHRmb3IgKGkgaW4gc25pcHBldHMpe1xyXG5cdFx0XHR2YXIgc25pcHBldCA9IHNuaXBwZXRzW2ldLnNwbGl0KCcgOiAnKTtcclxuXHJcblx0XHRcdGlmIChzZWxlY3RlZFRleHQgPT0gc25pcHBldFswXSkge1xyXG5cdFx0XHRcdG5ld1N0ciA9IHNuaXBwZXRbMV07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBuZXdTdHI7XHJcblx0fVxyXG5cclxuXHRjYWxjdWxhdGVDdXJzb3JFbmRQb3MoblN0ciA6IHN0cmluZywgY3Vyc29yIDogQ29kZU1pcnJvci5Qb3NpdGlvbiwgZW5kUG9zaXRpb24gOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0dmFyIG5sU3ltYiA9IHRoaXMuc2V0dGluZ3MubmV3bGluZVN5bWJvbDtcclxuXHRcdHZhciBlbmRTeW1ib2wgPSB0aGlzLnNldHRpbmdzLmVuZFN5bWJvbDtcclxuXHRcdHZhciBzdG9wU3ltYm9sID0gdGhpcy5zZXR0aW5ncy5zdG9wU3ltYm9sO1xyXG5cdFx0dmFyIG5ld1N0ciA9IG5TdHIuc3BsaXQoJ1xcbicpLmpvaW4oJycpO1xyXG5cclxuXHRcdGlmIChuZXdTdHIuaW5kZXhPZihzdG9wU3ltYm9sKSA9PSAtMSkge1xyXG5cdFx0XHR2YXIgcmF3RW5kID0gbmV3U3RyLmluZGV4T2YoZW5kU3ltYm9sKTtcclxuXHRcdFx0aWYgKHJhd0VuZCA9PSAtMSlcdHJhd0VuZCA9IG5ld1N0ci5sZW5ndGg7XHJcblx0XHRcdFxyXG5cdFx0XHR2YXIgbGFzdE5sID0gbmV3U3RyLnN1YnN0cmluZygwLCByYXdFbmQpLmxhc3RJbmRleE9mKG5sU3ltYik7XHJcblx0XHRcdGlmIChsYXN0TmwgIT0gLTEpXHR2YXIgZW5kUG9zSW5kZXggPSByYXdFbmQgLSBsYXN0TmwgLSBubFN5bWIubGVuZ3RoIC0gY3Vyc29yLmNoO1xyXG5cdFx0XHRlbHNlIFx0XHRcdFx0dmFyIGVuZFBvc0luZGV4ID0gcmF3RW5kO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIGVuZFBvc0luZGV4ID0gMDtcclxuXHRcdH1cclxuXHJcblxyXG5cdFx0bmxTeW1iID0gbmxTeW1iLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XHQvL25vIHNwZWNpYWwgc3ltYm9scyBpbiBubFN5bWJcclxuXHRcdHZhciByZyA9IG5sU3ltYiArICdcXFxcbicgKyAnfCcgKyBubFN5bWI7XHJcblx0XHRjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocmcpO1xyXG5cdFx0Y29uc3QgcmVnZXhGID0gbmV3IFJlZ0V4cChyZywgJ2cnKTtcclxuXHRcdHZhciBubGluZXNDb3VudCA9IChuZXdTdHIuc3Vic3RyaW5nKDAsIHJhd0VuZCkubWF0Y2gocmVnZXhGKSB8fCBbXSkubGVuZ3RoO1xyXG5cclxuXHRcdGVuZFBvc2l0aW9uLm5saW5lc0NvdW50ID0gbmxpbmVzQ291bnQ7XHJcblx0XHRlbmRQb3NpdGlvbi5wb3NpdGlvbiA9IGVuZFBvc0luZGV4O1xyXG5cclxuXHRcdG5ld1N0ciA9IG5ld1N0ci5zcGxpdChyZWdleCkuam9pbignXFxuJyk7XHJcblx0XHRuZXdTdHIgPSBuZXdTdHIucmVwbGFjZShlbmRTeW1ib2wsJycpO1xyXG5cdFx0cmV0dXJuIG5ld1N0cjtcclxuXHR9XHJcblxyXG5cclxuXHRpbnNlcnRTbmlwcGV0KGtleSA6IHN0cmluZyA9ICcnLCBzbmlwcGV0U3RhcnRwb3MgOiBDb2RlTWlycm9yLlBvc2l0aW9uID0ge2NoOi0xLCBsaW5lOi0xfSk6IGJvb2xlYW4ge1xyXG5cdFx0bGV0IGFjdGl2ZUxlYWY6IGFueSA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xyXG5cdFx0bGV0IGVkaXRvciA9IGFjdGl2ZUxlYWYudmlldy5zb3VyY2VNb2RlLmNtRWRpdG9yO1xyXG5cdFx0Ly8gbGV0IGVkaXRvciA9IGFjdGl2ZUxlYWYudmlldy5lZGl0b3I7XHJcblx0XHR2YXIgY3Vyc29yT3JpZyA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdHZhciB3YXNTZWxlY3Rpb24gPSBlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKTtcclxuXHRcdHZhciBjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCdmcm9tJyk7XHJcblx0XHR2YXIgd29yZEJvdW5kYXJpZXM7XHJcblx0XHRpZih3YXNTZWxlY3Rpb24pIHtcclxuXHRcdFx0d29yZEJvdW5kYXJpZXMgPSB7c3RhcnQ6IGN1cnNvciwgZW5kOiBlZGl0b3IuZ2V0Q3Vyc29yKCd0bycpfTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHdvcmRCb3VuZGFyaWVzID0gdGhpcy5nZXRXb3JkQm91bmRhcmllcyhlZGl0b3IpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHN0b3BTeW1ib2wgPSB0aGlzLnNldHRpbmdzLnN0b3BTeW1ib2w7XHJcblx0XHR2YXIgcGFzdGVTeW1ib2wgPSB0aGlzLnNldHRpbmdzLnBhc3RlU3ltYm9sO1xyXG5cdFx0dmFyIHN0b3BGb3VuZCA9IGZhbHNlO1xyXG5cdFx0dmFyIG5ld1N0ciA9IFwiXCI7XHJcblxyXG5cdFx0bmV3U3RyID0gdGhpcy5maW5kU25pcHBldChlZGl0b3IsIGN1cnNvck9yaWcsIGN1cnNvcik7XHJcblx0XHRjdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCdmcm9tJyk7XHJcblxyXG5cdFx0Ly9wcm9jZWVkIFRhYiBhbmQgU3BhY2ViYXJcclxuXHRcdHZhciBlbmRDdXJzb3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKCd0bycpO1xyXG5cdFx0aWYgKG5ld1N0ciA9PSBcIlwiIHx8IFxyXG5cdFx0XHQoa2V5ID09ICdTcGFjZScgJiYgKGN1cnNvck9yaWcuY2ggIT0gZW5kQ3Vyc29yLmNoIHx8IGN1cnNvck9yaWcubGluZSAhPSBlbmRDdXJzb3IubGluZSkpICkgIHtcclxuXHRcdFx0aWYgKHdhc1NlbGVjdGlvbiA9PSBmYWxzZSkge1xyXG5cdFx0XHRcdGVkaXRvci5nZXREb2MoKS5zZXRTZWxlY3Rpb24oY3Vyc29yT3JpZywgY3Vyc29yT3JpZyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGtleSA9PSAnU3BhY2UnKVx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRpZiAobmV3U3RyID09IFwiXCIpIHtcclxuXHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKGN1cnNvck9yaWcpO1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLm5leHRTdG9wKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvL2ZpbmQgZW5kIHBvc2l0aW9uXHJcblx0XHR2YXIgZW5kUG9zaXRpb24gPSB7bmxpbmVzQ291bnQ6IDAsIHBvc2l0aW9uOiAwfTtcclxuXHRcdG5ld1N0ciA9IHRoaXMuY2FsY3VsYXRlQ3Vyc29yRW5kUG9zKG5ld1N0ciwgY3Vyc29yLCBlbmRQb3NpdGlvbik7XHJcblx0XHRpZiAobmV3U3RyLmluZGV4T2Yoc3RvcFN5bWJvbCkgIT0gLTEpXHRzdG9wRm91bmQgPSB0cnVlO1xyXG5cdFx0aWYgKG5ld1N0ci5pbmRleE9mKHBhc3RlU3ltYm9sKSAhPSAtMSlcdHNuaXBwZXRTdGFydHBvcyA9IGN1cnNvcjtcclxuXHJcblx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihuZXdTdHIpO1xyXG5cclxuXHJcblx0XHRpZiAoc3RvcEZvdW5kKSB7XHJcblx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe1xyXG5cdFx0XHRcdGxpbmU6IGN1cnNvci5saW5lLFxyXG5cdFx0XHRcdGNoOiBjdXJzb3IuY2hcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5uZXh0U3RvcCgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7XHJcblx0XHRcdFx0bGluZTogY3Vyc29yLmxpbmUgKyBlbmRQb3NpdGlvbi5ubGluZXNDb3VudCxcclxuXHRcdFx0XHRjaDogY3Vyc29yLmNoICsgZW5kUG9zaXRpb24ucG9zaXRpb25cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0ZWRpdG9yLmZvY3VzKCk7XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdGFkanVzdEN1cnNvcihlZGl0b3I6IENvZGVNaXJyb3IuRWRpdG9yLCBjdXJzb3I6IENvZGVNaXJyb3IuUG9zaXRpb24sIG5ld1N0cjogc3RyaW5nLCBvbGRTdHI6IHN0cmluZykge1xyXG5cdFx0dmFyIGN1cnNvck9mZnNldCA9IG5ld1N0ci5sZW5ndGggLSBvbGRTdHIubGVuZ3RoO1xyXG5cdFx0dGhpcy5hZGp1c3RDdXJzb3JPZmZzZXQoZWRpdG9yLCBjdXJzb3IsIGN1cnNvck9mZnNldCk7XHJcblx0fVxyXG5cclxuXHRhZGp1c3RDdXJzb3JPZmZzZXQoZWRpdG9yOiBDb2RlTWlycm9yLkVkaXRvciwgY3Vyc29yOiBDb2RlTWlycm9yLlBvc2l0aW9uLCBjdXJzb3JPZmZzZXQ6IGFueSkge1xyXG5cdFx0ZWRpdG9yLnNldEN1cnNvcih7XHJcblx0XHRcdGxpbmU6IGN1cnNvci5saW5lLFxyXG5cdFx0XHRjaDogY3Vyc29yLmNoICsgY3Vyc29yT2Zmc2V0XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZUtleURvd24gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KSA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmICgoZXZlbnQua2V5ID09ICdUYWInICYmIHRoaXMuc2V0dGluZ3MudXNlVGFiKSB8fCAoZXZlbnQuY29kZSA9PSAnU3BhY2UnICYmIHRoaXMuc2V0dGluZ3MudXNlU3BhY2UpKSB7XHJcblx0XHRcdHRoaXMuU25pcHBldE9uVHJpZ2dlcihldmVudC5jb2RlLCB0cnVlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdFNuaXBwZXRPblRyaWdnZXIoa2V5IDogc3RyaW5nID0gJycsIHByZXZlbnREZWY6IGJvb2xlYW49ZmFsc2UpOiBib29sZWFuIHtcclxuXHRcdGxldCBhY3RpdmVMZWFmOiBhbnkgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuXHRcdGxldCBjbSA9IGFjdGl2ZUxlYWYudmlldy5zb3VyY2VNb2RlLmNtRWRpdG9yO1xyXG5cdFx0dmFyIGN1cnNvclN0ID0gY20uZ2V0Q3Vyc29yKCk7XHJcblx0XHRpZiAodGhpcy5pbnNlcnRTbmlwcGV0KGtleSwgY3Vyc29yU3QpKSB7XHJcblxyXG5cdFx0XHRpZiAocHJldmVudERlZikge1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuaXNXWVNJV1lHICYmIGtleSA9PSAnVGFiJyl7XHJcblx0XHRcdFx0XHQvLyBkZWxldGUgJ1xcdCcgaW4gTGl2ZSBwcmV2aWV3XHJcblx0XHRcdFx0XHR2YXIgc2VhcmNoID0gY20uc2VhcmNoQ3Vyc29yKCdcXHQnLCBjdXJzb3JTdCk7XHJcblx0XHRcdFx0XHRpZiAoc2VhcmNoLmZpbmRQcmV2aW91cygpKSB7XHJcblx0XHRcdFx0XHRcdHNlYXJjaC5yZXBsYWNlKCcnKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdGlmIChjdXJzb3JTdC5jaCA+PTAgJiYgY3Vyc29yU3QubGluZSA+PSAwKSB7XHRcdC8vcGFzdGUgdGV4dCBmcm9tIGNsaXBib2FyZFxyXG5cdFx0XHRcdHZhciBjdXJzb3JPcmlnID0gY20uZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0bmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpLnRoZW4oXHJcblx0XHRcdFx0XHQoY2xpcFRleHQpID0+IHtcclxuXHJcblx0XHRcdFx0XHRcdGlmKHRoaXMuc2V0dGluZ3MuaXNXWVNJV1lHID09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHNlYXJjaCA9IGNtLmdldFNlYXJjaEN1cnNvcih0aGlzLnNldHRpbmdzLnBhc3RlU3ltYm9sLCBjdXJzb3JTdCk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHNlYXJjaCA9IGNtLnNlYXJjaEN1cnNvcih0aGlzLnNldHRpbmdzLnBhc3RlU3ltYm9sLCBjdXJzb3JTdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKHNlYXJjaC5maW5kTmV4dCgpKSB7XHJcblx0XHRcdFx0XHRcdFx0c2VhcmNoLnJlcGxhY2UoY2xpcFRleHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLm5leHRTdG9wKCk7XHJcblx0fVxyXG5cclxuXHRuZXh0U3RvcCgpOiBib29sZWFuIHtcclxuXHRcdGxldCBhY3RpdmVMZWFmOiBhbnkgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcclxuXHRcdGxldCBjbSA9IGFjdGl2ZUxlYWYudmlldy5zb3VyY2VNb2RlLmNtRWRpdG9yO1xyXG5cclxuXHRcdGlmKHRoaXMuc2V0dGluZ3MuaXNXWVNJV1lHID09IGZhbHNlKSB7XHJcblx0XHRcdHZhciBzZWFyY2ggPSBjbS5nZXRTZWFyY2hDdXJzb3IodGhpcy5zZXR0aW5ncy5zdG9wU3ltYm9sLCBjbS5nZXRDdXJzb3IoKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgc2VhcmNoID0gY20uc2VhcmNoQ3Vyc29yKHRoaXMuc2V0dGluZ3Muc3RvcFN5bWJvbCwgY20uZ2V0Q3Vyc29yKCkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChzZWFyY2guZmluZE5leHQoKSkge1xyXG5cdFx0XHRzZWFyY2gucmVwbGFjZShcIlwiKTtcclxuXHJcblx0XHRcdGlmKHRoaXMuc2V0dGluZ3MuaXNXWVNJV1lHID09IGZhbHNlKSB7XHJcblx0XHRcdFx0Y20uc2V0Q3Vyc29yKHNlYXJjaC5mcm9tKCkpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNtLnNldEN1cnNvcihzZWFyY2guY3VycmVudCgpLmZyb20pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLnVzZVRhYikge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcblxyXG5pbnRlcmZhY2UgVGV4dFNuaXBwZXRzU2V0dGluZ3Mge1xyXG5cdHNuaXBwZXRzX2ZpbGU6IHN0cmluZztcclxuXHRzbmlwcGV0czogc3RyaW5nW107XHJcblx0ZW5kU3ltYm9sOiBzdHJpbmc7XHJcblx0bmV3bGluZVN5bWJvbDogc3RyaW5nO1xyXG5cdHN0b3BTeW1ib2w6IHN0cmluZztcclxuXHRwYXN0ZVN5bWJvbDogc3RyaW5nO1xyXG5cdHVzZVRhYjogYm9vbGVhbjtcclxuXHR1c2VTcGFjZTogYm9vbGVhbjtcclxuXHR3b3JkRGVsaW1pdGVyczogc3RyaW5nO1xyXG5cdGlzV1lTSVdZRzogYm9vbGVhbjtcclxuXHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFRleHRTbmlwcGV0c1NldHRpbmdzID0ge1xyXG5cdHNuaXBwZXRzX2ZpbGU6IFwic25pcHBldHMgOiBJdCBpcyBhbiBvYnNpZGlhbiBwbHVnaW4sIHRoYXQgcmVwbGFjZXMgeW91ciBzZWxlY3RlZCB0ZXh0LlwiLFxyXG5cdHNuaXBwZXRzIDogW1wic25pcHBldHMgOiBJdCBpcyBhbiBvYnNpZGlhbiBwbHVnaW4sIHRoYXQgcmVwbGFjZXMgeW91ciBzZWxlY3RlZCB0ZXh0LlwiXSxcclxuXHRlbmRTeW1ib2w6ICckZW5kJCcsXHJcblx0bmV3bGluZVN5bWJvbDogJyRubCQnLFxyXG5cdHN0b3BTeW1ib2w6IFwiJHRiJFwiLFxyXG5cdHBhc3RlU3ltYm9sOiBcIiRwc3QkXCIsXHJcblx0dXNlVGFiOiB0cnVlLFxyXG5cdHVzZVNwYWNlOiBmYWxzZSxcclxuXHR3b3JkRGVsaW1pdGVyczogXCIkKClbXXt9PD4sLiE/OzpcXCdcXFwiXFxcXC9cIixcclxuXHRpc1dZU0lXWUc6IGZhbHNlLFxyXG59XHJcblxyXG5jbGFzcyBUZXh0U25pcHBldHNTZXR0aW5nc1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVGV4dFNuaXBwZXRzO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUZXh0U25pcHBldHMpIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGxldCB7XHJcblx0XHRcdGNvbnRhaW5lckVsXHJcblx0XHR9ID0gdGhpcztcclxuXHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywge3RleHQ6ICdUZXh0IFNuaXBwZXRzIC0gU2V0dGluZ3MnfSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHQuc2V0TmFtZShcIlNuaXBwZXRzXCIpXHJcblx0XHQuc2V0RGVzYyhcIlR5cGUgaGVyZSB5b3VyIHNuaXBwZXRzIGluIGZvcm1hdCAnc25pcHBldCA6IHJlc3VsdCcsIG9uZSBwZXIgbGluZS4gRW1wdHkgbGluZXMgd2lsbCBiZSBpZ25vcmVkLiBDdHJsK1RhYiB0byByZXBsYWNlIChob3RrZXkgY2FuIGJlIGNoYW5nZWQpLlwiKVxyXG5cdFx0LnNldENsYXNzKFwidGV4dC1zbmlwcGV0cy1jbGFzc1wiKVxyXG5cdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxyXG5cdFx0XHR0ZXh0XHJcblx0XHRcdC5zZXRQbGFjZWhvbGRlcihcImJlZm9yZSA6IGFmdGVyXCIpXHJcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zbmlwcGV0c19maWxlKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc25pcHBldHNfZmlsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdHRoaXMucGx1Z2luLlVwZGF0ZVNwbGl0KHRoaXMucGx1Z2luLnNldHRpbmdzLm5ld2xpbmVTeW1ib2wpO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoXCJDdXJzb3IgZW5kIHBvc2l0aW9uIG1hcmtcIilcclxuXHRcdC5zZXREZXNjKFwiUGxhY2VzIHRoZSBjdXJzb3IgdG8gdGhlIG1hcmsgcG9zaXRpb24gYWZ0ZXIgaW5zZXJ0aW5nIGEgc25pcHBldCAoZGVmYXVsdDogJGVuZCQpLlxcbk1hcmsgZG9lcyBub3QgYXBwZWFyIGFueXdoZXJlIHdpdGhpbiB0aGUgc25pcHBldC4gRG8gbm90IHVzZSB0b2dldGhlciB3aXRoIFN0b3AgU3ltYm9sLlwiKVxyXG5cdFx0LnNldENsYXNzKFwidGV4dC1zbmlwcGV0cy1jdXJzb3JcIilcclxuXHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT5cclxuXHRcdFx0dGV4dFxyXG5cdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCIkZW5kJFwiKVxyXG5cdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5kU3ltYm9sKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0aWYgKHZhbHVlID09ICcnKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9ICckZW5kJCc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuZFN5bWJvbCA9IHZhbHVlO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoXCJOZXdsaW5lIG1hcmtcIilcclxuXHRcdC5zZXREZXNjKFwiSWdub3JlcyBuZXdsaW5lIGFmdGVyIG1hcmssIHJlcGxhY2UgaXQgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyIGFmdGVyIGV4cGFuZGluZyAoZGVmYXVsdDogJG5sJCkuXFxuTmVjZXNzYXJ5IHRvIHdyaXRlIGJlZm9yZSBldmVyeSBsaW5lIGJyZWFrIGluIG11bHRpbGluZSBzbmlwcGV0cy5cIilcclxuXHRcdC5zZXRDbGFzcyhcInRleHQtc25pcHBldHMtbmV3bGluZVwiKVxyXG5cdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxyXG5cdFx0XHR0ZXh0XHJcblx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIiRubCRcIilcclxuXHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5ld2xpbmVTeW1ib2wpXHJcblx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRpZiAodmFsdWUgPT0gJycpIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gJyRubCQnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5uZXdsaW5lU3ltYm9sID0gdmFsdWU7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uVXBkYXRlU3BsaXQodmFsdWUpO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoJ1N0b3AgU3ltYm9sJylcclxuXHRcdC5zZXREZXNjKCdTeW1ib2wgdG8ganVtcCB0byB3aGVuIGNvbW1hbmQgaXMgY2FsbGVkLicpXHJcblx0XHQuc2V0Q2xhc3MoXCJ0ZXh0LXNuaXBwZXRzLXRhYnN0b3BzXCIpXHJcblx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHRleHRcclxuXHRcdFx0LnNldFBsYWNlaG9sZGVyKCcnKVxyXG5cdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RvcFN5bWJvbClcclxuXHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdGlmICh2YWx1ZSA9PScnKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9ICckdGIkJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RvcFN5bWJvbCA9IHZhbHVlO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdC5zZXROYW1lKCdDbGlwYm9hcmQgcGFzdGUgU3ltYm9sJylcclxuXHRcdC5zZXREZXNjKCdTeW1ib2wgdG8gYmUgcmVwbGFjZWQgd2l0aCBjbGlwYm9hcmQgY29udGVudC4nKVxyXG5cdFx0LnNldENsYXNzKFwidGV4dC1zbmlwcGV0cy10YWJzdG9wc1wiKVxyXG5cdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PiB0ZXh0XHJcblx0XHRcdC5zZXRQbGFjZWhvbGRlcignJylcclxuXHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnBhc3RlU3ltYm9sKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0aWYgKHZhbHVlID09JycpIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gJyRwc3QkJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGFzdGVTeW1ib2wgPSB2YWx1ZTtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdC5zZXROYW1lKFwiRXhwYW5kIG9uIFRhYlwiKVxyXG5cdFx0LnNldERlc2MoXCJVc2UgdGhlIFRhYiBrZXkgYXMgdGhlIHRyaWdnZXIuXCIpXHJcblx0XHQuYWRkVG9nZ2xlKHRvZ2dsZSA9PlxyXG5cdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGFiKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlVGFiID0gIXRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVRhYjtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoXCJFeHBhbmQgb24gU3BhY2VcIilcclxuXHRcdC5zZXREZXNjKFwiVXNlIHRoZSBTcGFjZSBiYXIgYnV0dG9uIGFzIHRoZSB0cmlnZ2VyLlwiKVxyXG5cdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT5cclxuXHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZVNwYWNlKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlU3BhY2UgPSAhdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlU3BhY2U7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdC5zZXROYW1lKFwiTGl2ZSBQcmV2aWV3IE1vZGVcIilcclxuXHRcdC5zZXREZXNjKFwiVG9nZ2xlIG1hbnVhbGx5IGlmIG5vdCBjb3JyZWN0LiBZb3Ugc2hvdWxkIHJlc3RhcnQgcGx1Z2luIGFmdGVyIGNoYW5naW5nIHRoaXMgb3B0aW9uLlwiKVxyXG5cdFx0LmFkZFRvZ2dsZSh0b2dnbGUgPT5cclxuXHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmlzV1lTSVdZRylcclxuXHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmlzV1lTSVdZRyA9ICF0aGlzLnBsdWdpbi5zZXR0aW5ncy5pc1dZU0lXWUc7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHQuc2V0TmFtZSgnV29yZCBkZWxpbWl0ZXJzJylcclxuXHRcdC5zZXREZXNjKCfQoWhhcmFjdGVycyBmb3Igc3BlY2lmeWluZyB0aGUgYm91bmRhcnkgYmV0d2VlbiBzZXBhcmF0ZSB3b3Jkcy4nKVxyXG5cdFx0LnNldENsYXNzKFwidGV4dC1zbmlwcGV0cy1kZWxpbWl0ZXJcIilcclxuXHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHQuc2V0UGxhY2Vob2xkZXIoJycpXHJcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy53b3JkRGVsaW1pdGVycylcclxuXHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLndvcmREZWxpbWl0ZXJzID0gdmFsdWU7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdH1cclxufVxyXG4iXSwibmFtZXMiOlsiUGx1Z2luIiwiTWFya2Rvd25WaWV3IiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1REE7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxD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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment