/*! Bundled by webpack from entry point: ./_Scripts/tageditornew/tageditornew.ts */
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./_Scripts/LegacyJS/constants.mod.js":
/*!********************************************!*\
!*** ./_Scripts/LegacyJS/constants.mod.js ***!
\********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ KEY_CODE: () => (/* binding */ KEY_CODE)
/* harmony export */ });
const KEY_CODE = {
LEFT_MOUSE: 1,
MIDDLE_MOUSE: 2,
BACKSPACE: 8,
TAB: 9,
ENTER: 13,
ESC: 27,
SPACE: 32,
PAGEUP: 33,
PAGEDOWN: 34,
END: 35,
HOME: 36,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
DEL: 46,
0: 48,
1: 49,
2: 50,
3: 51,
4: 52,
5: 53,
6: 54,
7: 55,
8: 56,
9: 57,
A: 65,
B: 66,
C: 67,
D: 68,
E: 69,
F: 70,
G: 71,
H: 72,
I: 73,
J: 74,
K: 75,
L: 76,
M: 77,
N: 78,
O: 79,
P: 80,
Q: 81,
R: 82,
S: 83,
T: 84,
U: 85,
V: 86,
W: 87,
X: 88,
Y: 89,
Z: 90,
F4: 115,
COMMA: 188,
};
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/publicPath */
/******/ (() => {
/******/ __webpack_require__.p = "";
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules.
(() => {
var __webpack_exports__ = {};
/*!***************************************************!*\
!*** ./_Scripts/_Includes/set-public-path.mod.ts ***!
\***************************************************/
__webpack_require__.r(__webpack_exports__);
// We need to set the public path at runtime based on the GlobalRoot site setting.
// (We don't know at build time where the static files will be,
// since we could be deployed on-premise.)
// The value of that site setting gets written out to the dom in Master.cshtml
// (see JavaScriptHelper.PublicPath()) so that we can read it here
__webpack_require__.p = document.getElementById("webpack-public-path").innerText + "Js/";
})();
// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules.
(() => {
/*!***********************************************!*\
!*** ./_Scripts/tageditornew/tageditornew.ts ***!
\***********************************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../LegacyJS/constants.mod */ "./_Scripts/LegacyJS/constants.mod.js");
/*** IMPORTS FROM imports-loader ***/
StackExchange = window.StackExchange = (window.StackExchange || {});
StackOverflow = window.StackOverflow = (window.StackOverflow || {});
"use strict";
function tagEditor(jActual, options = {}) {
var tagEditorId = Math.floor(Math.random() * 1000);
if (typeof options.initialFocus === "undefined") {
options.initialFocus = jActual.is(":focus");
}
function setFocus() { options.initialFocus = true; }
if (!jActual.is(":visible")) { // it may fade in when doing inline-editing
var tryNumber = options.__tryNumber || 0;
var incrementTryNumber = $('body').is(":visible"); // Locally, we have to wait for LESS to display the body. This can take an extra long time.
if (tryNumber < 3) {
options.__tryNumber = tryNumber + (incrementTryNumber ? 1 : 0);
jActual.on("focus", setFocus); // start recording this immediately (mainly for the inline tag editor)
setTimeout(function () {
jActual.off("focus", setFocus);
StackExchange.tagEditor(jActual, options);
}, 300);
return;
}
else {
if (!$('body.review-task-page').length && !$('body.staging-ground-listing').length) {
StackExchange.debug.log("tag box is invisible, couldn't start tag editor");
}
return;
}
}
var hasFocus = !!options.initialFocus;
var columns = options.columns || 3;
var show_excerpts = typeof (options.excerpts) == "undefined" || options.excerpts;
var render_learn_more = typeof (options.learnMore) == "undefined" || options.learnMore;
var placeholder = jActual.attr('placeholder') || "";
var renderTag = function (s) { return window.tagRenderer(s, null, "span", !!options.useStacksClasses); };
var filterTags = options.customFilterTags || function (tags, inputPosition) {
var existing = {};
return tags.map(function (tagText) {
// remove empty tags
if (/^\s*$/.test(tagText))
return false;
// remove duplicate tags
if (existing[tagText] === true)
return false;
if (!options.operators || !options.operators.test(tagText))
existing[tagText] = true;
return true;
});
};
var existingTags = options.customExistingTags || function (tags, inputPosition) {
return tags;
};
var safeTags = options.customSafeTags || function (tags) {
var result = StackExchange.helpers.sanitizeAndSplitTags(tags, /* allowWildcards */ false, !!options.operators, options.allowUpperCaseTagNames) || [];
if (tags && $.trim(tags)) {
log('safeTags("{0}") => {1}'.formatUnicorn(tags, result.toString()));
}
return result;
};
var sanitizeSearchTerm = options.sanitizeSearchTerm || function (inputValue) {
return safeTags(inputValue)[0];
};
var suggestions = $(); // Retain the suggestion popover in case there are multiple editors on a page.
var width = jActual.innerWidth();
var editor = $("
").insertAfter(jActual);
editor.data('target-field', jActual.get(0));
if (options.extraTagEditorCssClass) {
editor.addClass(options.extraTagEditorCssClass);
}
["padding-right", "padding-left", "box-sizing", "margin-top", "margin-bottom"].forEach(function (prop) {
editor.css(prop, jActual.css(prop));
});
var borderBox = jActual.css("box-sizing") === "border-box";
if (borderBox) {
width += parseInt(editor.css("border-right-width"), 10) + parseInt(editor.css("border-left-width"), 10);
}
var suggestionsWidth = options.suggestionsWidth || width, boxWidth = ((suggestionsWidth - 12) / columns) | 0, narrowBoxes = options.responsiveIsh && boxWidth < 150;
editor.css("width", width);
var actualDisplay = jActual.css("display");
jActual.hide();
// note: this must happen *after* hiding the actual . If the element has a percentage
// width but isn't display: none, getComputedStyle may or may not return the *used* value, i.e.
// actual pixel width (depends on browser and probably other things).
var width_css = getComputedStyle(jActual[0]).width;
var responsive_width = /%$/.test(width_css);
if (responsive_width) {
editor.css("width", width_css);
}
if (actualDisplay === "inline") {
editor.css("display", "inline-block");
}
var preciseSelection = "selectionDirection" in jActual[0];
var test = renderTag("test").appendTo(editor), rowHeight = borderBox ? editor.outerHeight() : editor.innerHeight(), height = jActual.innerHeight();
test.remove();
if (borderBox) {
height += parseInt(editor.css("border-top-width"), 10) + parseInt(editor.css("border-bottom-width"), 10);
}
var preInput = $("").appendTo(editor), input = $(``)
.appendTo(editor).val(jActual.val() + " ")
.attr('placeholder', placeholder), postInput = $("").appendTo(editor), ti = jActual.attr("tabIndex");
var actualId = jActual.attr("id");
if (actualId) {
var labels = $("label[for='" + actualId + "']");
if (labels.length) {
var editorId = "tageditor-replacing-" + actualId + "--input";
input.attr("id", editorId);
labels.attr("for", editorId);
}
}
if (ti) {
input.attr("tabIndex", ti);
}
["aria-labelledby", "aria-label"].forEach(attr => {
const value = jActual.attr(attr);
if (value) {
input.attr(attr, value);
}
});
if (jActual.hasClass("s-input")) {
editor.addClass("s-input").css({ paddingTop: 0, paddingBottom: 0 });
input.addClass("s-input"); // most of the styling is un-done, but we want to get the typography
}
input.addClass("js-tageditor-replacing");
var suggestionHasFocus = false;
var _requiredRegex;
function requiredRegex() {
if (typeof _requiredRegex === "undefined") {
var req = StackExchange.tagEditor.requiredTags;
var sources = [];
for (var i = 0; i < req.length; i++) {
sources.push(getTagNameFromData(req[i]).replace(/[.+]/g, "\\$&"));
}
_requiredRegex = new RegExp("^(?:" + sources.join("|") + ")$");
}
return _requiredRegex;
}
function ensureRequiredTags() {
if (options.ignoreRequired)
return;
var required = StackExchange.tagEditor.requiredTags; // the ask page sets this
if (required && required.length && /^ ?$/.test(input.val())) {
var rr = requiredRegex();
if (preInput.add(postInput).children().filter(function () { return rr.test($(this).text()); }).length === 0)
showTagSuggestions(required, '');
}
}
function shouldShowAllBecauseEmptyAndFocused() {
return options.showAllWhenEmptyAndFocused && isTotallyEmpty();
}
// We're simulating focus/blur events on jActual. This variable
// keeps track of whether we "conceptually" consider the tag editor
// to have focus.
var actualHasFakeFocus = hasFocus;
input.focus(function (evt, doNotTriggerOnActual = false) {
hasFocus = true;
ensureRequiredTags();
if (!actualHasFakeFocus) {
if (!doNotTriggerOnActual)
jActual.triggerHandler("focus", true);
actualHasFakeFocus = true;
}
if (shouldShowAllBecauseEmptyAndFocused()) {
autocomplete(true);
}
});
// We want to trigger a blur event on the actual (invisible) tag input box when the
// user leaves the "fake" editor. For that, we have to handle the following case:
// The textbox (`input`) has focus, and the user clicks on a present tag (or its
// delete icon). In that case, events are fired in this order:
// mousedown on the tag
// blur on `input`
// mouseup on the tag
// click on the tag -> causing editTag() to refocus `input`
// We don't want to consider this a blur, since practically the focus never left
// the editor. That's why we inhibit our custom trigger in the mousedown handler,
// and only fire the blur event after the mouseup event, and only if it's still
// appropriate.
// Note: *after* (via timeout), not *in* the mouseup handler, since *in* the handler,
// `input` wasn't refocused yet.
var doNotPropagateNextBlur = false;
editor.mousedown(function () {
doNotPropagateNextBlur = true;
$(document).one("mouseup", function () {
setTimeout(function () {
if (!hasFocus) {
jActual.triggerHandler("blur");
actualHasFakeFocus = false;
}
doNotPropagateNextBlur = false;
}, 0);
});
});
input.blur(function (evt) {
hasFocus = false;
setTimeout(function () {
if (!suggestionHasFocus) {
cancelAutoCompletion();
cleanUp();
if (!doNotPropagateNextBlur) {
jActual.triggerHandler("blur");
actualHasFakeFocus = false;
}
}
doNotPropagateNextBlur = false;
}, 0); // we have to cycle through the event loop for the suggestion to get focus, hence the timeout
});
jActual.focus(function (evt, isFake) {
if (!isFake) {
input.trigger("focus", true);
}
});
input.on({
keydown: input_keydown,
keyup: input_keyup,
input: function () { setTimeout(cleanUp, 0); },
});
editor.delegate(".rendered-element", "click", function (evt) {
var jThis = $(this);
if ($(evt.target).hasClass("js-delete-tag")) {
jThis.text("");
}
editTag(jThis);
cleanUp();
});
editor.click(function (evt) {
if (evt.target !== this)
return;
editTag("");
cleanUp();
});
// allow redrawing of the tags after they've been rendered, e.g. when needing to change a tag's sponsored image
editor.on('rerender', function () {
combine();
cleanUp(true);
});
function tagSpan(tagName, noDelete = false) {
var jSpan = renderTag(tagName);
if (options.tagMenus) {
jSpan.data('tag-menu-tagname', tagName);
}
if (!noDelete) {
var btnClasses = (jSpan.hasClass("s-tag") ? 's-tag--dismiss' : 'delete-tag') + ' baw0 js-delete-tag';
var btn = $('', {
'class': btnClasses,
'type': 'button',
'title': options.tooltipDeleteTag || __tr(["Remove tag"], undefined, "en", [])
});
if (jSpan.hasClass("s-tag")) {
// Append clear icon
btn.append($(""));
}
jSpan.append(btn);
// TagSponsorships.Edit will add the image here
editor.trigger('tagSpanCreated', [jSpan]);
}
if (options.tagSpanCreated) { // allow other shenanigans to occur on this .post-tag
options.tagSpanCreated(jSpan);
}
return jSpan;
}
function tagsInDirection(direction) {
var preTags = $([]), postTags = $([]);
switch (direction) {
case COMBINE_DIRECTION.all:
preTags = preInput.find(".rendered-element");
postTags = postInput.find(".rendered-element");
break;
case COMBINE_DIRECTION.left:
preTags = preInput.find(".rendered-element:last");
break;
case COMBINE_DIRECTION.right:
postTags = postInput.find(".rendered-element:first");
break;
case COMBINE_DIRECTION.all_left:
preTags = preInput.find(".rendered-element");
break;
case COMBINE_DIRECTION.all_right:
postTags = postInput.find(".rendered-element");
break;
}
return {
pre: preTags,
post: postTags
};
}
function plainInput(direction = COMBINE_DIRECTION.all) {
var tags = tagsInDirection(direction);
var alltags = tags.pre.map(function (i, el) { return $(el).text(); }).get();
var preContent = alltags.join(" ");
if (preContent.length)
preContent += " ";
var postTags = tags.post.map(function (i, el) { return $(el).text(); }).get();
var postContent = postTags.join(" ");
if (postContent.length && input.val().length)
postContent = " " + postContent;
var val = input.val();
alltags = alltags.concat(postTags);
return {
text: preContent + input.val() + postContent,
lengthBeforeInput: preContent.length,
val: val,
tags: alltags
};
}
// expects a result from plainInput(COMBINE_DIRECTION.all); if you don't have one ready, pass nothing
function triggerRenderedChange(resultFromPlainInput) {
const finalResult = resultFromPlainInput !== null && resultFromPlainInput !== void 0 ? resultFromPlainInput : plainInput();
setTimeout(function () {
jActual.trigger("tageditor:renderedchange", [finalResult.tags, finalResult.val]);
});
setInputWidth(); // something has changed, ensure the dynamically-sized input display is wide enough
checkForCommunityTags();
}
function isTotallyEmpty() {
var val = input.val();
return (val === "" || val === " ") && preInput.add(postInput).children().filter(function () { return !/^\s*$/.test($(this).text()); }).length === 0;
}
function getTagNameFromData(dataItem) {
var _a;
return options.getTagNameFromData ? options.getTagNameFromData(dataItem) : (_a = dataItem.Name) !== null && _a !== void 0 ? _a : '';
}
let COMBINE_DIRECTION;
(function (COMBINE_DIRECTION) {
COMBINE_DIRECTION[COMBINE_DIRECTION["left"] = 1] = "left";
COMBINE_DIRECTION[COMBINE_DIRECTION["right"] = 2] = "right";
COMBINE_DIRECTION[COMBINE_DIRECTION["all_left"] = 3] = "all_left";
COMBINE_DIRECTION[COMBINE_DIRECTION["all_right"] = 4] = "all_right";
COMBINE_DIRECTION[COMBINE_DIRECTION["all"] = 5] = "all"; // the default
})(COMBINE_DIRECTION || (COMBINE_DIRECTION = {}));
function combine(direction = COMBINE_DIRECTION.all) {
var sel = input.caret();
var selDir = input[0].selectionDirection;
var tags = tagsInDirection(direction);
if (!tags.pre.add(tags.post).length) // already combined
return;
var plain = plainInput(direction);
input.val(plain.text);
tags.pre.remove();
tags.post.remove();
input.caret(sel.start + plain.lengthBeforeInput, sel.end + plain.lengthBeforeInput);
if (preciseSelection)
input[0].selectionDirection = selDir;
cancelAutoCompletion();
triggerRenderedChange();
}
function tagSpanOrUnstyled(tagName) {
if (options.operators && options.operators.test(tagName)) {
return $("").text(tagName);
}
var result = tagSpan(tagName).addClass("rendered-element");
if (!isTagValid(tagName)) {
result
.addClass("invalid-tag temp-tag__danger")
.attr('title', options.tooltipInvalidTag || __tr(["invalid tag"], undefined, "en", []));
}
return result;
}
function isTagValid(tagName) {
if (options.invalid && options.invalid[tagName])
return false;
if (options.isTagValid && !options.isTagValid(tagName))
return false;
return true;
}
function cleanUp(firstTime) {
if (suggestionHasFocus)
return;
var sel;
if (firstTime) // opera puts the cursor to the front, not the end
sel = { start: input.val().length, end: input.val().length };
else
sel = input.caret();
// For IE; happens when you click somewhere else (e.g. another tag) and thus cause a blur.
// This isn't directly IE's fault; rather, it's the caret plugin's way of using lastIndexOf
// to find the selection start that returns a -1 in that case.
if (sel.start == -1)
sel.start = sel.end = 0;
if (!preciseSelection && sel.start !== sel.end) {
combine(); // in most cases this will be a no-op, except if the user selected text using anything other than the standard keys
setInputWidth();
return;
}
var inputVal = input.val();
var preCursor = inputVal.substr(0, sel.start);
var postCursor = inputVal.substr(sel.end);
var selDir = input[0].selectionDirection;
// we have to preserve a possible empty element at the end (i.e. the *last* character is [,;\s]);
// certain browsers IE remove it. Hence the "!" thing
var splitRegex = options.allowSpaces ? /[,;]+/ : /[,;\s]+/;
var splitFn = typeof options.customCleanUpSplit === "function" ? options.customCleanUpSplit : function (input) { return input.split(splitRegex); };
var preSplit = splitFn(preCursor + "!");
preSplit = (preCursor + "!").split(splitRegex);
if (preSplit[preSplit.length - 1] === "!") {
preSplit[preSplit.length - 1] = "";
}
else {
preSplit[preSplit.length - 1] = preSplit[preSplit.length - 1].slice(0, -1);
}
var postSplit = splitFn(postCursor);
var onCursor = preSplit.pop(); // type assertion is valid because split() always returns at least one string
var newCursor = onCursor.length;
onCursor += inputVal.substring(sel.start, sel.end);
onCursor += postSplit.shift();
preSplit = safeTags(preSplit.join(" "));
postSplit = safeTags(postSplit.join(" "));
var renderedChange = !!preSplit.length || !!postSplit.length;
var i;
for (i = 0; i < preSplit.length; i++) {
tagSpanOrUnstyled(preSplit[i]).appendTo(preInput);
}
for (i = 0; i < postSplit.length; i++) {
tagSpanOrUnstyled(postSplit[i]).appendTo(postInput);
}
if (onCursor !== input.val()) {
input.val(onCursor);
}
var $renderedElements = editor.find(".rendered-element");
// The JQuery typings don't know about the concept of a jquery object not containing an html element
const renderedStrings = $renderedElements.map(function (_, el) { return $(el).text(); }).get();
var tagsToKeep = filterTags(renderedStrings, preInput.find(".rendered-element").length);
i = 0;
$renderedElements.filter(function () {
return !tagsToKeep[i++];
}).remove();
var pi = plainInput();
var newVal = $.trim(pi.text);
var oldVal = jActual.val();
if (newVal != oldVal) {
jActual.val(newVal).trigger("change");
const editorIsLoaded = !!StackExchange.MarkdownEditor;
if (editorIsLoaded && !options.ignoreStyleCode) {
// tags have changed, and we have a WMD -- update the syntax highlighting
styleCode.updateLangdivDelayed.trigger(newVal.split(/ /g));
}
}
if (renderedChange) {
triggerRenderedChange(pi);
}
if (hasFocus) {
input.caret(newCursor, newCursor + sel.end - sel.start);
if (preciseSelection)
input[0].selectionDirection = selDir;
autocomplete();
ensureRequiredTags();
}
setInputWidth();
// On the checks below: in IE 11, this will cause 'input' events to fire, creating a loop
if (isTotallyEmpty()) {
if (input.attr('placeholder') !== placeholder) {
input.attr('placeholder', placeholder);
}
}
else {
if (input.attr('placeholder') !== '') {
input.attr('placeholder', '');
}
}
}
function equalsIgnoreOrder(_arr1, _arr2) {
if (!Array.isArray(_arr1)
|| !Array.isArray(_arr2)
|| _arr1.length !== _arr2.length) {
return false;
}
// .concat() to not mutate arguments
const arr1 = _arr1.concat().sort();
const arr2 = _arr2.concat().sort();
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
var communitiesByTagsUrl = '/collectives/shared/get-communities-by-tags';
var $communityBadges = editor.closest('.js-tag-editor-container').find('.js-community-icons');
var firstLoad = !$communityBadges.is(':empty');
var subCommunitySlugs = [];
var previousTags = [];
var previousSubCommunitiesData;
var getCommunitiesByTags = StackExchange.helpers.DelayedReaction(function (tags, callback) {
if (equalsIgnoreOrder(previousTags, tags)) {
callback(previousSubCommunitiesData);
return;
}
previousTags = tags;
StackExchange.helpers.addSpinner(editor, { position: "absolute", right: 10, top: height / 2 - 2 });
$.ajax({
url: communitiesByTagsUrl,
data: { tags: tags },
traditional: true
})
.done(function (data) {
previousSubCommunitiesData = data;
StackExchange.helpers.removeSpinner();
callback(data);
});
}, 400, { sliding: true });
function checkForCommunityTags() {
if (firstLoad) {
firstLoad = false;
return;
}
var $renderedElements = editor.find(".rendered-element");
var tags = $renderedElements.toArray().map(function (el) { return $(el).text(); });
if ($communityBadges.length === 0)
return;
if (tags && tags.length > 0) {
getCommunitiesByTags.trigger(tags, updateForCommunityTags);
}
else {
updateForCommunityTags();
}
}
function updateForCommunityTags(subCommunitiesData) {
if (!subCommunitiesData || !subCommunitiesData.subCommunities || subCommunitiesData.subCommunities.length === 0) {
subCommunitySlugs = [];
$communityBadges.empty();
return;
}
var newCommunitySlugs = subCommunitiesData.subCommunities.map(function (s) { return s.slug; });
if (!equalsIgnoreOrder(subCommunitySlugs, newCommunitySlugs)) {
subCommunitySlugs = newCommunitySlugs;
$communityBadges.html(subCommunitiesData.fullHtml);
}
}
function editTag(jTagOrText, cursorToStart = false, preserveFocus = false, preventFireEvent = false) {
var jTag, text;
if (typeof jTagOrText === "string")
text = jTagOrText;
else if (!jTagOrText.length)
return;
else {
jTag = jTagOrText;
text = jTag.text();
}
var inputSplit = safeTags(input.val());
for (var i = 0; i < inputSplit.length; i++) {
tagSpanOrUnstyled(inputSplit[i]).appendTo(preInput);
}
input.val(text);
if (jTag) {
var left = $($.unique(jTag.prevAll(".rendered-element").get()));
jTag.nextAll(".rendered-element").prependTo(postInput);
left.appendTo(preInput);
jTag.remove();
}
else {
postInput.find(".rendered-element").appendTo(preInput);
}
if (hasFocus || !preserveFocus) {
input.focus();
}
if (cursorToStart) {
input.caret(0, 0);
}
if (!preventFireEvent) {
triggerRenderedChange();
}
}
var contentWidthCache = {};
function contentWidth(jInput) {
var text = jInput.val(), key = "c_" + text;
if (key in contentWidthCache)
return contentWidthCache[key];
var copy = $("").css({
"font-family": jInput.css("font-family"),
"font-size": jInput.css("font-size"),
"display": "inline-block" // prevent wrapping (only matters in multiline mode)
});
copy.text(jInput.val());
copy.insertAfter(jInput);
var result = copy.innerWidth();
copy.remove();
contentWidthCache[key] = result;
return result;
}
function setInputWidth() {
if (responsive_width) {
width = editor.innerWidth(); // recalculate (this will be off-by-border-wdith, but meh)
}
var inputWidth = contentWidth(input) + 19;
var preWidth = preInput.outerWidth();
input.css("width", inputWidth);
var inputYRelative = input.position().top;
var inputY = inputYRelative /*- editor.scrollTop()*/;
if (inputY > 0 && inputY + rowHeight < height) // input box is fully visible -- don't do anything
return;
if (inputYRelative + editor.scrollTop() + rowHeight < height) { // all the way to the top -- that keeps the box visible
editor.scrollTop(0);
return;
}
editor.scrollTop(inputYRelative - (height - rowHeight) / 2 + editor.scrollTop());
}
// dy = +1 or -1
function moveCursorVertically(dy, shift) {
var candidates;
if (dy > 0) {
candidates = postInput.find("> *");
}
else {
candidates = preInput.find("> *");
}
var cur = input.position();
var inpLen = input.val().length;
var factor = inpLen > 0 ? input.caret().start / inpLen : 0.5;
var curMid = cur.left + input.width() * factor;
var found;
var foundRow;
for (var i = 0; i < candidates.length; i++) {
var cand = candidates.eq(dy > 0 ? i : candidates.length - i - 1);
var candPos = cand.position();
if (typeof foundRow !== "undefined") {
if (candPos.top !== foundRow)
break;
}
else {
var dist = Math.abs(candPos.top - cur.top);
if (dist > rowHeight / 2) {
foundRow = candPos.top;
}
else {
continue;
}
}
var candMid = candPos.left + cand.width() / 2;
if ((dy < 0 && (candMid < curMid))
||
(dy > 0 && (candMid > curMid))) {
found = found || cand;
break;
}
found = cand;
}
if (found) {
if (shift) {
while (found.parent().length)
combine(dy > 0 ? COMBINE_DIRECTION.right : COMBINE_DIRECTION.left);
input.caret(0, input.val().length);
}
else {
editTag(found);
}
return true;
}
return false;
}
// shift+arrow or home/end means the user wants to create a selection
// -- in that case, combine *everything* into the editable input,
// unless the browser supports selectionDirection
var combineOnShiftWith = {
35: true,
36: true,
37: true,
38: true,
39: true,
40: true
};
// Record that the following focus event was cause by a key press.
// Only in that case will a single suggestion be auto-chosen.
// Yes, this is kinda ugly.
var keyboardToSuggestions = false;
function recordTabbingToSuggestions() {
keyboardToSuggestions = true;
setTimeout(function () { keyboardToSuggestions = false; }, 0);
}
// If there are no tag suggestions,
// get the typed input and swap it out for a red error tag
function renderErrorTag() {
var typed = safeTags(input.val())[0];
if (!typed)
return;
var errorTag = $("");
choose(errorTag);
}
function input_keydown(evt) {
// shift but not *only* shift or shift-tab, or ctrl-A
if ((!preciseSelection && evt.shiftKey && combineOnShiftWith[evt.which]) || (evt.ctrlKey && evt.which === _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.A)) {
combine();
return true;
}
var selection = input.caret(), selDir = input[0].selectionDirection, cursor = selDir === "forward" ? selection.end : selection.start, cursorAtEnd = cursor === input.val().length, cursorAtStart = cursor === 0, prev, next;
switch (evt.which) {
case 37: // left
if (!cursorAtStart)
return true;
prev = preInput.find(".rendered-element:last");
if (!prev.length)
return true;
if (evt.shiftKey)
combine(COMBINE_DIRECTION.left);
else
editTag(prev);
return evt.shiftKey;
break;
case 39: // right
if (!cursorAtEnd)
return true;
next = postInput.find(".rendered-element:first");
if (!next.length)
return true;
if (evt.shiftKey)
combine(COMBINE_DIRECTION.right);
else
editTag(next, true);
return evt.shiftKey;
break;
case 8: // backspace
if (!cursorAtStart)
return true;
prev = preInput.find(".rendered-element:last");
if (!prev.length)
return true;
input.val(prev.text() + input.val());
input.caret(prev.text().length, prev.text().length);
prev.remove();
triggerRenderedChange();
return false;
break;
case 46: // del
if (!cursorAtEnd)
return true;
next = postInput.find(".rendered-element:first");
if (!next.length)
return true;
input.val(input.val() + next.text());
input.caret(cursor, cursor);
next.remove();
triggerRenderedChange();
return false;
break;
case 38: // up
if (moveCursorVertically(-1, evt.shiftKey)) {
return false;
}
// intentional fall-through -- up behaves like in most cases
case 36: // home
prev = preInput.find(".rendered-element:first");
if (!prev.length)
return true;
if (evt.shiftKey)
combine(COMBINE_DIRECTION.all_left);
else
editTag(prev, true);
return evt.shiftKey;
break;
case 40: // down
var sugg = suggestions.children("div:first");
if (sugg.length) {
recordTabbingToSuggestions();
sugg.focus();
return false;
}
if (moveCursorVertically(1, evt.shiftKey)) {
return false;
}
// intentional fall-through here -- if no suggestions are shown, down behaves like end
case 35: // end
next = postInput.find(".rendered-element:last");
if (!next.length)
return true;
if (evt.shiftKey)
combine(COMBINE_DIRECTION.all_right);
else
editTag(next);
return evt.shiftKey;
break;
case 9:
recordTabbingToSuggestions();
if (options.renderErrorTagIfNoResults && !hasSuggestions()) {
renderErrorTag();
}
break;
case 13: // enter
if (hasSuggestions())
return false; // make enter a no-op if the suggestions popup is there (in particular, don't submit the form)
break;
case 32: // space
if (options.allowSpaces) {
return true; // Allows users to search for multi-word tags (e.g. first and last name)
}
else if (options.spaceSelectsTopSuggestion === false) {
return false;
}
else if (options.spaceSelectsTopSuggestion && hasSuggestions()) {
choose(suggestions.children('div:first'));
return false;
}
break;
}
return true;
}
function input_keyup(evt) {
// This must be done on keyup to prevent bubbling to doEscapeClose in stub.js when the suggestion is in a modal.
if (evt.which === _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.ESC && suggestions.length > 0) {
cancelAutoCompletion();
evt.preventDefault(); // firefox does some funky stuff otherwise
evt.stopPropagation();
return false;
}
return true;
}
var prevTyped;
function hasSuggestions() {
return !!suggestions.length && !suggestions.hasClass('no-results');
}
function autocomplete(always = false) {
var typed = sanitizeSearchTerm(input.val()) || '';
// normalize/massage what's sent to server
if (options.allowUpperCaseTagNames) {
typed = typed.toLocaleLowerCase();
}
if (prevTyped === typed && !always)
return;
prevTyped = typed;
if (!typed.length && !shouldShowAllBecauseEmptyAndFocused()) {
cancelAutoCompletion();
return;
}
getSuggestions(typed, function (data) {
if (typed !== prevTyped || !hasFocus)
return; // the user typed after the request was started
showTagSuggestions(data, typed);
});
}
var suggestionCache = {};
var getFromServer = StackExchange.helpers.DelayedReaction(function (searchTerm, callback) {
StackExchange.helpers.addSpinner(editor, { position: "absolute", right: 10, top: height / 2 - 2 });
var promise = null;
if (options.getDataPromise) {
promise = options.getDataPromise(searchTerm);
}
else {
var apiUrl = getServerUrl();
var queryParameters = { q: searchTerm, newstyle: true };
promise = $.get(apiUrl, queryParameters, undefined, "json");
promise.done((data) => data.forEach((tag) => {
if (tag.IsDiverged) {
window.tagRenderer.markDivergedTag(tag.Name);
}
}));
}
promise
.done(function (data) {
suggestionCache[getSuggestionCacheKey(searchTerm)] = data;
StackExchange.helpers.removeSpinner();
callback(data);
});
}, 400, { sliding: true });
function getSuggestions(searchTerm, callback) {
var key = getSuggestionCacheKey(searchTerm);
if (!options.disableCaching && suggestionCache[key])
callback(suggestionCache[key]);
else
getFromServer.trigger(searchTerm, callback);
}
function getServerUrl() {
return options.tagApiUrl || "/filter/tags";
}
function getSuggestionCacheKey(searchTerm) {
return getServerUrl() + '|' + searchTerm;
}
function showTagSuggestions(data, typed) {
var _a, _b;
suggestions.remove();
suggestionHasFocus = false;
var currentHeight = editor.height();
let suggestionItems = [];
// The JQuery typings don't know about the concept of a jquery object not containing an html element
const renderedStrings = editor.find('.rendered-element').map(function (_, el) { return $(el).text(); }).get();
var existing = existingTags(renderedStrings, preInput.find(".rendered-element").length);
for (var i = 0; i < data.length; i++) {
// Only suggest tags that aren't already in the editor
if (!existing.includes(getTagNameFromData(data[i]))) {
suggestionItems.push(data[i]);
}
}
var suggestionCount = suggestionItems.length;
if (suggestionCount === 0) {
suggestions = $(`
")
.css({
position: "absolute",
left: editor.position().left,
top: editor.position().top + currentHeight + 1 + ((_a = options.suggestionsTopMargin) !== null && _a !== void 0 ? _a : 0),
width: suggestionsWidth
})
.insertAfter(editor);
if (options.noResultsCallback) {
options.noResultsCallback(suggestions, typed);
}
return;
}
suggestions = $(``)
.css({
position: "absolute",
left: editor.position().left,
top: editor.position().top + currentHeight + 1 + ((_b = options.suggestionsTopMargin) !== null && _b !== void 0 ? _b : 0),
width: suggestionsWidth
})
.insertAfter(editor);
if (options.onCreatingTagSuggestions) {
options.onCreatingTagSuggestions(existing || []);
}
var boxRenderer = options.suggestionTagBoxRenderer || renderTagBox;
for (var i = 0; i < suggestionItems.length; i++) {
var box = boxRenderer(suggestionItems[i], typed)
.attr("tabindex", ti || 0)
.addClass('js-tag-suggestion')
.attr('role', 'option') //needed for accessibility (because parent is role='listbox')
.appendTo(suggestions);
adjustMoreLinkToAvailableWidth(box);
if (i % columns === 0 && !narrowBoxes) {
box.css("clear", "both");
}
}
suggestions.on({
keydown: choice_keydown,
keyup: choice_keyup,
click: function (evt) { if (!isEventInLink(evt)) {
choose($(this));
evt.stopPropagation();
} },
focus: function () {
if (keyboardToSuggestions && suggestionCount === 1) {
choose($(this));
}
else {
suggestionHasFocus = true;
}
},
blur: function () { suggestionHasFocus = false; },
}, '.js-tag-suggestion');
//Adjust accessibility now that the suggestions are being shown
input.attr('aria-controls', `tag-suggestions-${tagEditorId}`);
input.attr('aria-expanded', 'true');
}
function renderTagBox(tag, match) {
var tagName = getTagNameFromData(tag);
var box = $("").css("width", narrowBoxes ? "auto" : boxWidth).data("tag-name", (tag.Negated ? 'not ' : '') + (tag.SynonymOf || tagName));
var tagRow = $("");
var tagContainer = $("");
box.append(tagRow);
tagRow.append(tagContainer);
// Convert matches to a regex matching any number of dashes between characters.
// E.g., "abc" becomes /a-*b-*c/ and "ab*" becomes /a-*b.*/
// Use \t as a stand-in for '*' during the transform.
if (match) {
match = match.replace(/-/g, "").replace(/\*+/g, '\t').replace(/([^\t])(?=[^\t])/g, "$1-*").replace(/\+/g, "\\+").replace(/\./g, "\\.").replace(/\t/g, '.*');
}
var isOperator = options.operators && options.operators.test(tagName);
var span = isOperator ? $('').text(tagName) : tagSpan(tagName, true);
var content = span.html();
if (match) {
content = content.replace(new RegExp("(" + match + ")"), "$1");
}
if (narrowBoxes)
span.addClass("m0");
if (tag.Negated) {
tagRow.prepend($('
').text('not'));
}
tagContainer.append(span.html(content));
if (tag.Count && !narrowBoxes && !isOperator)
tagRow.append($("").html("" + tag.Count));
if (show_excerpts && !narrowBoxes && !isOperator) {
var text = "";
if (tag.Excerpt)
text = tag.Excerpt;
if (text.length)
box.append($("").text(text));
if (tag.Synonyms && tag.Synonyms.length) {
var synonyms = $("
" + __tr(["also:"], undefined, "en", []) + "
").appendTo(box);
var splitted = tag.Synonyms.split(/\|/);
for (var i = 0; i < splitted.length; i++) {
text = splitted[i];
if (match)
text = text.replace(new RegExp("(" + match + ")"), "$1");
if (i > 0)
text = ", " + text;
synonyms.append("" + text + "");
}
}
}
if (render_learn_more && !narrowBoxes && !isOperator) {
var url = tag.InfoUrl;
if (!url) {
url = (tag.IsDiverged ? StackExchange.options.site.routePrefix : "") + "/tags/" + encodeURIComponent(tag.SynonymOf || tagName) + "/info";
}
// Screenreader treatment of SVGs in links is a bit unreliable, see https://www.scottohara.me/blog/2019/05/22/contextual-images-svgs-and-a11y.html#using-the-svg-within-a-link.
// Giving the link an aria-label instead is one of the suggested solutions from the article.
$('')
.attr('href', url)
.attr("aria-label", __tr(["info"], undefined, "en", []))
.append(Svg.HelpSm.WithAttr({ "aria-hidden": "true" }))
.appendTo(tagRow);
}
return box;
}
var widthThreshold;
function adjustMoreLinkToAvailableWidth(box) {
var morelink = box.find("p.more-info");
if (typeof widthThreshold === "undefined")
widthThreshold = boxWidth - 5 - morelink.outerWidth();
var tagWidth = box.find(".rendered-element:first").outerWidth();
if (tagWidth > widthThreshold)
morelink.find("a").text(__tr(["info"], undefined, "en", []));
}
/**
* Called when a tag suggestion is picked from the autocomplete box - means we have a valid tag from server!
*/
function choose(jTag) {
input.val(jTag.data("tag-name"));
cancelAutoCompletion();
editTag("");
cleanUp();
}
function log(msg) {
if (!StackExchange.options.enableLogging)
return;
console.log('tag editor new: ' + msg);
if (typeof msg !== "string") {
console.log(msg);
}
}
function cancelAutoCompletion() {
suggestions.remove();
suggestions = $();
suggestionHasFocus = false;
getFromServer.cancel();
//Adjust accessibility now that the auto complete popup has been removed
input.removeAttr('aria-controls');
input.attr('aria-expanded', 'false');
}
function isEventInLink(evt) {
return $(evt.target).closest('a').length > 0;
}
function choice_keydown(evt) {
var prev;
switch (evt.which) {
case _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.RIGHT: // right
case _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.DOWN: // down
$(this).next("div").focus();
return false;
case _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.LEFT: // left
$(this).prev("div").focus();
return false;
case _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.UP: // up
prev = $(this).prev("div");
if (prev.length)
prev.focus();
else
input.focus();
return false;
case _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.ENTER: // enter
if (isEventInLink(evt)) {
break;
}
choose($(this));
return false;
case _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.SPACE: // space
if (options.spaceSelectsTopSuggestion) {
choose($(this));
}
return false;
}
}
function choice_keyup(evt) {
// This must be done on keyup to prevent bubbling to doEscapeClose in stub.js when the suggestion is in a modal.
if (evt.which === _LegacyJS_constants_mod__WEBPACK_IMPORTED_MODULE_0__.KEY_CODE.ESC) {
cancelAutoCompletion();
input.focus();
evt.stopPropagation();
return false;
}
return true;
}
cleanUp(true);
StackExchange.tagEditor.ready.resolve();
const elementWithAttachedFunctions = jActual[0];
// I apologize
elementWithAttachedFunctions["func_clear"] =
function () {
jActual.val('');
input.val('').blur();
editor.find('.rendered-element').remove();
};
// I don't
elementWithAttachedFunctions["func_add"] = function (tagName) {
var old = input.val();
input.val(tagName);
editTag(old, false, /*preserveFocus=*/ true);
cleanUp();
};
// Not my fault
elementWithAttachedFunctions["func_finish"] = function () {
editTag("");
};
// This is getting out of hand
elementWithAttachedFunctions["func_redraw"] = function (fireEvent) {
var tagName = jActual.val();
jActual.val('');
input.val('').blur();
editor.find('.rendered-element').remove();
input.val(tagName);
editTag("", false, /*preserveFocus=*/ true, /*noEvent=*/ !fireEvent);
cleanUp();
};
}
;
tagEditor.ready = $.Deferred();
tagEditor.requiredTags = []; // will be overwritten externally
StackExchange.tagEditor = tagEditor;
})();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnZWRpdG9ybmV3Lltsb2NhbGU6YjY0YjJlM2ZdLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLENBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O1VDdkRBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BOzs7Ozs7Ozs7Ozs7QUNBQSxrRkFBa0Y7QUFDbEYsK0RBQStEO0FBQy9ELDBDQUEwQztBQUMxQyw4RUFBOEU7QUFDOUUsa0VBQWtFO0FBQ2xFLHFCQUF1QixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTDNGLFlBQVksQ0FBQztBQUN3QztBQXVCckQsU0FBUyxTQUFTLENBQVEsT0FBaUMsRUFBRSxVQUFrRCxFQUFFO0lBRTdHLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFB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LEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixLQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEUsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDLENBQUM7QUFDTixDQUFDO0FBQUEsQ0FBQztBQUVGLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBUSxDQUFDO0FBQ3JDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsaUNBQWlDO0FBRTlELGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc3RhY2tvdmVyZmxvdy8uL19TY3JpcHRzL0xlZ2FjeUpTL2NvbnN0YW50cy5tb2QuanMiLCJ3ZWJwYWNrOi8vc3RhY2tvdmVyZmxvdy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zdGFja292ZXJmbG93L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zdGFja292ZXJmbG93L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc3RhY2tvdmVyZmxvdy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3N0YWNrb3ZlcmZsb3cvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vc3RhY2tvdmVyZmxvdy8uL19TY3JpcHRzL19JbmNsdWRlcy9zZXQtcHVibGljLXBhdGgubW9kLnRzIiwid2VicGFjazovL3N0YWNrb3ZlcmZsb3cvLi9fU2NyaXB0cy90YWdlZGl0b3JuZXcvdGFnZWRpdG9ybmV3LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIu+7v2V4cG9ydCBjb25zdCBLRVlfQ09ERSA9IHtcbiAgICBMRUZUX01PVVNFOiAxLFxuICAgIE1JRERMRV9NT1VTRTogMixcbiAgICBCQUNLU1BBQ0U6IDgsXG4gICAgVEFCOiA5LFxuICAgIEVOVEVSOiAxMyxcbiAgICBFU0M6IDI3LFxuICAgIFNQQUNFOiAzMixcbiAgICBQQUdFVVA6IDMzLFxuICAgIFBBR0VET1dOOiAzNCxcbiAgICBFTkQ6IDM1LFxuICAgIEhPTUU6IDM2LFxuICAgIExFRlQ6IDM3LFxuICAgIFVQOiAzOCxcbiAgICBSSUdIVDogMzksXG4gICAgRE9XTjogNDAsXG4gICAgREVMOiA0NixcbiAgICAwOiA0OCxcbiAgICAxOiA0OSxcbiAgICAyOiA1MCxcbiAgICAzOiA1MSxcbiAgICA0OiA1MixcbiAgICA1OiA1MyxcbiAgICA2OiA1NCxcbiAgICA3OiA1NSxcbiAgICA4OiA1NixcbiAgICA5OiA1NyxcbiAgICBBOiA2NSxcbiAgICBCOiA2NixcbiAgICBDOiA2NyxcbiAgICBEOiA2OCxcbiAgICBFOiA2OSxcbiAgICBGOiA3MCxcbiAgICBHOiA3MSxcbiAgICBIOiA3MixcbiAgICBJOiA3MyxcbiAgICBKOiA3NCxcbiAgICBLOiA3NSxcbiAgICBMOiA3NixcbiAgICBNOiA3NyxcbiAgICBOOiA3OCxcbiAgICBPOiA3OSxcbiAgICBQOiA4MCxcbiAgICBROiA4MSxcbiAgICBSOiA4MixcbiAgICBTOiA4MyxcbiAgICBUOiA4NCxcbiAgICBVOiA4NSxcbiAgICBWOiA4NixcbiAgICBXOiA4NyxcbiAgICBYOiA4OCxcbiAgICBZOiA4OSxcbiAgICBaOiA5MCxcbiAgICBGNDogMTE1LFxuICAgIENPTU1BOiAxODgsXG59OyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjsiLCIvLyBXZSBuZWVkIHRvIHNldCB0aGUgcHVibGljIHBhdGggYXQgcnVudGltZSBiYXNlZCBvbiB0aGUgR2xvYmFsUm9vdCBzaXRlIHNldHRpbmcuXG4vLyAoV2UgZG9uJ3Qga25vdyBhdCBidWlsZCB0aW1lIHdoZXJlIHRoZSBzdGF0aWMgZmlsZXMgd2lsbCBiZSxcbi8vIHNpbmNlIHdlIGNvdWxkIGJlIGRlcGxveWVkIG9uLXByZW1pc2UuKVxuLy8gVGhlIHZhbHVlIG9mIHRoYXQgc2l0ZSBzZXR0aW5nIGdldHMgd3JpdHRlbiBvdXQgdG8gdGhlIGRvbSBpbiBNYXN0ZXIuY3NodG1sXG4vLyAoc2VlIEphdmFTY3JpcHRIZWxwZXIuUHVibGljUGF0aCgpKSBzbyB0aGF0IHdlIGNhbiByZWFkIGl0IGhlcmVcbl9fd2VicGFja19wdWJsaWNfcGF0aF9fID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3ZWJwYWNrLXB1YmxpYy1wYXRoXCIpLmlubmVyVGV4dCArIFwiSnMvXCI7XG5cbmV4cG9ydCB7IH07XG4iLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IEtFWV9DT0RFIH0gZnJvbSBcIi4uL0xlZ2FjeUpTL2NvbnN0YW50cy5tb2RcIjtcblxudHlwZSBPbmVFbGVtZW50SnF1ZXJ5PFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4gPSBKUXVlcnk8VD4gJiB7IFswXTogVCB9O1xuXG4vLyBUaGlzIGlzIGEgY29tcHJvbWlzZSB0byBrZWVwIHRoZSB0eXBlc2NyaXB0aWZpY2F0aW9uIG9mIHRoaXMgZmlsZSByZWFzb25hYmxlLiBJZiB0aGUgdGFnIGVkaXRvclxuLy8gaXMgdXNlZCBmb3IgYWN0dWFsIHRhZ3MsIHRoZW4gdGhpcyBpcyB0aGUgc2hhcGUgb2YgdGhlIGRhdGEsIHVzZWQgYnkgdGhpbmdzIGxpa2UgcmVuZGVyVGFnQm94LlxuLy8gSWYgdGhlIGRhdGEgaGFzIGEgZGlmZmVyZW50IHNoYXBlLCB0aGFuIHRoZSBjYWxsZXIgYWxzbyBoYXMgdG8gcHJvdmlkZSBpdHMgb3duIHN1Z2dlc3Rpb25UYWdCb3hSZW5kZXJlcixcbi8vIGF0IHdoaWNoIHBvaW50IHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IHRoZSBzaGFwZS5cbi8vXG4vLyBOb3RlIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsLlxuLy9cbi8vIEFsc28gc2VlIFREYXRhUG9zc2libHlXaXRoU3RhbmRhcmRUYWdEYXRhIGJlbG93LlxudHlwZSBTdGFuZGFyZFRhZ0RhdGEgPSB7XG4gICAgTmFtZT86IHN0cmluZztcbiAgICBOZWdhdGVkPzogYm9vbGVhbjtcbiAgICBDb3VudD86IG51bWJlcjtcbiAgICBFeGNlcnB0Pzogc3RyaW5nO1xuICAgIFN5bm9ueW1zPzogc3RyaW5nO1xuICAgIEluZm9Vcmw/OiBzdHJpbmc7XG4gICAgSXNEaXZlcmdlZD86IGJvb2xlYW47XG4gICAgU3lub255bU9mPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiB0YWdFZGl0b3I8VERhdGE+KGpBY3R1YWw6IEpRdWVyeTxIVE1MSW5wdXRFbGVtZW50Piwgb3B0aW9uczogU3RhY2tFeGNoYW5nZS50YWdFZGl0b3IuT3B0aW9uczxURGF0YT4gPSB7fSkge1xuXG4gICAgdmFyIHRhZ0VkaXRvcklkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCk7XG5cbiAgICAvLyB1c2VkIGZvciBwYXJhbWV0ZXJzIG9mIGZ1bmN0aW9ucyB0aGF0IHJlYWxseSBvbmx5IHdvcmsgb24gc3RhbmRhcmQgdGFnIGRhdGEuXG4gICAgdHlwZSBURGF0YVBvc3NpYmx5V2l0aFN0YW5kYXJkVGFnRGF0YSA9IFREYXRhICYgU3RhbmRhcmRUYWdEYXRhO1xuXG4gICAgdHlwZSBQcml2YXRlT3B0aW9ucyA9IFN0YWNrRXhjaGFuZ2UudGFnRWRpdG9yLk9wdGlvbnM8VERhdGE+ICYgeyBfX3RyeU51bWJlcj86IG51bWJlciB9O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmluaXRpYWxGb2N1cyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBvcHRpb25zLmluaXRpYWxGb2N1cyA9IGpBY3R1YWwuaXMoXCI6Zm9jdXNcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Rm9jdXMoKSB7IG9wdGlvbnMuaW5pdGlhbEZvY3VzID0gdHJ1ZTsgfVxuXG4gICAgaWYgKCFqQWN0dWFsLmlzKFwiOnZpc2libGVcIikpIHsgLy8gaXQgbWF5IGZhZGUgaW4gd2hlbiBkb2luZyBpbmxpbmUtZWRpdGluZ1xuICAgICAgICB2YXIgdHJ5TnVtYmVyID0gKG9wdGlvbnMgYXMgUHJpdmF0ZU9wdGlvbnMpLl9fdHJ5TnVtYmVyIHx8IDA7XG5cbiAgICAgICAgdmFyIGluY3JlbWVudFRyeU51bWJlciA9ICQoJ2JvZHknKS5pcyhcIjp2aXNpYmxlXCIpOyAvLyBMb2NhbGx5LCB3ZSBoYXZlIHRvIHdhaXQgZm9yIExFU1MgdG8gZGlzcGxheSB0aGUgYm9keS4gIFRoaXMgY2FuIHRha2UgYW4gZXh0cmEgbG9uZyB0aW1lLlxuXG4gICAgICAgIGlmICh0cnlOdW1iZXIgPCAzKSB7XG4gICAgICAgICAgICAob3B0aW9ucyBhcyBQcml2YXRlT3B0aW9ucykuX190cnlOdW1iZXIgPSB0cnlOdW1iZXIgKyAoaW5jcmVtZW50VHJ5TnVtYmVyID8gMSA6IDApO1xuXG4gICAgICAgICAgICBqQWN0dWFsLm9uKFwiZm9jdXNcIiwgc2V0Rm9jdXMpOyAvLyBzdGFydCByZWNvcmRpbmcgdGhpcyBpbW1lZGlhdGVseSAobWFpbmx5IGZvciB0aGUgaW5saW5lIHRhZyBlZGl0b3IpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBqQWN0dWFsLm9mZihcImZvY3VzXCIsIHNldEZvY3VzKTtcbiAgICAgICAgICAgICAgICBTdGFja0V4Y2hhbmdlLnRhZ0VkaXRvcihqQWN0dWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoISQoJ2JvZHkucmV2aWV3LXRhc2stcGFnZScpLmxlbmd0aCAmJiAhJCgnYm9keS5zdGFnaW5nLWdyb3VuZC1saXN0aW5nJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgU3RhY2tFeGNoYW5nZS5kZWJ1Zy5sb2coXCJ0YWcgYm94IGlzIGludmlzaWJsZSwgY291bGRuJ3Qgc3RhcnQgdGFnIGVkaXRvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoYXNGb2N1cyA9ICEhb3B0aW9ucy5pbml0aWFsRm9jdXM7XG5cbiAgICB2YXIgY29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucyB8fCAzO1xuICAgIHZhciBzaG93X2V4Y2VycHRzID0gdHlwZW9mIChvcHRpb25zLmV4Y2VycHRzKSA9PSBcInVuZGVmaW5lZFwiIHx8IG9wdGlvbnMuZXhjZXJwdHM7XG4gICAgdmFyIHJlbmRlcl9sZWFybl9tb3JlID0gdHlwZW9mKG9wdGlvbnMubGVhcm5Nb3JlKSA9PSBcInVuZGVmaW5lZFwiIHx8IG9wdGlvbnMubGVhcm5Nb3JlO1xuICAgIHZhciBwbGFjZWhvbGRlciA9IGpBY3R1YWwuYXR0cigncGxhY2Vob2xkZXInKSB8fCBcIlwiO1xuICAgIHZhciByZW5kZXJUYWcgPSBmdW5jdGlvbiAoczogc3RyaW5nKSB7IHJldHVybiB3aW5kb3cudGFnUmVuZGVyZXIocywgbnVsbCwgXCJzcGFuXCIsICEhb3B0aW9ucy51c2VTdGFja3NDbGFzc2VzKTsgfTtcbiAgICB2YXIgZmlsdGVyVGFncyA9IG9wdGlvbnMuY3VzdG9tRmlsdGVyVGFncyB8fCBmdW5jdGlvbiAodGFncywgaW5wdXRQb3NpdGlvbikge1xuICAgICAgICB2YXIgZXhpc3Rpbmc6IHsgW3RhZ1RleHQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICAgICAgICByZXR1cm4gdGFncy5tYXAoZnVuY3Rpb24gKHRhZ1RleHQpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBlbXB0eSB0YWdzXG4gICAgICAgICAgICBpZiAoL15cXHMqJC8udGVzdCh0YWdUZXh0KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlIHRhZ3NcbiAgICAgICAgICAgIGlmIChleGlzdGluZ1t0YWdUZXh0XSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLm9wZXJhdG9ycyB8fCAhb3B0aW9ucy5vcGVyYXRvcnMudGVzdCh0YWdUZXh0KSlcbiAgICAgICAgICAgICAgICBleGlzdGluZ1t0YWdUZXh0XSA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHZhciBleGlzdGluZ1RhZ3MgPSBvcHRpb25zLmN1c3RvbUV4aXN0aW5nVGFncyB8fCBmdW5jdGlvbiAodGFncywgaW5wdXRQb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gdGFncztcbiAgICB9O1xuICAgIHZhciBzYWZlVGFncyA9IG9wdGlvbnMuY3VzdG9tU2FmZVRhZ3MgfHwgZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFN0YWNrRXhjaGFuZ2UuaGVscGVycy5zYW5pdGl6ZUFuZFNwbGl0VGFncyh0YWdzLCAvKiBhbGxvd1dpbGRjYXJkcyAqLyBmYWxzZSwgISFvcHRpb25zLm9wZXJhdG9ycywgb3B0aW9ucy5hbGxvd1VwcGVyQ2FzZVRhZ05hbWVzKSB8fCBbXTtcblxuICAgICAgICBpZiAodGFncyAmJiAkLnRyaW0odGFncykpIHtcbiAgICAgICAgICAgIGxvZygnc2FmZVRhZ3MoXCJ7MH1cIikgPT4gezF9Jy5mb3JtYXRVbmljb3JuKHRhZ3MsIHJlc3VsdC50b1N0cmluZygpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB2YXIgc2FuaXRpemVTZWFyY2hUZXJtID0gb3B0aW9ucy5zYW5pdGl6ZVNlYXJjaFRlcm0gfHwgZnVuY3Rpb24gKGlucHV0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHNhZmVUYWdzKGlucHV0VmFsdWUpWzBdO1xuICAgIH07XG5cbiAgICB2YXIgc3VnZ2VzdGlvbnMgPSAkKCk7IC8vIFJldGFpbiB0aGUgc3VnZ2VzdGlvbiBwb3BvdmVyIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIGVkaXRvcnMgb24gYSBwYWdlLlxuXG4gICAgdmFyIHdpZHRoID0gakFjdHVhbC5pbm5lcldpZHRoKCk7XG5cbiAgICB2YXIgZWRpdG9yID0gJChcIjxkaXYgY2xhc3M9J2pzLXRhZy1lZGl0b3IgdGFnLWVkaXRvciBtdWx0aS1saW5lJyAvPlwiKS5pbnNlcnRBZnRlcihqQWN0dWFsKTtcblxuICAgIGVkaXRvci5kYXRhKCd0YXJnZXQtZmllbGQnLCBqQWN0dWFsLmdldCgwKSk7XG5cbiAgICBpZiAob3B0aW9ucy5leHRyYVRhZ0VkaXRvckNzc0NsYXNzKSB7XG4gICAgICAgIGVkaXRvci5hZGRDbGFzcyhvcHRpb25zLmV4dHJhVGFnRWRpdG9yQ3NzQ2xhc3MpO1xuICAgIH1cblxuICAgIFtcInBhZGRpbmctcmlnaHRcIiwgXCJwYWRkaW5nLWxlZnRcIiwgXCJib3gtc2l6aW5nXCIsIFwibWFyZ2luLXRvcFwiLCBcIm1hcmdpbi1ib3R0b21cIl0uZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBlZGl0b3IuY3NzKHByb3AsIGpBY3R1YWwuY3NzKHByb3ApKTtcbiAgICB9KTtcbiAgICB2YXIgYm9yZGVyQm94ID0gakFjdHVhbC5jc3MoXCJib3gtc2l6aW5nXCIpID09PSBcImJvcmRlci1ib3hcIjtcbiAgICBpZiAoYm9yZGVyQm94KSB7XG4gICAgICAgIHdpZHRoICs9IHBhcnNlSW50KGVkaXRvci5jc3MoXCJib3JkZXItcmlnaHQtd2lkdGhcIiksIDEwKSArIHBhcnNlSW50KGVkaXRvci5jc3MoXCJib3JkZXItbGVmdC13aWR0aFwiKSwgMTApXG4gICAgfVxuXG4gICAgdmFyIHN1Z2dlc3Rpb25zV2lkdGggPSBvcHRpb25zLnN1Z2dlc3Rpb25zV2lkdGggfHwgd2lkdGgsXG4gICAgICAgIGJveFdpZHRoID0gKChzdWdnZXN0aW9uc1dpZHRoIC0gMTIpIC8gY29sdW1ucykgfCAwLFxuICAgICAgICBuYXJyb3dCb3hlcyA9IG9wdGlvbnMucmVzcG9uc2l2ZUlzaCAmJiBib3hXaWR0aCA8IDE1MDtcblxuICAgIGVkaXRvci5jc3MoXCJ3aWR0aFwiLCB3aWR0aCk7XG4gICAgdmFyIGFjdHVhbERpc3BsYXkgPSBqQWN0dWFsLmNzcyhcImRpc3BsYXlcIik7XG5cbiAgICBqQWN0dWFsLmhpZGUoKTtcblxuICAgIC8vIG5vdGU6IHRoaXMgbXVzdCBoYXBwZW4gKmFmdGVyKiBoaWRpbmcgdGhlIGFjdHVhbCA8aW5wdXQ+LiBJZiB0aGUgZWxlbWVudCBoYXMgYSBwZXJjZW50YWdlXG4gICAgLy8gd2lkdGggYnV0IGlzbid0IGRpc3BsYXk6IG5vbmUsIGdldENvbXB1dGVkU3R5bGUgbWF5IG9yIG1heSBub3QgcmV0dXJuIHRoZSAqdXNlZCogdmFsdWUsIGkuZS5cbiAgICAvLyBhY3R1YWwgcGl4ZWwgd2lkdGggKGRlcGVuZHMgb24gYnJvd3NlciBhbmQgcHJvYmFibHkgb3RoZXIgdGhpbmdzKS5cbiAgICB2YXIgd2lkdGhfY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShqQWN0dWFsWzBdKS53aWR0aDtcbiAgICB2YXIgcmVzcG9uc2l2ZV93aWR0aCA9IC8lJC8udGVzdCh3aWR0aF9jc3MpO1xuICAgIGlmIChyZXNwb25zaXZlX3dpZHRoKSB7XG4gICAgICAgIGVkaXRvci5jc3MoXCJ3aWR0aFwiLCB3aWR0aF9jc3MpO1xuICAgIH1cblxuICAgIGlmIChhY3R1YWxEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgIGVkaXRvci5jc3MoXCJkaXNwbGF5XCIsIFwiaW5saW5lLWJsb2NrXCIpO1xuICAgIH1cblxuICAgIHZhciBwcmVjaXNlU2VsZWN0aW9uID0gXCJzZWxlY3Rpb25EaXJlY3Rpb25cIiBpbiBqQWN0dWFsWzBdO1xuXG5cbiAgICB2YXIgdGVzdCA9IHJlbmRlclRhZyhcInRlc3RcIikuYXBwZW5kVG8oZWRpdG9yKSxcbiAgICAgICAgcm93SGVpZ2h0ID0gYm9yZGVyQm94ID8gZWRpdG9yLm91dGVySGVpZ2h0KCkgOiBlZGl0b3IuaW5uZXJIZWlnaHQoKSxcbiAgICAgICAgaGVpZ2h0ID0gakFjdHVhbC5pbm5lckhlaWdodCgpO1xuICAgIHRlc3QucmVtb3ZlKCk7XG4gICAgaWYgKGJvcmRlckJveCkge1xuICAgICAgICBoZWlnaHQgKz0gcGFyc2VJbnQoZWRpdG9yLmNzcyhcImJvcmRlci10b3Atd2lkdGhcIiksIDEwKSArIHBhcnNlSW50KGVkaXRvci5jc3MoXCJib3JkZXItYm90dG9tLXdpZHRoXCIpLCAxMClcbiAgICB9XG5cbiAgICB2YXIgcHJlSW5wdXQgPSAkKFwiPHNwYW4gLz5cIikuYXBwZW5kVG8oZWRpdG9yKSxcbiAgICAgICAgaW5wdXQgPSAkKGA8aW5wdXQgdHlwZT0ndGV4dCcgYXV0b2NvbXBsZXRlPSdvZmYnIHRhYkluZGV4PScwJyBhcmlhLWF1dG9jb21wbGV0ZT0nbGlzdCcgYXJpYS1oYXNwb3B1cD0nbGlzdGJveCcgcm9sZT0nY29tYm9ib3gnIGFyaWEtZXhwYW5kZWQ9J2ZhbHNlJyAvPmApXG4gICAgICAgICAgICAuYXBwZW5kVG8oZWRpdG9yKS52YWwoakFjdHVhbC52YWwoKSArIFwiIFwiKVxuICAgICAgICAgICAgLmF0dHIoJ3BsYWNlaG9sZGVyJywgcGxhY2Vob2xkZXIpIGFzIE9uZUVsZW1lbnRKcXVlcnk8SFRNTElucHV0RWxlbWVudD4sXG4gICAgICAgIHBvc3RJbnB1dCA9ICQoXCI8c3BhbiAvPlwiKS5hcHBlbmRUbyhlZGl0b3IpLFxuICAgICAgICB0aSA9IGpBY3R1YWwuYXR0cihcInRhYkluZGV4XCIpO1xuXG4gICAgdmFyIGFjdHVhbElkID0gakFjdHVhbC5hdHRyKFwiaWRcIik7XG4gICAgaWYgKGFjdHVhbElkKSB7XG4gICAgICAgIHZhciBsYWJlbHMgPSAkKFwibGFiZWxbZm9yPSdcIiArIGFjdHVhbElkICsgXCInXVwiKTtcbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBlZGl0b3JJZCA9IFwidGFnZWRpdG9yLXJlcGxhY2luZy1cIiArIGFjdHVhbElkICsgXCItLWlucHV0XCI7XG4gICAgICAgICAgICBpbnB1dC5hdHRyKFwiaWRcIiwgZWRpdG9ySWQpO1xuICAgICAgICAgICAgbGFiZWxzLmF0dHIoXCJmb3JcIiwgZWRpdG9ySWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRpKSB7XG4gICAgICAgIGlucHV0LmF0dHIoXCJ0YWJJbmRleFwiLCB0aSk7XG4gICAgfVxuXG4gICAgW1wiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1sYWJlbFwiXS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGpBY3R1YWwuYXR0cihhdHRyKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnB1dC5hdHRyKGF0dHIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGpBY3R1YWwuaGFzQ2xhc3MoXCJzLWlucHV0XCIpKSB7XG4gICAgICAgIGVkaXRvci5hZGRDbGFzcyhcInMtaW5wdXRcIikuY3NzKHtwYWRkaW5nVG9wOiAwLCBwYWRkaW5nQm90dG9tOiAwfSk7XG4gICAgICAgIGlucHV0LmFkZENsYXNzKFwicy1pbnB1dFwiKTsgLy8gbW9zdCBvZiB0aGUgc3R5bGluZyBpcyB1bi1kb25lLCBidXQgd2Ugd2FudCB0byBnZXQgdGhlIHR5cG9ncmFwaHlcbiAgICB9XG5cbiAgICBpbnB1dC5hZGRDbGFzcyhcImpzLXRhZ2VkaXRvci1yZXBsYWNpbmdcIik7XG5cbiAgICB2YXIgc3VnZ2VzdGlvbkhhc0ZvY3VzID0gZmFsc2U7XG5cbiAgICB2YXIgX3JlcXVpcmVkUmVnZXg6IFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiByZXF1aXJlZFJlZ2V4KCk6IFJlZ0V4cCB7XG4gICAgICAgIGlmICh0eXBlb2YgX3JlcXVpcmVkUmVnZXggPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHZhciByZXEgPSBTdGFja0V4Y2hhbmdlLnRhZ0VkaXRvci5yZXF1aXJlZFRhZ3M7XG4gICAgICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VzLnB1c2goZ2V0VGFnTmFtZUZyb21EYXRhKHJlcVtpXSkucmVwbGFjZSgvWy4rXS9nLCBcIlxcXFwkJlwiKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9yZXF1aXJlZFJlZ2V4ID0gbmV3IFJlZ0V4cChcIl4oPzpcIiArIHNvdXJjZXMuam9pbihcInxcIikgKyBcIikkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmVxdWlyZWRSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbnN1cmVSZXF1aXJlZFRhZ3MoKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmlnbm9yZVJlcXVpcmVkKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHJlcXVpcmVkID0gU3RhY2tFeGNoYW5nZS50YWdFZGl0b3IucmVxdWlyZWRUYWdzOyAvLyB0aGUgYXNrIHBhZ2Ugc2V0cyB0aGlzXG4gICAgICAgIGlmIChyZXF1aXJlZCAmJiByZXF1aXJlZC5sZW5ndGggJiYgL14gPyQvLnRlc3QoaW5wdXQudmFsKCkpKSB7XG4gICAgICAgICAgICB2YXIgcnIgPSByZXF1aXJlZFJlZ2V4KCk7XG4gICAgICAgICAgICBpZiAocHJlSW5wdXQuYWRkKHBvc3RJbnB1dCkuY2hpbGRyZW4oKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gcnIudGVzdCgkKHRoaXMpLnRleHQoKSk7IH0pLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICBzaG93VGFnU3VnZ2VzdGlvbnMocmVxdWlyZWQsICcnKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkU2hvd0FsbEJlY2F1c2VFbXB0eUFuZEZvY3VzZWQoKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnNob3dBbGxXaGVuRW1wdHlBbmRGb2N1c2VkICYmIGlzVG90YWxseUVtcHR5KCk7XG4gICAgfVxuXG4gICAgLy8gV2UncmUgc2ltdWxhdGluZyBmb2N1cy9ibHVyIGV2ZW50cyBvbiBqQWN0dWFsLiBUaGlzIHZhcmlhYmxlXG4gICAgLy8ga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSBcImNvbmNlcHR1YWxseVwiIGNvbnNpZGVyIHRoZSB0YWcgZWRpdG9yXG4gICAgLy8gdG8gaGF2ZSBmb2N1cy5cbiAgICB2YXIgYWN0dWFsSGFzRmFrZUZvY3VzID0gaGFzRm9jdXM7XG5cbiAgICBpbnB1dC5mb2N1cyhmdW5jdGlvbiAoZXZ0OiBKUXVlcnlJbnB1dEV2ZW50T2JqZWN0LCBkb05vdFRyaWdnZXJPbkFjdHVhbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgZW5zdXJlUmVxdWlyZWRUYWdzKCk7XG4gICAgICAgIGlmICghYWN0dWFsSGFzRmFrZUZvY3VzKSB7XG4gICAgICAgICAgICBpZiAoIWRvTm90VHJpZ2dlck9uQWN0dWFsKVxuICAgICAgICAgICAgICAgIGpBY3R1YWwudHJpZ2dlckhhbmRsZXIoXCJmb2N1c1wiLCB0cnVlKTtcbiAgICAgICAgICAgIGFjdHVhbEhhc0Zha2VGb2N1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZFNob3dBbGxCZWNhdXNlRW1wdHlBbmRGb2N1c2VkKCkpIHtcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2FudCB0byB0cmlnZ2VyIGEgYmx1ciBldmVudCBvbiB0aGUgYWN0dWFsIChpbnZpc2libGUpIHRhZyBpbnB1dCBib3ggd2hlbiB0aGVcbiAgICAvLyB1c2VyIGxlYXZlcyB0aGUgXCJmYWtlXCIgZWRpdG9yLiBGb3IgdGhhdCwgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBjYXNlOlxuICAgIC8vIFRoZSB0ZXh0Ym94IChgaW5wdXRgKSBoYXMgZm9jdXMsIGFuZCB0aGUgdXNlciBjbGlja3Mgb24gYSBwcmVzZW50IHRhZyAob3IgaXRzXG4gICAgLy8gZGVsZXRlIGljb24pLiBJbiB0aGF0IGNhc2UsIGV2ZW50cyBhcmUgZmlyZWQgaW4gdGhpcyBvcmRlcjpcbiAgICAvLyAgIG1vdXNlZG93biBvbiB0aGUgdGFnXG4gICAgLy8gICBibHVyIG9uIGBpbnB1dGBcbiAgICAvLyAgIG1vdXNldXAgb24gdGhlIHRhZ1xuICAgIC8vICAgY2xpY2sgb24gdGhlIHRhZyAtPiBjYXVzaW5nIGVkaXRUYWcoKSB0byByZWZvY3VzIGBpbnB1dGBcbiAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNvbnNpZGVyIHRoaXMgYSBibHVyLCBzaW5jZSBwcmFjdGljYWxseSB0aGUgZm9jdXMgbmV2ZXIgbGVmdFxuICAgIC8vIHRoZSBlZGl0b3IuIFRoYXQncyB3aHkgd2UgaW5oaWJpdCBvdXIgY3VzdG9tIHRyaWdnZXIgaW4gdGhlIG1vdXNlZG93biBoYW5kbGVyLFxuICAgIC8vIGFuZCBvbmx5IGZpcmUgdGhlIGJsdXIgZXZlbnQgYWZ0ZXIgdGhlIG1vdXNldXAgZXZlbnQsIGFuZCBvbmx5IGlmIGl0J3Mgc3RpbGxcbiAgICAvLyBhcHByb3ByaWF0ZS5cbiAgICAvLyBOb3RlOiAqYWZ0ZXIqICh2aWEgdGltZW91dCksIG5vdCAqaW4qIHRoZSBtb3VzZXVwIGhhbmRsZXIsIHNpbmNlICppbiogdGhlIGhhbmRsZXIsXG4gICAgLy8gYGlucHV0YCB3YXNuJ3QgcmVmb2N1c2VkIHlldC5cbiAgICB2YXIgZG9Ob3RQcm9wYWdhdGVOZXh0Qmx1ciA9IGZhbHNlO1xuXG4gICAgZWRpdG9yLm1vdXNlZG93bihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvTm90UHJvcGFnYXRlTmV4dEJsdXIgPSB0cnVlO1xuICAgICAgICAkKGRvY3VtZW50KS5vbmUoXCJtb3VzZXVwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzRm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgakFjdHVhbC50cmlnZ2VySGFuZGxlcihcImJsdXJcIik7XG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbEhhc0Zha2VGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb05vdFByb3BhZ2F0ZU5leHRCbHVyID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpbnB1dC5ibHVyKGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgaGFzRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXN1Z2dlc3Rpb25IYXNGb2N1cykge1xuICAgICAgICAgICAgICAgIGNhbmNlbEF1dG9Db21wbGV0aW9uKCk7XG4gICAgICAgICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgICAgICAgIGlmICghZG9Ob3RQcm9wYWdhdGVOZXh0Qmx1cikge1xuICAgICAgICAgICAgICAgICAgICBqQWN0dWFsLnRyaWdnZXJIYW5kbGVyKFwiYmx1clwiKTtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGFzRmFrZUZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9Ob3RQcm9wYWdhdGVOZXh0Qmx1ciA9IGZhbHNlO1xuICAgICAgICB9LCAwKTsgLy8gd2UgaGF2ZSB0byBjeWNsZSB0aHJvdWdoIHRoZSBldmVudCBsb29wIGZvciB0aGUgc3VnZ2VzdGlvbiB0byBnZXQgZm9jdXMsIGhlbmNlIHRoZSB0aW1lb3V0XG4gICAgfSk7XG5cbiAgICBqQWN0dWFsLmZvY3VzKGZ1bmN0aW9uIChldnQ6IEpRdWVyeUlucHV0RXZlbnRPYmplY3QsIGlzRmFrZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWlzRmFrZSkge1xuICAgICAgICAgICAgaW5wdXQudHJpZ2dlcihcImZvY3VzXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpbnB1dC5vbih7XG4gICAgICAgIGtleWRvd246IGlucHV0X2tleWRvd24sXG4gICAgICAgIGtleXVwOiBpbnB1dF9rZXl1cCxcbiAgICAgICAgaW5wdXQ6IGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChjbGVhblVwLCAwKTsgfSxcbiAgICB9KTtcblxuICAgIGVkaXRvci5kZWxlZ2F0ZShcIi5yZW5kZXJlZC1lbGVtZW50XCIsIFwiY2xpY2tcIiwgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICB2YXIgalRoaXMgPSAkKHRoaXMpO1xuICAgICAgICBpZiAoJChldnQudGFyZ2V0KS5oYXNDbGFzcyhcImpzLWRlbGV0ZS10YWdcIikpIHtcbiAgICAgICAgICAgIGpUaGlzLnRleHQoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdFRhZyhqVGhpcyk7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICB9KTtcblxuICAgIGVkaXRvci5jbGljayhmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGlmIChldnQudGFyZ2V0ICE9PSB0aGlzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBlZGl0VGFnKFwiXCIpO1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgfSk7XG5cbiAgICAvLyBhbGxvdyByZWRyYXdpbmcgb2YgdGhlIHRhZ3MgYWZ0ZXIgdGhleSd2ZSBiZWVuIHJlbmRlcmVkLCBlLmcuIHdoZW4gbmVlZGluZyB0byBjaGFuZ2UgYSB0YWcncyBzcG9uc29yZWQgaW1hZ2VcbiAgICBlZGl0b3Iub24oJ3JlcmVuZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb21iaW5lKCk7XG4gICAgICAgIGNsZWFuVXAodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB0YWdTcGFuKHRhZ05hbWUgOiBzdHJpbmcsIG5vRGVsZXRlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdmFyIGpTcGFuID0gcmVuZGVyVGFnKHRhZ05hbWUpO1xuICAgICAgICBpZiAob3B0aW9ucy50YWdNZW51cykge1xuICAgICAgICAgICAgalNwYW4uZGF0YSgndGFnLW1lbnUtdGFnbmFtZScsIHRhZ05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFub0RlbGV0ZSkge1xuICAgICAgICAgICAgdmFyIGJ0bkNsYXNzZXMgPSAoalNwYW4uaGFzQ2xhc3MoXCJzLXRhZ1wiKSA/ICdzLXRhZy0tZGlzbWlzcycgOiAnZGVsZXRlLXRhZycpICsgJyBiYXcwIGpzLWRlbGV0ZS10YWcnO1xuICAgICAgICAgICAgdmFyIGJ0biA9ICQoJzxidXR0b24vPicsIHtcbiAgICAgICAgICAgICAgICAnY2xhc3MnOiBidG5DbGFzc2VzLFxuICAgICAgICAgICAgICAgICd0eXBlJzogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgJ3RpdGxlJzogb3B0aW9ucy50b29sdGlwRGVsZXRlVGFnIHx8IF9zKCdSZW1vdmUgdGFnJylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGpTcGFuLmhhc0NsYXNzKFwicy10YWdcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBBcHBlbmQgY2xlYXIgaWNvblxuICAgICAgICAgICAgICAgIGJ0bi5hcHBlbmQoJChcIjxzdmcgY2xhc3M9J3N2Zy1pY29uIGljb25DbGVhclNtIHBlLW5vbmUnIHdpZHRoPScxNCcgaGVpZ2h0PScxNCcgdmlld0JveD0nMCAwIDE0IDE0Jz48cGF0aCBkPSdNMTIgMy40MUwxMC41OSAyIDcgNS41OSAzLjQxIDIgMiAzLjQxIDUuNTkgNyAyIDEwLjU5IDMuNDEgMTIgNyA4LjQxIDEwLjU5IDEyIDEyIDEwLjU5IDguNDEgN3onPjwvcGF0aD48L3N2Zz5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgalNwYW4uYXBwZW5kKGJ0bik7XG4gICAgICAgICAgICAvLyBUYWdTcG9uc29yc2hpcHMuRWRpdCB3aWxsIGFkZCB0aGUgaW1hZ2UgaGVyZVxuICAgICAgICAgICAgZWRpdG9yLnRyaWdnZXIoJ3RhZ1NwYW5DcmVhdGVkJywgW2pTcGFuXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy50YWdTcGFuQ3JlYXRlZCkgeyAvLyBhbGxvdyBvdGhlciBzaGVuYW5pZ2FucyB0byBvY2N1ciBvbiB0aGlzIC5wb3N0LXRhZ1xuICAgICAgICAgICAgb3B0aW9ucy50YWdTcGFuQ3JlYXRlZChqU3Bhbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4galNwYW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGFnc0luRGlyZWN0aW9uKGRpcmVjdGlvbjogQ09NQklORV9ESVJFQ1RJT04pIHtcbiAgICAgICAgdmFyIHByZVRhZ3MgPSAkKFtdKSwgcG9zdFRhZ3MgPSAkKFtdKTtcblxuICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBDT01CSU5FX0RJUkVDVElPTi5hbGw6XG4gICAgICAgICAgICAgICAgcHJlVGFncyA9IHByZUlucHV0LmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudFwiKTtcbiAgICAgICAgICAgICAgICBwb3N0VGFncyA9IHBvc3RJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENPTUJJTkVfRElSRUNUSU9OLmxlZnQ6XG4gICAgICAgICAgICAgICAgcHJlVGFncyA9IHByZUlucHV0LmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudDpsYXN0XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDT01CSU5FX0RJUkVDVElPTi5yaWdodDpcbiAgICAgICAgICAgICAgICBwb3N0VGFncyA9IHBvc3RJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnQ6Zmlyc3RcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENPTUJJTkVfRElSRUNUSU9OLmFsbF9sZWZ0OlxuICAgICAgICAgICAgICAgIHByZVRhZ3MgPSBwcmVJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENPTUJJTkVfRElSRUNUSU9OLmFsbF9yaWdodDpcbiAgICAgICAgICAgICAgICBwb3N0VGFncyA9IHBvc3RJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnRcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZTogcHJlVGFncyxcbiAgICAgICAgICAgIHBvc3Q6IHBvc3RUYWdzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGxhaW5JbnB1dChkaXJlY3Rpb246IENPTUJJTkVfRElSRUNUSU9OID0gQ09NQklORV9ESVJFQ1RJT04uYWxsKSB7XG5cbiAgICAgICAgdmFyIHRhZ3MgPSB0YWdzSW5EaXJlY3Rpb24oZGlyZWN0aW9uKTtcbiAgICAgICAgdmFyIGFsbHRhZ3MgPSB0YWdzLnByZS5tYXAoZnVuY3Rpb24gKGksIGVsKSB7IHJldHVybiAkKGVsKS50ZXh0KCk7IH0pLmdldCgpO1xuICAgICAgICB2YXIgcHJlQ29udGVudCA9IGFsbHRhZ3Muam9pbihcIiBcIik7XG4gICAgICAgIGlmIChwcmVDb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHByZUNvbnRlbnQgKz0gXCIgXCI7XG4gICAgICAgIHZhciBwb3N0VGFncyA9IHRhZ3MucG9zdC5tYXAoZnVuY3Rpb24gKGksIGVsKSB7IHJldHVybiAkKGVsKS50ZXh0KCk7IH0pLmdldCgpO1xuICAgICAgICB2YXIgcG9zdENvbnRlbnQgPSBwb3N0VGFncy5qb2luKFwiIFwiKTtcbiAgICAgICAgaWYgKHBvc3RDb250ZW50Lmxlbmd0aCAmJiBpbnB1dC52YWwoKS5sZW5ndGgpXG4gICAgICAgICAgICBwb3N0Q29udGVudCA9IFwiIFwiICsgcG9zdENvbnRlbnQ7XG4gICAgICAgIHZhciB2YWwgPSBpbnB1dC52YWwoKTtcbiAgICAgICAgYWxsdGFncyA9IGFsbHRhZ3MuY29uY2F0KHBvc3RUYWdzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQ6IHByZUNvbnRlbnQgKyBpbnB1dC52YWwoKSArIHBvc3RDb250ZW50LFxuICAgICAgICAgICAgbGVuZ3RoQmVmb3JlSW5wdXQ6IHByZUNvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgdmFsOiB2YWwsXG4gICAgICAgICAgICB0YWdzOiBhbGx0YWdzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGV4cGVjdHMgYSByZXN1bHQgZnJvbSBwbGFpbklucHV0KENPTUJJTkVfRElSRUNUSU9OLmFsbCk7IGlmIHlvdSBkb24ndCBoYXZlIG9uZSByZWFkeSwgcGFzcyBub3RoaW5nXG4gICAgZnVuY3Rpb24gdHJpZ2dlclJlbmRlcmVkQ2hhbmdlKHJlc3VsdEZyb21QbGFpbklucHV0PzogUmV0dXJuVHlwZTx0eXBlb2YgcGxhaW5JbnB1dD4pIHtcbiAgICAgICAgY29uc3QgZmluYWxSZXN1bHQgPSByZXN1bHRGcm9tUGxhaW5JbnB1dCA/PyBwbGFpbklucHV0KCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBqQWN0dWFsLnRyaWdnZXIoXCJ0YWdlZGl0b3I6cmVuZGVyZWRjaGFuZ2VcIiwgW2ZpbmFsUmVzdWx0LnRhZ3MsIGZpbmFsUmVzdWx0LnZhbF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2V0SW5wdXRXaWR0aCgpOyAvLyBzb21ldGhpbmcgaGFzIGNoYW5nZWQsIGVuc3VyZSB0aGUgZHluYW1pY2FsbHktc2l6ZWQgaW5wdXQgZGlzcGxheSBpcyB3aWRlIGVub3VnaFxuXG4gICAgICAgIGNoZWNrRm9yQ29tbXVuaXR5VGFncygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVG90YWxseUVtcHR5KCkge1xuICAgICAgICB2YXIgdmFsID0gaW5wdXQudmFsKCk7XG4gICAgICAgIHJldHVybiAodmFsID09PSBcIlwiIHx8IHZhbCA9PT0gXCIgXCIpICYmIHByZUlucHV0LmFkZChwb3N0SW5wdXQpLmNoaWxkcmVuKCkuZmlsdGVyKGZ1bmN0aW9uICgpIHsgcmV0dXJuICEvXlxccyokLy50ZXN0KCQodGhpcykudGV4dCgpKTsgfSkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFRhZ05hbWVGcm9tRGF0YShkYXRhSXRlbTogVERhdGFQb3NzaWJseVdpdGhTdGFuZGFyZFRhZ0RhdGEpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5nZXRUYWdOYW1lRnJvbURhdGEgPyBvcHRpb25zLmdldFRhZ05hbWVGcm9tRGF0YShkYXRhSXRlbSkgOiBkYXRhSXRlbS5OYW1lID8/ICcnO1xuICAgIH1cblxuICAgIGVudW0gQ09NQklORV9ESVJFQ1RJT04ge1xuICAgICAgICBsZWZ0ID0gMSxcbiAgICAgICAgcmlnaHQgPSAyLFxuICAgICAgICBhbGxfbGVmdCA9IDMsXG4gICAgICAgIGFsbF9yaWdodCA9IDQsXG4gICAgICAgIGFsbCA9IDUgLy8gdGhlIGRlZmF1bHRcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21iaW5lKGRpcmVjdGlvbjogQ09NQklORV9ESVJFQ1RJT04gPSBDT01CSU5FX0RJUkVDVElPTi5hbGwpIHtcblxuICAgICAgICB2YXIgc2VsID0gaW5wdXQuY2FyZXQoKTtcbiAgICAgICAgdmFyIHNlbERpciA9IGlucHV0WzBdLnNlbGVjdGlvbkRpcmVjdGlvbjtcbiAgICAgICAgdmFyIHRhZ3MgPSB0YWdzSW5EaXJlY3Rpb24oZGlyZWN0aW9uKTtcblxuICAgICAgICBpZiAoIXRhZ3MucHJlLmFkZCh0YWdzLnBvc3QpLmxlbmd0aCkgLy8gYWxyZWFkeSBjb21iaW5lZFxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHZhciBwbGFpbiA9IHBsYWluSW5wdXQoZGlyZWN0aW9uKTtcbiAgICAgICAgaW5wdXQudmFsKHBsYWluLnRleHQpO1xuICAgICAgICB0YWdzLnByZS5yZW1vdmUoKTtcbiAgICAgICAgdGFncy5wb3N0LnJlbW92ZSgpO1xuICAgICAgICBpbnB1dC5jYXJldChzZWwuc3RhcnQgKyBwbGFpbi5sZW5ndGhCZWZvcmVJbnB1dCwgc2VsLmVuZCArIHBsYWluLmxlbmd0aEJlZm9yZUlucHV0KTtcbiAgICAgICAgaWYgKHByZWNpc2VTZWxlY3Rpb24pXG4gICAgICAgICAgICBpbnB1dFswXS5zZWxlY3Rpb25EaXJlY3Rpb24gPSBzZWxEaXI7XG4gICAgICAgIGNhbmNlbEF1dG9Db21wbGV0aW9uKCk7XG4gICAgICAgIHRyaWdnZXJSZW5kZXJlZENoYW5nZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRhZ1NwYW5PclVuc3R5bGVkKHRhZ05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAob3B0aW9ucy5vcGVyYXRvcnMgJiYgb3B0aW9ucy5vcGVyYXRvcnMudGVzdCh0YWdOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuICQoXCI8c3BhbiBjbGFzcz0ncmVuZGVyZWQtZWxlbWVudCcvPlwiKS50ZXh0KHRhZ05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRhZ1NwYW4odGFnTmFtZSkuYWRkQ2xhc3MoXCJyZW5kZXJlZC1lbGVtZW50XCIpO1xuXG4gICAgICAgIGlmICghaXNUYWdWYWxpZCh0YWdOYW1lKSkge1xuICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiaW52YWxpZC10YWcgdGVtcC10YWdfX2RhbmdlclwiKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIG9wdGlvbnMudG9vbHRpcEludmFsaWRUYWcgfHwgX3MoJ2ludmFsaWQgdGFnJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1RhZ1ZhbGlkKHRhZ05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAob3B0aW9ucy5pbnZhbGlkICYmIG9wdGlvbnMuaW52YWxpZFt0YWdOYW1lXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1RhZ1ZhbGlkICYmICFvcHRpb25zLmlzVGFnVmFsaWQodGFnTmFtZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhblVwKGZpcnN0VGltZT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25IYXNGb2N1cylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB2YXIgc2VsO1xuICAgICAgICBpZiAoZmlyc3RUaW1lKSAvLyBvcGVyYSBwdXRzIHRoZSBjdXJzb3IgdG8gdGhlIGZyb250LCBub3QgdGhlIGVuZFxuICAgICAgICAgICAgc2VsID0geyBzdGFydDogaW5wdXQudmFsKCkubGVuZ3RoLCBlbmQ6IGlucHV0LnZhbCgpLmxlbmd0aCB9O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzZWwgPSBpbnB1dC5jYXJldCgpO1xuXG4gICAgICAgIC8vIEZvciBJRTsgaGFwcGVucyB3aGVuIHlvdSBjbGljayBzb21ld2hlcmUgZWxzZSAoZS5nLiBhbm90aGVyIHRhZykgYW5kIHRodXMgY2F1c2UgYSBibHVyLlxuICAgICAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IElFJ3MgZmF1bHQ7IHJhdGhlciwgaXQncyB0aGUgY2FyZXQgcGx1Z2luJ3Mgd2F5IG9mIHVzaW5nIGxhc3RJbmRleE9mXG4gICAgICAgIC8vIHRvIGZpbmQgdGhlIHNlbGVjdGlvbiBzdGFydCB0aGF0IHJldHVybnMgYSAtMSBpbiB0aGF0IGNhc2UuXG4gICAgICAgIGlmIChzZWwuc3RhcnQgPT0gLTEpXG4gICAgICAgICAgICBzZWwuc3RhcnQgPSBzZWwuZW5kID0gMDtcblxuICAgICAgICBpZiAoIXByZWNpc2VTZWxlY3Rpb24gJiYgc2VsLnN0YXJ0ICE9PSBzZWwuZW5kKSB7XG4gICAgICAgICAgICBjb21iaW5lKCk7IC8vIGluIG1vc3QgY2FzZXMgdGhpcyB3aWxsIGJlIGEgbm8tb3AsIGV4Y2VwdCBpZiB0aGUgdXNlciBzZWxlY3RlZCB0ZXh0IHVzaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIHN0YW5kYXJkIGtleXNcbiAgICAgICAgICAgIHNldElucHV0V2lkdGgoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnB1dFZhbCA9IGlucHV0LnZhbCgpO1xuXG4gICAgICAgIHZhciBwcmVDdXJzb3IgPSBpbnB1dFZhbC5zdWJzdHIoMCwgc2VsLnN0YXJ0KTtcbiAgICAgICAgdmFyIHBvc3RDdXJzb3IgPSBpbnB1dFZhbC5zdWJzdHIoc2VsLmVuZCk7XG4gICAgICAgIHZhciBzZWxEaXIgPSBpbnB1dFswXS5zZWxlY3Rpb25EaXJlY3Rpb247XG5cbiAgICAgICAgLy8gd2UgaGF2ZSB0byBwcmVzZXJ2ZSBhIHBvc3NpYmxlIGVtcHR5IGVsZW1lbnQgYXQgdGhlIGVuZCAoaS5lLiB0aGUgKmxhc3QqIGNoYXJhY3RlciBpcyBbLDtcXHNdKTtcbiAgICAgICAgLy8gY2VydGFpbiBicm93c2VycyA8Y291Z2g+SUU8L2NvdWdoPiByZW1vdmUgaXQuIEhlbmNlIHRoZSBcIiFcIiB0aGluZ1xuICAgICAgICB2YXIgc3BsaXRSZWdleCA9IG9wdGlvbnMuYWxsb3dTcGFjZXMgPyAvWyw7XSsvIDogL1ssO1xcc10rLztcbiAgICAgICAgdmFyIHNwbGl0Rm4gPSB0eXBlb2Ygb3B0aW9ucy5jdXN0b21DbGVhblVwU3BsaXQgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuY3VzdG9tQ2xlYW5VcFNwbGl0IDogZnVuY3Rpb24gKGlucHV0OiBzdHJpbmcpIHsgcmV0dXJuIGlucHV0LnNwbGl0KHNwbGl0UmVnZXgpIH07XG4gICAgICAgIHZhciBwcmVTcGxpdCA9IHNwbGl0Rm4ocHJlQ3Vyc29yICsgXCIhXCIpO1xuICAgICAgICBwcmVTcGxpdCA9IChwcmVDdXJzb3IgKyBcIiFcIikuc3BsaXQoc3BsaXRSZWdleCk7XG4gICAgICAgIGlmIChwcmVTcGxpdFtwcmVTcGxpdC5sZW5ndGggLSAxXSA9PT0gXCIhXCIpIHtcbiAgICAgICAgICAgIHByZVNwbGl0W3ByZVNwbGl0Lmxlbmd0aCAtIDFdID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZVNwbGl0W3ByZVNwbGl0Lmxlbmd0aCAtIDFdID0gcHJlU3BsaXRbcHJlU3BsaXQubGVuZ3RoIC0gMV0uc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvc3RTcGxpdCA9IHNwbGl0Rm4ocG9zdEN1cnNvcik7XG4gICAgICAgIHZhciBvbkN1cnNvciA9IHByZVNwbGl0LnBvcCgpIGFzIHN0cmluZzsgLy8gdHlwZSBhc3NlcnRpb24gaXMgdmFsaWQgYmVjYXVzZSBzcGxpdCgpIGFsd2F5cyByZXR1cm5zIGF0IGxlYXN0IG9uZSBzdHJpbmdcbiAgICAgICAgdmFyIG5ld0N1cnNvciA9IG9uQ3Vyc29yLmxlbmd0aDtcbiAgICAgICAgb25DdXJzb3IgKz0gaW5wdXRWYWwuc3Vic3RyaW5nKHNlbC5zdGFydCwgc2VsLmVuZCk7XG4gICAgICAgIG9uQ3Vyc29yICs9IHBvc3RTcGxpdC5zaGlmdCgpO1xuXG4gICAgICAgIHByZVNwbGl0ID0gc2FmZVRhZ3MocHJlU3BsaXQuam9pbihcIiBcIikpO1xuICAgICAgICBwb3N0U3BsaXQgPSBzYWZlVGFncyhwb3N0U3BsaXQuam9pbihcIiBcIikpO1xuXG4gICAgICAgIHZhciByZW5kZXJlZENoYW5nZSA9ICEhcHJlU3BsaXQubGVuZ3RoIHx8ICEhcG9zdFNwbGl0Lmxlbmd0aDtcblxuICAgICAgICB2YXIgaTogbnVtYmVyO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlU3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRhZ1NwYW5PclVuc3R5bGVkKHByZVNwbGl0W2ldKS5hcHBlbmRUbyhwcmVJbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcG9zdFNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0YWdTcGFuT3JVbnN0eWxlZChwb3N0U3BsaXRbaV0pLmFwcGVuZFRvKHBvc3RJbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob25DdXJzb3IgIT09IGlucHV0LnZhbCgpKSB7XG4gICAgICAgICAgICBpbnB1dC52YWwob25DdXJzb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyICRyZW5kZXJlZEVsZW1lbnRzID0gZWRpdG9yLmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudFwiKTtcbiAgICAgICAgLy8gVGhlIEpRdWVyeSB0eXBpbmdzIGRvbid0IGtub3cgYWJvdXQgdGhlIGNvbmNlcHQgb2YgYSBqcXVlcnkgb2JqZWN0IG5vdCBjb250YWluaW5nIGFuIGh0bWwgZWxlbWVudFxuICAgICAgICBjb25zdCByZW5kZXJlZFN0cmluZ3MgPSAkcmVuZGVyZWRFbGVtZW50cy5tYXAoZnVuY3Rpb24gKF8sIGVsKSB7IHJldHVybiAkKGVsKS50ZXh0KCk7IH0pLmdldCgpIGFzIHVua25vd24gYXMgc3RyaW5nW107XG4gICAgICAgIHZhciB0YWdzVG9LZWVwID0gZmlsdGVyVGFncyhyZW5kZXJlZFN0cmluZ3MsIHByZUlucHV0LmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudFwiKS5sZW5ndGgpO1xuXG4gICAgICAgIGkgPSAwO1xuICAgICAgICAkcmVuZGVyZWRFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICF0YWdzVG9LZWVwW2krK107XG4gICAgICAgIH0pLnJlbW92ZSgpO1xuXG4gICAgICAgIHZhciBwaSA9IHBsYWluSW5wdXQoKTtcbiAgICAgICAgdmFyIG5ld1ZhbCA9ICQudHJpbShwaS50ZXh0KTtcbiAgICAgICAgdmFyIG9sZFZhbCA9IGpBY3R1YWwudmFsKCk7XG4gICAgICAgIGlmIChuZXdWYWwgIT0gb2xkVmFsKSB7XG4gICAgICAgICAgICBqQWN0dWFsLnZhbChuZXdWYWwpLnRyaWdnZXIoXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICBjb25zdCBlZGl0b3JJc0xvYWRlZCA9ICEhU3RhY2tFeGNoYW5nZS5NYXJrZG93bkVkaXRvcjtcbiAgICAgICAgICAgIGlmIChlZGl0b3JJc0xvYWRlZCAgJiYgIW9wdGlvbnMuaWdub3JlU3R5bGVDb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFncyBoYXZlIGNoYW5nZWQsIGFuZCB3ZSBoYXZlIGEgV01EIC0tIHVwZGF0ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZ1xuICAgICAgICAgICAgICAgIHN0eWxlQ29kZS51cGRhdGVMYW5nZGl2RGVsYXllZC50cmlnZ2VyKG5ld1ZhbC5zcGxpdCgvIC9nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVuZGVyZWRDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRyaWdnZXJSZW5kZXJlZENoYW5nZShwaSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzRm9jdXMpIHtcbiAgICAgICAgICAgIGlucHV0LmNhcmV0KG5ld0N1cnNvciwgbmV3Q3Vyc29yICsgc2VsLmVuZCAtIHNlbC5zdGFydCk7XG4gICAgICAgICAgICBpZiAocHJlY2lzZVNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICBpbnB1dFswXS5zZWxlY3Rpb25EaXJlY3Rpb24gPSBzZWxEaXI7XG4gICAgICAgICAgICBhdXRvY29tcGxldGUoKTtcbiAgICAgICAgICAgIGVuc3VyZVJlcXVpcmVkVGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHNldElucHV0V2lkdGgoKTtcbiAgICAgICAgLy8gT24gdGhlIGNoZWNrcyBiZWxvdzogaW4gSUUgMTEsIHRoaXMgd2lsbCBjYXVzZSAnaW5wdXQnIGV2ZW50cyB0byBmaXJlLCBjcmVhdGluZyBhIGxvb3BcbiAgICAgICAgaWYgKGlzVG90YWxseUVtcHR5KCkpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5hdHRyKCdwbGFjZWhvbGRlcicpICE9PSBwbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgIGlucHV0LmF0dHIoJ3BsYWNlaG9sZGVyJywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlucHV0LmF0dHIoJ3BsYWNlaG9sZGVyJykgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuYXR0cigncGxhY2Vob2xkZXInLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcXVhbHNJZ25vcmVPcmRlcjxUPihfYXJyMTogVFtdLCBfYXJyMjogVFtdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KF9hcnIxKVxuICAgICAgICAgICAgfHwgIUFycmF5LmlzQXJyYXkoX2FycjIpXG4gICAgICAgICAgICB8fCBfYXJyMS5sZW5ndGggIT09IF9hcnIyLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC5jb25jYXQoKSB0byBub3QgbXV0YXRlIGFyZ3VtZW50c1xuICAgICAgICBjb25zdCBhcnIxID0gX2FycjEuY29uY2F0KCkuc29ydCgpO1xuICAgICAgICBjb25zdCBhcnIyID0gX2FycjIuY29uY2F0KCkuc29ydCgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbnRlcmZhY2UgU3ViQ29tbXVuaXR5RGF0YSB7XG4gICAgICAgIHN1YkNvbW11bml0aWVzOiB7XG4gICAgICAgICAgICBzbHVnOiBzdHJpbmc7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICByZWxhdGl2ZVVybDogc3RyaW5nO1xuICAgICAgICAgICAgY29tbXVuaXRpZXNPblNvVXJsOiBzdHJpbmc7XG4gICAgICAgIH1bXTtcbiAgICAgICAgZnVsbEh0bWw6IHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgY29tbXVuaXRpZXNCeVRhZ3NVcmwgPSAnL2NvbGxlY3RpdmVzL3NoYXJlZC9nZXQtY29tbXVuaXRpZXMtYnktdGFncyc7XG4gICAgdmFyICRjb21tdW5pdHlCYWRnZXMgPSBlZGl0b3IuY2xvc2VzdCgnLmpzLXRhZy1lZGl0b3ItY29udGFpbmVyJykuZmluZCgnLmpzLWNvbW11bml0eS1pY29ucycpO1xuICAgIHZhciBmaXJzdExvYWQgPSAhJGNvbW11bml0eUJhZGdlcy5pcygnOmVtcHR5Jyk7XG4gICAgdmFyIHN1YkNvbW11bml0eVNsdWdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHZhciBwcmV2aW91c1RhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgdmFyIHByZXZpb3VzU3ViQ29tbXVuaXRpZXNEYXRhOiBTdWJDb21tdW5pdHlEYXRhIHwgdW5kZWZpbmVkO1xuXG4gICAgdmFyIGdldENvbW11bml0aWVzQnlUYWdzID0gU3RhY2tFeGNoYW5nZS5oZWxwZXJzLkRlbGF5ZWRSZWFjdGlvbihmdW5jdGlvbiAodGFncywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKGVxdWFsc0lnbm9yZU9yZGVyKHByZXZpb3VzVGFncywgdGFncykpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHByZXZpb3VzU3ViQ29tbXVuaXRpZXNEYXRhKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzVGFncyA9IHRhZ3M7XG5cbiAgICAgICAgU3RhY2tFeGNoYW5nZS5oZWxwZXJzLmFkZFNwaW5uZXIoZWRpdG9yLCB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHJpZ2h0OiAxMCwgdG9wOiBoZWlnaHQgLyAyIC0gMiB9KTtcblxuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBjb21tdW5pdGllc0J5VGFnc1VybCxcbiAgICAgICAgICAgIGRhdGE6IHsgdGFnczogdGFncyB9LFxuICAgICAgICAgICAgdHJhZGl0aW9uYWw6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdWJDb21tdW5pdGllc0RhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICAgICAgU3RhY2tFeGNoYW5nZS5oZWxwZXJzLnJlbW92ZVNwaW5uZXIoKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sIDQwMCwgeyBzbGlkaW5nOiB0cnVlIH0pO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tGb3JDb21tdW5pdHlUYWdzKCkge1xuICAgICAgICBpZiAoZmlyc3RMb2FkKSB7XG4gICAgICAgICAgICBmaXJzdExvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciAkcmVuZGVyZWRFbGVtZW50cyA9IGVkaXRvci5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnRcIik7XG4gICAgICAgIHZhciB0YWdzID0gJHJlbmRlcmVkRWxlbWVudHMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICQoZWwpLnRleHQoKTsgfSlcblxuICAgICAgICBpZiAoJGNvbW11bml0eUJhZGdlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRhZ3MgJiYgdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRDb21tdW5pdGllc0J5VGFncy50cmlnZ2VyKHRhZ3MsIHVwZGF0ZUZvckNvbW11bml0eVRhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlRm9yQ29tbXVuaXR5VGFncygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlRm9yQ29tbXVuaXR5VGFncyhzdWJDb21tdW5pdGllc0RhdGE/OiBTdWJDb21tdW5pdHlEYXRhKSB7XG4gICAgICAgIGlmICghc3ViQ29tbXVuaXRpZXNEYXRhIHx8ICFzdWJDb21tdW5pdGllc0RhdGEuc3ViQ29tbXVuaXRpZXMgfHwgc3ViQ29tbXVuaXRpZXNEYXRhLnN1YkNvbW11bml0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc3ViQ29tbXVuaXR5U2x1Z3MgPSBbXTtcbiAgICAgICAgICAgICRjb21tdW5pdHlCYWRnZXMuZW1wdHkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdDb21tdW5pdHlTbHVncyA9IHN1YkNvbW11bml0aWVzRGF0YS5zdWJDb21tdW5pdGllcy5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuc2x1ZyB9KTtcblxuICAgICAgICBpZiAoIWVxdWFsc0lnbm9yZU9yZGVyKHN1YkNvbW11bml0eVNsdWdzLCBuZXdDb21tdW5pdHlTbHVncykpIHtcbiAgICAgICAgICAgIHN1YkNvbW11bml0eVNsdWdzID0gbmV3Q29tbXVuaXR5U2x1Z3M7XG4gICAgICAgICAgICAkY29tbXVuaXR5QmFkZ2VzLmh0bWwoc3ViQ29tbXVuaXRpZXNEYXRhLmZ1bGxIdG1sKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVkaXRUYWcoalRhZ09yVGV4dDogc3RyaW5nIHwgSlF1ZXJ5LCBjdXJzb3JUb1N0YXJ0OiBib29sZWFuID0gZmFsc2UsIHByZXNlcnZlRm9jdXM6IGJvb2xlYW4gPSBmYWxzZSwgcHJldmVudEZpcmVFdmVudDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHZhciBqVGFnLCB0ZXh0O1xuICAgICAgICBpZiAodHlwZW9mIGpUYWdPclRleHQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0ZXh0ID0galRhZ09yVGV4dDtcbiAgICAgICAgZWxzZSBpZiAoIWpUYWdPclRleHQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGpUYWcgPSBqVGFnT3JUZXh0O1xuICAgICAgICAgICAgdGV4dCA9IGpUYWcudGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlucHV0U3BsaXQgPSBzYWZlVGFncyhpbnB1dC52YWwoKSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dFNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0YWdTcGFuT3JVbnN0eWxlZChpbnB1dFNwbGl0W2ldKS5hcHBlbmRUbyhwcmVJbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dC52YWwodGV4dCk7XG4gICAgICAgIGlmIChqVGFnKSB7XG4gICAgICAgICAgICB2YXIgbGVmdCA9ICQoJC51bmlxdWUoalRhZy5wcmV2QWxsKFwiLnJlbmRlcmVkLWVsZW1lbnRcIikuZ2V0KCkpKTtcbiAgICAgICAgICAgIGpUYWcubmV4dEFsbChcIi5yZW5kZXJlZC1lbGVtZW50XCIpLnByZXBlbmRUbyhwb3N0SW5wdXQpO1xuICAgICAgICAgICAgbGVmdC5hcHBlbmRUbyhwcmVJbnB1dCk7XG4gICAgICAgICAgICBqVGFnLnJlbW92ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zdElucHV0LmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudFwiKS5hcHBlbmRUbyhwcmVJbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0ZvY3VzIHx8ICFwcmVzZXJ2ZUZvY3VzKSB7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJzb3JUb1N0YXJ0KSB7XG4gICAgICAgICAgICBpbnB1dC5jYXJldCgwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByZXZlbnRGaXJlRXZlbnQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJSZW5kZXJlZENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbnRlbnRXaWR0aENhY2hlOiB7IFtzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gICAgZnVuY3Rpb24gY29udGVudFdpZHRoKGpJbnB1dDogSlF1ZXJ5PEhUTUxJbnB1dEVsZW1lbnQ+KSB7XG4gICAgICAgIHZhciB0ZXh0ID0gaklucHV0LnZhbCgpLFxuICAgICAgICAgICAga2V5ID0gXCJjX1wiICsgdGV4dDtcblxuICAgICAgICBpZiAoa2V5IGluIGNvbnRlbnRXaWR0aENhY2hlKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRXaWR0aENhY2hlW2tleV07XG5cbiAgICAgICAgdmFyIGNvcHkgPSAkKFwiPHNwYW4gLz5cIikuY3NzKHtcbiAgICAgICAgICAgIFwiZm9udC1mYW1pbHlcIjogaklucHV0LmNzcyhcImZvbnQtZmFtaWx5XCIpLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIjogaklucHV0LmNzcyhcImZvbnQtc2l6ZVwiKSxcbiAgICAgICAgICAgIFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIC8vIHByZXZlbnQgd3JhcHBpbmcgKG9ubHkgbWF0dGVycyBpbiBtdWx0aWxpbmUgbW9kZSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvcHkudGV4dChqSW5wdXQudmFsKCkpO1xuICAgICAgICBjb3B5Lmluc2VydEFmdGVyKGpJbnB1dCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBjb3B5LmlubmVyV2lkdGgoKTtcbiAgICAgICAgY29weS5yZW1vdmUoKTtcbiAgICAgICAgY29udGVudFdpZHRoQ2FjaGVba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRJbnB1dFdpZHRoKCkge1xuICAgICAgICBpZiAocmVzcG9uc2l2ZV93aWR0aCkge1xuICAgICAgICAgICAgd2lkdGggPSBlZGl0b3IuaW5uZXJXaWR0aCgpOyAvLyByZWNhbGN1bGF0ZSAodGhpcyB3aWxsIGJlIG9mZi1ieS1ib3JkZXItd2RpdGgsIGJ1dCBtZWgpXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlucHV0V2lkdGggPSBjb250ZW50V2lkdGgoaW5wdXQpICsgMTk7XG4gICAgICAgIHZhciBwcmVXaWR0aCA9IHByZUlucHV0Lm91dGVyV2lkdGgoKTtcblxuICAgICAgICBpbnB1dC5jc3MoXCJ3aWR0aFwiLCBpbnB1dFdpZHRoKTtcblxuICAgICAgICB2YXIgaW5wdXRZUmVsYXRpdmUgPSBpbnB1dC5wb3NpdGlvbigpLnRvcDtcbiAgICAgICAgdmFyIGlucHV0WSA9IGlucHV0WVJlbGF0aXZlIC8qLSBlZGl0b3Iuc2Nyb2xsVG9wKCkqLztcbiAgICAgICAgaWYgKGlucHV0WSA+IDAgJiYgaW5wdXRZICsgcm93SGVpZ2h0IDwgaGVpZ2h0KSAvLyBpbnB1dCBib3ggaXMgZnVsbHkgdmlzaWJsZSAtLSBkb24ndCBkbyBhbnl0aGluZ1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoaW5wdXRZUmVsYXRpdmUgKyBlZGl0b3Iuc2Nyb2xsVG9wKCkgKyByb3dIZWlnaHQgPCBoZWlnaHQpIHsvLyBhbGwgdGhlIHdheSB0byB0aGUgdG9wIC0tIHRoYXQga2VlcHMgdGhlIGJveCB2aXNpYmxlXG4gICAgICAgICAgICBlZGl0b3Iuc2Nyb2xsVG9wKDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvci5zY3JvbGxUb3AoaW5wdXRZUmVsYXRpdmUgLSAoaGVpZ2h0IC0gcm93SGVpZ2h0KSAvIDIgKyBlZGl0b3Iuc2Nyb2xsVG9wKCkpO1xuICAgIH1cblxuICAgIC8vIGR5ID0gKzEgb3IgLTFcbiAgICBmdW5jdGlvbiBtb3ZlQ3Vyc29yVmVydGljYWxseShkeTogbnVtYmVyLCBzaGlmdDogYm9vbGVhbikge1xuICAgICAgICB2YXIgY2FuZGlkYXRlcztcbiAgICAgICAgaWYgKGR5ID4gMCkge1xuICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHBvc3RJbnB1dC5maW5kKFwiPiAqXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHByZUlucHV0LmZpbmQoXCI+ICpcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1ciA9IGlucHV0LnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBpbnBMZW4gPSBpbnB1dC52YWwoKS5sZW5ndGg7XG4gICAgICAgIHZhciBmYWN0b3IgPSBpbnBMZW4gPiAwID8gaW5wdXQuY2FyZXQoKS5zdGFydCAvIGlucExlbiA6IDAuNTtcbiAgICAgICAgdmFyIGN1ck1pZCA9IGN1ci5sZWZ0ICsgaW5wdXQud2lkdGgoKSAqIGZhY3RvcjtcbiAgICAgICAgdmFyIGZvdW5kO1xuICAgICAgICB2YXIgZm91bmRSb3c7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNhbmQgPSBjYW5kaWRhdGVzLmVxKGR5ID4gMCA/IGkgOiBjYW5kaWRhdGVzLmxlbmd0aCAtIGkgLSAxKTtcbiAgICAgICAgICAgIHZhciBjYW5kUG9zID0gY2FuZC5wb3NpdGlvbigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3VuZFJvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIGlmIChjYW5kUG9zLnRvcCAhPT0gZm91bmRSb3cpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlzdCA9IE1hdGguYWJzKGNhbmRQb3MudG9wIC0gY3VyLnRvcCk7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3QgPiByb3dIZWlnaHQgLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kUm93ID0gY2FuZFBvcy50b3A7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNhbmRNaWQgPSBjYW5kUG9zLmxlZnQgKyBjYW5kLndpZHRoKCkgLyAyO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChkeSA8IDAgJiYgKGNhbmRNaWQgPCBjdXJNaWQpKVxuICAgICAgICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgKGR5ID4gMCAmJiAoY2FuZE1pZCA+IGN1ck1pZCkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kIHx8IGNhbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3VuZCA9IGNhbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoc2hpZnQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZm91bmQucGFyZW50KCkubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBjb21iaW5lKGR5ID4gMCA/IENPTUJJTkVfRElSRUNUSU9OLnJpZ2h0IDogQ09NQklORV9ESVJFQ1RJT04ubGVmdCk7XG4gICAgICAgICAgICAgICAgaW5wdXQuY2FyZXQoMCwgaW5wdXQudmFsKCkubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWRpdFRhZyhmb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gc2hpZnQrYXJyb3cgb3IgaG9tZS9lbmQgbWVhbnMgdGhlIHVzZXIgd2FudHMgdG8gY3JlYXRlIGEgc2VsZWN0aW9uXG4gICAgLy8gLS0gaW4gdGhhdCBjYXNlLCBjb21iaW5lICpldmVyeXRoaW5nKiBpbnRvIHRoZSBlZGl0YWJsZSBpbnB1dCxcbiAgICAvLyB1bmxlc3MgdGhlIGJyb3dzZXIgc3VwcG9ydHMgc2VsZWN0aW9uRGlyZWN0aW9uXG4gICAgdmFyIGNvbWJpbmVPblNoaWZ0V2l0aDogeyBbY29kZTogbnVtYmVyXTogYm9vbGVhbiB8IHVuZGVmaW5lZCB9ID0ge1xuICAgICAgICAzNTogdHJ1ZSxcbiAgICAgICAgMzY6IHRydWUsXG4gICAgICAgIDM3OiB0cnVlLFxuICAgICAgICAzODogdHJ1ZSxcbiAgICAgICAgMzk6IHRydWUsXG4gICAgICAgIDQwOiB0cnVlXG4gICAgfTtcblxuICAgIC8vIFJlY29yZCB0aGF0IHRoZSBmb2xsb3dpbmcgZm9jdXMgZXZlbnQgd2FzIGNhdXNlIGJ5IGEga2V5IHByZXNzLlxuICAgIC8vIE9ubHkgaW4gdGhhdCBjYXNlIHdpbGwgYSBzaW5nbGUgc3VnZ2VzdGlvbiBiZSBhdXRvLWNob3Nlbi5cbiAgICAvLyBZZXMsIHRoaXMgaXMga2luZGEgdWdseS5cbiAgICB2YXIga2V5Ym9hcmRUb1N1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gcmVjb3JkVGFiYmluZ1RvU3VnZ2VzdGlvbnMoKSB7XG4gICAgICAgIGtleWJvYXJkVG9TdWdnZXN0aW9ucyA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBrZXlib2FyZFRvU3VnZ2VzdGlvbnMgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRhZyBzdWdnZXN0aW9ucyxcbiAgICAvLyBnZXQgdGhlIHR5cGVkIGlucHV0IGFuZCBzd2FwIGl0IG91dCBmb3IgYSByZWQgZXJyb3IgdGFnXG4gICAgZnVuY3Rpb24gcmVuZGVyRXJyb3JUYWcoKSB7XG4gICAgICAgIHZhciB0eXBlZCA9IHNhZmVUYWdzKGlucHV0LnZhbCgpKVswXTtcbiAgICAgICAgaWYgKCF0eXBlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGVycm9yVGFnID0gJChcIjxzcGFuIGRhdGEtdGFnLW5hbWU9J1wiICsgdHlwZWQgKyBcIicvPlwiKTtcbiAgICAgICAgY2hvb3NlKGVycm9yVGFnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnB1dF9rZXlkb3duKGV2dDogSlF1ZXJ5S2V5RXZlbnRPYmplY3QpIHtcbiAgICAgICAgLy8gc2hpZnQgYnV0IG5vdCAqb25seSogc2hpZnQgb3Igc2hpZnQtdGFiLCBvciBjdHJsLUFcbiAgICAgICAgaWYgKCghcHJlY2lzZVNlbGVjdGlvbiAmJiBldnQuc2hpZnRLZXkgJiYgY29tYmluZU9uU2hpZnRXaXRoW2V2dC53aGljaF0pIHx8IChldnQuY3RybEtleSAmJiBldnQud2hpY2ggPT09IEtFWV9DT0RFLkEpKSB7XG4gICAgICAgICAgICBjb21iaW5lKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZWN0aW9uID0gaW5wdXQuY2FyZXQoKSxcbiAgICAgICAgICAgIHNlbERpciA9IGlucHV0WzBdLnNlbGVjdGlvbkRpcmVjdGlvbixcbiAgICAgICAgICAgIGN1cnNvciA9IHNlbERpciA9PT0gXCJmb3J3YXJkXCIgPyBzZWxlY3Rpb24uZW5kIDogc2VsZWN0aW9uLnN0YXJ0LFxuICAgICAgICAgICAgY3Vyc29yQXRFbmQgPSBjdXJzb3IgPT09IGlucHV0LnZhbCgpLmxlbmd0aCxcbiAgICAgICAgICAgIGN1cnNvckF0U3RhcnQgPSBjdXJzb3IgPT09IDAsXG4gICAgICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgICAgIHN3aXRjaCAoZXZ0LndoaWNoKSB7XG4gICAgICAgICAgICBjYXNlIDM3OiAvLyBsZWZ0XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3JBdFN0YXJ0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwcmV2ID0gcHJlSW5wdXQuZmluZChcIi5yZW5kZXJlZC1lbGVtZW50Omxhc3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGV2dC5zaGlmdEtleSlcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZShDT01CSU5FX0RJUkVDVElPTi5sZWZ0KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVkaXRUYWcocHJldik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2dC5zaGlmdEtleTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzk6IC8vIHJpZ2h0XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3JBdEVuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHBvc3RJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnQ6Zmlyc3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGV2dC5zaGlmdEtleSlcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZShDT01CSU5FX0RJUkVDVElPTi5yaWdodCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBlZGl0VGFnKG5leHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBldnQuc2hpZnRLZXk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDg6ICAvLyBiYWNrc3BhY2VcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvckF0U3RhcnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHByZXYgPSBwcmVJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnQ6bGFzdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXYubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpbnB1dC52YWwocHJldi50ZXh0KCkgKyBpbnB1dC52YWwoKSk7XG4gICAgICAgICAgICAgICAgaW5wdXQuY2FyZXQocHJldi50ZXh0KCkubGVuZ3RoLCBwcmV2LnRleHQoKS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHByZXYucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclJlbmRlcmVkQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0NjogLy8gZGVsXG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3JBdEVuZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHBvc3RJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnQ6Zmlyc3RcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsKGlucHV0LnZhbCgpICsgbmV4dC50ZXh0KCkpO1xuICAgICAgICAgICAgICAgIGlucHV0LmNhcmV0KGN1cnNvciwgY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJSZW5kZXJlZENoYW5nZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICAgICAgICAgICAgaWYgKG1vdmVDdXJzb3JWZXJ0aWNhbGx5KC0xLCBldnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWwgZmFsbC10aHJvdWdoIC0tIHVwIGJlaGF2ZXMgbGlrZSBpbiBtb3N0IGNhc2VzXG4gICAgICAgICAgICBjYXNlIDM2OiAvLyBob21lXG4gICAgICAgICAgICAgICAgcHJldiA9IHByZUlucHV0LmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudDpmaXJzdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXYubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZXZ0LnNoaWZ0S2V5KVxuICAgICAgICAgICAgICAgICAgICBjb21iaW5lKENPTUJJTkVfRElSRUNUSU9OLmFsbF9sZWZ0KTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVkaXRUYWcocHJldiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2dC5zaGlmdEtleTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDA6IC8vIGRvd25cbiAgICAgICAgICAgICAgICB2YXIgc3VnZyA9IHN1Z2dlc3Rpb25zLmNoaWxkcmVuKFwiZGl2OmZpcnN0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChzdWdnLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRUYWJiaW5nVG9TdWdnZXN0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICBzdWdnLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVDdXJzb3JWZXJ0aWNhbGx5KDEsIGV2dC5zaGlmdEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbCBmYWxsLXRocm91Z2ggaGVyZSAtLSBpZiBubyBzdWdnZXN0aW9ucyBhcmUgc2hvd24sIGRvd24gYmVoYXZlcyBsaWtlIGVuZFxuICAgICAgICAgICAgY2FzZSAzNTogLy8gZW5kXG4gICAgICAgICAgICAgICAgbmV4dCA9IHBvc3RJbnB1dC5maW5kKFwiLnJlbmRlcmVkLWVsZW1lbnQ6bGFzdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZXZ0LnNoaWZ0S2V5KVxuICAgICAgICAgICAgICAgICAgICBjb21iaW5lKENPTUJJTkVfRElSRUNUSU9OLmFsbF9yaWdodCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBlZGl0VGFnKG5leHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBldnQuc2hpZnRLZXk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgcmVjb3JkVGFiYmluZ1RvU3VnZ2VzdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZW5kZXJFcnJvclRhZ0lmTm9SZXN1bHRzICYmICFoYXNTdWdnZXN0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckVycm9yVGFnKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMzogLy8gZW50ZXJcbiAgICAgICAgICAgICAgICBpZiAoaGFzU3VnZ2VzdGlvbnMoKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBtYWtlIGVudGVyIGEgbm8tb3AgaWYgdGhlIHN1Z2dlc3Rpb25zIHBvcHVwIGlzIHRoZXJlIChpbiBwYXJ0aWN1bGFyLCBkb24ndCBzdWJtaXQgdGhlIGZvcm0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDMyOiAvLyBzcGFjZVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3BhY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBBbGxvd3MgdXNlcnMgdG8gc2VhcmNoIGZvciBtdWx0aS13b3JkIHRhZ3MgKGUuZy4gZmlyc3QgYW5kIGxhc3QgbmFtZSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc3BhY2VTZWxlY3RzVG9wU3VnZ2VzdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zcGFjZVNlbGVjdHNUb3BTdWdnZXN0aW9uICYmIGhhc1N1Z2dlc3Rpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hvb3NlKHN1Z2dlc3Rpb25zLmNoaWxkcmVuKCdkaXY6Zmlyc3QnKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnB1dF9rZXl1cChldnQ6IEpRdWVyeUtleUV2ZW50T2JqZWN0KSB7XG4gICAgICAgIC8vIFRoaXMgbXVzdCBiZSBkb25lIG9uIGtleXVwIHRvIHByZXZlbnQgYnViYmxpbmcgdG8gZG9Fc2NhcGVDbG9zZSBpbiBzdHViLmpzIHdoZW4gdGhlIHN1Z2dlc3Rpb24gaXMgaW4gYSBtb2RhbC5cbiAgICAgICAgaWYgKGV2dC53aGljaCA9PT0gS0VZX0NPREUuRVNDICYmIHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNhbmNlbEF1dG9Db21wbGV0aW9uKCk7XG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsgLy8gZmlyZWZveCBkb2VzIHNvbWUgZnVua3kgc3R1ZmYgb3RoZXJ3aXNlXG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIHZhciBwcmV2VHlwZWQ6IHN0cmluZztcblxuICAgIGZ1bmN0aW9uIGhhc1N1Z2dlc3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gISFzdWdnZXN0aW9ucy5sZW5ndGggJiYgIXN1Z2dlc3Rpb25zLmhhc0NsYXNzKCduby1yZXN1bHRzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXV0b2NvbXBsZXRlKGFsd2F5czogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHZhciB0eXBlZCA9IHNhbml0aXplU2VhcmNoVGVybShpbnB1dC52YWwoKSkgfHwgJyc7XG5cbiAgICAgICAgLy8gbm9ybWFsaXplL21hc3NhZ2Ugd2hhdCdzIHNlbnQgdG8gc2VydmVyXG4gICAgICAgIGlmIChvcHRpb25zLmFsbG93VXBwZXJDYXNlVGFnTmFtZXMpIHtcbiAgICAgICAgICAgIHR5cGVkID0gdHlwZWQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2VHlwZWQgPT09IHR5cGVkICYmICFhbHdheXMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgcHJldlR5cGVkID0gdHlwZWQ7XG5cbiAgICAgICAgaWYgKCF0eXBlZC5sZW5ndGggJiYgIXNob3VsZFNob3dBbGxCZWNhdXNlRW1wdHlBbmRGb2N1c2VkKCkpIHtcbiAgICAgICAgICAgIGNhbmNlbEF1dG9Db21wbGV0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTdWdnZXN0aW9ucyh0eXBlZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0eXBlZCAhPT0gcHJldlR5cGVkIHx8ICFoYXNGb2N1cykgcmV0dXJuOyAvLyB0aGUgdXNlciB0eXBlZCBhZnRlciB0aGUgcmVxdWVzdCB3YXMgc3RhcnRlZFxuXG4gICAgICAgICAgICBzaG93VGFnU3VnZ2VzdGlvbnMoZGF0YSwgdHlwZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3VnZ2VzdGlvbkNhY2hlID0ge30gYXMgeyBba2V5OiBzdHJpbmddOiByZWFkb25seSBURGF0YVtdfTtcblxuICAgIHZhciBnZXRGcm9tU2VydmVyID0gU3RhY2tFeGNoYW5nZS5oZWxwZXJzLkRlbGF5ZWRSZWFjdGlvbihmdW5jdGlvbiAoc2VhcmNoVGVybSwgY2FsbGJhY2spIHtcbiAgICAgICAgU3RhY2tFeGNoYW5nZS5oZWxwZXJzLmFkZFNwaW5uZXIoZWRpdG9yLCB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHJpZ2h0OiAxMCwgdG9wOiBoZWlnaHQgLyAyIC0gMiB9KTtcbiAgICAgICAgdmFyIHByb21pc2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmdldERhdGFQcm9taXNlKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gb3B0aW9ucy5nZXREYXRhUHJvbWlzZShzZWFyY2hUZXJtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBhcGlVcmwgPSBnZXRTZXJ2ZXJVcmwoKTtcbiAgICAgICAgICAgIHZhciBxdWVyeVBhcmFtZXRlcnMgPSB7IHE6IHNlYXJjaFRlcm0sIG5ld3N0eWxlOiB0cnVlIH07XG4gICAgICAgICAgICBwcm9taXNlID0gJC5nZXQoYXBpVXJsLCBxdWVyeVBhcmFtZXRlcnMsIHVuZGVmaW5lZCwgXCJqc29uXCIpO1xuICAgICAgICAgICAgcHJvbWlzZS5kb25lKChkYXRhOiBURGF0YVBvc3NpYmx5V2l0aFN0YW5kYXJkVGFnRGF0YVtdKSA9PlxuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcuSXNEaXZlcmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnRhZ1JlbmRlcmVyLm1hcmtEaXZlcmdlZFRhZyh0YWcuTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21pc2VcbiAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkNhY2hlW2dldFN1Z2dlc3Rpb25DYWNoZUtleShzZWFyY2hUZXJtKV0gPSBkYXRhO1xuICAgICAgICAgICAgICAgIFN0YWNrRXhjaGFuZ2UuaGVscGVycy5yZW1vdmVTcGlubmVyKCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgICAgICB9KTtcblxuICAgIH0sIDQwMCwgeyBzbGlkaW5nOiB0cnVlIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0U3VnZ2VzdGlvbnMoc2VhcmNoVGVybTogc3RyaW5nLCBjYWxsYmFjazogKGRhdGE6IHJlYWRvbmx5IFREYXRhW10pID0+IHZvaWQpIHtcbiAgICAgICAgdmFyIGtleSA9IGdldFN1Z2dlc3Rpb25DYWNoZUtleShzZWFyY2hUZXJtKTtcbiAgICAgICAgaWYgKCFvcHRpb25zLmRpc2FibGVDYWNoaW5nICYmIHN1Z2dlc3Rpb25DYWNoZVtrZXldKVxuICAgICAgICAgICAgY2FsbGJhY2soc3VnZ2VzdGlvbkNhY2hlW2tleV0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBnZXRGcm9tU2VydmVyLnRyaWdnZXIoc2VhcmNoVGVybSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNlcnZlclVybCgpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGFnQXBpVXJsIHx8IFwiL2ZpbHRlci90YWdzXCI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U3VnZ2VzdGlvbkNhY2hlS2V5KHNlYXJjaFRlcm06IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2V0U2VydmVyVXJsKCkgKyAnfCcgKyBzZWFyY2hUZXJtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3dUYWdTdWdnZXN0aW9ucyhkYXRhOiByZWFkb25seSBURGF0YVtdLCB0eXBlZDogc3RyaW5nKSB7XG4gICAgICAgIHN1Z2dlc3Rpb25zLnJlbW92ZSgpO1xuXG4gICAgICAgIHN1Z2dlc3Rpb25IYXNGb2N1cyA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gZWRpdG9yLmhlaWdodCgpO1xuXG4gICAgICAgIGxldCBzdWdnZXN0aW9uSXRlbXMgPSBbXTtcblxuICAgICAgICAvLyBUaGUgSlF1ZXJ5IHR5cGluZ3MgZG9uJ3Qga25vdyBhYm91dCB0aGUgY29uY2VwdCBvZiBhIGpxdWVyeSBvYmplY3Qgbm90IGNvbnRhaW5pbmcgYW4gaHRtbCBlbGVtZW50XG4gICAgICAgIGNvbnN0IHJlbmRlcmVkU3RyaW5ncyA9IGVkaXRvci5maW5kKCcucmVuZGVyZWQtZWxlbWVudCcpLm1hcChmdW5jdGlvbiAoXywgZWwpIHsgcmV0dXJuICQoZWwpLnRleHQoKTsgfSkuZ2V0KCkgYXMgdW5rbm93biBhcyBzdHJpbmdbXTtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gZXhpc3RpbmdUYWdzKHJlbmRlcmVkU3RyaW5ncywgcHJlSW5wdXQuZmluZChcIi5yZW5kZXJlZC1lbGVtZW50XCIpLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gT25seSBzdWdnZXN0IHRhZ3MgdGhhdCBhcmVuJ3QgYWxyZWFkeSBpbiB0aGUgZWRpdG9yXG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKGdldFRhZ05hbWVGcm9tRGF0YShkYXRhW2ldKSkpIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uSXRlbXMucHVzaChkYXRhW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdWdnZXN0aW9uQ291bnQgPSBzdWdnZXN0aW9uSXRlbXMubGVuZ3RoO1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbkNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucyA9ICQoYDxkaXYgaWQ9J3RhZy1zdWdnZXN0aW9ucy0ke3RhZ0VkaXRvcklkfScgY2xhc3M9J3RhZy1zdWdnZXN0aW9ucyBuby1yZXN1bHRzIGJveC1ib3JkZXIgZnMtY2F0aW9uIGZjLWJsYWNrLTQwMCBjLWRlZmF1bHQgd214MTAwJyByb2xlPSdsaXN0Ym94JyBhcmlhLWxhYmVsPSdBdXRvY29tcGxldGUgc3VnZ2VzdGlvbnMnPmAgKyBfcyhcIk5vIHJlc3VsdHMgZm91bmRcIikgKyBcIjwvZGl2PlwiKVxuICAgICAgICAgICAgICAgIC5jc3Moe1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlZGl0b3IucG9zaXRpb24oKS5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IGVkaXRvci5wb3NpdGlvbigpLnRvcCArIGN1cnJlbnRIZWlnaHQgKyAxICsgKG9wdGlvbnMuc3VnZ2VzdGlvbnNUb3BNYXJnaW4gPz8gMCksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzdWdnZXN0aW9uc1dpZHRoXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuaW5zZXJ0QWZ0ZXIoZWRpdG9yKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubm9SZXN1bHRzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm5vUmVzdWx0c0NhbGxiYWNrKHN1Z2dlc3Rpb25zLCB0eXBlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdWdnZXN0aW9ucyA9ICQoYDxkaXYgaWQ9J3RhZy1zdWdnZXN0aW9ucy0ke3RhZ0VkaXRvcklkfScgY2xhc3M9J3RhZy1zdWdnZXN0aW9ucyBqcy10YWctc3VnZ2VzdGlvbnMgYm94LWJvcmRlciB3bXgxMDAnIHJvbGU9J2xpc3Rib3gnIGFyaWEtbGFiZWw9J0F1dG9jb21wbGV0ZSBzdWdnZXN0aW9ucycvPmApXG4gICAgICAgICAgICAuY3NzKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGVkaXRvci5wb3NpdGlvbigpLmxlZnQsXG4gICAgICAgICAgICAgICAgdG9wOiBlZGl0b3IucG9zaXRpb24oKS50b3AgKyBjdXJyZW50SGVpZ2h0ICsgMSArIChvcHRpb25zLnN1Z2dlc3Rpb25zVG9wTWFyZ2luID8/IDApLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzdWdnZXN0aW9uc1dpZHRoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmluc2VydEFmdGVyKGVkaXRvcik7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMub25DcmVhdGluZ1RhZ1N1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQ3JlYXRpbmdUYWdTdWdnZXN0aW9ucyhleGlzdGluZyB8fCBbXSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYm94UmVuZGVyZXIgPSBvcHRpb25zLnN1Z2dlc3Rpb25UYWdCb3hSZW5kZXJlciB8fCByZW5kZXJUYWdCb3g7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWdnZXN0aW9uSXRlbXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgdmFyIGJveCA9IGJveFJlbmRlcmVyKHN1Z2dlc3Rpb25JdGVtc1tpXSwgdHlwZWQpXG4gICAgICAgICAgICAgICAgLmF0dHIoXCJ0YWJpbmRleFwiLCB0aSB8fCAwKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnanMtdGFnLXN1Z2dlc3Rpb24nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdyb2xlJywgJ29wdGlvbicpIC8vbmVlZGVkIGZvciBhY2Nlc3NpYmlsaXR5IChiZWNhdXNlIHBhcmVudCBpcyByb2xlPSdsaXN0Ym94JylcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oc3VnZ2VzdGlvbnMpO1xuXG4gICAgICAgICAgICBhZGp1c3RNb3JlTGlua1RvQXZhaWxhYmxlV2lkdGgoYm94KTtcblxuICAgICAgICAgICAgaWYgKGkgJSBjb2x1bW5zID09PSAwICYmICFuYXJyb3dCb3hlcykge1xuICAgICAgICAgICAgICAgIGJveC5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdWdnZXN0aW9ucy5vbih7XG4gICAgICAgICAgICBrZXlkb3duOiBjaG9pY2Vfa2V5ZG93bixcbiAgICAgICAgICAgIGtleXVwOiBjaG9pY2Vfa2V5dXAsXG4gICAgICAgICAgICBjbGljazogZnVuY3Rpb24gKGV2dCkgeyBpZiAoIWlzRXZlbnRJbkxpbmsoZXZ0KSkgeyBjaG9vc2UoJCh0aGlzKSk7IGV2dC5zdG9wUHJvcGFnYXRpb24oKTsgfSB9LFxuICAgICAgICAgICAgZm9jdXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5Ym9hcmRUb1N1Z2dlc3Rpb25zICYmIHN1Z2dlc3Rpb25Db3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjaG9vc2UoJCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmx1cjogZnVuY3Rpb24gKCkgeyBzdWdnZXN0aW9uSGFzRm9jdXMgPSBmYWxzZTsgfSxcbiAgICAgICAgfSwgJy5qcy10YWctc3VnZ2VzdGlvbicpO1xuXG4gICAgICAgIC8vQWRqdXN0IGFjY2Vzc2liaWxpdHkgbm93IHRoYXQgdGhlIHN1Z2dlc3Rpb25zIGFyZSBiZWluZyBzaG93blxuICAgICAgICBpbnB1dC5hdHRyKCdhcmlhLWNvbnRyb2xzJywgYHRhZy1zdWdnZXN0aW9ucy0ke3RhZ0VkaXRvcklkfWApO1xuICAgICAgICBpbnB1dC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW5kZXJUYWdCb3godGFnOiBURGF0YVBvc3NpYmx5V2l0aFN0YW5kYXJkVGFnRGF0YSwgbWF0Y2g6IHN0cmluZykge1xuICAgICAgICB2YXIgdGFnTmFtZSA9IGdldFRhZ05hbWVGcm9tRGF0YSh0YWcpO1xuICAgICAgICB2YXIgYm94ID0gJChcIjxkaXYgY2xhc3M9J2Y6YnMtcmluZyBvdXRsaW5lLW5vbmUnIC8+XCIpLmNzcyhcIndpZHRoXCIsIG5hcnJvd0JveGVzID8gXCJhdXRvXCIgOiBib3hXaWR0aCkuZGF0YShcInRhZy1uYW1lXCIsICh0YWcuTmVnYXRlZCA/ICdub3QgJyA6ICcnKSArICh0YWcuU3lub255bU9mIHx8IHRhZ05hbWUpKTtcblxuICAgICAgICB2YXIgdGFnUm93ID0gJChcIjxkaXYgY2xhc3M9J2QtZmxleCBhaS1jZW50ZXInIC8+XCIpO1xuICAgICAgICB2YXIgdGFnQ29udGFpbmVyID0gJChcIjxkaXYgY2xhc3M9J2ZsZXgtLWl0ZW0gbXI2JyAvPlwiKTtcblxuICAgICAgICBib3guYXBwZW5kKHRhZ1Jvdyk7XG4gICAgICAgIHRhZ1Jvdy5hcHBlbmQodGFnQ29udGFpbmVyKTtcblxuICAgICAgICAvLyBDb252ZXJ0IG1hdGNoZXMgdG8gYSByZWdleCBtYXRjaGluZyBhbnkgbnVtYmVyIG9mIGRhc2hlcyBiZXR3ZWVuIGNoYXJhY3RlcnMuXG4gICAgICAgIC8vIEUuZy4sIFwiYWJjXCIgYmVjb21lcyAvYS0qYi0qYy8gYW5kIFwiYWIqXCIgYmVjb21lcyAvYS0qYi4qL1xuICAgICAgICAvLyBVc2UgXFx0IGFzIGEgc3RhbmQtaW4gZm9yICcqJyBkdXJpbmcgdGhlIHRyYW5zZm9ybS5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoLnJlcGxhY2UoLy0vZywgXCJcIikucmVwbGFjZSgvXFwqKy9nLCAnXFx0JykucmVwbGFjZSgvKFteXFx0XSkoPz1bXlxcdF0pL2csIFwiJDEtKlwiKS5yZXBsYWNlKC9cXCsvZywgXCJcXFxcK1wiKS5yZXBsYWNlKC9cXC4vZywgXCJcXFxcLlwiKS5yZXBsYWNlKC9cXHQvZywgJy4qJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXNPcGVyYXRvciA9IG9wdGlvbnMub3BlcmF0b3JzICYmIG9wdGlvbnMub3BlcmF0b3JzLnRlc3QodGFnTmFtZSk7XG5cbiAgICAgICAgdmFyIHNwYW4gPSBpc09wZXJhdG9yID8gJCgnPHNwYW4gY2xhc3M9XCJweDQgZnMtY2FwdGlvblwiPicpLnRleHQodGFnTmFtZSkgOiB0YWdTcGFuKHRhZ05hbWUsIHRydWUpO1xuXG4gICAgICAgIHZhciBjb250ZW50ID0gc3Bhbi5odG1sKCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShuZXcgUmVnRXhwKFwiKFwiICsgbWF0Y2ggKyBcIilcIiksIFwiPHNwYW4gY2xhc3M9J21hdGNoJz4kMTwvc3Bhbj5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFycm93Qm94ZXMpXG4gICAgICAgICAgICBzcGFuLmFkZENsYXNzKFwibTBcIik7XG5cbiAgICAgICAgaWYgKHRhZy5OZWdhdGVkKSB7XG4gICAgICAgICAgICB0YWdSb3cucHJlcGVuZCgkKCc8ZGl2IGNsYXNzPVwiZmxleC0taXRlbSBtcjYgZnMtY2FwdGlvblwiPicpLnRleHQoJ25vdCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhZ0NvbnRhaW5lci5hcHBlbmQoc3Bhbi5odG1sKGNvbnRlbnQpKTtcblxuICAgICAgICBpZiAodGFnLkNvdW50ICYmICFuYXJyb3dCb3hlcyAmJiAhaXNPcGVyYXRvcilcbiAgICAgICAgICAgIHRhZ1Jvdy5hcHBlbmQoJChcIjxkaXYgY2xhc3M9J2ZsZXgtLWl0ZW0gZnMtZmluZSB0cnVuY2F0ZSBtcjYnIC8+XCIpLmh0bWwoXCJcIiArIHRhZy5Db3VudCkpO1xuXG4gICAgICAgIGlmIChzaG93X2V4Y2VycHRzICYmICFuYXJyb3dCb3hlcyAmJiAhaXNPcGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKHRhZy5FeGNlcnB0KVxuICAgICAgICAgICAgICAgIHRleHQgPSB0YWcuRXhjZXJwdDtcbiAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBib3guYXBwZW5kKCQoXCI8cCBjbGFzcz0nbXQ2IG1iMCB2LXRydW5jYXRlNCBsaC1tZCcgLz5cIikudGV4dCh0ZXh0KSk7XG5cbiAgICAgICAgICAgIGlmICh0YWcuU3lub255bXMgJiYgdGFnLlN5bm9ueW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBzeW5vbnltcyA9ICQoXCI8cCA+XCIgKyBfcyhcImFsc286IFwiKSArIFwiPC9wPlwiKS5hcHBlbmRUbyhib3gpO1xuICAgICAgICAgICAgICAgIHZhciBzcGxpdHRlZCA9IHRhZy5TeW5vbnltcy5zcGxpdCgvXFx8Lyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGxpdHRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc3BsaXR0ZWRbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChcIihcIiArIG1hdGNoICsgXCIpXCIpLCBcIjxzcGFuIGNsYXNzPSdtYXRjaCc+JDE8L3NwYW4+XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCIsIFwiICsgdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgc3lub255bXMuYXBwZW5kKFwiPHNwYW4+XCIgKyB0ZXh0ICsgXCI8L3NwYW4+XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJfbGVhcm5fbW9yZSAmJiAhbmFycm93Qm94ZXMgJiYgIWlzT3BlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0YWcuSW5mb1VybDtcbiAgICAgICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gKHRhZy5Jc0RpdmVyZ2VkID8gU3RhY2tFeGNoYW5nZS5vcHRpb25zLnNpdGUucm91dGVQcmVmaXggOiBcIlwiKSArIFwiL3RhZ3MvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGFnLlN5bm9ueW1PZiB8fCB0YWdOYW1lKSArIFwiL2luZm9cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNjcmVlbnJlYWRlciB0cmVhdG1lbnQgb2YgU1ZHcyBpbiBsaW5rcyBpcyBhIGJpdCB1bnJlbGlhYmxlLCBzZWUgaHR0cHM6Ly93d3cuc2NvdHRvaGFyYS5tZS9ibG9nLzIwMTkvMDUvMjIvY29udGV4dHVhbC1pbWFnZXMtc3Zncy1hbmQtYTExeS5odG1sI3VzaW5nLXRoZS1zdmctd2l0aGluLWEtbGluay5cbiAgICAgICAgICAgIC8vIEdpdmluZyB0aGUgbGluayBhbiBhcmlhLWxhYmVsIGluc3RlYWQgaXMgb25lIG9mIHRoZSBzdWdnZXN0ZWQgc29sdXRpb25zIGZyb20gdGhlIGFydGljbGUuXG4gICAgICAgICAgICAkKCc8YSBjbGFzcz1cIm1sLWF1dG8gZmxleC0taXRlbSBzLWJ0biBzLWJ0bl9fbXV0ZWQgcDQganMtdGFnLWluZm8tYnRuXCIgdGFyZ2V0PVwiX2JsYW5rXCIgLz4nKVxuICAgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgdXJsKVxuICAgICAgICAgICAgICAgIC5hdHRyKFwiYXJpYS1sYWJlbFwiLCBfcyhcImluZm9cIikpXG4gICAgICAgICAgICAgICAgLmFwcGVuZChTdmcuSGVscFNtLldpdGhBdHRyKHsgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIiB9KSlcbiAgICAgICAgICAgICAgICAuYXBwZW5kVG8odGFnUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib3g7XG4gICAgfVxuXG4gICAgdmFyIHdpZHRoVGhyZXNob2xkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBmdW5jdGlvbiBhZGp1c3RNb3JlTGlua1RvQXZhaWxhYmxlV2lkdGgoYm94OiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIHZhciBtb3JlbGluayA9IGJveC5maW5kKFwicC5tb3JlLWluZm9cIik7XG4gICAgICAgIGlmICh0eXBlb2Ygd2lkdGhUaHJlc2hvbGQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICB3aWR0aFRocmVzaG9sZCA9IGJveFdpZHRoIC0gNSAtIG1vcmVsaW5rLm91dGVyV2lkdGgoKTtcbiAgICAgICAgdmFyIHRhZ1dpZHRoID0gYm94LmZpbmQoXCIucmVuZGVyZWQtZWxlbWVudDpmaXJzdFwiKS5vdXRlcldpZHRoKCk7XG4gICAgICAgIGlmICh0YWdXaWR0aCA+IHdpZHRoVGhyZXNob2xkKVxuICAgICAgICAgICAgbW9yZWxpbmsuZmluZChcImFcIikudGV4dChfcyhcImluZm9cIikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgdGFnIHN1Z2dlc3Rpb24gaXMgcGlja2VkIGZyb20gdGhlIGF1dG9jb21wbGV0ZSBib3ggLSBtZWFucyB3ZSBoYXZlIGEgdmFsaWQgdGFnIGZyb20gc2VydmVyIVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNob29zZShqVGFnOiBKUXVlcnk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGlucHV0LnZhbChqVGFnLmRhdGEoXCJ0YWctbmFtZVwiKSk7XG4gICAgICAgIGNhbmNlbEF1dG9Db21wbGV0aW9uKCk7XG4gICAgICAgIGVkaXRUYWcoXCJcIik7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2cobXNnOiB1bmtub3duKSB7XG4gICAgICAgIGlmICghU3RhY2tFeGNoYW5nZS5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHJldHVybjtcblxuICAgICAgICBjb25zb2xlLmxvZygndGFnIGVkaXRvciBuZXc6ICcgKyBtc2cpO1xuICAgICAgICBpZiAodHlwZW9mIG1zZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbmNlbEF1dG9Db21wbGV0aW9uKCkge1xuICAgICAgICBzdWdnZXN0aW9ucy5yZW1vdmUoKTtcbiAgICAgICAgc3VnZ2VzdGlvbnMgPSAkKCk7XG4gICAgICAgIHN1Z2dlc3Rpb25IYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgICBnZXRGcm9tU2VydmVyLmNhbmNlbCgpO1xuXG4gICAgICAgIC8vQWRqdXN0IGFjY2Vzc2liaWxpdHkgbm93IHRoYXQgdGhlIGF1dG8gY29tcGxldGUgcG9wdXAgaGFzIGJlZW4gcmVtb3ZlZFxuICAgICAgICBpbnB1dC5yZW1vdmVBdHRyKCdhcmlhLWNvbnRyb2xzJyk7XG4gICAgICAgIGlucHV0LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0V2ZW50SW5MaW5rKGV2dDogQmFzZUpRdWVyeUV2ZW50T2JqZWN0KSB7XG4gICAgICAgIHJldHVybiAkKGV2dC50YXJnZXQpLmNsb3Nlc3QoJ2EnKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNob2ljZV9rZXlkb3duKGV2dDogSlF1ZXJ5S2V5RXZlbnRPYmplY3QpIHtcblxuICAgICAgICB2YXIgcHJldjtcblxuICAgICAgICBzd2l0Y2ggKGV2dC53aGljaCkge1xuICAgICAgICAgICAgY2FzZSBLRVlfQ09ERS5SSUdIVDogLy8gcmlnaHRcbiAgICAgICAgICAgIGNhc2UgS0VZX0NPREUuRE9XTjogLy8gZG93blxuICAgICAgICAgICAgICAgICQodGhpcykubmV4dChcImRpdlwiKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgS0VZX0NPREUuTEVGVDogLy8gbGVmdFxuICAgICAgICAgICAgICAgICQodGhpcykucHJldihcImRpdlwiKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgS0VZX0NPREUuVVA6IC8vIHVwXG4gICAgICAgICAgICAgICAgcHJldiA9ICQodGhpcykucHJldihcImRpdlwiKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHByZXYuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSBLRVlfQ09ERS5FTlRFUjogLy8gZW50ZXJcbiAgICAgICAgICAgICAgICBpZiAoaXNFdmVudEluTGluayhldnQpKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgY2hvb3NlKCQodGhpcykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgS0VZX0NPREUuU1BBQ0U6IC8vIHNwYWNlXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3BhY2VTZWxlY3RzVG9wU3VnZ2VzdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjaG9vc2UoJCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNob2ljZV9rZXl1cChldnQ6IEpRdWVyeUtleUV2ZW50T2JqZWN0KSB7XG4gICAgICAgIC8vIFRoaXMgbXVzdCBiZSBkb25lIG9uIGtleXVwIHRvIHByZXZlbnQgYnViYmxpbmcgdG8gZG9Fc2NhcGVDbG9zZSBpbiBzdHViLmpzIHdoZW4gdGhlIHN1Z2dlc3Rpb24gaXMgaW4gYSBtb2RhbC5cbiAgICAgICAgaWYgKGV2dC53aGljaCA9PT0gS0VZX0NPREUuRVNDKSB7XG4gICAgICAgICAgICBjYW5jZWxBdXRvQ29tcGxldGlvbigpO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNsZWFuVXAodHJ1ZSk7XG4gICAgU3RhY2tFeGNoYW5nZS50YWdFZGl0b3IucmVhZHkucmVzb2x2ZSgpO1xuXG4gICAgY29uc3QgZWxlbWVudFdpdGhBdHRhY2hlZEZ1bmN0aW9ucyA9IGpBY3R1YWxbMF0gYXMgU3RhY2tFeGNoYW5nZS50YWdFZGl0b3IuQm91bmRJbnB1dEVsZW1lbnQ7XG5cbiAgICAvLyBJIGFwb2xvZ2l6ZVxuICAgIGVsZW1lbnRXaXRoQXR0YWNoZWRGdW5jdGlvbnNbXCJmdW5jX2NsZWFyXCJdID1cbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgakFjdHVhbC52YWwoJycpO1xuICAgICAgICAgICAgaW5wdXQudmFsKCcnKS5ibHVyKCk7XG4gICAgICAgICAgICBlZGl0b3IuZmluZCgnLnJlbmRlcmVkLWVsZW1lbnQnKS5yZW1vdmUoKTtcbiAgICAgICAgfTtcblxuICAgIC8vIEkgZG9uJ3RcbiAgICBlbGVtZW50V2l0aEF0dGFjaGVkRnVuY3Rpb25zW1wiZnVuY19hZGRcIl0gPSBmdW5jdGlvbiAodGFnTmFtZSkge1xuICAgICAgICB2YXIgb2xkID0gaW5wdXQudmFsKCk7XG4gICAgICAgIGlucHV0LnZhbCh0YWdOYW1lKTtcbiAgICAgICAgZWRpdFRhZyhvbGQsIGZhbHNlLCAvKnByZXNlcnZlRm9jdXM9Ki90cnVlKTtcbiAgICAgICAgY2xlYW5VcCgpO1xuICAgIH07XG5cbiAgICAvLyBOb3QgbXkgZmF1bHRcbiAgICBlbGVtZW50V2l0aEF0dGFjaGVkRnVuY3Rpb25zW1wiZnVuY19maW5pc2hcIl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGVkaXRUYWcoXCJcIik7XG4gICAgfTtcblxuICAgIC8vIFRoaXMgaXMgZ2V0dGluZyBvdXQgb2YgaGFuZFxuICAgIGVsZW1lbnRXaXRoQXR0YWNoZWRGdW5jdGlvbnNbXCJmdW5jX3JlZHJhd1wiXSA9IGZ1bmN0aW9uIChmaXJlRXZlbnQ6IGJvb2xlYW4pIHsgLy8gZXZlbnQgaXMgXCJ0YWdlZGl0b3I6cmVuZGVyZWRjaGFuZ2VcIlxuICAgICAgICB2YXIgdGFnTmFtZSA9IGpBY3R1YWwudmFsKCk7XG4gICAgICAgIGpBY3R1YWwudmFsKCcnKTtcbiAgICAgICAgaW5wdXQudmFsKCcnKS5ibHVyKCk7XG4gICAgICAgIGVkaXRvci5maW5kKCcucmVuZGVyZWQtZWxlbWVudCcpLnJlbW92ZSgpO1xuICAgICAgICBpbnB1dC52YWwodGFnTmFtZSk7XG4gICAgICAgIGVkaXRUYWcoXCJcIiwgZmFsc2UsIC8qcHJlc2VydmVGb2N1cz0qL3RydWUsIC8qbm9FdmVudD0qLyAhZmlyZUV2ZW50KTtcbiAgICAgICAgY2xlYW5VcCgpO1xuICAgIH07XG59O1xuXG50YWdFZGl0b3IucmVhZHkgPSAkLkRlZmVycmVkPHZvaWQ+KCk7XG50YWdFZGl0b3IucmVxdWlyZWRUYWdzID0gW107IC8vIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZXh0ZXJuYWxseVxuXG5TdGFja0V4Y2hhbmdlLnRhZ0VkaXRvciA9IHRhZ0VkaXRvcjtcblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9